Version 1.0.1.0 .

svn merge -r 29745:30582 https://dart.googlecode.com/svn/branches/bleeding_edge/deps trunk/deps

git-svn-id: http://dart.googlecode.com/svn/trunk@30599 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/.gitignore b/.gitignore
index 3b24772..9590c6e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -66,6 +66,6 @@
 tools/out
 tools/xcodebuild
 pkg/shadow_dom/tool/node_modules
-
-
-
+editor/util/testing/mac/CodeLab.suite/Results
+editor/util/testing/mac/DartEditor.suite/Results
+editor/util/testing/mac/Samples.suite/Results
\ No newline at end of file
diff --git a/dart.gyp b/dart.gyp
index f5ac7ba..9bfc1d3 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -35,7 +35,7 @@
         ['OS!="android"', {
           'dependencies': [
             'runtime/dart-runtime.gyp:test_extension',
-            'samples/sample_extension/sample_extension.gyp:sample_extension',
+            'runtime/dart-runtime.gyp:sample_extension',
           ],
         }],
       ],
@@ -86,6 +86,9 @@
       'dependencies': [
         'create_sdk',
       ],
+      'inputs': [
+        '<(PRODUCT_DIR)/dart-sdk/README',
+      ],
       'actions': [
         {
           'action_name': 'upload_sdk_py',
@@ -155,7 +158,10 @@
       'target_name': 'api_docs',
       'type': 'none',
       'dependencies': [
+        # TODO(alanknight) : Once we're fully switched over to the new
+        # viewer remove the old api_docs gyp file.
         'utils/apidoc/apidoc.gyp:api_docs',
+        'utils/apidoc/docgen.gyp:docgen',
       ],
     },
     {
@@ -203,7 +209,7 @@
       'conditions': [
         ['OS!="android"', {
            'dependencies': [
-             'samples/sample_extension/sample_extension.gyp:sample_extension',
+             'runtime/dart-runtime.gyp:sample_extension',
            ],
           },
         ],
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 9237bdc..b5d0f47 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -5,23 +5,21 @@
 \usepackage{hyperref}
 \newcommand{\code}[1]{{\sf #1}}
 \title{Dart Programming Language  Specification \\
-{\large Draft Version 0.8}}
+{\large Version 1.0}}
 \author{The Dart Team}
 \begin{document}
 \maketitle
 
 \tableofcontents
 
+
 \newpage
 
 \pagestyle{myheadings}
-\markright{{\bf Draft}  Dart Programming Language Specification {\bf Draft}}
+\markright{Dart Programming Language Specification}
 
 \section{Notes}
 
-Expect the contents and language rules to change over time.
-%Please mail comments to gbracha@google.com.
-
 \subsection{Licensing}
 \label{licensing}
 
@@ -34,502 +32,6 @@
   
   http://code.google.com/google\_bsd\_license.html.
   
-\subsection{Change Log}
-\label{changes}
-
-\subsubsection{Changes Since Version 0.02}
-
-The following changes have been made in version 0.03 since version 0.02. In addition, various typographical errors have been corrected. The changes are listed by section number.
-
-\ref{notation}: Expanded examples of grammar.
-
-\ref{factories}: Corrected reference to undefined production {\em typeVariables} to {\em typeParameters}.
-
- \ref{superinterfaces}: Removed static warning when imported superinterface of a class contains private members.
-
-The former section on factories and constructors in interfaces (now removed): Removed redundant prohibition on default values.
-
-\ref{interfaceSuperinterfaces}: Removed static warning when imported superinterface of an interface contains private members.
-
-\ref{expressions}: Fixed typo in grammar.
-
-\ref{new}, \ref{const} : made explicit accessibility requirement for class being constructed.
-
-\ref{const}: make clear that referenced constructor must be marked \CONST{}.
-
-\ref{superInvocation}: fixed botched sentence where superclass $S$ is introduced.
-
-\ref{postfixExpressions}: qualified definition of $v++$ so it is clear that $v$ is an identifier.
-
-
-
-\subsubsection{Changes Since Version 0.03}
-
-\ref{instanceMethods}. The former section on interface methods (now removed): Added missing requirement that overriding methods have same number of required parameters and all optional parameters as overridden method, in same order.
-
-\ref{generics}:  Added prohibition against cyclic type hierarchy for type parameters.
-
-\ref{instanceCreation}: Clarified requirements on use of parameterized types in instance creation expressions.
-
-\ref{bindingActualsToFormals}: Added requirement that $q_i$ are distinct.
-
-\ref{staticInvocation}. Static method invocation determines the function (which may involve evaluating a getter) before evaluating the arguments, so that static invocation and top-level function invocation agree.
-
-\ref{typeTest}: Added missing test that type being tested against is in scope and is indeed a type.
-
-\ref{forLoop}:  Changed for loop to introduce fresh variable for each iteration.
-
-\ref{parameterizedTypes}: Malformed parameterized types generate warnings, not errors(except when used in reified contexts like instance creation and superclasses/interfaces).
-
-
-\subsubsection{Changes Since Version 0.04}
-
-Added hyperlinks in PDF.
-
-\ref{operators}: Removed unary plus operator. Clarified that operator formals must be required.
-
-\ref{constantConstructors}:  Filled in a lot of missing detail.
-
-The former section on factories and constructors in interfaces (now removed): Allowed factory class to be declared via a qualified name.
-
-\ref{numbers}:  Changed production for $Number$. 
-
-\ref{const}: Added requirements that actuals be constant, rules for dealing with inappropriate types of actuals, and examples. Also explicitly prohibit type parameters.
-
-\ref{functionExpressionInvocation}: Modified final bullet to keep it inline with similar clauses in other sections. Exact wording of these sections also tweaked slightly.
-
-\ref{unaryExpressions}: Specified !  operator. Eliminated section on prefix expressions and moved contents to section on unary expressions.
-
-\ref{lexicalRules}: Specified unicode form of Dart source.
-
-
-\subsubsection{Changes Since Version 0.05}
-
-\ref{generativeConstructors}: Clarified how initializing formals can act as optional parameters of generative constructors.
-
-\ref{factories}: Treat factories as constructors, so type parameters are implicitly in scope.
-
-The former section on factories and constructors in interfaces (now removed): Simplify rules for interface factory clauses. Use the keyword \DEFAULT{} instead of \FACTORY{}.
-
-\ref{generics}: Mention that typedefs can have type parameters.
-
-\ref{typeTest}: Added checked mode test that type arguments match generic type.
-
-\ref{dynamicTypeSystem}: Added definition of malformed types, and requirement on their handling in checked mode.
-
-\subsubsection{Changes Since Version 0.06}
-
-\ref{variables}: library variable initializers must be constant.
-
-\ref{classes}: Added \ABSTRACT{} modifier to grammar. 
-
-\ref{classes}, \ref{staticMethods}, \ref{staticVariables}, \ref{unqualifiedInvocation},\ref{identifierReference}: Superclass static members are not in scope in subclasses, and do not conflict with subclass members.
-
-\ref{operators}:  \code{[]=} must return \VOID{}. Operator \CALL{} added to support function emulation. Removed operator \code{$>>>$}. Made explicit restriction on methods named \CALL{} or \NEGATE{}.
-
-\ref{constants}: Added \code{!$e$} as constant expression. Clarified what happens if evaluation of a constant fails.
-
-\ref{maps}: Map keys need not be constants. However, they are always string literals.
-
-\ref{this}: State restrictions on use of \THIS{}.
-
-\ref{instanceCreation}, \ref{new}: Rules for bounds checking of constructor arguments when calling default constructors for interfaces refined.
-
-\ref{ordinaryInvocation}: Revised semantics to account for function emulation.
-
-\ref{staticInvocation}: Revised semantics to account for function emulation.
-
-\ref{superInvocation}: Factory constructors cannot contain super invocations. Revised semantics to account for function emulation.
-
-\ref{assignment}: Specified assignment involving \code{[]=} operator.
-
-\ref{compoundAssignment}: Removed operator \code{$>>>$}.
-
-\ref{shift}: Removed operator \code{$>>>$}.
-
-\ref{postfixExpressions}: Postfix \code{-{}-} operator specified.  Behavior of postfix operations on subscripted expressions specified.
-
-\ref{identifierReference}: Added built-in identifier \CALL{}.  Banned use of built-in identifiers as types made other uses warnings.
-
-\ref{typeTest}: Moved specification of test that type arguments match generic type to \ref{dynamicTypeSystem}.
-
-\ref{switch}: Corrected evaluation of case clauses so that case expression is the receiver of ==.  Revised specification to correctly deal with blank  statements in case clauses.
-
-\ref{assert}: Fixed bug in \ASSERT{} specification that could lead to puzzlers.
-
-\ref{dynamicTypeSystem}: Consolidated definition of malformed types.
-
-\ref{functionTypes}: Revised semantics to account for function emulation.
-
-
-\subsubsection{Changes Since Version 0.07}
-
-\ref{variables}: Static variables are lazily initialized, but need not be constants. Orthogonal notion of constant variable introduced.
-
-\ref{operators}: Added \EQUALS{} operator as part of revised \code{==} treatment.
-
-\ref{generativeConstructors}: Initializing formals have the same type as the field they correspond to.
-
-\ref{staticVariables}: Static variable getter rules revised to deal with lazy initialization.
-
-\ref{expressions}: Modified syntax to support cascaded method invocations.
-
-\ref{constants}:  Removed support for + operator on Strings.  Extended string constants to support certain cases of string interpolation. Revised constants to deal with constant variables.
-
-\ref{strings}: Corrected definition of \code{HEX\_DIGIT\_SEQUENCE}. Support implicit concatenation of adjacent single line strings. 
-
-\ref{bindingActualsToFormals}: Centralized and corrected type rules for function invocation.
-
-\ref{methodInvocation}: Moved rules for checking function/method invocations to \ref{bindingActualsToFormals}. Added definition of cascaded method invocations.
-
-\ref{getterInvocation}, \ref{assignment}: Updated \code{noSuchMethod()} call for getters and setters to conform to planned API.
-
-\ref{conditional}: Modified syntax to support cascaded method invocations.
-
-\ref{equality}: Revised semantics for \code{==}.
-
-\ref{identifierReference}: Removed \IMPORT{}, \LIBRARY{} and \SOURCE{} from list of built-in identifiers and added \EQUALS{}. Revised rules for evaluating identifiers to deal with lazy static variable initialization.
-
-\ref{continue}: Fixed bug that allowed \CONTINUE{} labeled on non-loops.
-
-\ref{librariesAndScripts}: Revised syntax so no space is permitted between \code{\#} and directives. Introduced \code{show:} combinator. Describe \code{prefix:} as a combinator. Added initial discussion of namespaces. Preclude string interpolation in arguments to directives.
-
-\subsubsection{Changes Since Version 0.08}
-
-\ref{instanceMethods}, \ref{abstractInstanceMembers}: Abstract methods may specify default values.
-
-\ref{interfaces}, The former section on interface methods (now removed): Interface methods may specify default values.
-
-\ref{constants}: The \code{\~{}/ } operator can apply to doubles.
-
-\ref{instanceCreation}: Refined rules regarding abstract class instantiation, allowing factories to be used.
-
-\ref{switch}: \SWITCH{} statement specification revised.
-
-\ref{throw}: \THROW{} may not throw \NULL{}.
-
-\ref{imports}: Imports introduce a scope separate from the library scope. Multiple libraries may share prefix. 
-
-\ref{typedef}: Recursive typedefs disallowed.
-
-\subsubsection{Changes Since Version 0.09}
-
-\ref{scoping}: Consolidated discussion of namespaces and scopes. Started to tighten up definitions of scopes.
-
-\ref{classes}: Overriding of fields allowed.
-
-\ref{operators}: \CALL{} is no longer an operator.
-
-The former section on variables in interfaces (now removed): Added specification of variable declarations in interfaces.
-
-\ref{constants}: Static methods and top-level functions are compile-time constants.
-
-\ref{strings}: Multiline strings can be implicitly concatenated and contain interpolated expressions.
-
-\ref{typeCast}: Type cast expression added.
-
-\ref{expressionStatements}: Map literals cannot be expression statements.
-
-\ref{try}, \ref{throw}: Clarified type of stack trace.
-
-\ref{exports}, \ref{imports}: Added re-export facility.
-
-
-\subsubsection{Changes Since Version 0.10}
-
-\ref{overview}: Discuss reified runtime types.
-
-\ref{scoping}: Removed shadowing warnings. Allow overloading of \code{-}.
-
-\ref{variables}: Centralized discussion of implicit getters and setters.
-
-\ref{externalFunctions}: External functions added.
-
-\ref{classes}: Abstract classes must now be declared explicitly.
-
-\ref{operators}: Eliminate \NEGATE{} in favor of overloaded unary minus. Eliminate \EQUALS{} in favor of operator \code{==}.
-
-\ref{setters}: Setter syntax no longer includes = sign after the name.
-
-\ref{abstractInstanceMembers}:  Clarify  that getters and setters may be abstract. Eliminate \ABSTRACT{} modifier for abstract members. Added static warning if abstract class has abstract member.
-
-\ref{instanceVariables}: Instance variables can be initialized to non-constants. Moved discussion of implicit getters and setters to \ref{variables}.
-
-\ref{generativeConstructors}:  Clarify that finals can only be set once.
-
-\ref{redirectingFactoryConstructors}: Added redirecting factories.
-
-\ref{staticVariables}: Moved discussion of implicit getters and setters to \ref{variables}.
-
-\ref{interfaces}: Eliminated interface declarations.
-
-\ref{metadata}: Added metadata.
-
-\ref{constants}: Refined definition constant identity/caching.
-
-\ref{throw}: Stack traces moved to \ref{try}.
-
-\ref{new}: Creating an instance via \NEW{} using an undefined class or constructor is a dynamic error and a static warning, not a compile-time error.  Evaluation rules to allow instance variables with non-constant initializers.  Instantiating an abstract class via a generative constructor is now a dynamic error.
-
-\ref{equality}: Replaced \code{===} with built-in function \code{identical()}. Equality does not special case identity.
-
-\ref{identifierReference}: Type names have meaning as expressions. \ASSERT{} is not a built-in identifier anymore, but \EXPORT{}, \IMPORT{}, \LIBRARY{} and \PART{} are. Removed warning on use of built-in identifiers as variable/function names.
-
-\ref{typeCast}: type cast accepts \NULL{}.
-
-\ref{argumentDefinitionTest}: Added operation to determine if optional argument was actually passed.
-
-\ref{localFunctionDeclaration}: Added section on local functions.
-
-\ref{switch}: Allow switch on compile-time constants of any one type.
-
-\ref{try}: Revised syntax for \CATCH{} clauses. Specification of stack traces moved from \ref{throw}.
-
-\ref{return}: Made explicit that checked mode tests returns.
-
-\ref{assert}:  \ASSERT{} is now a reserved word.
-
-\ref{librariesAndScripts}: Revised library syntax and semantics.
-
-\ref{typeDynamic}: Renamed {\bf Dynamic} to \DYNAMIC{}.
-
-\ref{reservedWords}:  \ASSERT{} is a reserved word.
-
-
-\subsubsection{Changes Since Version 0.11}
-
-\ref{notation}: Moved discussion of tokenization to section \ref{reference}.
-
-\ref{numbers}: Removed unary plus.
-
-\ref{librariesAndScripts}: Refined definition of show and hide to handle getters and setters in pairs.
-
-\ref{functionTypes}: All function types are subtypes of \code{Function}.
-
-\ref{reference}: Added discussion of tokenization.
-
-\ref{reservedWords}: Defined meaning of reserved word.
-
-\ref{comments}: Added initial discussion of dartdoc comments.
-
-\subsubsection{Changes Since Version 0.12}
-
-\ref{classes}: Removed \ABSTRACT{} modifier from grammar of members. Added grammar for \WITH{} clause.
-
-\ref{superclasses}: Added discussion of new \WITH{} clause for mixins.
-
-\ref{mixins}: Added specification of mixins.
-
-\ref{constants}: Revised description of \code{identical()} so that it always returns \TRUE{} on numbers with the same class and value. 
-
-\ref{null}: Invocations on \NULL{} throw \code{NoSuchMethodError} only.
-
-\ref{throw}: \THROW{} of \NULL{} raises \code{NullThrownError}.
-
-\ref{instanceCreation} Using undefined types as type arguments to a constructor is a dynamic failure.
-
-\ref{librariesAndScripts}: Added discussion of compilation units.  Allow name clause to be optional for libraries, allow export clauses in scripts. Support fully qualified name for libraries. Allow different imports to share same prefix. Added mixin application as a top level declaration.
-
-\ref{typedef}: Typedefs for mixin applications added.
-
-\ref{interfaceTypes}: Add effects of mixin clause on subtyping.
-
-\ref{leastUpperBounds}: Corrected definition of LUBs.
-
-\ref{reservedWords}: Added keyword \WITH{}.
-
-
-\subsubsection{Changes Since Version 0.20}
-
-\ref{getters}: Getters cannot return \VOID{}.
-
-\ref{superinterfaces}: Added requirement that superclass cannot appear in \IMPLEMENTS{} clause.
-
-\ref{interfaceInheritanceAndOverriding}: Clarified status of getter/setter vs. method conflicts in multiple interface inheritance.
-
-\ref{throw}: Separated \THROW{} into \code{\THROW{} e} and \code{\RETHROW{}}.
-
-\ref{new}:  Arguments to constructor are evaluated before allocating new object.
-
-\ref{unqualifiedInvocation}: Calling an undeclared method in a static context is a dynamic error (and a static warning) not a compile-time one.
-
-\ref{ordinaryInvocation}, \ref{superInvocation}, \ref{getterInvocation}, \ref{assignment}: Refined description of \code{InvocationMirror} instance passed to \code{noSuchMethod()}.
-
-\ref{lexicalRules}: Abandoned requirement for Unicode Normalization Form C.
-
-\subsubsection{Changes Since Version 0.30}
-
-\ref{superclasses}, \ref{superinterfaces}: Clarified that super types with wrong number of type arguments cause a compilation error.
-
-\subsubsection{Changes Since Version 0.31}
-
-\ref{abstractInstanceMembers}: Abstract methods act as pure declarations.
-
-\ref{mixins}: Mixin application has forwarding constructors for all superclass constructors.
-
-\ref{instanceCreation}, \ref{new}: Revised so that wrong generic arity is a runtime error with static warning. 
-
-\ref{typeTest}, \ref{typeCast}:  Eliminated special treatment of malformed types.
-
-\ref{rethrow}:  Rethrow is a statement, not an expression.
-
-\ref{librariesAndScripts}: Semicolon required after top-level external declarations.
-
-\ref{imports}: Removed requirement that library names be unique within an isolate.
-
-\ref{dynamicTypeSystem}: Revised definition of malformed types. Revised behavior of checked and production modes wrt to malformed and malbounded types. Refined assignability rules wrt new function type subtyping.
-
-\ref{interfaceTypes}: Corrected oversight wrt type variables and \cd{Object}.
-
-\ref{functionTypes}: Liberalized function subtyping rules. Special assignability rules.
-
-\ref{parameterizedTypes}: Out with misconstructed types, in with malbounded ones.
-
-\subsubsection{Changes Since Version 0.40}
-
-\ref{expressions}: Argument definition test construct dropped.
-
-\ref{maps}: Map literals can be keyed by arbitrary expressions.
-
-\ref{librariesAndScripts}: Implicitly named libraries are named `'. Script tags are allowed in all libraries. It is a warning to import or export two libraries with the same name.
-
-\subsubsection{Changes Since Version 0.41}
-
-\ref{variables}: Uninitialized final is now just a static warning.
-
-\ref{typeOfAFunction}: Added details about the run time type of functions.
-
-\ref{instanceVariables}: Disallowed const inst vars.
-
-\ref{redirectingConstructors}: Uninitialized final is now just a static warning.
-
-\ref{objectIdentity}, \ref{constants}: Clarified rules for double identity.
-
-\ref{maps}: Adjusted rules for constant map literals.
-
-\ref{propertyExtraction}: If the same method is extracted repeatedly from the same object, the results are equal.  Furthermore, the type of the property extraction is based on the method being closurized. Also described handling of  property extractions on \SUPER{} explicitly.
-
-\ref{getterInvocation}:  Explicitly described getter invocations on \SUPER{}.
-
-\subsubsection{Changes Since Version 0.50}
-
-% there was no public 0.50!
-
-\ref{variables}: Final variables introduce setters that trap on execution. Not initializing a final is a warning, not an error.  Initializing a final variable declared with an initializer is a warning, not an error. 
-
-\ref{requiredFormals}: Initializing formals can specify function types.  These may not specify defaults.
-
-\ref{instanceMethods}: Corrected override rules to fit with earlier relaxation of function subtype rules. Furthermore, bad overrides provoke warnings not errors. Also, methods and corresponding setters yield warnings.
-
-\ref{generativeConstructors}:  Initializing a final variable declared with an initializer is a warning, not an error. 
-
-\ref{staticMethods}: Corresponding setters yield warnings.
-
-\ref{inheritanceAndOverriding}: Refined definitions of inheritance and overriding to correctly account for library privacy.
-
-\ref{superinterfaces}: Suppress type warnings for unimplemented members of superinterfaces if the class declares \code{noSuchMethod()}.
-
-\ref{interfaceInheritanceAndOverriding}: Refined definitions of inheritance and overriding to correctly account for library privacy.
-
-\ref{constants}: Literal symbols are constants.
-
-\ref{numbers}, \ref{booleans}, \ref{strings}: Specified the runtime type of numbers, booleans and strings.
-
-\ref{strings}: Implicit concatenation works among all kinds of strings.
-
-\ref{symbols}: Added literal symbols.
-
-\ref{if}, \ref{for}, \ref{while}, \ref{do}: Single statements in control constructs implicitly introduce a block.
-
-\ref{imports}: Introduced special treatment for imports conflicts with \code{dart:core}. Ambiguous names are treated as malformed types or \code{NoSuchMethodError}s.
-
-\ref{typedef}: Tightened restrictions on recursive typedefs.
-
-%\ref{typeDynamic}: Clarified that \DYNAMIC{} is not an expression.
-
-\subsubsection{Changes Since Version 0.51}
-
-\ref{classes}: Mixin applications are a kind of class definition.
-
-\ref{generativeConstructors}: Clarify that executing repeated initialization of a final variable by an initializer or initializing formal is a run-time error.
-
-\ref{mixins}: Mixin applications are defined using  \CLASS{}  rather than \TYPEDEF{}.
-
-\ref{objectIdentity}: Refined definition of \code{identical()}.
-
-\ref{propertyExtraction}:  Abstract methods are ignored for purposes of property extraction.
-
-\ref{bindingActualsToFormals}: Mismatched arguments lead to \cd{NoSuchMethodError}.
-
-\ref{ordinaryInvocation}, \ref{superInvocation}: Correctly account for calls to \cd{noSuchMethod} due to mismatched arguments.
-
-\ref{imports}, \ref{exports}:  Provenance of declarations allowed to disambiguate imports and exports.
-
-\ref{typedef}: Mixin applications are no longer defined via a \TYPEDEF{}.
-
-\ref{functionTypes}: All functions must implement \CALL{}.
-
-\ref{comments}: Doc comments details are unspecified.
-
-\subsubsection{Changes Since Version 0.6}
-
-\ref{variables}: Type promotion support added.
-
-\ref{formalParameters}: refined scope rules.
-
-\ref{classes}: Banned name clashes between type variables and members etc.
-
-\ref{factories}: Banned default values in redirecting factories.
-
-\ref{constants}: Added constant conditional expressions.
-
-\ref{strings}: Allow adjacent single and multiline strings to concatenate. Allow escaped newlines in multiline strings.
-
-\ref{const}: Allow parameterized types in const instance creation.
-
-\ref{conditional}: Type promotion support added.
-
-\ref{logicalBooleanExpressions}: Type promotion support added.
-
-\ref{logicalBooleanExpressions} - \ref{bitwiseExpressions}, \ref{operatorPrecedence}: Increased precedence of bitwise operations to be higher than equality and relational expressions.
-
-\ref{identifierReference}: Clarified static type rules. Type promotion support added.
-
-\ref{typeTest}: Type promotion support added.
-
-\ref{if}: Type promotion support added.
-
-\ref{try}: \ON{} with no \CATCH{} implies \DYNAMIC{}, not \cd{Object}.
-
-\ref{return}: Added warning if \RETURN{} without expression mixed with \RETURN{} with an expression.
-
-\ref{exports}: Ensure that exports treat \code{dart:} libs specially, like imports do.
-
-\ref{typePromotion}: Added notion of type promotion.
-
-\ref{typedef}: Banned all recursion in typedefs.
-
-\subsubsection{Changes Since Version 0.7}
-
-
-\ref{variables}: Final variables no longer introduce setters.
-
-\ref{superinterfaces}: Described \cd{@proxy} annotation's effects on typechecking.
-
-\ref{metadata}: Banned use of types as metadata.
-
-\ref{new}: Instantiating subclasses of malbounded types is a dynamic error.
-
-\ref{typeTest}, \ref{typeCast}, \ref{try}: Use of malformed type in casts, type tests and catch clauses is a dynamic error.
-
-\ref{scripts}: Corrected rules for running scripts.
-
-\ref{dynamicTypeSystem}: In checked mode, subtype tests against malbounded types are dynamic errors.
-
-\ref{leastUpperBounds}:  Extended LUBs to all types.
-
-
-
 \section{Notation}
 \label{notation}
 
@@ -636,7 +138,7 @@
 \subsection{Scoping}
 \label{scoping}
 
-A {\em namespace} is a mapping of identifiers to declarations.  Let $NS$ be a namespace. We say that a name $n$ {\em is in }$NS$ if $n$ is a key of $NS$. We say a declaration $d$ {\em is in }$NS$ if a key of $NS$ maps to $d$.
+A {\em namespace} is a mapping of names denoting declarations to actual declarations.  Let $NS$ be a namespace. We say that a name $n$ {\em is in }$NS$ if $n$ is a key of $NS$. We say a declaration $d$ {\em is in }$NS$ if a key of $NS$ maps to $d$.
 
 A scope $S_0$ induces a namespace $NS_0$ that maps the simple name of each variable, type or function declaration $d$ declared in $S_0$ to $d$. Labels are not included in the induced namespace of a scope; instead they have their own dedicated namespace.
 
@@ -891,7 +393,8 @@
 }
 
 \rationale{
-As a rule, type annotations are ignored in production mode. However, we do not want to allow programs to compile legally in one mode and not another, and in this extremely odd situation, that consideration takes precedence.
+As a rule, type annotations are ignored in production mode. However, we do 
+ not want to allow programs to compile legally in one mode and not another, and in this extremely odd situation, that consideration takes precedence.
 }
 
 \end{dartCode}
@@ -2029,7 +1532,7 @@
 
 \begin{enumerate}
 
-\item There is only one namespace for getters, setters, methods and constructors (\ref{scoping}). A field $f$ introduces a getter $f$ and a setter $f=$ (\ref{instanceVariables}, \ref{staticVariables}). When we speak of members here, we mean accessible fields, getters, setters and methods (\ref{classes}).
+\item There is only one namespace for getters, setters, methods and constructors (\ref{scoping}). A field $f$ introduces a getter $f$ and a non-final field $f$ also introduces a setter $f=$ (\ref{instanceVariables}, \ref{staticVariables}). When we speak of members here, we mean accessible fields, getters, setters and methods (\ref{classes}).
 \item You cannot have two  members with the same name in the same class - be they declared or inherited (\ref{scoping}, \ref{classes}).
 \item Static members are never inherited.
 \item It is a warning if you have an  static member named $m$ in your class or any superclass (even though it is not inherited) and an  instance member of the same name (\ref{instanceMethods}, \ref{getters}, \ref{setters}).
@@ -2060,7 +1563,7 @@
   \item  If possible the interface gets a member named $m$ that has the minimum number of required parameters among all the members in the superinterfaces, the maximal number of    positionals, and the superset of named parameters.  The types of these are all \DYNAMIC{}. If this is impossible then no member $m$ appears in the interface.
   \end{itemize}  (\ref{interfaceInheritanceAndOverriding})
 \item  Rule \ref{typeSigAssignable} applies to interfaces as well as classes  (\ref{interfaceInheritanceAndOverriding}).
-\item  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 \cd{noSuchMethod} method (\ref{superinterfaces}).
+\item  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 \cd{noSuchMethod} method (\ref{superinterfaces}) or is annotated with \cd{@proxy}.
 \item The identifier of a named constructor cannot be the same as the name of a member declared (as opposed to inherited) in the same class (\ref{constructors}).
 \end{enumerate}
 }
@@ -2288,13 +1791,23 @@
 Dart does not directly support mixin composition, but the concept is useful when defining how the superclass of a class with a mixin clause is created.
 }
 
-The {\em composition of two mixins}, $M_1<T_1 \ldots T_{k_{M_1}}>$ and $M_2<U_1  \ldots U_{k_{M_2}}>$, written $M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1  \ldots U_{k_{M_2}}>$ defines an anonymous mixin such that for any class $S<V_1 \ldots V_{k_S}>$, the application of $M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1  \ldots U_{k_{M_2}}>$  to $S<V_1 \ldots V_{k_S}>$ is equivalent to 
+The {\em composition of two mixins}, $M_1<T_1 \ldots T_{k_{M_1}}>$ and $M_2<U_1  \ldots U_{k_{M_2}}>$, written $M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1  \ldots U_{k_{M_2}}>$ defines an anonymous mixin such that for any class $S<V_1 \ldots V_{k_S}>$, the application of 
 
-\code{\ABSTRACT{} \CLASS{} $Id_1<T_1  \ldots T_{k_{M_1}}, U_1  \ldots U_{k_{M_2}}, V_1  \ldots V_{k_S}> = Id_2<U_1  \ldots U_{k_{M_2}}, V_1  \ldots V_{k_S}>$ \WITH{} $M_1 <T_1  \ldots T_{k_{M_1}}>$;}
+$M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1  \ldots U_{k_{M_2}}>$  
+
+to $S<V_1 \ldots V_{k_S}>$ is equivalent to 
+
+\begin{dartCode}
+\ABSTRACT{} \CLASS{} $Id_1<T_1  \ldots T_{k_{M_1}}, U_1  \ldots U_{k_{M_2}}, V_1  \ldots V_{k_S}> = $
+      $Id_2<U_1  \ldots U_{k_{M_2}}, V_1  \ldots V_{k_S}>$ \WITH{} $M_1 <T_1  \ldots T_{k_{M_1}}>$;
+\end{dartCode}
 
 where $Id_2$ denotes 
 
-\code{\ABSTRACT{}  \CLASS{} $Id_2<U_1 \ldots U_{k_{M_2}}, V_1 \ldots V_{k_S}> = S<V_1 \ldots V_{k_S}>$ \WITH{} $M_2<U_1  \ldots U_{k_{M_2}}>$; }
+\begin{dartCode}
+\ABSTRACT{}  \CLASS{} $Id_2<U_1 \ldots U_{k_{M_2}}, V_1 \ldots V_{k_S}> =$
+                         $S<V_1 \ldots V_{k_S}>$ \WITH{} $M_2<U_1  \ldots U_{k_{M_2}}>$; 
+\end{dartCode}
 
 and $Id_1$ and $Id_2$ are unique identifiers that do not exist anywhere in the program. 
 
@@ -2575,9 +2088,7 @@
     \IF{} (\TRUE{}) \{\RETURN{} y; \}
     \ELSE{} \{ \RETURN{} 3;\}
   \}  
-  
 \}
-
 \end{dartCode}
 
 \commentary{An implementation is free to immediately issue a compilation error for  \code{x}, but it is not required to do so.  It could defer errors if it does not immediately compile the declarations that reference \code{x}. For example, it could delay giving a compilation error about the method \code{m1} until the first invocation of \code{m1}. However, it could not choose to execute \code{m1},  see that the branch that refers to \code{x} is not taken and return 2 successfully. 
@@ -2848,7 +2359,9 @@
 \item $\backslash$b for backspace, equivalent to $\backslash$x08.
 \item $\backslash$t for tab, equivalent to $\backslash$x09.
 \item $\backslash$v for vertical tab, equivalent to $\backslash$x0B
-\item $\backslash$x $HEX\_DIGIT_1$ $HEX\_DIGIT_2$, equivalent to $\backslash$u\{$HEX\_DIGIT_1$ $HEX\_DIGIT_2$\}.
+\item $\backslash$x $HEX\_DIGIT_1$ $HEX\_DIGIT_2$, equivalent to 
+
+$\backslash$u\{$HEX\_DIGIT_1$ $HEX\_DIGIT_2$\}.
 \item $\backslash$u $HEX\_DIGIT_1$ $HEX\_DIGIT_2$ $HEX\_DIGIT_3$ $HEX\_DIGIT_4$, equivalent to $\backslash$u\{$HEX\_DIGIT_1$ $HEX\_DIGIT_2$ $HEX\_DIGIT_3$ $HEX\_DIGIT_4$\}.
 \item $\backslash$u\{$HEX\_DIGIT\_SEQUENCE$\} is the unicode scalar value represented by the $HEX\_DIGIT\_SEQUENCE$. It is a compile-time error if the value of the $HEX\_DIGIT\_SEQUENCE$ is not a valid unicode scalar value.
 \item \$ indicating the beginning of an interpolated expression.
@@ -3028,7 +2541,9 @@
 \begin{itemize}
 \item
 First, the expression $k_i$ is evaluated yielding object $u_i$, the $e_i$ is vaulted yielding object $o_i$, for $i \in 1..n$ in left to right order, yielding objects $u_1, o_1\ldots u_n, o_n$.
-\item  A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class $Map<K, V>$ is allocated. 
+\item  A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class
+ 
+ $Map<K, V>$ is allocated. 
 \item
 The operator \code{[]=} is invoked on $m$ with  first  argument $u_i$ and second argument $o_i,  i \in 1.. n$.
 \item
@@ -3036,7 +2551,9 @@
 \end{itemize}
 
 
-A runtime map literal  $\{k_1:e_1\ldots k_n :e_n\}$ is evaluated as  $<\DYNAMIC{},  \DYNAMIC{}>\{k_1:e_1\ldots k_n :e_n\}$.
+A runtime map literal  $\{k_1:e_1\ldots k_n :e_n\}$ is evaluated as  
+
+$<\DYNAMIC{},  \DYNAMIC{}>\{k_1:e_1\ldots k_n :e_n\}$.
 
 Iff all the keys in a map literal are compile-time constants, it is a static warning if the values of any two keys in a map literal are equal.
 
@@ -3105,13 +2622,29 @@
 
 %Q{Can anyone implement it? Then we should define things via call}
 
-The static type of a function literal of the form $(T_1$ $a_1, \ldots, T_n$ $a_n, [T_{n+1}$ $x_{n+1} = d_1, \ldots,  T_{n+k}$ $x_{n+k} = d_k]) => e$ is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow T_0$, where $T_0$ is the static type of $e$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
+The static type of a function literal of the form 
 
-The static type of a function literal of the form $(T_1$ $a_1, \ldots, T_n$ $a_n, \{T_{n+1}$ $x_{n+1} : d_1, \ldots,  T_{n+k}$ $x_{n+k} : d_k\}) => e$ is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow T_0$, where $T_0$ is the static type of $e$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
+$(T_1$ $a_1, \ldots, T_n$ $a_n, [T_{n+1}$ $x_{n+1} = d_1, \ldots,  T_{n+k}$ $x_{n+k} = d_k]) => e$ 
 
-The static type of a function literal of the form  $(T_1$ $a_1, \ldots, T_n$ $a_n, [T_{n+1}$ $x_{n+1} = d_1, \ldots,  T_{n+k}$ $x_{n+k}= d_k])\{s\}$ is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow  \DYNAMIC{}$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
+is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow T_0$, where $T_0$ is the static type of $e$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
 
-The static type of a function literal of the form  $(T_1$ $a_1, \ldots, T_n$ $a_n, \{T_{n+1}$ $x_{n+1} : d_1, \ldots,  T_{n+k}$ $x_{n+k} : d_k\})\{s\}$ is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow  \DYNAMIC{}$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
+The static type of a function literal of the form 
+
+$(T_1$ $a_1, \ldots, T_n$ $a_n, \{T_{n+1}$ $x_{n+1} : d_1, \ldots,  T_{n+k}$ $x_{n+k} : d_k\}) => e$ 
+
+is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow T_0$, where $T_0$ is the static type of $e$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
+
+The static type of a function literal of the form  
+
+$(T_1$ $a_1, \ldots, T_n$ $a_n, [T_{n+1}$ $x_{n+1} = d_1, \ldots,  T_{n+k}$ $x_{n+k}= d_k])\{s\}$ 
+
+is $(T_1 \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \rightarrow  \DYNAMIC{}$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
+
+The static type of a function literal of the form  
+
+$(T_1$ $a_1, \ldots, T_n$ $a_n, \{T_{n+1}$ $x_{n+1} : d_1, \ldots,  T_{n+k}$ $x_{n+k} : d_k\})\{s\}$ 
+
+is $(T_1 \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \rightarrow  \DYNAMIC{}$. In any case where $T_i, 1 \le i \le n+k$, is not specified, it is considered to have been specified as  \DYNAMIC{}.
 
 %** Now that declared return types are precluded, do we need some better return type rule for (x){s} and friends?
 
@@ -3226,7 +2759,9 @@
 
 Otherwise, $q$ is a factory constructor (\ref{factories}). Then:
 
-If $q$ is a redirecting factory constructor of the form $T(p_1, \ldots, p_{n+k}) = c;$ or of the form  $T.id(p_1, \ldots, p_{n+k}) = c;$ then the result of the evaluation of $e$ is equivalent to evaluating the expression $[V_1,  \ldots, V_m/T_1,  \ldots, T_m]($\code{\NEW{} $c(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k}))$}.
+If $q$ is a redirecting factory constructor of the form $T(p_1, \ldots, p_{n+k}) = c;$ or of the form  $T.id(p_1, \ldots, p_{n+k}) = c;$ then the result of the evaluation of $e$ is equivalent to evaluating the expression 
+
+$[V_1,  \ldots, V_m/T_1,  \ldots, T_m]($\code{\NEW{} $c(a_1, \ldots, a_n, x_{n+1}: a_{n+1}, \ldots, x_{n+k}: a_{n+k}))$}.
 
 Otherwise, the body of $q$ is executed with respect to the bindings that resulted from the evaluation of the argument list and the type parameters (if any) of $q$ bound to the actual type arguments $V_1, \ldots, V_l$ resulting in an object $i$. The result of the evaluation of $e$ is $i$.
 
@@ -3263,7 +2798,11 @@
 .
 \end{grammar}
 
-Let $e$ be a constant object expression of the form  \CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ or the form  \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. It is a compile-time error if $T$ does not denote a class accessible in the current scope. 
+Let $e$ be a constant object expression of the form  
+
+\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ 
+
+or the form  \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. It is a compile-time error if $T$ does not denote a class accessible in the current scope. 
 
 \commentary{In particular, $T$ may not be a type variable.}
 
@@ -3279,11 +2818,23 @@
 
 Evaluation of $e$ proceeds as follows:
 
-First, if $e$ is of the form \CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ then let $i$ be the value of the expression \NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. Otherwise, $e$ must be of the form  
+First, if $e$ is of the form 
+
+\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ 
+
+then let $i$ be the value of the expression 
+
+\NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. 
+
+Otherwise, $e$ must be of the form  
 
 \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$, 
 
-in which case let $i$ be the result of evaluating \NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. Then:
+in which case let $i$ be the result of evaluating 
+
+\NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. 
+
+Then:
 \begin{itemize}
 \item If during execution of the program, a constant object expression has already evaluated to an instance $j$ of class $R$ with type arguments $V_i, 1 \le i \le m$, then: 
 \begin{itemize}
@@ -3358,16 +2909,23 @@
 If $e$ is an expression that evaluates to an object $o$, and if $m$ is the name of a concrete method member of $e$, then $e.m$ is defined to be equivalent to:
 
 \begin{itemize}
- %\item $(r_1, \ldots, r_n)\{\RETURN{}$ $o.m(r_1, \ldots, r_n);\}$ if $m$ has only required parameters $r_1, \ldots r_n$.
-%\item $(r_1, \ldots, r_n, rest)\{return$  $o.m(r_1, \ldots, r_n, rest);\}$ if $m$ has required parameters $r_1, \ldots r_n$, and a rest parameter $rest$.
-%\item
 
-% so the issue is that o is not an expression, but we don't want to bind to e, as its evaluation
-% could have side effects, result in different objects at different times etc.
-% so we use  u, where u is a fresh final variable bound to o 
-%
-\item  $(r_1, \ldots, r_n, \{p_1 : d_1, \ldots , p_k : d_k\})\{$\RETURN{} $u.m(r_1, \ldots, r_n, p_1: p_1, \ldots, p_k: p_k);\}$ if $m$ has required parameters $r_1, \ldots, r_n$, and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
-\item $(r_1, \ldots, r_n, [p_1 = d_1, \ldots , p_k = d_k])\{$\RETURN{} $u.m(r_1, \ldots, r_n, p_1, \ldots, p_k);\}$ if $m$ has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\item  
+\begin{dartCode}
+$(r_1, \ldots, r_n, \{p_1 : d_1, \ldots , p_k : d_k\})$ \{
+  \RETURN{} $ u.m(r_1, \ldots, r_n, p_1: p_1, \ldots, p_k: p_k);$
+\} 
+\end{dartCode}
+
+if $m$ has required parameters $r_1, \ldots, r_n$, and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\item 
+\begin{dartCode}
+$(r_1, \ldots, r_n, [p_1 = d_1, \ldots , p_k = d_k])$\{
+  \RETURN{} $u.m(r_1, \ldots, r_n, p_1, \ldots, p_k)$;
+\}
+\end{dartCode}
+
+if $m$ has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
 \end{itemize}
 
 where $u$ is a fresh final variable bound to $o$, except that:
@@ -3403,8 +2961,22 @@
  %\item $(r_1, \ldots, r_n)\{\RETURN{}$ $o.m(r_1, \ldots, r_n);\}$ if $m$ has only required parameters $r_1, \ldots r_n$.
 %\item $(r_1, \ldots, r_n, rest)\{return$  $o.m(r_1, \ldots, r_n, rest);\}$ if $m$ has required parameters $r_1, \ldots r_n$, and a rest parameter $rest$.
 %\item
-\item  $(r_1, \ldots, r_n, \{p_1 : d_1, \ldots , p_k : d_k\})\{$\RETURN{} $\SUPER{}.m(r_1, \ldots, r_n, p_1: p_1, \ldots, p_k: p_k);\}$ if $m$ has required parameters $r_1, \ldots, r_n$, and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
-\item $(r_1, \ldots, r_n, [p_1 = d_1, \ldots , p_k = d_k])\{$\RETURN{} $\SUPER{}.m(r_1, \ldots, r_n, p_1, \ldots, p_k);\}$ if $m$ has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\item  
+\begin{dartCode}
+$(r_1, \ldots, r_n, \{p_1 : d_1, \ldots , p_k : d_k\})$\{
+   \RETURN{} \SUPER{}$.m(r_1, \ldots, r_n, p_1: p_1, \ldots, p_k: p_k)$;
+\}
+\end{dartCode}
+
+if $m$ has required parameters $r_1, \ldots, r_n$, and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\item 
+\begin{dartCode}
+$(r_1, \ldots, r_n, [p_1 = d_1, \ldots , p_k = d_k])$\{
+   \RETURN{} \SUPER{}$.m(r_1, \ldots, r_n, p_1, \ldots, p_k)$;
+\} 
+\end{dartCode}
+
+if $m$ has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
 \end{itemize}
 
 Except that:
@@ -3452,7 +3024,11 @@
     .
  \end{grammar}
 
-Evaluation of an actual argument list of the form $(a_1, \ldots, a_m, q_1: a_{m+1}, \ldots, q_l: a_{m+l})$ proceeds as follows:
+Evaluation of an actual argument list of the form 
+
+$(a_1, \ldots, a_m, q_1: a_{m+1}, \ldots, q_l: a_{m+l})$ 
+
+proceeds as follows:
 
 The arguments $a_1, \ldots, a_{m+l}$ are evaluated in the order they appear in the program, yielding objects $o_1, \ldots, o_{m+l}$.
 
@@ -3629,7 +3205,10 @@
 \label{staticInvocation}
 
 A static method invocation $i$ has the form 
-$C.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ where $C$ denotes a class in the current scope.
+
+$C.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ 
+
+where $C$ denotes a class in the current scope.
 
 It is a static warning if $C$ does not declare a static method or getter $m$.
 
@@ -4193,19 +3772,33 @@
 \rationale{The above ensures that if $v$ is a field, the getter gets called exactly once. Likewise in the cases below. 
 }
 
-A postfix expression of the form \code{$C.v$ ++} is equivalent to \code{()\{var r = $C.v$; $C.v$ = r + 1; return r\}()}.
+A postfix expression of the form \code{$C.v$ ++} is equivalent to 
 
-A postfix expression of the form \code{$e_1.v$++} is equivalent to \code{(x)\{var r = x.v; x.v = r + 1; \RETURN{} r\}($e_1$)}.
+\code{()\{var r = $C.v$; $C.v$ = r + 1; return r\}()}.
 
-A postfix expression of the form \code{$e_1[e_2]$++},  is equivalent to \code{(a, i)\{var r = a[i]; a[i] = r + 1; return r\}($e_1$, $e_2$)}.
+A postfix expression of the form \code{$e_1.v$++} is equivalent to 
 
-A postfix expression of the form \code{$v$-{}-}, where $v$ is an identifier, is equivalent to \code{()\{var r = $v$; $v$ = r - 1; return r\}()}.
+\code{(x)\{var r = x.v; x.v = r + 1; \RETURN{} r\}($e_1$)}.
 
-A postfix expression of the form \code{$C.v$-{}-} is equivalent to \code{()\{var r = $C.v$; $C.v$ = r - 1; return r\}()}.
+A postfix expression of the form \code{$e_1[e_2]$++},  is equivalent to 
 
-A postfix expression of the form \code{$e_1.v$-{}-} is equivalent to \code{(x)\{var r = x.v; x.v = r - 1; \RETURN{} r\}($e_1$)}.
+\code{(a, i)\{var r = a[i]; a[i] = r + 1; return r\}($e_1$, $e_2$)}.
 
-A postfix expression of the form \code{$e_1[e_2]$-{}-},  is equivalent to \code{(a, i)\{var r = a[i]; a[i] = r - 1; return r\}($e_1$, $e_2$)}.
+A postfix expression of the form \code{$v$-{}-}, where $v$ is an identifier, is equivalent to 
+
+\code{()\{var r = $v$; $v$ = r - 1; return r\}()}.
+
+A postfix expression of the form \code{$C.v$-{}-} is equivalent to 
+
+\code{()\{var r = $C.v$; $C.v$ = r - 1; return r\}()}.
+
+A postfix expression of the form \code{$e_1.v$-{}-} is equivalent to 
+
+\code{(x)\{var r = x.v; x.v = r - 1; \RETURN{} r\}($e_1$)}.
+
+A postfix expression of the form \code{$e_1[e_2]$-{}-},  is equivalent to 
+
+\code{(a, i)\{var r = a[i]; a[i] = r - 1; return r\}($e_1$, $e_2$)}.
  
 
 \subsection{ Assignable Expressions}
@@ -4775,7 +4368,28 @@
     .
  \end{grammar}
  
- Given a switch statement of the form \code{\SWITCH{} ($e$) \{ \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1 \ldots$  \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ \DEFAULT{}: $s_{n+1}$ \}} or the form \code{\SWITCH{} ($e$) \{ \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1 \ldots$  \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ \}}, it is a compile-time error if the expressions $e_k$ are not compile-time constants for all  $k \in 1..n$.  It is a compile-time error if the values of the expressions $e_k$ are not either:
+ Given a switch statement of the form 
+ 
+\begin{dartCode}
+\SWITCH{} ($e$) \{ 
+   \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1$ 
+   $\ldots$  
+   \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ 
+   \DEFAULT{}: $s_{n+1}$ 
+\}
+\end{dartCode}
+ 
+ or the form 
+ 
+\begin{dartCode}
+\SWITCH{} ($e$) \{ 
+   \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1$
+   $\ldots$  
+   \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ 
+\}
+\end{dartCode}
+ 
+ it is a compile-time error if the expressions $e_k$ are not compile-time constants for all  $k \in 1..n$.  It is a compile-time error if the values of the expressions $e_k$ are not either:
  \begin{itemize}
  \item instances of the same class $C$, for all $k \in 1..n$,  or 
  \item instances of a class that implements \cd{int}, for all $k \in 1..n$,  or 
@@ -4796,7 +4410,28 @@
 The \SWITCH{}  statement should only be used in very limited situations (e.g., interpreters or scanners).  
 }
 
-Execution of a switch statement of the form \code{\SWITCH{} ($e$) \{ \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1 \ldots$  \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ \DEFAULT{}: $s_{n+1}$ \}} or the form \code{\SWITCH{} ($e$) \{ \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1 \ldots$  \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ \}} proceeds as follows:
+Execution of a switch statement of the form
+
+\begin{dartCode}
+\SWITCH{} ($e$) \{ 
+   \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1$ 
+   $\ldots$  
+   \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ 
+   \DEFAULT{}: $s_{n+1}$ 
+\}
+\end{dartCode}
+ 
+or the form 
+ 
+\begin{dartCode}
+\SWITCH{} ($e$) \{ 
+   \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1$
+   $\ldots$  
+   \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ 
+\}
+\end{dartCode}
+
+proceeds as follows:
 
 The statement \code{\VAR{} id = $e$;} is evaluated, where \code{id} is a variable whose name is distinct from any other variable in the program. In checked mode, it is a run time error if the value of $e$ is not an instance of the same class as the constants $e_1 \ldots e_n$. 
 
@@ -4806,14 +4441,35 @@
 
 A case clause introduces a new scope, nested in the lexically surrounding scope. The scope of a case clause ends immediately after the case clause's statement list.
 
-Execution of a \CASE{} clause \CASE{} $e_{k}: s_{k}$ of a  switch statement  \code{\SWITCH{} ($e$) \{  $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1 \ldots$ $label_{n1} \ldots label_{nj_n}$ \CASE{}  $e_n: s_n$ \DEFAULT{}: $s_{n+1}$ \}} proceeds as follows:
+Execution of a \CASE{} clause \CASE{} $e_{k}: s_{k}$ of a  switch statement  
+
+\begin{dartCode}
+\SWITCH{} ($e$) \{ 
+   \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1$ 
+   $\ldots$  
+   \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ 
+   \DEFAULT{}: $s_{n+1}$ 
+\}
+\end{dartCode}
+
+proceeds as follows:
 
 The expression \code{$e_k$ == id} is evaluated to an object $o$ which is then subjected to boolean conversion yielding a value $v$. 
 If $v$ is not  \TRUE{} the following case,  \CASE{} $e_{k+1}: s_{k+1}$ is executed if it exists. If  \CASE{} $e_{k+1}: s_{k+1}$ does not exist, then the \DEFAULT{} clause is executed by executing $s_{n+1}$.
 If $v$ is \TRUE{},   let $h$ be the smallest number such that $h \ge k$ and $s_h$ is non-empty. If no such $h$ exists, let $h = n + 1$. The  sequence of statements $s_h$ is then executed.
 If execution reaches the point after $s_h$  then  a runtime error occurs, unless $h = n+1$.
 
-Execution of a \CASE{} clause \CASE{} $e_{k}: s_{k}$ of a  switch statement  \code{\SWITCH{} ($e$) \{  $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1 \ldots$ $label_{n1} \ldots label_{nj_n}$ \CASE{}  $e_n: s_n$ \}} proceeds as follows:
+Execution of a \CASE{} clause \CASE{} $e_{k}: s_{k}$ of a  switch statement  
+
+\begin{dartCode}
+\SWITCH{} ($e$) \{ 
+   \CASE{} $label_{11} \ldots label_{1j_1}$ $e_1: s_1$
+   $\ldots$  
+   \CASE{} $label_{n1} \ldots label_{nj_n}$ $e_n: s_n$ 
+\}
+\end{dartCode}
+
+proceeds as follows:
 
 The expression \code{$e_k$ == id} is evaluated to an object $o$ which is then subjected to boolean conversion yielding a value $v$. 
 If $v$ is not  \TRUE{} the following case,  \CASE{} $e_{k+1}: s_{k+1}$ is executed if it exists. 
@@ -4902,12 +4558,15 @@
 The syntax is designed to be upward compatible with existing Javascript programs. The \ON{} clause can be omitted, leaving what looks like a Javascript catch clause.
 }
 
-An \ON{}-\CATCH{} clause of   the form   \code{\ON{} $T$ \CATCH{} ($p_1, p_2$) $s$}  {\em matches} an object $o$  if the type of $o$ is a subtype of $T$.  If $T$ is a malformed type, then performing a match causes a run time error.
+An \ON{}-\CATCH{} clause of the form   \code{\ON{} $T$ \CATCH{} ($p_1, p_2$) $s$}  {\em matches} an object $o$  if the type of $o$ is a subtype of $T$.  If $T$ is a malformed type, then performing a match causes a run time error.
 
 \commentary {
 It is of course a static warning if $T$ is a malformed type (\ref{staticTypes}).
 }
 
+An \ON{}-\CATCH{} clause of the form   \code{\ON{} $T$ \CATCH{} ($p_1, p_2$) $s$} introduces a new scope $CS$ in which local variables specified by $p_1$ and $p_2$ are defined. The statement $s$ is enclosed within $CS$.
+
+
 An \ON{}-\CATCH{} clause of the form  \code{\ON{} $T$ \CATCH{} ($p_1$) $s$} is equivalent to an \ON{}-\CATCH{} clause  \code{\ON{} $T$ \CATCH{} ($p_1, p_2$) $s$} where $p_2$ is an identifier that does not occur anywhere else in the program. 
 
 
@@ -5040,7 +4699,7 @@
 The question then becomes, what value should a return statement return when no return expression is given. In a generative constructor, it is obviously the object being constructed (\THIS{}). A void function is not expected to participate in an expression, which is why it is marked \VOID{} in the first place. Hence, this situation is a mistake which should be detected as soon as possible. The static rules help here, but if the code is executed, using \NULL{} leads to fast failure, which is desirable in this case. The same rationale applies for function bodies that do not contain a return statement at all.
 }
 
-It is a static warning if a function contains both one or more return statements of the form \code{\RETURN;} and one or more return statements of the form \code{\RETURN{} $e$;}.
+It is a static warning if a function contains both one or more explicit return statements of the form \code{\RETURN;} and one or more return statements of the form \code{\RETURN{} $e$;}.
 
 
 \subsection{ Labels}
@@ -5286,6 +4945,9 @@
 Next, if $I$ includes a prefix clause of the form \AS{} $p$, let $NS =  prefix(p, NS_n)$ where $prefix(id, n)$, takes an identifier $id$ and produces a namespace that has, for each entry mapping key $k$ to declaration $d$ in $n$,  an entry mapping $id.k$ to $d$. Otherwise, let $NS = NS_n$.
 It is a compile-time error if the current library declares a top-level member named $p$.
 
+% This is problematic, because it implies that p.T would be available even in a scope that declared p. We really need to think of p as a single object with properties p.T etc., except it isn't really that
+% either. After all, p isn't actually available as a stand alone name.
+
 Then, for each entry mapping key $k$ to declaration $d$ in $NS$,  $d$ is made available in the top level scope of $L$ under the name $k$ unless either:
 \begin{itemize}
 \item
@@ -5440,10 +5102,10 @@
 \subsection{Scripts}
 \label{scripts}
 
-A {\em script} is a library whose exported namespace  (\ref{exports}) includes a top-level function \code{main()}. 
+A {\em script} is a library whose exported namespace  (\ref{exports}) includes a top-level function \code{main}. 
 A script $S$ may be executed as follows:
 
-First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main()} that is in the exported namespace of $S$ is invoked with no arguments. It is a run time error if $S$ does not declare or import a top-level function \code{main()}.
+First, $S$ is compiled as a library as specified above. Then, the top-level function \code{main} that is in the exported namespace of $S$ is invoked with no arguments. It is a run time error if $S$ does not declare or import a top-level function \code{main}.
 
 \rationale{
 The names of scripts are optional, in the interests of interactive, informal use. However, any script of long term value should be given a name as a matter of good practice. 
@@ -5987,10 +5649,41 @@
 The least upper bound of a function type and an interface type $T$ is the least upper bound of \cd{Function} and $T$.
 Let $F$ and $G$ be function types. If $F$ and $G$ differ in their number of required parameters, then the least upper bound of $F$ and $G$ is \cd{Function}.  Otherwise:
 \begin{itemize}
-\item If $F= (T_1 \ldots T_r, [T_{r+1}, \ldots, T_n]) \longrightarrow T_0$ and $G= (S_1 \ldots S_r, [S_{r+1}, \ldots, S_k]) \longrightarrow S_0$ where $k \le n$ then the least upper bound of $F$ and $G$ is $(L_1 \ldots L_r, [L_{r+1}, \ldots, L_k]) \longrightarrow L_0$ where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0..k$.
-\item If $F= (T_1 \ldots T_r, [T_{r+1}, \ldots, T_n]) \longrightarrow T_0$ and $G= (S_1 \ldots S_r, \{ \ldots \}) \longrightarrow S_0$ then the least upper bound of $F$ and $G$ is $(L_1 \ldots L_r) \longrightarrow L_0$ where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0..r$.
-\item If $F= (T_1 \ldots T_r, \{T_{r+1}$  $p_{r+1}, \ldots, T_f$ $p_f\}) \longrightarrow T_0$ and $G= (S_1 \ldots S_r, \{ S_{r+1}$  $q_{r+1}, \ldots, S_g$ $q_g\}) \longrightarrow S_0$ then let $\{x_m, \ldots x_n\}  = \{p_{r+1}, \ldots, p_f\} \cap \{q_{r+1}, \ldots, q_g\}$ and let $X_j$ be the least upper bound of the types of $x_j$ in $F$ and $G, j \in m..n$. Then
-the least upper bound of $F$ and $G$ is $(L_1 \ldots L_r, \{ X_m$ $x_m, \ldots, X_n$ $x_n\}) \longrightarrow L_0$ where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0..r$ 
+\item If 
+
+$F= (T_1 \ldots T_r, [T_{r+1}, \ldots, T_n]) \longrightarrow T_0$, 
+
+$G= (S_1 \ldots S_r, [S_{r+1}, \ldots, S_k]) \longrightarrow S_0$ 
+
+where $k \le n$ then the least upper bound of $F$ and $G$ is 
+
+$(L_1 \ldots L_r, [L_{r+1}, \ldots, L_k]) \longrightarrow L_0$ 
+
+where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0..k$.
+\item If 
+
+$F= (T_1 \ldots T_r, [T_{r+1}, \ldots, T_n]) \longrightarrow T_0$,
+
+$G= (S_1 \ldots S_r, \{ \ldots \}) \longrightarrow S_0$ 
+
+then the least upper bound of $F$ and $G$ is 
+
+$(L_1 \ldots L_r) \longrightarrow L_0$ 
+
+where $L_i$ 
+is the least upper bound of $T_i$ and $S_i, i \in 0..r$.
+\item If 
+
+$F= (T_1 \ldots T_r, \{T_{r+1}$  $p_{r+1}, \ldots, T_f$ $p_f\}) \longrightarrow T_0$,  
+
+$G= (S_1 \ldots S_r, \{ S_{r+1}$  $q_{r+1}, \ldots, S_g$ $q_g\}) \longrightarrow S_0$ 
+
+then let $\{x_m, \ldots x_n\}  = \{p_{r+1}, \ldots, p_f\} \cap \{q_{r+1}, \ldots, q_g\}$ and let $X_j$ be the least upper bound of the types of $x_j$ in $F$ and $G, j \in m..n$. Then
+the least upper bound of $F$ and $G$ is
+
+$(L_1 \ldots L_r, \{ X_m$ $x_m, \ldots, X_n$ $x_n\}) \longrightarrow L_0$ 
+
+where $L_i$ is the least upper bound of $T_i$ and $S_i, i \in 0..r$ 
 \end{itemize}
 
 
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index c7beef7..7f79c5d 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -12,6 +12,7 @@
 import 'generated/source_io.dart';
 import 'generated/sdk.dart';
 import 'generated/sdk_io.dart';
+import 'generated/ast.dart';
 import 'generated/element.dart';
 import '../options.dart';
 
@@ -50,8 +51,22 @@
     var sourceFile = new JavaFile(sourcePath);
     var uriKind = getUriKind(sourceFile);
     var librarySource = new FileBasedSource.con2(contentCache, sourceFile, uriKind);
-    // resolve library
+    // prepare context
     prepareAnalysisContext(sourceFile);
+    // don't try to analyzer parts
+    var unit = context.parseCompilationUnit(librarySource);
+    var hasLibraryDirective = false;
+    var hasPartOfDirective = false;
+    for (var directive in unit.directives) {
+      if (directive is LibraryDirective) hasLibraryDirective = true;
+      if (directive is PartOfDirective) hasPartOfDirective = true;
+    }
+    if (hasPartOfDirective && !hasLibraryDirective) {
+      print("Only libraries can be analyzed.");
+      print("$sourceFile is a part and can not be analyzed.");
+      return;
+    }
+    // resolve library
     var libraryElement = context.computeLibraryElement(librarySource);
     // prepare source and errors
     prepareSources(libraryElement);
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 3a430d9..06e0a05 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -1,6 +1,8 @@
 // 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 engine.ast;
+
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -10,6 +12,7 @@
 import 'utilities_dart.dart';
 import 'utilities_collection.dart' show TokenMap;
 import 'element.dart';
+
 /**
  * The abstract class `ASTNode` defines the behavior common to all nodes in the AST structure
  * for a Dart program.
@@ -17,7 +20,6 @@
  * @coverage dart.engine.ast
  */
 abstract class ASTNode {
-
   /**
    * An empty array of ast nodes.
    */
@@ -62,7 +64,6 @@
     while (node != null && !isInstanceOf(node, enclosingClass)) {
       node = node.parent;
     }
-    ;
     return node as ASTNode;
   }
 
@@ -201,6 +202,7 @@
     accept(new ToSourceVisitor(writer));
     return writer.toString();
   }
+
   String toString() => toSource();
 
   /**
@@ -245,9 +247,12 @@
   void set parent(ASTNode newParent) {
     _parent = newParent;
   }
+
   static int _hashCodeGenerator = 0;
+
   final int hashCode = ++_hashCodeGenerator;
 }
+
 /**
  * The interface `ASTVisitor` defines the behavior of objects that can be used to visit an AST
  * structure.
@@ -256,109 +261,212 @@
  */
 abstract class ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node);
+
   R visitAnnotation(Annotation node);
+
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node);
+
   R visitArgumentList(ArgumentList node);
+
   R visitAsExpression(AsExpression node);
+
   R visitAssertStatement(AssertStatement assertStatement);
+
   R visitAssignmentExpression(AssignmentExpression node);
+
   R visitBinaryExpression(BinaryExpression node);
+
   R visitBlock(Block node);
+
   R visitBlockFunctionBody(BlockFunctionBody node);
+
   R visitBooleanLiteral(BooleanLiteral node);
+
   R visitBreakStatement(BreakStatement node);
+
   R visitCascadeExpression(CascadeExpression node);
+
   R visitCatchClause(CatchClause node);
+
   R visitClassDeclaration(ClassDeclaration node);
+
   R visitClassTypeAlias(ClassTypeAlias node);
+
   R visitComment(Comment node);
+
   R visitCommentReference(CommentReference node);
+
   R visitCompilationUnit(CompilationUnit node);
+
   R visitConditionalExpression(ConditionalExpression node);
+
   R visitConstructorDeclaration(ConstructorDeclaration node);
+
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node);
+
   R visitConstructorName(ConstructorName node);
+
   R visitContinueStatement(ContinueStatement node);
+
   R visitDeclaredIdentifier(DeclaredIdentifier node);
+
   R visitDefaultFormalParameter(DefaultFormalParameter node);
+
   R visitDoStatement(DoStatement node);
+
   R visitDoubleLiteral(DoubleLiteral node);
+
   R visitEmptyFunctionBody(EmptyFunctionBody node);
+
   R visitEmptyStatement(EmptyStatement node);
+
   R visitExportDirective(ExportDirective node);
+
   R visitExpressionFunctionBody(ExpressionFunctionBody node);
+
   R visitExpressionStatement(ExpressionStatement node);
+
   R visitExtendsClause(ExtendsClause node);
+
   R visitFieldDeclaration(FieldDeclaration node);
+
   R visitFieldFormalParameter(FieldFormalParameter node);
+
   R visitForEachStatement(ForEachStatement node);
+
   R visitFormalParameterList(FormalParameterList node);
+
   R visitForStatement(ForStatement node);
+
   R visitFunctionDeclaration(FunctionDeclaration node);
+
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node);
+
   R visitFunctionExpression(FunctionExpression node);
+
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node);
+
   R visitFunctionTypeAlias(FunctionTypeAlias functionTypeAlias);
+
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node);
+
   R visitHideCombinator(HideCombinator node);
+
   R visitIfStatement(IfStatement node);
+
   R visitImplementsClause(ImplementsClause node);
+
   R visitImportDirective(ImportDirective node);
+
   R visitIndexExpression(IndexExpression node);
+
   R visitInstanceCreationExpression(InstanceCreationExpression node);
+
   R visitIntegerLiteral(IntegerLiteral node);
+
   R visitInterpolationExpression(InterpolationExpression node);
+
   R visitInterpolationString(InterpolationString node);
+
   R visitIsExpression(IsExpression node);
+
   R visitLabel(Label node);
+
   R visitLabeledStatement(LabeledStatement node);
+
   R visitLibraryDirective(LibraryDirective node);
+
   R visitLibraryIdentifier(LibraryIdentifier node);
+
   R visitListLiteral(ListLiteral node);
+
   R visitMapLiteral(MapLiteral node);
+
   R visitMapLiteralEntry(MapLiteralEntry node);
+
   R visitMethodDeclaration(MethodDeclaration node);
+
   R visitMethodInvocation(MethodInvocation node);
+
   R visitNamedExpression(NamedExpression node);
+
   R visitNativeClause(NativeClause node);
+
   R visitNativeFunctionBody(NativeFunctionBody node);
+
   R visitNullLiteral(NullLiteral node);
+
   R visitParenthesizedExpression(ParenthesizedExpression node);
+
   R visitPartDirective(PartDirective node);
+
   R visitPartOfDirective(PartOfDirective node);
+
   R visitPostfixExpression(PostfixExpression node);
+
   R visitPrefixedIdentifier(PrefixedIdentifier node);
+
   R visitPrefixExpression(PrefixExpression node);
+
   R visitPropertyAccess(PropertyAccess node);
+
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node);
+
   R visitRethrowExpression(RethrowExpression node);
+
   R visitReturnStatement(ReturnStatement node);
+
   R visitScriptTag(ScriptTag node);
+
   R visitShowCombinator(ShowCombinator node);
+
   R visitSimpleFormalParameter(SimpleFormalParameter node);
+
   R visitSimpleIdentifier(SimpleIdentifier node);
+
   R visitSimpleStringLiteral(SimpleStringLiteral node);
+
   R visitStringInterpolation(StringInterpolation node);
+
   R visitSuperConstructorInvocation(SuperConstructorInvocation node);
+
   R visitSuperExpression(SuperExpression node);
+
   R visitSwitchCase(SwitchCase node);
+
   R visitSwitchDefault(SwitchDefault node);
+
   R visitSwitchStatement(SwitchStatement node);
+
   R visitSymbolLiteral(SymbolLiteral node);
+
   R visitThisExpression(ThisExpression node);
+
   R visitThrowExpression(ThrowExpression node);
+
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node);
+
   R visitTryStatement(TryStatement node);
+
   R visitTypeArgumentList(TypeArgumentList node);
+
   R visitTypeName(TypeName node);
+
   R visitTypeParameter(TypeParameter node);
+
   R visitTypeParameterList(TypeParameterList node);
+
   R visitVariableDeclaration(VariableDeclaration node);
+
   R visitVariableDeclarationList(VariableDeclarationList node);
+
   R visitVariableDeclarationStatement(VariableDeclarationStatement node);
+
   R visitWhileStatement(WhileStatement node);
+
   R visitWithClause(WithClause node);
 }
+
 /**
  * Instances of the class `AdjacentStrings` represents two or more string literals that are
  * implicitly concatenated because of being adjacent (separated only by whitespace).
@@ -374,7 +482,6 @@
  * @coverage dart.engine.ast
  */
 class AdjacentStrings extends StringLiteral {
-
   /**
    * The strings that are implicitly concatenated.
    */
@@ -396,18 +503,24 @@
    * @param strings the strings that are implicitly concatenated
    */
   AdjacentStrings({List<StringLiteral> strings}) : this.full(strings);
+
   accept(ASTVisitor visitor) => visitor.visitAdjacentStrings(this);
+
   Token get beginToken => strings.beginToken;
+
   Token get endToken => strings.endToken;
+
   void visitChildren(ASTVisitor visitor) {
     strings.accept(visitor);
   }
+
   void appendStringValue(JavaStringBuilder builder) {
     for (StringLiteral stringLiteral in strings) {
       stringLiteral.appendStringValue(builder);
     }
   }
 }
+
 /**
  * The abstract class `AnnotatedNode` defines the behavior of nodes that can be annotated with
  * both a comment and metadata.
@@ -415,7 +528,6 @@
  * @coverage dart.engine.ast
  */
 abstract class AnnotatedNode extends ASTNode {
-
   /**
    * The documentation comment associated with this node, or `null` if this node does not have
    * a documentation comment associated with it.
@@ -446,6 +558,7 @@
    * @param metadata the annotations associated with this node
    */
   AnnotatedNode({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
+
   Token get beginToken {
     if (_comment == null) {
       if (_metadata.isEmpty) {
@@ -497,6 +610,7 @@
     this._metadata.clear();
     this._metadata.addAll(metadata);
   }
+
   void visitChildren(ASTVisitor visitor) {
     if (commentIsBeforeAnnotations()) {
       safelyVisitChild(_comment, visitor);
@@ -544,6 +658,7 @@
     return children;
   }
 }
+
 /**
  * Instances of the class `Annotation` represent an annotation that can be associated with an
  * AST node.
@@ -559,7 +674,6 @@
  * @coverage dart.engine.ast
  */
 class Annotation extends ASTNode {
-
   /**
    * The at sign that introduced the annotation.
    */
@@ -630,6 +744,7 @@
    *          annotation is not the invocation of a constructor
    */
   Annotation({Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments}) : this.full(atSign, name, period, constructorName, arguments);
+
   accept(ASTVisitor visitor) => visitor.visitAnnotation(this);
 
   /**
@@ -639,6 +754,7 @@
    * @return the arguments to the constructor being invoked
    */
   ArgumentList get arguments => _arguments;
+
   Token get beginToken => atSign;
 
   /**
@@ -664,6 +780,7 @@
     }
     return null;
   }
+
   Token get endToken {
     if (_arguments != null) {
       return _arguments.endToken;
@@ -717,12 +834,14 @@
   void set name(Identifier name) {
     this._name = becomeParentOf(name);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_arguments, visitor);
   }
 }
+
 /**
  * Instances of the class `ArgumentDefinitionTest` represent an argument definition test.
  *
@@ -734,7 +853,6 @@
  * @coverage dart.engine.ast
  */
 class ArgumentDefinitionTest extends Expression {
-
   /**
    * The token representing the question mark.
    */
@@ -763,8 +881,11 @@
    * @param identifier the identifier representing the argument being tested
    */
   ArgumentDefinitionTest({Token question, SimpleIdentifier identifier}) : this.full(question, identifier);
+
   accept(ASTVisitor visitor) => visitor.visitArgumentDefinitionTest(this);
+
   Token get beginToken => question;
+
   Token get endToken => _identifier.endToken;
 
   /**
@@ -782,10 +903,12 @@
   void set identifier(SimpleIdentifier identifier) {
     this._identifier = becomeParentOf(identifier);
   }
+
   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.
@@ -802,7 +925,6 @@
  * @coverage dart.engine.ast
  */
 class ArgumentList extends ASTNode {
-
   /**
    * The left parenthesis.
    */
@@ -858,8 +980,11 @@
    * @param rightParenthesis the right parenthesis
    */
   ArgumentList({Token leftParenthesis, List<Expression> arguments, Token rightParenthesis}) : this.full(leftParenthesis, arguments, rightParenthesis);
+
   accept(ASTVisitor visitor) => visitor.visitArgumentList(this);
+
   Token get beginToken => _leftParenthesis;
+
   Token get endToken => _rightParenthesis;
 
   /**
@@ -923,6 +1048,7 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
+
   void visitChildren(ASTVisitor visitor) {
     arguments.accept(visitor);
   }
@@ -975,6 +1101,7 @@
     return _correspondingStaticParameters[index];
   }
 }
+
 /**
  * Instances of the class `AsExpression` represent an 'as' expression.
  *
@@ -986,7 +1113,6 @@
  * @coverage dart.engine.ast
  */
 class AsExpression extends Expression {
-
   /**
    * The expression used to compute the value being cast.
    */
@@ -1023,8 +1149,11 @@
    * @param type the name of the type being cast to
    */
   AsExpression({Expression expression, Token isOperator, TypeName type}) : this.full(expression, isOperator, type);
+
   accept(ASTVisitor visitor) => visitor.visitAsExpression(this);
+
   Token get beginToken => _expression.beginToken;
+
   Token get endToken => _type.endToken;
 
   /**
@@ -1058,11 +1187,13 @@
   void set type(TypeName name) {
     this._type = becomeParentOf(name);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     safelyVisitChild(_type, visitor);
   }
 }
+
 /**
  * Instances of the class `AssertStatement` represent an assert statement.
  *
@@ -1074,7 +1205,6 @@
  * @coverage dart.engine.ast
  */
 class AssertStatement extends Statement {
-
   /**
    * The token representing the 'assert' keyword.
    */
@@ -1127,7 +1257,9 @@
    * @param semicolon the semicolon terminating the statement
    */
   AssertStatement({Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon}) : this.full(keyword, leftParenthesis, condition, rightParenthesis, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitAssertStatement(this);
+
   Token get beginToken => keyword;
 
   /**
@@ -1136,6 +1268,7 @@
    * @return the condition that is being asserted to be `true`
    */
   Expression get condition => _condition;
+
   Token get endToken => semicolon;
 
   /**
@@ -1146,10 +1279,12 @@
   void set condition(Expression condition) {
     this._condition = becomeParentOf(condition);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
   }
 }
+
 /**
  * Instances of the class `AssignmentExpression` represent an assignment expression.
  *
@@ -1161,7 +1296,6 @@
  * @coverage dart.engine.ast
  */
 class AssignmentExpression extends Expression {
-
   /**
    * The expression used to compute the left hand side.
    */
@@ -1212,7 +1346,9 @@
    * @param rightHandSide the expression used to compute the right hand side
    */
   AssignmentExpression({Expression leftHandSide, Token operator, Expression rightHandSide}) : this.full(leftHandSide, operator, rightHandSide);
+
   accept(ASTVisitor visitor) => visitor.visitAssignmentExpression(this);
+
   Token get beginToken => _leftHandSide.beginToken;
 
   /**
@@ -1230,6 +1366,7 @@
     }
     return element;
   }
+
   Token get endToken => _rightHandSide.endToken;
 
   /**
@@ -1303,6 +1440,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_leftHandSide, visitor);
     safelyVisitChild(_rightHandSide, visitor);
@@ -1350,6 +1488,7 @@
     return parameters[0];
   }
 }
+
 /**
  * Instances of the class `BinaryExpression` represent a binary (infix) expression.
  *
@@ -1361,7 +1500,6 @@
  * @coverage dart.engine.ast
  */
 class BinaryExpression extends Expression {
-
   /**
    * The expression used to compute the left operand.
    */
@@ -1412,7 +1550,9 @@
    * @param rightOperand the expression used to compute the right operand
    */
   BinaryExpression({Expression leftOperand, Token operator, Expression rightOperand}) : this.full(leftOperand, operator, rightOperand);
+
   accept(ASTVisitor visitor) => visitor.visitBinaryExpression(this);
+
   Token get beginToken => _leftOperand.beginToken;
 
   /**
@@ -1430,6 +1570,7 @@
     }
     return element;
   }
+
   Token get endToken => _rightOperand.endToken;
 
   /**
@@ -1503,6 +1644,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_leftOperand, visitor);
     safelyVisitChild(_rightOperand, visitor);
@@ -1550,6 +1692,7 @@
     return parameters[0];
   }
 }
+
 /**
  * Instances of the class `Block` represent a sequence of statements.
  *
@@ -1561,7 +1704,6 @@
  * @coverage dart.engine.ast
  */
 class Block extends Statement {
-
   /**
    * The left curly bracket.
    */
@@ -1599,13 +1741,18 @@
    * @param rightBracket the right curly bracket
    */
   Block({Token leftBracket, List<Statement> statements, Token rightBracket}) : this.full(leftBracket, statements, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitBlock(this);
+
   Token get beginToken => leftBracket;
+
   Token get endToken => rightBracket;
+
   void visitChildren(ASTVisitor visitor) {
     statements.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `BlockFunctionBody` represent a function body that consists of a
  * block of statements.
@@ -1618,7 +1765,6 @@
  * @coverage dart.engine.ast
  */
 class BlockFunctionBody extends FunctionBody {
-
   /**
    * The block representing the body of the function.
    */
@@ -1639,7 +1785,9 @@
    * @param block the block representing the body of the function
    */
   BlockFunctionBody({Block block}) : this.full(block);
+
   accept(ASTVisitor visitor) => visitor.visitBlockFunctionBody(this);
+
   Token get beginToken => _block.beginToken;
 
   /**
@@ -1648,6 +1796,7 @@
    * @return the block representing the body of the function
    */
   Block get block => _block;
+
   Token get endToken => _block.endToken;
 
   /**
@@ -1658,10 +1807,12 @@
   void set block(Block block) {
     this._block = becomeParentOf(block);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_block, visitor);
   }
 }
+
 /**
  * Instances of the class `BooleanLiteral` represent a boolean literal expression.
  *
@@ -1673,7 +1824,6 @@
  * @coverage dart.engine.ast
  */
 class BooleanLiteral extends Literal {
-
   /**
    * The token representing the literal.
    */
@@ -1702,13 +1852,19 @@
    * @param value the value of the literal
    */
   BooleanLiteral({Token literal, bool value}) : this.full(literal, value);
+
   accept(ASTVisitor visitor) => visitor.visitBooleanLiteral(this);
+
   Token get beginToken => literal;
+
   Token get endToken => literal;
+
   bool get isSynthetic => literal.isSynthetic;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `BreakStatement` represent a break statement.
  *
@@ -1720,7 +1876,6 @@
  * @coverage dart.engine.ast
  */
 class BreakStatement extends Statement {
-
   /**
    * The token representing the 'break' keyword.
    */
@@ -1757,8 +1912,11 @@
    * @param semicolon the semicolon terminating the statement
    */
   BreakStatement({Token keyword, SimpleIdentifier label, Token semicolon}) : this.full(keyword, label, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitBreakStatement(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => semicolon;
 
   /**
@@ -1776,10 +1934,12 @@
   void set label(SimpleIdentifier identifier) {
     _label = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
 }
+
 /**
  * Instances of the class `CascadeExpression` represent a sequence of cascaded expressions:
  * expressions that share a common target. There are three kinds of expressions that can be used in
@@ -1801,7 +1961,6 @@
  * @coverage dart.engine.ast
  */
 class CascadeExpression extends Expression {
-
   /**
    * The target of the cascade sections.
    */
@@ -1831,8 +1990,11 @@
    * @param cascadeSections the cascade sections sharing the common target
    */
   CascadeExpression({Expression target, List<Expression> cascadeSections}) : this.full(target, cascadeSections);
+
   accept(ASTVisitor visitor) => visitor.visitCascadeExpression(this);
+
   Token get beginToken => _target.beginToken;
+
   Token get endToken => cascadeSections.endToken;
 
   /**
@@ -1850,11 +2012,13 @@
   void set target(Expression target) {
     this._target = becomeParentOf(target);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     cascadeSections.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `CatchClause` represent a catch clause within a try statement.
  *
@@ -1870,7 +2034,6 @@
  * @coverage dart.engine.ast
  */
 class CatchClause extends ASTNode {
-
   /**
    * The token representing the 'on' keyword, or `null` if there is no 'on' keyword.
    */
@@ -1958,7 +2121,9 @@
    * @param body the body of the catch block
    */
   CatchClause({Token onKeyword, TypeName exceptionType, Token catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, Token comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body}) : this.full(onKeyword, exceptionType, catchKeyword, leftParenthesis, exceptionParameter, comma, stackTraceParameter, rightParenthesis, body);
+
   accept(ASTVisitor visitor) => visitor.visitCatchClause(this);
+
   Token get beginToken {
     if (onKeyword != null) {
       return onKeyword;
@@ -1972,6 +2137,7 @@
    * @return the body of the catch block
    */
   Block get body => _body;
+
   Token get endToken => _body.endToken;
 
   /**
@@ -2049,6 +2215,7 @@
   void set stackTraceParameter(SimpleIdentifier parameter) {
     _stackTraceParameter = becomeParentOf(parameter);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(exceptionType, visitor);
     safelyVisitChild(_exceptionParameter, visitor);
@@ -2056,6 +2223,7 @@
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * Instances of the class `ClassDeclaration` represent the declaration of a class.
  *
@@ -2070,7 +2238,6 @@
  * @coverage dart.engine.ast
  */
 class ClassDeclaration extends CompilationUnitMember {
-
   /**
    * The 'abstract' keyword, or `null` if the keyword was absent.
    */
@@ -2175,8 +2342,11 @@
    * @param rightBracket the right curly bracket
    */
   ClassDeclaration({Comment comment, List<Annotation> metadata, Token abstractKeyword, Token classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, Token leftBracket, List<ClassMember> members, Token rightBracket}) : this.full(comment, metadata, abstractKeyword, classKeyword, name, typeParameters, extendsClause, withClause, implementsClause, leftBracket, members, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitClassDeclaration(this);
+
   ClassElement get element => _name != null ? (_name.staticElement as ClassElement) : null;
+
   Token get endToken => rightBracket;
 
   /**
@@ -2244,6 +2414,7 @@
   void set withClause(WithClause withClause) {
     this._withClause = becomeParentOf(withClause);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
@@ -2254,6 +2425,7 @@
     safelyVisitChild(nativeClause, visitor);
     members.accept(visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata {
     if (abstractKeyword != null) {
       return abstractKeyword;
@@ -2261,6 +2433,7 @@
     return classKeyword;
   }
 }
+
 /**
  * The abstract class `ClassMember` defines the behavior common to nodes that declare a name
  * within the scope of a class.
@@ -2268,7 +2441,6 @@
  * @coverage dart.engine.ast
  */
 abstract class ClassMember extends Declaration {
-
   /**
    * Initialize a newly created member of a class.
    *
@@ -2285,6 +2457,7 @@
    */
   ClassMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
+
 /**
  * Instances of the class `ClassTypeAlias` represent a class type alias.
  *
@@ -2299,7 +2472,6 @@
  * @coverage dart.engine.ast
  */
 class ClassTypeAlias extends TypeAlias {
-
   /**
    * The name of the class being declared.
    */
@@ -2378,7 +2550,9 @@
    * @param semicolon the semicolon terminating the declaration
    */
   ClassTypeAlias({Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, Token equals, Token abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon}) : this.full(comment, metadata, keyword, name, typeParameters, equals, abstractKeyword, superclass, withClause, implementsClause, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitClassTypeAlias(this);
+
   ClassElement get element => _name != null ? (_name.staticElement as ClassElement) : null;
 
   /**
@@ -2461,6 +2635,7 @@
   void set withClause(WithClause withClause) {
     this._withClause = becomeParentOf(withClause);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
@@ -2470,6 +2645,7 @@
     safelyVisitChild(_implementsClause, visitor);
   }
 }
+
 /**
  * Instances of the class `Combinator` represent the combinator associated with an import
  * directive.
@@ -2483,7 +2659,6 @@
  * @coverage dart.engine.ast
  */
 abstract class Combinator extends ASTNode {
-
   /**
    * The keyword specifying what kind of processing is to be done on the imported names.
    */
@@ -2506,8 +2681,10 @@
    *          names
    */
   Combinator({Token keyword}) : this.full(keyword);
+
   Token get beginToken => keyword;
 }
+
 /**
  * Instances of the class `Comment` represent a comment within the source code.
  *
@@ -2531,7 +2708,6 @@
  * @coverage dart.engine.ast
  */
 class Comment extends ASTNode {
-
   /**
    * Create a block comment.
    *
@@ -2603,8 +2779,11 @@
    * @param references the references embedded within the documentation comment
    */
   Comment({List<Token> tokens, CommentType type, List<CommentReference> references}) : this.full(tokens, type, references);
+
   accept(ASTVisitor visitor) => visitor.visitComment(this);
+
   Token get beginToken => tokens[0];
+
   Token get endToken => tokens[tokens.length - 1];
 
   /**
@@ -2627,16 +2806,17 @@
    * @return `true` if this is an end-of-line comment
    */
   bool get isEndOfLine => identical(_type, CommentType.END_OF_LINE);
+
   void visitChildren(ASTVisitor visitor) {
     references.accept(visitor);
   }
 }
+
 /**
  * The enumeration `CommentType` encodes all the different types of comments that are
  * recognized by the parser.
  */
 class CommentType extends Enum<CommentType> {
-
   /**
    * An end-of-line comment.
    */
@@ -2651,9 +2831,12 @@
    * A documentation comment.
    */
   static final CommentType DOCUMENTATION = new CommentType('DOCUMENTATION', 2);
+
   static final List<CommentType> values = [END_OF_LINE, BLOCK, DOCUMENTATION];
+
   CommentType(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * Instances of the class `CommentReference` represent a reference to a Dart element that is
  * found within a documentation comment.
@@ -2666,7 +2849,6 @@
  * @coverage dart.engine.ast
  */
 class CommentReference extends ASTNode {
-
   /**
    * The token representing the 'new' keyword, or `null` if there was no 'new' keyword.
    */
@@ -2695,8 +2877,11 @@
    * @param identifier the identifier being referenced
    */
   CommentReference({Token newKeyword, Identifier identifier}) : this.full(newKeyword, identifier);
+
   accept(ASTVisitor visitor) => visitor.visitCommentReference(this);
+
   Token get beginToken => _identifier.beginToken;
+
   Token get endToken => _identifier.endToken;
 
   /**
@@ -2714,10 +2899,12 @@
   void set identifier(Identifier identifier) {
     identifier = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_identifier, visitor);
   }
 }
+
 /**
  * Instances of the class `CompilationUnit` represent a compilation unit.
  *
@@ -2745,7 +2932,6 @@
  * @coverage dart.engine.ast
  */
 class CompilationUnit extends ASTNode {
-
   /**
    * The first token in the token stream that was parsed to form this compilation unit.
    */
@@ -2813,9 +2999,13 @@
    * @param endToken the last token in the token stream
    */
   CompilationUnit({Token beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, Token endToken}) : this.full(beginToken, scriptTag, directives, declarations, endToken);
+
   accept(ASTVisitor visitor) => visitor.visitCompilationUnit(this);
+
   Token get beginToken => _beginToken;
+
   Token get endToken => _endToken;
+
   int get length {
     Token endToken = this.endToken;
     if (endToken == null) {
@@ -2823,6 +3013,7 @@
     }
     return endToken.offset + endToken.length;
   }
+
   int get offset => 0;
 
   /**
@@ -2841,6 +3032,7 @@
   void set scriptTag(ScriptTag scriptTag) {
     this._scriptTag = becomeParentOf(scriptTag);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_scriptTag, visitor);
     if (directivesAreBeforeDeclarations()) {
@@ -2883,6 +3075,7 @@
     return children;
   }
 }
+
 /**
  * Instances of the class `CompilationUnitMember` defines the behavior common to nodes that
  * declare a name within the scope of a compilation unit.
@@ -2900,7 +3093,6 @@
  * @coverage dart.engine.ast
  */
 abstract class CompilationUnitMember extends Declaration {
-
   /**
    * Initialize a newly created generic compilation unit member.
    *
@@ -2917,6 +3109,7 @@
    */
   CompilationUnitMember({Comment comment, List<Annotation> metadata}) : this.full(comment, metadata);
 }
+
 /**
  * Instances of the class `ConditionalExpression` represent a conditional expression.
  *
@@ -2928,7 +3121,6 @@
  * @coverage dart.engine.ast
  */
 class ConditionalExpression extends Expression {
-
   /**
    * The condition used to determine which of the expressions is executed next.
    */
@@ -2985,7 +3177,9 @@
    *          `false`
    */
   ConditionalExpression({Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression}) : this.full(condition, question, thenExpression, colon, elseExpression);
+
   accept(ASTVisitor visitor) => visitor.visitConditionalExpression(this);
+
   Token get beginToken => _condition.beginToken;
 
   /**
@@ -3001,6 +3195,7 @@
    * @return the expression that is executed if the condition evaluates to `false`
    */
   Expression get elseExpression => _elseExpression;
+
   Token get endToken => _elseExpression.endToken;
 
   /**
@@ -3039,12 +3234,14 @@
   void set thenExpression(Expression expression) {
     _thenExpression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_thenExpression, visitor);
     safelyVisitChild(_elseExpression, visitor);
   }
 }
+
 /**
  * Instances of the class `ConstructorDeclaration` represent a constructor declaration.
  *
@@ -3071,7 +3268,6 @@
  * @coverage dart.engine.ast
  */
 class ConstructorDeclaration extends ClassMember {
-
   /**
    * The token for the 'external' keyword, or `null` if the constructor is not external.
    */
@@ -3191,6 +3387,7 @@
    * @param body the body of the constructor
    */
   ConstructorDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, Identifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters, Token separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body}) : this.full(comment, metadata, externalKeyword, constKeyword, factoryKeyword, returnType, period, name, parameters, separator, initializers, redirectedConstructor, body);
+
   accept(ASTVisitor visitor) => visitor.visitConstructorDeclaration(this);
 
   /**
@@ -3199,7 +3396,9 @@
    * @return the body of the constructor
    */
   FunctionBody get body => _body;
+
   ConstructorElement get element => _element;
+
   Token get endToken {
     if (_body != null) {
       return _body.endToken;
@@ -3296,6 +3495,7 @@
   void set returnType(Identifier typeName) {
     _returnType = becomeParentOf(typeName);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -3305,6 +3505,7 @@
     safelyVisitChild(_redirectedConstructor, visitor);
     safelyVisitChild(_body, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata {
     Token leftMost = this.leftMost([externalKeyword, constKeyword, factoryKeyword]);
     if (leftMost != null) {
@@ -3331,6 +3532,7 @@
     return leftMost;
   }
 }
+
 /**
  * Instances of the class `ConstructorFieldInitializer` represent the initialization of a
  * field within a constructor's initialization list.
@@ -3343,7 +3545,6 @@
  * @coverage dart.engine.ast
  */
 class ConstructorFieldInitializer extends ConstructorInitializer {
-
   /**
    * The token for the 'this' keyword, or `null` if there is no 'this' keyword.
    */
@@ -3399,13 +3600,16 @@
    * @param expression the expression computing the value to which the field will be initialized
    */
   ConstructorFieldInitializer({Token keyword, Token period, SimpleIdentifier fieldName, Token equals, Expression expression}) : this.full(keyword, period, fieldName, equals, expression);
+
   accept(ASTVisitor visitor) => visitor.visitConstructorFieldInitializer(this);
+
   Token get beginToken {
     if (keyword != null) {
       return keyword;
     }
     return _fieldName.beginToken;
   }
+
   Token get endToken => _expression.endToken;
 
   /**
@@ -3440,11 +3644,13 @@
   void set fieldName(SimpleIdentifier identifier) {
     _fieldName = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_fieldName, visitor);
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class `ConstructorInitializer` defines the behavior of nodes that can
  * occur in the initializer list of a constructor declaration.
@@ -3459,6 +3665,7 @@
  */
 abstract class ConstructorInitializer extends ASTNode {
 }
+
 /**
  * Instances of the class `ConstructorName` represent the name of the constructor.
  *
@@ -3470,7 +3677,6 @@
  * @coverage dart.engine.ast
  */
 class ConstructorName extends ASTNode {
-
   /**
    * The name of the type defining the constructor.
    */
@@ -3516,8 +3722,11 @@
    * @param name the name of the constructor
    */
   ConstructorName({TypeName type, Token period, SimpleIdentifier name}) : this.full(type, period, name);
+
   accept(ASTVisitor visitor) => visitor.visitConstructorName(this);
+
   Token get beginToken => _type.beginToken;
+
   Token get endToken {
     if (_name != null) {
       return _name.endToken;
@@ -3576,11 +3785,13 @@
   void set type(TypeName type) {
     this._type = becomeParentOf(type);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_type, visitor);
     safelyVisitChild(_name, visitor);
   }
 }
+
 /**
  * Instances of the class `ContinueStatement` represent a continue statement.
  *
@@ -3592,7 +3803,6 @@
  * @coverage dart.engine.ast
  */
 class ContinueStatement extends Statement {
-
   /**
    * The token representing the 'continue' keyword.
    */
@@ -3629,8 +3839,11 @@
    * @param semicolon the semicolon terminating the statement
    */
   ContinueStatement({Token keyword, SimpleIdentifier label, Token semicolon}) : this.full(keyword, label, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitContinueStatement(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => semicolon;
 
   /**
@@ -3648,10 +3861,12 @@
   void set label(SimpleIdentifier identifier) {
     _label = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
 }
+
 /**
  * The abstract class `Declaration` defines the behavior common to nodes that represent the
  * declaration of a name. Each declared name is visible within a name scope.
@@ -3659,7 +3874,6 @@
  * @coverage dart.engine.ast
  */
 abstract class Declaration extends AnnotatedNode {
-
   /**
    * Initialize a newly created declaration.
    *
@@ -3684,6 +3898,7 @@
    */
   Element get element;
 }
+
 /**
  * Instances of the class `DeclaredIdentifier` represent the declaration of a single
  * identifier.
@@ -3696,7 +3911,6 @@
  * @coverage dart.engine.ast
  */
 class DeclaredIdentifier extends Declaration {
-
   /**
    * The token representing either the 'final', 'const' or 'var' keyword, or `null` if no
    * keyword was used.
@@ -3739,7 +3953,9 @@
    * @param identifier the name of the parameter being declared
    */
   DeclaredIdentifier({Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier}) : this.full(comment, metadata, keyword, type, identifier);
+
   accept(ASTVisitor visitor) => visitor.visitDeclaredIdentifier(this);
+
   LocalVariableElement get element {
     SimpleIdentifier identifier = this.identifier;
     if (identifier == null) {
@@ -3747,6 +3963,7 @@
     }
     return identifier.staticElement as LocalVariableElement;
   }
+
   Token get endToken => identifier.endToken;
 
   /**
@@ -3762,7 +3979,7 @@
    *
    * @return `true` if this variable was declared with the 'const' modifier
    */
-  bool get isConst => (keyword is KeywordToken) && identical(((keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
 
   /**
    * Return `true` if this variable was declared with the 'final' modifier. Variables that are
@@ -3771,7 +3988,7 @@
    *
    * @return `true` if this variable was declared with the 'final' modifier
    */
-  bool get isFinal => (keyword is KeywordToken) && identical(((keyword as KeywordToken)).keyword, Keyword.FINAL);
+  bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
 
   /**
    * Set the name of the declared type of the parameter to the given type name.
@@ -3781,11 +3998,13 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     safelyVisitChild(identifier, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata {
     if (keyword != null) {
       return keyword;
@@ -3795,6 +4014,7 @@
     return identifier.beginToken;
   }
 }
+
 /**
  * Instances of the class `DefaultFormalParameter` represent a formal parameter with a default
  * value. There are two kinds of parameters that are both represented by this class: named formal
@@ -3811,7 +4031,6 @@
  * @coverage dart.engine.ast
  */
 class DefaultFormalParameter extends FormalParameter {
-
   /**
    * The formal parameter with which the default value is associated.
    */
@@ -3858,7 +4077,9 @@
    * @param defaultValue the expression computing the default value for the parameter
    */
   DefaultFormalParameter({NormalFormalParameter parameter, ParameterKind kind, Token separator, Expression defaultValue}) : this.full(parameter, kind, separator, defaultValue);
+
   accept(ASTVisitor visitor) => visitor.visitDefaultFormalParameter(this);
+
   Token get beginToken => _parameter.beginToken;
 
   /**
@@ -3868,13 +4089,16 @@
    * @return the expression computing the default value for the parameter
    */
   Expression get defaultValue => _defaultValue;
+
   Token get endToken {
     if (_defaultValue != null) {
       return _defaultValue.endToken;
     }
     return _parameter.endToken;
   }
+
   SimpleIdentifier get identifier => _parameter.identifier;
+
   ParameterKind get kind => _kind;
 
   /**
@@ -3883,7 +4107,9 @@
    * @return the formal parameter with which the default value is associated
    */
   NormalFormalParameter get parameter => _parameter;
+
   bool get isConst => _parameter != null && _parameter.isConst;
+
   bool get isFinal => _parameter != null && _parameter.isFinal;
 
   /**
@@ -3912,11 +4138,13 @@
   void set parameter(NormalFormalParameter formalParameter) {
     _parameter = becomeParentOf(formalParameter);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_parameter, visitor);
     safelyVisitChild(_defaultValue, visitor);
   }
 }
+
 /**
  * The abstract class `Directive` defines the behavior common to nodes that represent a
  * directive.
@@ -3933,7 +4161,6 @@
  * @coverage dart.engine.ast
  */
 abstract class Directive extends AnnotatedNode {
-
   /**
    * The element associated with this directive, or `null` if the AST structure has not been
    * resolved or if this directive could not be resolved.
@@ -3982,6 +4209,7 @@
     this._element = element;
   }
 }
+
 /**
  * Instances of the class `DoStatement` represent a do statement.
  *
@@ -3993,7 +4221,6 @@
  * @coverage dart.engine.ast
  */
 class DoStatement extends Statement {
-
   /**
    * The token representing the 'do' keyword.
    */
@@ -4062,7 +4289,9 @@
    * @param semicolon the semicolon terminating the statement
    */
   DoStatement({Token doKeyword, Statement body, Token whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon}) : this.full(doKeyword, body, whileKeyword, leftParenthesis, condition, rightParenthesis, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitDoStatement(this);
+
   Token get beginToken => doKeyword;
 
   /**
@@ -4078,6 +4307,7 @@
    * @return the condition that determines when the loop will terminate
    */
   Expression get condition => _condition;
+
   Token get endToken => semicolon;
 
   /**
@@ -4129,11 +4359,13 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_body, visitor);
     safelyVisitChild(_condition, visitor);
   }
 }
+
 /**
  * Instances of the class `DoubleLiteral` represent a floating point literal expression.
  *
@@ -4149,7 +4381,6 @@
  * @coverage dart.engine.ast
  */
 class DoubleLiteral extends Literal {
-
   /**
    * The token representing the literal.
    */
@@ -4178,12 +4409,17 @@
    * @param value the value of the literal
    */
   DoubleLiteral({Token literal, double value}) : this.full(literal, value);
+
   accept(ASTVisitor visitor) => visitor.visitDoubleLiteral(this);
+
   Token get beginToken => literal;
+
   Token get endToken => literal;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `EmptyFunctionBody` represent an empty function body, which can only
  * appear in constructors or abstract methods.
@@ -4196,7 +4432,6 @@
  * @coverage dart.engine.ast
  */
 class EmptyFunctionBody extends FunctionBody {
-
   /**
    * The token representing the semicolon that marks the end of the function body.
    */
@@ -4217,12 +4452,17 @@
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
   EmptyFunctionBody({Token semicolon}) : this.full(semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitEmptyFunctionBody(this);
+
   Token get beginToken => semicolon;
+
   Token get endToken => semicolon;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `EmptyStatement` represent an empty statement.
  *
@@ -4234,7 +4474,6 @@
  * @coverage dart.engine.ast
  */
 class EmptyStatement extends Statement {
-
   /**
    * The semicolon terminating the statement.
    */
@@ -4255,12 +4494,17 @@
    * @param semicolon the semicolon terminating the statement
    */
   EmptyStatement({Token semicolon}) : this.full(semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitEmptyStatement(this);
+
   Token get beginToken => semicolon;
+
   Token get endToken => semicolon;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Ephemeral identifiers are created as needed to mimic the presence of an empty identifier.
  *
@@ -4270,8 +4514,10 @@
   EphemeralIdentifier.full(ASTNode parent, int location) : super.full(new Token(TokenType.IDENTIFIER, location)) {
     parent.becomeParentOf(this);
   }
+
   EphemeralIdentifier({ASTNode parent, int location}) : this.full(parent, location);
 }
+
 /**
  * Instances of the class `ExportDirective` represent an export directive.
  *
@@ -4283,7 +4529,6 @@
  * @coverage dart.engine.ast
  */
 class ExportDirective extends NamespaceDirective {
-
   /**
    * Initialize a newly created export directive.
    *
@@ -4307,19 +4552,23 @@
    * @param semicolon the semicolon terminating the directive
    */
   ExportDirective({Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon}) : this.full(comment, metadata, keyword, libraryUri, combinators, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitExportDirective(this);
+
   LibraryElement get uriElement {
     Element element = this.element;
     if (element is ExportElement) {
-      return ((element as ExportElement)).exportedLibrary;
+      return (element as ExportElement).exportedLibrary;
     }
     return null;
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     combinators.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `Expression` defines the behavior common to nodes that represent an
  * expression.
@@ -4334,7 +4583,6 @@
  * @coverage dart.engine.ast
  */
 abstract class Expression extends ASTNode {
-
   /**
    * The static type of this expression, or `null` if the AST structure has not been resolved.
    */
@@ -4392,7 +4640,7 @@
   ParameterElement get propagatedParameterElement {
     ASTNode parent = this.parent;
     if (parent is ArgumentList) {
-      return ((parent as ArgumentList)).getPropagatedParameterElementFor(this);
+      return (parent as ArgumentList).getPropagatedParameterElementFor(this);
     } else if (parent is IndexExpression) {
       IndexExpression indexExpression = parent as IndexExpression;
       if (identical(indexExpression.index, this)) {
@@ -4409,9 +4657,9 @@
         return assignmentExpression.propagatedParameterElementForRightHandSide;
       }
     } else if (parent is PrefixExpression) {
-      return ((parent as PrefixExpression)).propagatedParameterElementForOperand;
+      return (parent as PrefixExpression).propagatedParameterElementForOperand;
     } else if (parent is PostfixExpression) {
-      return ((parent as PostfixExpression)).propagatedParameterElementForOperand;
+      return (parent as PostfixExpression).propagatedParameterElementForOperand;
     }
     return null;
   }
@@ -4429,7 +4677,7 @@
   ParameterElement get staticParameterElement {
     ASTNode parent = this.parent;
     if (parent is ArgumentList) {
-      return ((parent as ArgumentList)).getStaticParameterElementFor(this);
+      return (parent as ArgumentList).getStaticParameterElementFor(this);
     } else if (parent is IndexExpression) {
       IndexExpression indexExpression = parent as IndexExpression;
       if (identical(indexExpression.index, this)) {
@@ -4446,9 +4694,9 @@
         return assignmentExpression.staticParameterElementForRightHandSide;
       }
     } else if (parent is PrefixExpression) {
-      return ((parent as PrefixExpression)).staticParameterElementForOperand;
+      return (parent as PrefixExpression).staticParameterElementForOperand;
     } else if (parent is PostfixExpression) {
-      return ((parent as PostfixExpression)).staticParameterElementForOperand;
+      return (parent as PostfixExpression).staticParameterElementForOperand;
     }
     return null;
   }
@@ -4461,6 +4709,7 @@
    */
   bool get isAssignable => false;
 }
+
 /**
  * Instances of the class `ExpressionFunctionBody` represent a function body consisting of a
  * single expression.
@@ -4473,7 +4722,6 @@
  * @coverage dart.engine.ast
  */
 class ExpressionFunctionBody extends FunctionBody {
-
   /**
    * The token introducing the expression that represents the body of the function.
    */
@@ -4512,8 +4760,11 @@
    * @param semicolon the semicolon terminating the statement
    */
   ExpressionFunctionBody({Token functionDefinition, Expression expression, Token semicolon}) : this.full(functionDefinition, expression, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitExpressionFunctionBody(this);
+
   Token get beginToken => functionDefinition;
+
   Token get endToken {
     if (semicolon != null) {
       return semicolon;
@@ -4536,10 +4787,12 @@
   void set expression(Expression expression) {
     this._expression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class `ExpressionStatement` wrap an expression as a statement.
  *
@@ -4551,7 +4804,6 @@
  * @coverage dart.engine.ast
  */
 class ExpressionStatement extends Statement {
-
   /**
    * The expression that comprises the statement.
    */
@@ -4581,8 +4833,11 @@
    * @param semicolon the semicolon terminating the statement
    */
   ExpressionStatement({Expression expression, Token semicolon}) : this.full(expression, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitExpressionStatement(this);
+
   Token get beginToken => _expression.beginToken;
+
   Token get endToken {
     if (semicolon != null) {
       return semicolon;
@@ -4596,6 +4851,7 @@
    * @return the expression that comprises the statement
    */
   Expression get expression => _expression;
+
   bool get isSynthetic => _expression.isSynthetic && semicolon.isSynthetic;
 
   /**
@@ -4606,10 +4862,12 @@
   void set expression(Expression expression) {
     this._expression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class `ExtendsClause` represent the "extends" clause in a class
  * declaration.
@@ -4622,7 +4880,6 @@
  * @coverage dart.engine.ast
  */
 class ExtendsClause extends ASTNode {
-
   /**
    * The token representing the 'extends' keyword.
    */
@@ -4651,8 +4908,11 @@
    * @param superclass the name of the class that is being extended
    */
   ExtendsClause({Token keyword, TypeName superclass}) : this.full(keyword, superclass);
+
   accept(ASTVisitor visitor) => visitor.visitExtendsClause(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => _superclass.endToken;
 
   /**
@@ -4670,10 +4930,12 @@
   void set superclass(TypeName name) {
     _superclass = becomeParentOf(name);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_superclass, visitor);
   }
 }
+
 /**
  * Instances of the class `FieldDeclaration` represent the declaration of one or more fields
  * of the same type.
@@ -4686,7 +4948,6 @@
  * @coverage dart.engine.ast
  */
 class FieldDeclaration extends ClassMember {
-
   /**
    * The token representing the 'static' keyword, or `null` if the fields are not static.
    */
@@ -4727,8 +4988,11 @@
    * @param semicolon the semicolon terminating the declaration
    */
   FieldDeclaration({Comment comment, List<Annotation> metadata, Token staticKeyword, VariableDeclarationList fieldList, Token semicolon}) : this.full(comment, metadata, staticKeyword, fieldList, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitFieldDeclaration(this);
+
   Element get element => null;
+
   Token get endToken => semicolon;
 
   /**
@@ -4753,10 +5017,12 @@
   void set fields(VariableDeclarationList fieldList) {
     fieldList = becomeParentOf(fieldList);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_fieldList, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata {
     if (staticKeyword != null) {
       return staticKeyword;
@@ -4764,6 +5030,7 @@
     return _fieldList.beginToken;
   }
 }
+
 /**
  * Instances of the class `FieldFormalParameter` represent a field formal parameter.
  *
@@ -4775,7 +5042,6 @@
  * @coverage dart.engine.ast
  */
 class FieldFormalParameter extends NormalFormalParameter {
-
   /**
    * The token representing either the 'final', 'const' or 'var' keyword, or `null` if no
    * keyword was used.
@@ -4839,7 +5105,9 @@
    *          not a function-typed field formal parameter
    */
   FieldFormalParameter({Comment comment, List<Annotation> metadata, Token keyword, TypeName type, Token thisToken, Token period, SimpleIdentifier identifier, FormalParameterList parameters}) : this.full(comment, metadata, keyword, type, thisToken, period, identifier, parameters);
+
   accept(ASTVisitor visitor) => visitor.visitFieldFormalParameter(this);
+
   Token get beginToken {
     if (keyword != null) {
       return keyword;
@@ -4848,6 +5116,7 @@
     }
     return thisToken;
   }
+
   Token get endToken => identifier.endToken;
 
   /**
@@ -4866,8 +5135,10 @@
    * @return the name of the declared type of the parameter
    */
   TypeName get type => _type;
-  bool get isConst => (keyword is KeywordToken) && identical(((keyword as KeywordToken)).keyword, Keyword.CONST);
-  bool get isFinal => (keyword is KeywordToken) && identical(((keyword as KeywordToken)).keyword, Keyword.FINAL);
+
+  bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
+
+  bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
 
   /**
    * Set the parameters of the function-typed parameter to the given parameters.
@@ -4886,6 +5157,7 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
@@ -4893,6 +5165,7 @@
     safelyVisitChild(_parameters, visitor);
   }
 }
+
 /**
  * Instances of the class `ForEachStatement` represent a for-each statement.
  *
@@ -4905,7 +5178,6 @@
  * @coverage dart.engine.ast
  */
 class ForEachStatement extends Statement {
-
   /**
    * The token representing the 'for' keyword.
    */
@@ -5010,7 +5282,9 @@
    * @param body the body of the loop
    */
   ForEachStatement.con2({Token forKeyword, Token leftParenthesis, SimpleIdentifier identifier, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body}) : this.con2_full(forKeyword, leftParenthesis, identifier, inKeyword, iterator, rightParenthesis, body);
+
   accept(ASTVisitor visitor) => visitor.visitForEachStatement(this);
+
   Token get beginToken => forKeyword;
 
   /**
@@ -5019,6 +5293,7 @@
    * @return the body of the loop
    */
   Statement get body => _body;
+
   Token get endToken => _body.endToken;
 
   /**
@@ -5078,6 +5353,7 @@
   void set loopVariable(DeclaredIdentifier variable) {
     _loopVariable = becomeParentOf(variable);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_loopVariable, visitor);
     safelyVisitChild(_identifier, visitor);
@@ -5085,6 +5361,7 @@
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * Instances of the class `ForStatement` represent a for statement.
  *
@@ -5103,7 +5380,6 @@
  * @coverage dart.engine.ast
  */
 class ForStatement extends Statement {
-
   /**
    * The token representing the 'for' keyword.
    */
@@ -5202,7 +5478,9 @@
    * @param body the body of the loop
    */
   ForStatement({Token forKeyword, Token leftParenthesis, VariableDeclarationList variableList, Expression initialization, Token leftSeparator, Expression condition, Token rightSeparator, List<Expression> updaters, Token rightParenthesis, Statement body}) : this.full(forKeyword, leftParenthesis, variableList, initialization, leftSeparator, condition, rightSeparator, updaters, rightParenthesis, body);
+
   accept(ASTVisitor visitor) => visitor.visitForStatement(this);
+
   Token get beginToken => forKeyword;
 
   /**
@@ -5219,6 +5497,7 @@
    * @return the condition used to determine when to terminate the loop
    */
   Expression get condition => _condition;
+
   Token get endToken => _body.endToken;
 
   /**
@@ -5270,6 +5549,7 @@
   void set variables(VariableDeclarationList variableList) {
     variableList = becomeParentOf(variableList);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_variableList, visitor);
     safelyVisitChild(_initialization, visitor);
@@ -5278,6 +5558,7 @@
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * The abstract class `FormalParameter` defines the behavior of objects representing a
  * parameter to a function.
@@ -5292,7 +5573,6 @@
  * @coverage dart.engine.ast
  */
 abstract class FormalParameter extends ASTNode {
-
   /**
    * Return the element representing this parameter, or `null` if this parameter has not been
    * resolved.
@@ -5337,6 +5617,7 @@
    */
   bool get isFinal;
 }
+
 /**
  * Instances of the class `FormalParameterList` represent the formal parameter list of a
  * method declaration, function declaration, or function type alias.
@@ -5369,7 +5650,6 @@
  * @coverage dart.engine.ast
  */
 class FormalParameterList extends ASTNode {
-
   /**
    * The left parenthesis.
    */
@@ -5425,8 +5705,11 @@
    * @param rightParenthesis the right parenthesis
    */
   FormalParameterList({Token leftParenthesis, List<FormalParameter> parameters, Token leftDelimiter, Token rightDelimiter, Token rightParenthesis}) : this.full(leftParenthesis, parameters, leftDelimiter, rightDelimiter, rightParenthesis);
+
   accept(ASTVisitor visitor) => visitor.visitFormalParameterList(this);
+
   Token get beginToken => _leftParenthesis;
+
   Token get endToken => _rightParenthesis;
 
   /**
@@ -5513,10 +5796,12 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
+
   void visitChildren(ASTVisitor visitor) {
     parameters.accept(visitor);
   }
 }
+
 /**
  * The abstract class `FunctionBody` defines the behavior common to objects representing the
  * body of a function or method.
@@ -5532,6 +5817,7 @@
  */
 abstract class FunctionBody extends ASTNode {
 }
+
 /**
  * Instances of the class `FunctionDeclaration` wrap a [FunctionExpression] as a top-level declaration.
  *
@@ -5547,7 +5833,6 @@
  * @coverage dart.engine.ast
  */
 class FunctionDeclaration extends CompilationUnitMember {
-
   /**
    * The token representing the 'external' keyword, or `null` if this is not an external
    * function.
@@ -5606,8 +5891,11 @@
    * @param functionExpression the function expression being wrapped
    */
   FunctionDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, TypeName returnType, Token propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression}) : this.full(comment, metadata, externalKeyword, returnType, propertyKeyword, name, functionExpression);
+
   accept(ASTVisitor visitor) => visitor.visitFunctionDeclaration(this);
+
   ExecutableElement get element => _name != null ? (_name.staticElement as ExecutableElement) : null;
+
   Token get endToken => _functionExpression.endToken;
 
   /**
@@ -5636,14 +5924,14 @@
    *
    * @return `true` if this function declares a getter
    */
-  bool get isGetter => propertyKeyword != null && identical(((propertyKeyword as KeywordToken)).keyword, Keyword.GET);
+  bool get isGetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.GET);
 
   /**
    * Return `true` if this function declares a setter.
    *
    * @return `true` if this function declares a setter
    */
-  bool get isSetter => propertyKeyword != null && identical(((propertyKeyword as KeywordToken)).keyword, Keyword.SET);
+  bool get isSetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.SET);
 
   /**
    * Set the function expression being wrapped to the given function expression.
@@ -5671,12 +5959,14 @@
   void set returnType(TypeName name) {
     _returnType = becomeParentOf(name);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_functionExpression, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata {
     if (externalKeyword != null) {
       return externalKeyword;
@@ -5691,6 +5981,7 @@
     return _functionExpression.beginToken;
   }
 }
+
 /**
  * Instances of the class `FunctionDeclarationStatement` wrap a [FunctionDeclaration
  ] as a statement.
@@ -5698,7 +5989,6 @@
  * @coverage dart.engine.ast
  */
 class FunctionDeclarationStatement extends Statement {
-
   /**
    * The function declaration being wrapped.
    */
@@ -5719,8 +6009,11 @@
    * @param functionDeclaration the the function declaration being wrapped
    */
   FunctionDeclarationStatement({FunctionDeclaration functionDeclaration}) : this.full(functionDeclaration);
+
   accept(ASTVisitor visitor) => visitor.visitFunctionDeclarationStatement(this);
+
   Token get beginToken => functionDeclaration.beginToken;
+
   Token get endToken => functionDeclaration.endToken;
 
   /**
@@ -5731,10 +6024,12 @@
   void set functionExpression(FunctionDeclaration functionDeclaration) {
     this.functionDeclaration = becomeParentOf(functionDeclaration);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(functionDeclaration, visitor);
   }
 }
+
 /**
  * Instances of the class `FunctionExpression` represent a function expression.
  *
@@ -5746,7 +6041,6 @@
  * @coverage dart.engine.ast
  */
 class FunctionExpression extends Expression {
-
   /**
    * The parameters associated with the function.
    */
@@ -5781,7 +6075,9 @@
    * @param body the body of the function
    */
   FunctionExpression({FormalParameterList parameters, FunctionBody body}) : this.full(parameters, body);
+
   accept(ASTVisitor visitor) => visitor.visitFunctionExpression(this);
+
   Token get beginToken {
     if (_parameters != null) {
       return _parameters.beginToken;
@@ -5797,6 +6093,7 @@
    * @return the body of the function
    */
   FunctionBody get body => _body;
+
   Token get endToken {
     if (_body != null) {
       return _body.endToken;
@@ -5830,11 +6127,13 @@
   void set parameters(FormalParameterList parameters) {
     this._parameters = becomeParentOf(parameters);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_parameters, visitor);
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * Instances of the class `FunctionExpressionInvocation` represent the invocation of a
  * function resulting from evaluating an expression. Invocations of methods and other forms of
@@ -5850,7 +6149,6 @@
  * @coverage dart.engine.ast
  */
 class FunctionExpressionInvocation extends Expression {
-
   /**
    * The expression producing the function being invoked.
    */
@@ -5891,6 +6189,7 @@
    * @param argumentList the list of arguments to the method
    */
   FunctionExpressionInvocation({Expression function, ArgumentList argumentList}) : this.full(function, argumentList);
+
   accept(ASTVisitor visitor) => visitor.visitFunctionExpressionInvocation(this);
 
   /**
@@ -5899,6 +6198,7 @@
    * @return the list of arguments to the method
    */
   ArgumentList get argumentList => _argumentList;
+
   Token get beginToken => _function.beginToken;
 
   /**
@@ -5916,6 +6216,7 @@
     }
     return element;
   }
+
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -5962,11 +6263,13 @@
   void set propagatedElement(ExecutableElement element) {
     _propagatedElement = element;
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_function, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class `FunctionTypeAlias` represent a function type alias.
  *
@@ -5981,7 +6284,6 @@
  * @coverage dart.engine.ast
  */
 class FunctionTypeAlias extends TypeAlias {
-
   /**
    * The name of the return type of the function type being defined, or `null` if no return
    * type was given.
@@ -6036,7 +6338,9 @@
    * @param semicolon the semicolon terminating the declaration
    */
   FunctionTypeAlias({Comment comment, List<Annotation> metadata, Token keyword, TypeName returnType, SimpleIdentifier name, TypeParameterList typeParameters, FormalParameterList parameters, Token semicolon}) : this.full(comment, metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitFunctionTypeAlias(this);
+
   FunctionTypeAliasElement get element => _name != null ? (_name.staticElement as FunctionTypeAliasElement) : null;
 
   /**
@@ -6104,6 +6408,7 @@
   void set typeParameters(TypeParameterList typeParameters) {
     this._typeParameters = becomeParentOf(typeParameters);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -6112,6 +6417,7 @@
     safelyVisitChild(_parameters, visitor);
   }
 }
+
 /**
  * Instances of the class `FunctionTypedFormalParameter` represent a function-typed formal
  * parameter.
@@ -6124,7 +6430,6 @@
  * @coverage dart.engine.ast
  */
 class FunctionTypedFormalParameter extends NormalFormalParameter {
-
   /**
    * The return type of the function, or `null` if the function does not have a return type.
    */
@@ -6161,13 +6466,16 @@
    * @param parameters the parameters of the function-typed parameter
    */
   FunctionTypedFormalParameter({Comment comment, List<Annotation> metadata, TypeName returnType, SimpleIdentifier identifier, FormalParameterList parameters}) : this.full(comment, metadata, returnType, identifier, parameters);
+
   accept(ASTVisitor visitor) => visitor.visitFunctionTypedFormalParameter(this);
+
   Token get beginToken {
     if (_returnType != null) {
       return _returnType.beginToken;
     }
     return identifier.beginToken;
   }
+
   Token get endToken => _parameters.endToken;
 
   /**
@@ -6184,7 +6492,9 @@
    * @return the return type of the function
    */
   TypeName get returnType => _returnType;
+
   bool get isConst => false;
+
   bool get isFinal => false;
 
   /**
@@ -6204,6 +6514,7 @@
   void set returnType(TypeName returnType) {
     this._returnType = becomeParentOf(returnType);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -6211,6 +6522,7 @@
     safelyVisitChild(_parameters, visitor);
   }
 }
+
 /**
  * Instances of the class `HideCombinator` represent a combinator that restricts the names
  * being imported to those that are not in a given list.
@@ -6223,7 +6535,6 @@
  * @coverage dart.engine.ast
  */
 class HideCombinator extends Combinator {
-
   /**
    * The list of names from the library that are hidden by this combinator.
    */
@@ -6247,12 +6558,16 @@
    * @param hiddenNames the list of names from the library that are hidden by this combinator
    */
   HideCombinator({Token keyword, List<SimpleIdentifier> hiddenNames}) : this.full(keyword, hiddenNames);
+
   accept(ASTVisitor visitor) => visitor.visitHideCombinator(this);
+
   Token get endToken => hiddenNames.endToken;
+
   void visitChildren(ASTVisitor visitor) {
     hiddenNames.accept(visitor);
   }
 }
+
 /**
  * The abstract class `Identifier` defines the behavior common to nodes that represent an
  * identifier.
@@ -6266,7 +6581,6 @@
  * @coverage dart.engine.ast
  */
 abstract class Identifier extends Expression {
-
   /**
    * Return `true` if the given name is visible only within the library in which it is
    * declared.
@@ -6312,8 +6626,10 @@
    * @return the element associated with the operator
    */
   Element get staticElement;
+
   bool get isAssignable => true;
 }
+
 /**
  * Instances of the class `IfStatement` represent an if statement.
  *
@@ -6325,7 +6641,6 @@
  * @coverage dart.engine.ast
  */
 class IfStatement extends Statement {
-
   /**
    * The token representing the 'if' keyword.
    */
@@ -6395,7 +6710,9 @@
    * @param elseStatement the statement that is executed if the condition evaluates to `false`
    */
   IfStatement({Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement}) : this.full(ifKeyword, leftParenthesis, condition, rightParenthesis, thenStatement, elseKeyword, elseStatement);
+
   accept(ASTVisitor visitor) => visitor.visitIfStatement(this);
+
   Token get beginToken => ifKeyword;
 
   /**
@@ -6412,6 +6729,7 @@
    * @return the statement that is executed if the condition evaluates to `false`
    */
   Statement get elseStatement => _elseStatement;
+
   Token get endToken {
     if (_elseStatement != null) {
       return _elseStatement.endToken;
@@ -6455,12 +6773,14 @@
   void set thenStatement(Statement statement) {
     _thenStatement = becomeParentOf(statement);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_thenStatement, visitor);
     safelyVisitChild(_elseStatement, visitor);
   }
 }
+
 /**
  * Instances of the class `ImplementsClause` represent the "implements" clause in an class
  * declaration.
@@ -6473,7 +6793,6 @@
  * @coverage dart.engine.ast
  */
 class ImplementsClause extends ASTNode {
-
   /**
    * The token representing the 'implements' keyword.
    */
@@ -6503,13 +6822,18 @@
    * @param interfaces the interfaces that are being implemented
    */
   ImplementsClause({Token keyword, List<TypeName> interfaces}) : this.full(keyword, interfaces);
+
   accept(ASTVisitor visitor) => visitor.visitImplementsClause(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => interfaces.endToken;
+
   void visitChildren(ASTVisitor visitor) {
     interfaces.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `ImportDirective` represent an import directive.
  *
@@ -6559,12 +6883,12 @@
     List<String> allShows1 = new List<String>();
     for (Combinator combinator in combinators1) {
       if (combinator is HideCombinator) {
-        NodeList<SimpleIdentifier> hides = ((combinator as HideCombinator)).hiddenNames;
+        NodeList<SimpleIdentifier> hides = (combinator as HideCombinator).hiddenNames;
         for (SimpleIdentifier simpleIdentifier in hides) {
           allHides1.add(simpleIdentifier.name);
         }
       } else {
-        NodeList<SimpleIdentifier> shows = ((combinator as ShowCombinator)).shownNames;
+        NodeList<SimpleIdentifier> shows = (combinator as ShowCombinator).shownNames;
         for (SimpleIdentifier simpleIdentifier in shows) {
           allShows1.add(simpleIdentifier.name);
         }
@@ -6575,12 +6899,12 @@
     List<String> allShows2 = new List<String>();
     for (Combinator combinator in combinators2) {
       if (combinator is HideCombinator) {
-        NodeList<SimpleIdentifier> hides = ((combinator as HideCombinator)).hiddenNames;
+        NodeList<SimpleIdentifier> hides = (combinator as HideCombinator).hiddenNames;
         for (SimpleIdentifier simpleIdentifier in hides) {
           allHides2.add(simpleIdentifier.name);
         }
       } else {
-        NodeList<SimpleIdentifier> shows = ((combinator as ShowCombinator)).shownNames;
+        NodeList<SimpleIdentifier> shows = (combinator as ShowCombinator).shownNames;
         for (SimpleIdentifier simpleIdentifier in shows) {
           allShows2.add(simpleIdentifier.name);
         }
@@ -6642,7 +6966,9 @@
    * @param semicolon the semicolon terminating the directive
    */
   ImportDirective({Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, Token asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon}) : this.full(comment, metadata, keyword, libraryUri, asToken, prefix, combinators, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitImportDirective(this);
+
   ImportElement get element => super.element as ImportElement;
 
   /**
@@ -6652,6 +6978,7 @@
    * @return the prefix to be used with the imported names
    */
   SimpleIdentifier get prefix => _prefix;
+
   LibraryElement get uriElement {
     ImportElement element = this.element;
     if (element == null) {
@@ -6668,12 +6995,14 @@
   void set prefix(SimpleIdentifier prefix) {
     this._prefix = becomeParentOf(prefix);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_prefix, visitor);
     combinators.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `IndexExpression` represent an index expression.
  *
@@ -6685,7 +7014,6 @@
  * @coverage dart.engine.ast
  */
 class IndexExpression extends Expression {
-
   /**
    * The expression used to compute the object being indexed, or `null` if this index
    * expression is part of a cascade expression.
@@ -6783,7 +7111,9 @@
    * @param rightBracket the right square bracket
    */
   IndexExpression.forCascade({Token period, Token leftBracket, Expression index, Token rightBracket}) : this.forCascade_full(period, leftBracket, index, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitIndexExpression(this);
+
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
@@ -6806,6 +7136,7 @@
     }
     return element;
   }
+
   Token get endToken => _rightBracket;
 
   /**
@@ -6850,7 +7181,7 @@
         }
         ancestor = ancestor.parent;
       }
-      return ((ancestor as CascadeExpression)).target;
+      return (ancestor as CascadeExpression).target;
     }
     return _target;
   }
@@ -6914,14 +7245,15 @@
   bool inSetterContext() {
     ASTNode parent = this.parent;
     if (parent is PrefixExpression) {
-      return ((parent as PrefixExpression)).operator.type.isIncrementOperator;
+      return (parent as PrefixExpression).operator.type.isIncrementOperator;
     } else if (parent is PostfixExpression) {
       return true;
     } else if (parent is AssignmentExpression) {
-      return identical(((parent as AssignmentExpression)).leftHandSide, this);
+      return identical((parent as AssignmentExpression).leftHandSide, this);
     }
     return false;
   }
+
   bool get isAssignable => true;
 
   /**
@@ -6988,6 +7320,7 @@
   void set target(Expression expression) {
     _target = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_index, visitor);
@@ -7035,6 +7368,7 @@
     return parameters[0];
   }
 }
+
 /**
  * Instances of the class `InstanceCreationExpression` represent an instance creation
  * expression.
@@ -7047,7 +7381,6 @@
  * @coverage dart.engine.ast
  */
 class InstanceCreationExpression extends Expression {
-
   /**
    * The keyword used to indicate how an object should be created.
    */
@@ -7090,6 +7423,7 @@
    * @param argumentList the list of arguments to the constructor
    */
   InstanceCreationExpression({Token keyword, ConstructorName constructorName, ArgumentList argumentList}) : this.full(keyword, constructorName, argumentList);
+
   accept(ASTVisitor visitor) => visitor.visitInstanceCreationExpression(this);
 
   /**
@@ -7098,7 +7432,9 @@
    * @return the list of arguments to the constructor
    */
   ArgumentList get argumentList => _argumentList;
+
   Token get beginToken => keyword;
+
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -7106,7 +7442,7 @@
    *
    * @return `true` if this creation expression is used to invoke a constant constructor
    */
-  bool get isConst => keyword is KeywordToken && identical(((keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool get isConst => keyword is KeywordToken && identical((keyword as KeywordToken).keyword, Keyword.CONST);
 
   /**
    * Set the list of arguments to the constructor to the given list.
@@ -7116,11 +7452,13 @@
   void set argumentList(ArgumentList argumentList) {
     this._argumentList = becomeParentOf(argumentList);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class `IntegerLiteral` represent an integer literal expression.
  *
@@ -7140,7 +7478,6 @@
  * @coverage dart.engine.ast
  */
 class IntegerLiteral extends Literal {
-
   /**
    * The token representing the literal.
    */
@@ -7169,12 +7506,17 @@
    * @param value the value of the literal
    */
   IntegerLiteral({Token literal, int value}) : this.full(literal, value);
+
   accept(ASTVisitor visitor) => visitor.visitIntegerLiteral(this);
+
   Token get beginToken => literal;
+
   Token get endToken => literal;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * The abstract class `InterpolationElement` defines the behavior common to elements within a
  * [StringInterpolation].
@@ -7189,6 +7531,7 @@
  */
 abstract class InterpolationElement extends ASTNode {
 }
+
 /**
  * Instances of the class `InterpolationExpression` represent an expression embedded in a
  * string interpolation.
@@ -7202,7 +7545,6 @@
  * @coverage dart.engine.ast
  */
 class InterpolationExpression extends InterpolationElement {
-
   /**
    * The token used to introduce the interpolation expression; either '$' if the expression is a
    * simple identifier or '${' if the expression is a full expression.
@@ -7240,8 +7582,11 @@
    * @param rightBracket the right curly bracket
    */
   InterpolationExpression({Token leftBracket, Expression expression, Token rightBracket}) : this.full(leftBracket, expression, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitInterpolationExpression(this);
+
   Token get beginToken => leftBracket;
+
   Token get endToken {
     if (rightBracket != null) {
       return rightBracket;
@@ -7265,10 +7610,12 @@
   void set expression(Expression expression) {
     this._expression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class `InterpolationString` represent a non-empty substring of an
  * interpolated string.
@@ -7281,7 +7628,6 @@
  * @coverage dart.engine.ast
  */
 class InterpolationString extends InterpolationElement {
-
   /**
    * The characters that will be added to the string.
    */
@@ -7310,7 +7656,9 @@
    * @param value the value of the literal
    */
   InterpolationString({Token contents, String value}) : this.full(contents, value);
+
   accept(ASTVisitor visitor) => visitor.visitInterpolationString(this);
+
   Token get beginToken => _contents;
 
   /**
@@ -7319,6 +7667,7 @@
    * @return the characters that will be added to the string
    */
   Token get contents => _contents;
+
   Token get endToken => _contents;
 
   /**
@@ -7345,9 +7694,11 @@
   void set value(String string) {
     _value = string;
   }
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `IsExpression` represent an is expression.
  *
@@ -7359,7 +7710,6 @@
  * @coverage dart.engine.ast
  */
 class IsExpression extends Expression {
-
   /**
    * The expression used to compute the value whose type is being tested.
    */
@@ -7404,8 +7754,11 @@
    * @param type the name of the type being tested for
    */
   IsExpression({Expression expression, Token isOperator, Token notOperator, TypeName type}) : this.full(expression, isOperator, notOperator, type);
+
   accept(ASTVisitor visitor) => visitor.visitIsExpression(this);
+
   Token get beginToken => _expression.beginToken;
+
   Token get endToken => _type.endToken;
 
   /**
@@ -7440,11 +7793,13 @@
   void set type(TypeName name) {
     this._type = becomeParentOf(name);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     safelyVisitChild(_type, visitor);
   }
 }
+
 /**
  * Instances of the class `Label` represent a label.
  *
@@ -7456,7 +7811,6 @@
  * @coverage dart.engine.ast
  */
 class Label extends ASTNode {
-
   /**
    * The label being associated with the statement.
    */
@@ -7485,8 +7839,11 @@
    * @param colon the colon that separates the label from whatever follows
    */
   Label({SimpleIdentifier label, Token colon}) : this.full(label, colon);
+
   accept(ASTVisitor visitor) => visitor.visitLabel(this);
+
   Token get beginToken => _label.beginToken;
+
   Token get endToken => colon;
 
   /**
@@ -7504,10 +7861,12 @@
   void set label(SimpleIdentifier label) {
     this._label = becomeParentOf(label);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
 }
+
 /**
  * Instances of the class `LabeledStatement` represent a statement that has a label associated
  * with them.
@@ -7520,7 +7879,6 @@
  * @coverage dart.engine.ast
  */
 class LabeledStatement extends Statement {
-
   /**
    * The labels being associated with the statement.
    */
@@ -7550,13 +7908,16 @@
    * @param statement the statement with which the labels are being associated
    */
   LabeledStatement({List<Label> labels, Statement statement}) : this.full(labels, statement);
+
   accept(ASTVisitor visitor) => visitor.visitLabeledStatement(this);
+
   Token get beginToken {
     if (!labels.isEmpty) {
       return labels.beginToken;
     }
     return _statement.beginToken;
   }
+
   Token get endToken => _statement.endToken;
 
   /**
@@ -7574,11 +7935,13 @@
   void set statement(Statement statement) {
     this._statement = becomeParentOf(statement);
   }
+
   void visitChildren(ASTVisitor visitor) {
     labels.accept(visitor);
     safelyVisitChild(_statement, visitor);
   }
 }
+
 /**
  * Instances of the class `LibraryDirective` represent a library directive.
  *
@@ -7590,7 +7953,6 @@
  * @coverage dart.engine.ast
  */
 class LibraryDirective extends Directive {
-
   /**
    * The token representing the 'library' token.
    */
@@ -7631,8 +7993,11 @@
    * @param semicolon the semicolon terminating the directive
    */
   LibraryDirective({Comment comment, List<Annotation> metadata, Token libraryToken, LibraryIdentifier name, Token semicolon}) : this.full(comment, metadata, libraryToken, name, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitLibraryDirective(this);
+
   Token get endToken => semicolon;
+
   Token get keyword => libraryToken;
 
   /**
@@ -7650,12 +8015,15 @@
   void set name(LibraryIdentifier name) {
     this._name = becomeParentOf(name);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata => libraryToken;
 }
+
 /**
  * Instances of the class `LibraryIdentifier` represent the identifier for a library.
  *
@@ -7667,7 +8035,6 @@
  * @coverage dart.engine.ast
  */
 class LibraryIdentifier extends Identifier {
-
   /**
    * The components of the identifier.
    */
@@ -7689,10 +8056,15 @@
    * @param components the components of the identifier
    */
   LibraryIdentifier({List<SimpleIdentifier> components}) : this.full(components);
+
   accept(ASTVisitor visitor) => visitor.visitLibraryIdentifier(this);
+
   Token get beginToken => components.beginToken;
+
   Element get bestElement => staticElement;
+
   Token get endToken => components.endToken;
+
   String get name {
     JavaStringBuilder builder = new JavaStringBuilder();
     bool needsPeriod = false;
@@ -7706,12 +8078,16 @@
     }
     return builder.toString();
   }
+
   Element get propagatedElement => null;
+
   Element get staticElement => null;
+
   void visitChildren(ASTVisitor visitor) {
     components.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `ListLiteral` represent a list literal.
  *
@@ -7723,7 +8099,6 @@
  * @coverage dart.engine.ast
  */
 class ListLiteral extends TypedLiteral {
-
   /**
    * The left square bracket.
    */
@@ -7767,7 +8142,9 @@
    * @param rightBracket the right square bracket
    */
   ListLiteral({Token constKeyword, TypeArgumentList typeArguments, Token leftBracket, List<Expression> elements, Token rightBracket}) : this.full(constKeyword, typeArguments, leftBracket, elements, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitListLiteral(this);
+
   Token get beginToken {
     Token token = constKeyword;
     if (token != null) {
@@ -7779,6 +8156,7 @@
     }
     return _leftBracket;
   }
+
   Token get endToken => _rightBracket;
 
   /**
@@ -7812,11 +8190,13 @@
   void set rightBracket(Token bracket) {
     _rightBracket = bracket;
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     elements.accept(visitor);
   }
 }
+
 /**
  * The abstract class `Literal` defines the behavior common to nodes that represent a literal
  * expression.
@@ -7836,6 +8216,7 @@
  */
 abstract class Literal extends Expression {
 }
+
 /**
  * Instances of the class `MapLiteral` represent a literal map.
  *
@@ -7847,7 +8228,6 @@
  * @coverage dart.engine.ast
  */
 class MapLiteral extends TypedLiteral {
-
   /**
    * The left curly bracket.
    */
@@ -7891,7 +8271,9 @@
    * @param rightBracket the right curly bracket
    */
   MapLiteral({Token constKeyword, TypeArgumentList typeArguments, Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket}) : this.full(constKeyword, typeArguments, leftBracket, entries, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitMapLiteral(this);
+
   Token get beginToken {
     Token token = constKeyword;
     if (token != null) {
@@ -7903,6 +8285,7 @@
     }
     return _leftBracket;
   }
+
   Token get endToken => _rightBracket;
 
   /**
@@ -7936,11 +8319,13 @@
   void set rightBracket(Token bracket) {
     _rightBracket = bracket;
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     entries.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `MapLiteralEntry` represent a single key/value pair in a map
  * literal.
@@ -7953,7 +8338,6 @@
  * @coverage dart.engine.ast
  */
 class MapLiteralEntry extends ASTNode {
-
   /**
    * The expression computing the key with which the value will be associated.
    */
@@ -7990,8 +8374,11 @@
    * @param value the expression computing the value that will be associated with the key
    */
   MapLiteralEntry({Expression key, Token separator, Expression value}) : this.full(key, separator, value);
+
   accept(ASTVisitor visitor) => visitor.visitMapLiteralEntry(this);
+
   Token get beginToken => _key.beginToken;
+
   Token get endToken => _value.endToken;
 
   /**
@@ -8027,11 +8414,13 @@
   void set value(Expression expression) {
     _value = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_key, visitor);
     safelyVisitChild(_value, visitor);
   }
 }
+
 /**
  * Instances of the class `MethodDeclaration` represent a method declaration.
  *
@@ -8051,7 +8440,6 @@
  * @coverage dart.engine.ast
  */
 class MethodDeclaration extends ClassMember {
-
   /**
    * The token for the 'external' keyword, or `null` if the constructor is not external.
    */
@@ -8137,6 +8525,7 @@
    * @param body the body of the method
    */
   MethodDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body}) : this.full(comment, metadata, externalKeyword, modifierKeyword, returnType, propertyKeyword, operatorKeyword, name, parameters, body);
+
   accept(ASTVisitor visitor) => visitor.visitMethodDeclaration(this);
 
   /**
@@ -8155,6 +8544,7 @@
    * @return the element associated with this method
    */
   ExecutableElement get element => _name != null ? (_name.staticElement as ExecutableElement) : null;
+
   Token get endToken => _body.endToken;
 
   /**
@@ -8191,7 +8581,7 @@
    *
    * @return `true` if this method declares a getter
    */
-  bool get isGetter => propertyKeyword != null && identical(((propertyKeyword as KeywordToken)).keyword, Keyword.GET);
+  bool get isGetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.GET);
 
   /**
    * Return `true` if this method declares an operator.
@@ -8205,14 +8595,14 @@
    *
    * @return `true` if this method declares a setter
    */
-  bool get isSetter => propertyKeyword != null && identical(((propertyKeyword as KeywordToken)).keyword, Keyword.SET);
+  bool get isSetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.SET);
 
   /**
    * Return `true` if this method is declared to be a static method.
    *
    * @return `true` if this method is declared to be a static method
    */
-  bool get isStatic => modifierKeyword != null && identical(((modifierKeyword as KeywordToken)).keyword, Keyword.STATIC);
+  bool get isStatic => modifierKeyword != null && identical((modifierKeyword as KeywordToken).keyword, Keyword.STATIC);
 
   /**
    * Set the body of the method to the given function body.
@@ -8249,6 +8639,7 @@
   void set returnType(TypeName typeName) {
     _returnType = becomeParentOf(typeName);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -8256,6 +8647,7 @@
     safelyVisitChild(_parameters, visitor);
     safelyVisitChild(_body, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata {
     if (modifierKeyword != null) {
       return modifierKeyword;
@@ -8269,6 +8661,7 @@
     return _name.beginToken;
   }
 }
+
 /**
  * Instances of the class `MethodInvocation` represent the invocation of either a function or
  * a method. Invocations of functions resulting from evaluating an expression are represented by
@@ -8284,7 +8677,6 @@
  * @coverage dart.engine.ast
  */
 class MethodInvocation extends Expression {
-
   /**
    * The expression producing the object on which the method is defined, or `null` if there is
    * no target (that is, the target is implicitly `this`).
@@ -8331,6 +8723,7 @@
    * @param argumentList the list of arguments to the method
    */
   MethodInvocation({Expression target, Token period, SimpleIdentifier methodName, ArgumentList argumentList}) : this.full(target, period, methodName, argumentList);
+
   accept(ASTVisitor visitor) => visitor.visitMethodInvocation(this);
 
   /**
@@ -8339,6 +8732,7 @@
    * @return the list of arguments to the method
    */
   ArgumentList get argumentList => _argumentList;
+
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
@@ -8347,6 +8741,7 @@
     }
     return _methodName.beginToken;
   }
+
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -8374,7 +8769,7 @@
         }
         ancestor = ancestor.parent;
       }
-      return ((ancestor as CascadeExpression)).target;
+      return (ancestor as CascadeExpression).target;
     }
     return _target;
   }
@@ -8424,12 +8819,14 @@
   void set target(Expression expression) {
     _target = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_methodName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class `NamedExpression` represent an expression that has a name associated
  * with it. They are used in method invocations when there are named parameters.
@@ -8442,7 +8839,6 @@
  * @coverage dart.engine.ast
  */
 class NamedExpression extends Expression {
-
   /**
    * The name associated with the expression.
    */
@@ -8471,7 +8867,9 @@
    * @param expression the expression with which the name is associated
    */
   NamedExpression({Label name, Expression expression}) : this.full(name, expression);
+
   accept(ASTVisitor visitor) => visitor.visitNamedExpression(this);
+
   Token get beginToken => _name.beginToken;
 
   /**
@@ -8488,6 +8886,7 @@
     }
     return null;
   }
+
   Token get endToken => _expression.endToken;
 
   /**
@@ -8521,11 +8920,13 @@
   void set name(Label identifier) {
     _name = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * The abstract class `NamespaceDirective` defines the behavior common to nodes that represent
  * a directive that impacts the namespace of a library.
@@ -8539,7 +8940,6 @@
  * @coverage dart.engine.ast
  */
 abstract class NamespaceDirective extends UriBasedDirective {
-
   /**
    * The token representing the 'import' or 'export' keyword.
    */
@@ -8583,8 +8983,11 @@
    * @param semicolon the semicolon terminating the directive
    */
   NamespaceDirective({Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon}) : this.full(comment, metadata, keyword, libraryUri, combinators, semicolon);
+
   Token get endToken => semicolon;
+
   Token get keyword => _keyword;
+
   LibraryElement get uriElement;
 
   /**
@@ -8595,8 +8998,10 @@
   void set keyword(Token exportToken) {
     this._keyword = exportToken;
   }
+
   Token get firstTokenAfterCommentAndMetadata => _keyword;
 }
+
 /**
  * Instances of the class `NativeClause` represent the "native" clause in an class
  * declaration.
@@ -8609,7 +9014,6 @@
  * @coverage dart.engine.ast
  */
 class NativeClause extends ASTNode {
-
   /**
    * The token representing the 'native' keyword.
    */
@@ -8638,13 +9042,18 @@
    * @param name the name of the native object that implements the class.
    */
   NativeClause({Token keyword, StringLiteral name}) : this.full(keyword, name);
+
   accept(ASTVisitor visitor) => visitor.visitNativeClause(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => name.endToken;
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(name, visitor);
   }
 }
+
 /**
  * Instances of the class `NativeFunctionBody` represent a function body that consists of a
  * native keyword followed by a string literal.
@@ -8657,7 +9066,6 @@
  * @coverage dart.engine.ast
  */
 class NativeFunctionBody extends FunctionBody {
-
   /**
    * The token representing 'native' that marks the start of the function body.
    */
@@ -8696,13 +9104,18 @@
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
   NativeFunctionBody({Token nativeToken, StringLiteral stringLiteral, Token semicolon}) : this.full(nativeToken, stringLiteral, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitNativeFunctionBody(this);
+
   Token get beginToken => nativeToken;
+
   Token get endToken => semicolon;
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(stringLiteral, visitor);
   }
 }
+
 /**
  * The abstract class `NormalFormalParameter` defines the behavior common to formal parameters
  * that are required (are not optional).
@@ -8717,7 +9130,6 @@
  * @coverage dart.engine.ast
  */
 abstract class NormalFormalParameter extends FormalParameter {
-
   /**
    * The documentation comment associated with this parameter, or `null` if this parameter
    * does not have a documentation comment associated with it.
@@ -8764,11 +9176,13 @@
    * @return the documentation comment associated with this parameter
    */
   Comment get documentationComment => _comment;
+
   SimpleIdentifier get identifier => _identifier;
+
   ParameterKind get kind {
     ASTNode parent = this.parent;
     if (parent is DefaultFormalParameter) {
-      return ((parent as DefaultFormalParameter)).kind;
+      return (parent as DefaultFormalParameter).kind;
     }
     return ParameterKind.REQUIRED;
   }
@@ -8790,6 +9204,7 @@
   void set identifier(SimpleIdentifier identifier) {
     this._identifier = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     if (commentIsBeforeAnnotations()) {
       safelyVisitChild(_comment, visitor);
@@ -8830,6 +9245,7 @@
     return children;
   }
 }
+
 /**
  * Instances of the class `NullLiteral` represent a null literal expression.
  *
@@ -8841,7 +9257,6 @@
  * @coverage dart.engine.ast
  */
 class NullLiteral extends Literal {
-
   /**
    * The token representing the literal.
    */
@@ -8862,12 +9277,17 @@
    * @param token the token representing the literal
    */
   NullLiteral({Token token}) : this.full(token);
+
   accept(ASTVisitor visitor) => visitor.visitNullLiteral(this);
+
   Token get beginToken => literal;
+
   Token get endToken => literal;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `ParenthesizedExpression` represent a parenthesized expression.
  *
@@ -8879,7 +9299,6 @@
  * @coverage dart.engine.ast
  */
 class ParenthesizedExpression extends Expression {
-
   /**
    * The left parenthesis.
    */
@@ -8916,8 +9335,11 @@
    * @param rightParenthesis the right parenthesis
    */
   ParenthesizedExpression({Token leftParenthesis, Expression expression, Token rightParenthesis}) : this.full(leftParenthesis, expression, rightParenthesis);
+
   accept(ASTVisitor visitor) => visitor.visitParenthesizedExpression(this);
+
   Token get beginToken => _leftParenthesis;
+
   Token get endToken => _rightParenthesis;
 
   /**
@@ -8967,10 +9389,12 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class `PartDirective` represent a part directive.
  *
@@ -8982,7 +9406,6 @@
  * @coverage dart.engine.ast
  */
 class PartDirective extends UriBasedDirective {
-
   /**
    * The token representing the 'part' token.
    */
@@ -9017,12 +9440,18 @@
    * @param semicolon the semicolon terminating the directive
    */
   PartDirective({Comment comment, List<Annotation> metadata, Token partToken, StringLiteral partUri, Token semicolon}) : this.full(comment, metadata, partToken, partUri, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitPartDirective(this);
+
   Token get endToken => semicolon;
+
   Token get keyword => partToken;
+
   CompilationUnitElement get uriElement => element as CompilationUnitElement;
+
   Token get firstTokenAfterCommentAndMetadata => partToken;
 }
+
 /**
  * Instances of the class `PartOfDirective` represent a part-of directive.
  *
@@ -9034,7 +9463,6 @@
  * @coverage dart.engine.ast
  */
 class PartOfDirective extends Directive {
-
   /**
    * The token representing the 'part' token.
    */
@@ -9083,8 +9511,11 @@
    * @param semicolon the semicolon terminating the directive
    */
   PartOfDirective({Comment comment, List<Annotation> metadata, Token partToken, Token ofToken, LibraryIdentifier libraryName, Token semicolon}) : this.full(comment, metadata, partToken, ofToken, libraryName, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitPartOfDirective(this);
+
   Token get endToken => semicolon;
+
   Token get keyword => partToken;
 
   /**
@@ -9102,12 +9533,15 @@
   void set libraryName(LibraryIdentifier libraryName) {
     this._libraryName = becomeParentOf(libraryName);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_libraryName, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata => partToken;
 }
+
 /**
  * Instances of the class `PostfixExpression` represent a postfix unary expression.
  *
@@ -9119,7 +9553,6 @@
  * @coverage dart.engine.ast
  */
 class PostfixExpression extends Expression {
-
   /**
    * The expression computing the operand for the operator.
    */
@@ -9162,7 +9595,9 @@
    * @param operator the postfix operator being applied to the operand
    */
   PostfixExpression({Expression operand, Token operator}) : this.full(operand, operator);
+
   accept(ASTVisitor visitor) => visitor.visitPostfixExpression(this);
+
   Token get beginToken => _operand.beginToken;
 
   /**
@@ -9180,6 +9615,7 @@
     }
     return element;
   }
+
   Token get endToken => operator;
 
   /**
@@ -9237,6 +9673,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_operand, visitor);
   }
@@ -9283,6 +9720,7 @@
     return parameters[0];
   }
 }
+
 /**
  * Instances of the class `PrefixExpression` represent a prefix unary expression.
  *
@@ -9294,7 +9732,6 @@
  * @coverage dart.engine.ast
  */
 class PrefixExpression extends Expression {
-
   /**
    * The prefix operator being applied to the operand.
    */
@@ -9337,7 +9774,9 @@
    * @param operand the expression computing the operand for the operator
    */
   PrefixExpression({Token operator, Expression operand}) : this.full(operator, operand);
+
   accept(ASTVisitor visitor) => visitor.visitPrefixExpression(this);
+
   Token get beginToken => operator;
 
   /**
@@ -9355,6 +9794,7 @@
     }
     return element;
   }
+
   Token get endToken => _operand.endToken;
 
   /**
@@ -9412,6 +9852,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_operand, visitor);
   }
@@ -9458,6 +9899,7 @@
     return parameters[0];
   }
 }
+
 /**
  * Instances of the class `PrefixedIdentifier` represent either an identifier that is prefixed
  * or an access to an object property where the target of the property access is a simple
@@ -9471,7 +9913,6 @@
  * @coverage dart.engine.ast
  */
 class PrefixedIdentifier extends Identifier {
-
   /**
    * The prefix associated with the library in which the identifier is defined.
    */
@@ -9508,14 +9949,18 @@
    * @param identifier the prefix associated with the library in which the identifier is defined
    */
   PrefixedIdentifier({SimpleIdentifier prefix, Token period, SimpleIdentifier identifier}) : this.full(prefix, period, identifier);
+
   accept(ASTVisitor visitor) => visitor.visitPrefixedIdentifier(this);
+
   Token get beginToken => _prefix.beginToken;
+
   Element get bestElement {
     if (_identifier == null) {
       return null;
     }
     return _identifier.bestElement;
   }
+
   Token get endToken => _identifier.endToken;
 
   /**
@@ -9524,6 +9969,7 @@
    * @return the identifier being prefixed
    */
   SimpleIdentifier get identifier => _identifier;
+
   String get name => "${_prefix.name}.${_identifier.name}";
 
   /**
@@ -9532,12 +9978,14 @@
    * @return the prefix associated with the library in which the identifier is defined
    */
   SimpleIdentifier get prefix => _prefix;
+
   Element get propagatedElement {
     if (_identifier == null) {
       return null;
     }
     return _identifier.propagatedElement;
   }
+
   Element get staticElement {
     if (_identifier == null) {
       return null;
@@ -9563,11 +10011,13 @@
   void set prefix(SimpleIdentifier identifier) {
     _prefix = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_prefix, visitor);
     safelyVisitChild(_identifier, visitor);
   }
 }
+
 /**
  * Instances of the class `PropertyAccess` represent the access of a property of an object.
  *
@@ -9583,7 +10033,6 @@
  * @coverage dart.engine.ast
  */
 class PropertyAccess extends Expression {
-
   /**
    * The expression computing the object defining the property being accessed.
    */
@@ -9620,13 +10069,16 @@
    * @param propertyName the name of the property being accessed
    */
   PropertyAccess({Expression target, Token operator, SimpleIdentifier propertyName}) : this.full(target, operator, propertyName);
+
   accept(ASTVisitor visitor) => visitor.visitPropertyAccess(this);
+
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
     }
     return operator;
   }
+
   Token get endToken => _propertyName.endToken;
 
   /**
@@ -9654,7 +10106,7 @@
         }
         ancestor = ancestor.parent;
       }
-      return ((ancestor as CascadeExpression)).target;
+      return (ancestor as CascadeExpression).target;
     }
     return _target;
   }
@@ -9667,6 +10119,7 @@
    * @see #getRealTarget()
    */
   Expression get target => _target;
+
   bool get isAssignable => true;
 
   /**
@@ -9696,11 +10149,13 @@
   void set target(Expression expression) {
     _target = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_propertyName, visitor);
   }
 }
+
 /**
  * Instances of the class `RedirectingConstructorInvocation` represent the invocation of a
  * another constructor in the same class from within a constructor's initialization list.
@@ -9713,7 +10168,6 @@
  * @coverage dart.engine.ast
  */
 class RedirectingConstructorInvocation extends ConstructorInitializer {
-
   /**
    * The token for the 'this' keyword.
    */
@@ -9768,6 +10222,7 @@
    * @param argumentList the list of arguments to the constructor
    */
   RedirectingConstructorInvocation({Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList}) : this.full(keyword, period, constructorName, argumentList);
+
   accept(ASTVisitor visitor) => visitor.visitRedirectingConstructorInvocation(this);
 
   /**
@@ -9776,6 +10231,7 @@
    * @return the list of arguments to the constructor
    */
   ArgumentList get argumentList => _argumentList;
+
   Token get beginToken => keyword;
 
   /**
@@ -9785,6 +10241,7 @@
    * @return the name of the constructor that is being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
+
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -9804,11 +10261,13 @@
   void set constructorName(SimpleIdentifier identifier) {
     _constructorName = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class `RethrowExpression` represent a rethrow expression.
  *
@@ -9820,7 +10279,6 @@
  * @coverage dart.engine.ast
  */
 class RethrowExpression extends Expression {
-
   /**
    * The token representing the 'rethrow' keyword.
    */
@@ -9841,12 +10299,17 @@
    * @param keyword the token representing the 'rethrow' keyword
    */
   RethrowExpression({Token keyword}) : this.full(keyword);
+
   accept(ASTVisitor visitor) => visitor.visitRethrowExpression(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => keyword;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `ReturnStatement` represent a return statement.
  *
@@ -9858,7 +10321,6 @@
  * @coverage dart.engine.ast
  */
 class ReturnStatement extends Statement {
-
   /**
    * The token representing the 'return' keyword.
    */
@@ -9896,8 +10358,11 @@
    * @param semicolon the semicolon terminating the statement
    */
   ReturnStatement({Token keyword, Expression expression, Token semicolon}) : this.full(keyword, expression, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitReturnStatement(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => semicolon;
 
   /**
@@ -9916,10 +10381,12 @@
   void set expression(Expression expression) {
     this._expression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class `ScriptTag` represent the script tag that can optionally occur at
  * the beginning of a compilation unit.
@@ -9932,7 +10399,6 @@
  * @coverage dart.engine.ast
  */
 class ScriptTag extends ASTNode {
-
   /**
    * The token representing this script tag.
    */
@@ -9953,12 +10419,17 @@
    * @param scriptTag the token representing this script tag
    */
   ScriptTag({Token scriptTag}) : this.full(scriptTag);
+
   accept(ASTVisitor visitor) => visitor.visitScriptTag(this);
+
   Token get beginToken => scriptTag;
+
   Token get endToken => scriptTag;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `ShowCombinator` represent a combinator that restricts the names
  * being imported to those in a given list.
@@ -9971,7 +10442,6 @@
  * @coverage dart.engine.ast
  */
 class ShowCombinator extends Combinator {
-
   /**
    * The list of names from the library that are made visible by this combinator.
    */
@@ -9995,12 +10465,16 @@
    * @param shownNames the list of names from the library that are made visible by this combinator
    */
   ShowCombinator({Token keyword, List<SimpleIdentifier> shownNames}) : this.full(keyword, shownNames);
+
   accept(ASTVisitor visitor) => visitor.visitShowCombinator(this);
+
   Token get endToken => shownNames.endToken;
+
   void visitChildren(ASTVisitor visitor) {
     shownNames.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `SimpleFormalParameter` represent a simple formal parameter.
  *
@@ -10012,7 +10486,6 @@
  * @coverage dart.engine.ast
  */
 class SimpleFormalParameter extends NormalFormalParameter {
-
   /**
    * The token representing either the 'final', 'const' or 'var' keyword, or `null` if no
    * keyword was used.
@@ -10049,7 +10522,9 @@
    * @param identifier the name of the parameter being declared
    */
   SimpleFormalParameter({Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier}) : this.full(comment, metadata, keyword, type, identifier);
+
   accept(ASTVisitor visitor) => visitor.visitSimpleFormalParameter(this);
+
   Token get beginToken {
     if (keyword != null) {
       return keyword;
@@ -10058,6 +10533,7 @@
     }
     return identifier.beginToken;
   }
+
   Token get endToken => identifier.endToken;
 
   /**
@@ -10067,8 +10543,10 @@
    * @return the name of the declared type of the parameter
    */
   TypeName get type => _type;
-  bool get isConst => (keyword is KeywordToken) && identical(((keyword as KeywordToken)).keyword, Keyword.CONST);
-  bool get isFinal => (keyword is KeywordToken) && identical(((keyword as KeywordToken)).keyword, Keyword.FINAL);
+
+  bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
+
+  bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
 
   /**
    * Set the name of the declared type of the parameter to the given type name.
@@ -10078,12 +10556,14 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     safelyVisitChild(identifier, visitor);
   }
 }
+
 /**
  * Instances of the class `SimpleIdentifier` represent a simple identifier.
  *
@@ -10099,7 +10579,6 @@
  * @coverage dart.engine.ast
  */
 class SimpleIdentifier extends Identifier {
-
   /**
    * The token representing the identifier.
    */
@@ -10140,17 +10619,24 @@
    * @param token the token representing the identifier
    */
   SimpleIdentifier({Token token}) : this.full(token);
+
   accept(ASTVisitor visitor) => visitor.visitSimpleIdentifier(this);
+
   Token get beginToken => token;
+
   Element get bestElement {
     if (_propagatedElement == null) {
       return _staticElement;
     }
     return _propagatedElement;
   }
+
   Token get endToken => token;
+
   String get name => token.lexeme;
+
   Element get propagatedElement => _propagatedElement;
+
   Element get staticElement => _staticElement;
 
   /**
@@ -10164,27 +10650,27 @@
       CatchClause clause = parent as CatchClause;
       return identical(this, clause.exceptionParameter) || identical(this, clause.stackTraceParameter);
     } else if (parent is ClassDeclaration) {
-      return identical(this, ((parent as ClassDeclaration)).name);
+      return identical(this, (parent as ClassDeclaration).name);
     } else if (parent is ClassTypeAlias) {
-      return identical(this, ((parent as ClassTypeAlias)).name);
+      return identical(this, (parent as ClassTypeAlias).name);
     } else if (parent is ConstructorDeclaration) {
-      return identical(this, ((parent as ConstructorDeclaration)).name);
+      return identical(this, (parent as ConstructorDeclaration).name);
     } else if (parent is DeclaredIdentifier) {
-      return identical(this, ((parent as DeclaredIdentifier)).identifier);
+      return identical(this, (parent as DeclaredIdentifier).identifier);
     } else if (parent is FunctionDeclaration) {
-      return identical(this, ((parent as FunctionDeclaration)).name);
+      return identical(this, (parent as FunctionDeclaration).name);
     } else if (parent is FunctionTypeAlias) {
-      return identical(this, ((parent as FunctionTypeAlias)).name);
+      return identical(this, (parent as FunctionTypeAlias).name);
     } else if (parent is Label) {
-      return identical(this, ((parent as Label)).label) && (parent.parent is LabeledStatement);
+      return identical(this, (parent as Label).label) && (parent.parent is LabeledStatement);
     } else if (parent is MethodDeclaration) {
-      return identical(this, ((parent as MethodDeclaration)).name);
+      return identical(this, (parent as MethodDeclaration).name);
     } else if (parent is FunctionTypedFormalParameter || parent is SimpleFormalParameter) {
-      return identical(this, ((parent as NormalFormalParameter)).identifier);
+      return identical(this, (parent as NormalFormalParameter).identifier);
     } else if (parent is TypeParameter) {
-      return identical(this, ((parent as TypeParameter)).name);
+      return identical(this, (parent as TypeParameter).name);
     } else if (parent is VariableDeclaration) {
-      return identical(this, ((parent as VariableDeclaration)).name);
+      return identical(this, (parent as VariableDeclaration).name);
     }
     return false;
   }
@@ -10256,14 +10742,15 @@
       target = access;
     }
     if (parent is PrefixExpression) {
-      return ((parent as PrefixExpression)).operator.type.isIncrementOperator;
+      return (parent as PrefixExpression).operator.type.isIncrementOperator;
     } else if (parent is PostfixExpression) {
       return true;
     } else if (parent is AssignmentExpression) {
-      return identical(((parent as AssignmentExpression)).leftHandSide, target);
+      return identical((parent as AssignmentExpression).leftHandSide, target);
     }
     return false;
   }
+
   bool get isSynthetic => token.isSynthetic;
 
   /**
@@ -10285,6 +10772,7 @@
   void set staticElement(Element element) {
     _staticElement = validateElement2(element);
   }
+
   void visitChildren(ASTVisitor visitor) {
   }
 
@@ -10315,28 +10803,29 @@
       return null;
     }
     ASTNode parent = this.parent;
-    if (parent is ClassDeclaration && identical(((parent as ClassDeclaration)).name, this)) {
+    if (parent is ClassDeclaration && identical((parent as ClassDeclaration).name, this)) {
       return validateElement(parent, ClassElement, element);
-    } else if (parent is ClassTypeAlias && identical(((parent as ClassTypeAlias)).name, this)) {
+    } else if (parent is ClassTypeAlias && identical((parent as ClassTypeAlias).name, this)) {
       return validateElement(parent, ClassElement, element);
-    } else if (parent is DeclaredIdentifier && identical(((parent as DeclaredIdentifier)).identifier, this)) {
+    } else if (parent is DeclaredIdentifier && identical((parent as DeclaredIdentifier).identifier, this)) {
       return validateElement(parent, LocalVariableElement, element);
-    } else if (parent is FormalParameter && identical(((parent as FormalParameter)).identifier, this)) {
+    } else if (parent is FormalParameter && identical((parent as FormalParameter).identifier, this)) {
       return validateElement(parent, ParameterElement, element);
-    } else if (parent is FunctionDeclaration && identical(((parent as FunctionDeclaration)).name, this)) {
+    } else if (parent is FunctionDeclaration && identical((parent as FunctionDeclaration).name, this)) {
       return validateElement(parent, ExecutableElement, element);
-    } else if (parent is FunctionTypeAlias && identical(((parent as FunctionTypeAlias)).name, this)) {
+    } else if (parent is FunctionTypeAlias && identical((parent as FunctionTypeAlias).name, this)) {
       return validateElement(parent, FunctionTypeAliasElement, element);
-    } else if (parent is MethodDeclaration && identical(((parent as MethodDeclaration)).name, this)) {
+    } else if (parent is MethodDeclaration && identical((parent as MethodDeclaration).name, this)) {
       return validateElement(parent, ExecutableElement, element);
-    } else if (parent is TypeParameter && identical(((parent as TypeParameter)).name, this)) {
+    } else if (parent is TypeParameter && identical((parent as TypeParameter).name, this)) {
       return validateElement(parent, TypeParameterElement, element);
-    } else if (parent is VariableDeclaration && identical(((parent as VariableDeclaration)).name, this)) {
+    } else if (parent is VariableDeclaration && identical((parent as VariableDeclaration).name, this)) {
       return validateElement(parent, VariableElement, element);
     }
     return element;
   }
 }
+
 /**
  * Instances of the class `SimpleStringLiteral` represent a string literal expression that
  * does not contain any interpolations.
@@ -10365,7 +10854,6 @@
  * @coverage dart.engine.ast
  */
 class SimpleStringLiteral extends StringLiteral {
-
   /**
    * The token representing the literal.
    */
@@ -10394,8 +10882,11 @@
    * @param value the value of the literal
    */
   SimpleStringLiteral({Token literal, String value}) : this.full(literal, value);
+
   accept(ASTVisitor visitor) => visitor.visitSimpleStringLiteral(this);
+
   Token get beginToken => literal;
+
   Token get endToken => literal;
 
   /**
@@ -10423,6 +10914,7 @@
    * @return `true` if this string literal is a raw string
    */
   bool get isRaw => _value.codeUnitAt(0) == 0x40;
+
   bool get isSynthetic => literal.isSynthetic;
 
   /**
@@ -10433,12 +10925,15 @@
   void set value(String string) {
     _value = StringUtilities.intern(_value);
   }
+
   void visitChildren(ASTVisitor visitor) {
   }
+
   void appendStringValue(JavaStringBuilder builder) {
     builder.append(value);
   }
 }
+
 /**
  * Instances of the class `Statement` defines the behavior common to nodes that represent a
  * statement.
@@ -10465,6 +10960,7 @@
  */
 abstract class Statement extends ASTNode {
 }
+
 /**
  * Instances of the class `StringInterpolation` represent a string interpolation literal.
  *
@@ -10477,7 +10973,6 @@
  * @coverage dart.engine.ast
  */
 class StringInterpolation extends StringLiteral {
-
   /**
    * The elements that will be composed to produce the resulting string.
    */
@@ -10499,16 +10994,22 @@
    * @param elements the elements that will be composed to produce the resulting string
    */
   StringInterpolation({List<InterpolationElement> elements}) : this.full(elements);
+
   accept(ASTVisitor visitor) => visitor.visitStringInterpolation(this);
+
   Token get beginToken => elements.beginToken;
+
   Token get endToken => elements.endToken;
+
   void visitChildren(ASTVisitor visitor) {
     elements.accept(visitor);
   }
+
   void appendStringValue(JavaStringBuilder builder) {
     throw new IllegalArgumentException();
   }
 }
+
 /**
  * Instances of the class `StringLiteral` represent a string literal expression.
  *
@@ -10522,7 +11023,6 @@
  * @coverage dart.engine.ast
  */
 abstract class StringLiteral extends Literal {
-
   /**
    * Return the value of the string literal, or `null` if the string is not a constant string
    * without any string interpolation.
@@ -10548,6 +11048,7 @@
    */
   void appendStringValue(JavaStringBuilder builder);
 }
+
 /**
  * Instances of the class `SuperConstructorInvocation` represent the invocation of a
  * superclass' constructor from within a constructor's initialization list.
@@ -10560,7 +11061,6 @@
  * @coverage dart.engine.ast
  */
 class SuperConstructorInvocation extends ConstructorInitializer {
-
   /**
    * The token for the 'super' keyword.
    */
@@ -10615,6 +11115,7 @@
    * @param argumentList the list of arguments to the constructor
    */
   SuperConstructorInvocation({Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList}) : this.full(keyword, period, constructorName, argumentList);
+
   accept(ASTVisitor visitor) => visitor.visitSuperConstructorInvocation(this);
 
   /**
@@ -10623,6 +11124,7 @@
    * @return the list of arguments to the constructor
    */
   ArgumentList get argumentList => _argumentList;
+
   Token get beginToken => keyword;
 
   /**
@@ -10632,6 +11134,7 @@
    * @return the name of the constructor that is being invoked
    */
   SimpleIdentifier get constructorName => _constructorName;
+
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -10651,11 +11154,13 @@
   void set constructorName(SimpleIdentifier identifier) {
     _constructorName = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
+
 /**
  * Instances of the class `SuperExpression` represent a super expression.
  *
@@ -10667,7 +11172,6 @@
  * @coverage dart.engine.ast
  */
 class SuperExpression extends Expression {
-
   /**
    * The token representing the keyword.
    */
@@ -10688,12 +11192,17 @@
    * @param keyword the token representing the keyword
    */
   SuperExpression({Token keyword}) : this.full(keyword);
+
   accept(ASTVisitor visitor) => visitor.visitSuperExpression(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => keyword;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `SwitchCase` represent the case in a switch statement.
  *
@@ -10705,7 +11214,6 @@
  * @coverage dart.engine.ast
  */
 class SwitchCase extends SwitchMember {
-
   /**
    * The expression controlling whether the statements will be executed.
    */
@@ -10734,6 +11242,7 @@
    * @param statements the statements that will be executed if this switch member is selected
    */
   SwitchCase({List<Label> labels, Token keyword, Expression expression, Token colon, List<Statement> statements}) : this.full(labels, keyword, expression, colon, statements);
+
   accept(ASTVisitor visitor) => visitor.visitSwitchCase(this);
 
   /**
@@ -10751,12 +11260,14 @@
   void set expression(Expression expression) {
     this._expression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     labels.accept(visitor);
     safelyVisitChild(_expression, visitor);
     statements.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `SwitchDefault` represent the default case in a switch statement.
  *
@@ -10768,7 +11279,6 @@
  * @coverage dart.engine.ast
  */
 class SwitchDefault extends SwitchMember {
-
   /**
    * Initialize a newly created switch default.
    *
@@ -10788,12 +11298,15 @@
    * @param statements the statements that will be executed if this switch member is selected
    */
   SwitchDefault({List<Label> labels, Token keyword, Token colon, List<Statement> statements}) : this.full(labels, keyword, colon, statements);
+
   accept(ASTVisitor visitor) => visitor.visitSwitchDefault(this);
+
   void visitChildren(ASTVisitor visitor) {
     labels.accept(visitor);
     statements.accept(visitor);
   }
 }
+
 /**
  * The abstract class `SwitchMember` defines the behavior common to objects representing
  * elements within a switch statement.
@@ -10807,7 +11320,6 @@
  * @coverage dart.engine.ast
  */
 abstract class SwitchMember extends ASTNode {
-
   /**
    * The labels associated with the switch member.
    */
@@ -10854,12 +11366,14 @@
    * @param statements the statements that will be executed if this switch member is selected
    */
   SwitchMember({List<Label> labels, Token keyword, Token colon, List<Statement> statements}) : this.full(labels, keyword, colon, statements);
+
   Token get beginToken {
     if (!labels.isEmpty) {
       return labels.beginToken;
     }
     return keyword;
   }
+
   Token get endToken {
     if (!statements.isEmpty) {
       return statements.endToken;
@@ -10867,6 +11381,7 @@
     return colon;
   }
 }
+
 /**
  * Instances of the class `SwitchStatement` represent a switch statement.
  *
@@ -10878,7 +11393,6 @@
  * @coverage dart.engine.ast
  */
 class SwitchStatement extends Statement {
-
   /**
    * The token representing the 'switch' keyword.
    */
@@ -10948,8 +11462,11 @@
    * @param rightBracket the right curly bracket
    */
   SwitchStatement({Token keyword, Token leftParenthesis, Expression expression, Token rightParenthesis, Token leftBracket, List<SwitchMember> members, Token rightBracket}) : this.full(keyword, leftParenthesis, expression, rightParenthesis, leftBracket, members, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitSwitchStatement(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => rightBracket;
 
   /**
@@ -10968,11 +11485,13 @@
   void set expression(Expression expression) {
     this._expression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     members.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `SymbolLiteral` represent a symbol literal expression.
  *
@@ -10984,7 +11503,6 @@
  * @coverage dart.engine.ast
  */
 class SymbolLiteral extends Literal {
-
   /**
    * The token introducing the literal.
    */
@@ -11013,12 +11531,17 @@
    * @param components the components of the literal
    */
   SymbolLiteral({Token poundSign, List<Token> components}) : this.full(poundSign, components);
+
   accept(ASTVisitor visitor) => visitor.visitSymbolLiteral(this);
+
   Token get beginToken => poundSign;
+
   Token get endToken => components[components.length - 1];
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `ThisExpression` represent a this expression.
  *
@@ -11030,7 +11553,6 @@
  * @coverage dart.engine.ast
  */
 class ThisExpression extends Expression {
-
   /**
    * The token representing the keyword.
    */
@@ -11051,12 +11573,17 @@
    * @param keyword the token representing the keyword
    */
   ThisExpression({Token keyword}) : this.full(keyword);
+
   accept(ASTVisitor visitor) => visitor.visitThisExpression(this);
+
   Token get beginToken => keyword;
+
   Token get endToken => keyword;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `ThrowExpression` represent a throw expression.
  *
@@ -11068,7 +11595,6 @@
  * @coverage dart.engine.ast
  */
 class ThrowExpression extends Expression {
-
   /**
    * The token representing the 'throw' keyword.
    */
@@ -11097,8 +11623,11 @@
    * @param expression the expression computing the exception to be thrown
    */
   ThrowExpression({Token keyword, Expression expression}) : this.full(keyword, expression);
+
   accept(ASTVisitor visitor) => visitor.visitThrowExpression(this);
+
   Token get beginToken => keyword;
+
   Token get endToken {
     if (_expression != null) {
       return _expression.endToken;
@@ -11121,10 +11650,12 @@
   void set expression(Expression expression) {
     this._expression = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
+
 /**
  * Instances of the class `TopLevelVariableDeclaration` represent the declaration of one or
  * more top-level variables of the same type.
@@ -11138,7 +11669,6 @@
  * @coverage dart.engine.ast
  */
 class TopLevelVariableDeclaration extends CompilationUnitMember {
-
   /**
    * The top-level variables being declared.
    */
@@ -11171,8 +11701,11 @@
    * @param semicolon the semicolon terminating the declaration
    */
   TopLevelVariableDeclaration({Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, Token semicolon}) : this.full(comment, metadata, variableList, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitTopLevelVariableDeclaration(this);
+
   Element get element => null;
+
   Token get endToken => semicolon;
 
   /**
@@ -11190,12 +11723,15 @@
   void set variables(VariableDeclarationList variableList) {
     variableList = becomeParentOf(variableList);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_variableList, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
 }
+
 /**
  * Instances of the class `TryStatement` represent a try statement.
  *
@@ -11210,7 +11746,6 @@
  * @coverage dart.engine.ast
  */
 class TryStatement extends Statement {
-
   /**
    * The token representing the 'try' keyword.
    */
@@ -11266,7 +11801,9 @@
    * @param finallyBlock the finally block contained in the try statement
    */
   TryStatement({Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock}) : this.full(tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
+
   accept(ASTVisitor visitor) => visitor.visitTryStatement(this);
+
   Token get beginToken => tryKeyword;
 
   /**
@@ -11275,6 +11812,7 @@
    * @return the body of the statement
    */
   Block get body => _body;
+
   Token get endToken {
     if (_finallyBlock != null) {
       return _finallyBlock.endToken;
@@ -11311,12 +11849,14 @@
   void set finallyBlock(Block block) {
     _finallyBlock = becomeParentOf(block);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_body, visitor);
     catchClauses.accept(visitor);
     safelyVisitChild(_finallyBlock, visitor);
   }
 }
+
 /**
  * The abstract class `TypeAlias` defines the behavior common to declarations of type aliases.
  *
@@ -11332,7 +11872,6 @@
  * @coverage dart.engine.ast
  */
 abstract class TypeAlias extends CompilationUnitMember {
-
   /**
    * The token representing the 'typedef' keyword.
    */
@@ -11365,9 +11904,12 @@
    * @param semicolon the semicolon terminating the declaration
    */
   TypeAlias({Comment comment, List<Annotation> metadata, Token keyword, Token semicolon}) : this.full(comment, metadata, keyword, semicolon);
+
   Token get endToken => semicolon;
+
   Token get firstTokenAfterCommentAndMetadata => keyword;
 }
+
 /**
  * Instances of the class `TypeArgumentList` represent a list of type arguments.
  *
@@ -11379,7 +11921,6 @@
  * @coverage dart.engine.ast
  */
 class TypeArgumentList extends ASTNode {
-
   /**
    * The left bracket.
    */
@@ -11417,13 +11958,18 @@
    * @param rightBracket the right bracket
    */
   TypeArgumentList({Token leftBracket, List<TypeName> arguments, Token rightBracket}) : this.full(leftBracket, arguments, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitTypeArgumentList(this);
+
   Token get beginToken => leftBracket;
+
   Token get endToken => rightBracket;
+
   void visitChildren(ASTVisitor visitor) {
     arguments.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `TypeName` represent the name of a type, which can optionally
  * include type arguments.
@@ -11436,7 +11982,6 @@
  * @coverage dart.engine.ast
  */
 class TypeName extends ASTNode {
-
   /**
    * The name of the type.
    */
@@ -11472,8 +12017,11 @@
    *          no type arguments
    */
   TypeName({Identifier name, TypeArgumentList typeArguments}) : this.full(name, typeArguments);
+
   accept(ASTVisitor visitor) => visitor.visitTypeName(this);
+
   Token get beginToken => _name.beginToken;
+
   Token get endToken {
     if (_typeArguments != null) {
       return _typeArguments.endToken;
@@ -11495,6 +12043,7 @@
    * @return the type arguments associated with the type
    */
   TypeArgumentList get typeArguments => _typeArguments;
+
   bool get isSynthetic => _name.isSynthetic && _typeArguments == null;
 
   /**
@@ -11514,11 +12063,13 @@
   void set typeArguments(TypeArgumentList typeArguments) {
     this._typeArguments = becomeParentOf(typeArguments);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_typeArguments, visitor);
   }
 }
+
 /**
  * Instances of the class `TypeParameter` represent a type parameter.
  *
@@ -11530,7 +12081,6 @@
  * @coverage dart.engine.ast
  */
 class TypeParameter extends Declaration {
-
   /**
    * The name of the type parameter.
    */
@@ -11573,6 +12123,7 @@
    * @param bound the name of the upper bound for legal arguments
    */
   TypeParameter({Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token keyword, TypeName bound}) : this.full(comment, metadata, name, keyword, bound);
+
   accept(ASTVisitor visitor) => visitor.visitTypeParameter(this);
 
   /**
@@ -11582,7 +12133,9 @@
    * @return the name of the upper bound for legal arguments
    */
   TypeName get bound => _bound;
+
   TypeParameterElement get element => _name != null ? (_name.staticElement as TypeParameterElement) : null;
+
   Token get endToken {
     if (_bound == null) {
       return _name.endToken;
@@ -11614,13 +12167,16 @@
   void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_bound, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
+
 /**
  * Instances of the class `TypeParameterList` represent type parameters within a declaration.
  *
@@ -11632,7 +12188,6 @@
  * @coverage dart.engine.ast
  */
 class TypeParameterList extends ASTNode {
-
   /**
    * The left angle bracket.
    */
@@ -11670,13 +12225,18 @@
    * @param rightBracket the right angle bracket
    */
   TypeParameterList({Token leftBracket, List<TypeParameter> typeParameters, Token rightBracket}) : this.full(leftBracket, typeParameters, rightBracket);
+
   accept(ASTVisitor visitor) => visitor.visitTypeParameterList(this);
+
   Token get beginToken => leftBracket;
+
   Token get endToken => rightBracket;
+
   void visitChildren(ASTVisitor visitor) {
     typeParameters.accept(visitor);
   }
 }
+
 /**
  * The abstract class `TypedLiteral` defines the behavior common to literals that have a type
  * associated with them.
@@ -11690,7 +12250,6 @@
  * @coverage dart.engine.ast
  */
 abstract class TypedLiteral extends Literal {
-
   /**
    * The token representing the 'const' keyword, or `null` if the literal is not a constant.
    */
@@ -11722,10 +12281,12 @@
    *          arguments were declared
    */
   TypedLiteral({Token constKeyword, TypeArgumentList typeArguments}) : this.full(constKeyword, typeArguments);
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(typeArguments, visitor);
   }
 }
+
 /**
  * The abstract class `UriBasedDirective` defines the behavior common to nodes that represent
  * a directive that references a URI.
@@ -11740,7 +12301,6 @@
  * @coverage dart.engine.ast
  */
 abstract class UriBasedDirective extends Directive {
-
   /**
    * The URI referenced by this directive.
    */
@@ -11790,11 +12350,13 @@
   void set uri(StringLiteral uri) {
     this._uri = becomeParentOf(uri);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_uri, visitor);
   }
 }
+
 /**
  * Instances of the class `VariableDeclaration` represent an identifier that has an initial
  * value associated with it. Instances of this class are always children of the class
@@ -11808,7 +12370,6 @@
  * @coverage dart.engine.ast
  */
 class VariableDeclaration extends Declaration {
-
   /**
    * The name of the variable being declared.
    */
@@ -11851,6 +12412,7 @@
    * @param initializer the expression used to compute the initial value for the variable
    */
   VariableDeclaration({Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token equals, Expression initializer}) : this.full(comment, metadata, name, equals, initializer);
+
   accept(ASTVisitor visitor) => visitor.visitVariableDeclaration(this);
 
   /**
@@ -11863,13 +12425,15 @@
       if (parent != null && parent.parent != null) {
         ASTNode node = parent.parent;
         if (node is AnnotatedNode) {
-          return ((node as AnnotatedNode)).documentationComment;
+          return (node as AnnotatedNode).documentationComment;
         }
       }
     }
     return comment;
   }
+
   VariableElement get element => _name != null ? (_name.staticElement as VariableElement) : null;
+
   Token get endToken {
     if (_initializer != null) {
       return _initializer.endToken;
@@ -11899,7 +12463,7 @@
    */
   bool get isConst {
     ASTNode parent = this.parent;
-    return parent is VariableDeclarationList && ((parent as VariableDeclarationList)).isConst;
+    return parent is VariableDeclarationList && (parent as VariableDeclarationList).isConst;
   }
 
   /**
@@ -11911,7 +12475,7 @@
    */
   bool get isFinal {
     ASTNode parent = this.parent;
-    return parent is VariableDeclarationList && ((parent as VariableDeclarationList)).isFinal;
+    return parent is VariableDeclarationList && (parent as VariableDeclarationList).isFinal;
   }
 
   /**
@@ -11931,13 +12495,16 @@
   void set name(SimpleIdentifier name) {
     this._name = becomeParentOf(name);
   }
+
   void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_initializer, visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
+
 /**
  * Instances of the class `VariableDeclarationList` represent the declaration of one or more
  * variables of the same type.
@@ -11956,7 +12523,6 @@
  * @coverage dart.engine.ast
  */
 class VariableDeclarationList extends AnnotatedNode {
-
   /**
    * The token representing the 'final', 'const' or 'var' keyword, or `null` if no keyword was
    * included.
@@ -11999,7 +12565,9 @@
    * @param variables a list containing the individual variables being declared
    */
   VariableDeclarationList({Comment comment, List<Annotation> metadata, Token keyword, TypeName type, List<VariableDeclaration> variables}) : this.full(comment, metadata, keyword, type, variables);
+
   accept(ASTVisitor visitor) => visitor.visitVariableDeclarationList(this);
+
   Token get endToken => variables.endToken;
 
   /**
@@ -12014,7 +12582,7 @@
    *
    * @return `true` if the variables in this list were declared with the 'const' modifier
    */
-  bool get isConst => keyword is KeywordToken && identical(((keyword as KeywordToken)).keyword, Keyword.CONST);
+  bool get isConst => keyword is KeywordToken && identical((keyword as KeywordToken).keyword, Keyword.CONST);
 
   /**
    * Return `true` if the variables in this list were declared with the 'final' modifier.
@@ -12023,7 +12591,7 @@
    *
    * @return `true` if the variables in this list were declared with the 'final' modifier
    */
-  bool get isFinal => keyword is KeywordToken && identical(((keyword as KeywordToken)).keyword, Keyword.FINAL);
+  bool get isFinal => keyword is KeywordToken && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
 
   /**
    * Set the type of the variables being declared to the given type name.
@@ -12033,10 +12601,12 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_type, visitor);
     variables.accept(visitor);
   }
+
   Token get firstTokenAfterCommentAndMetadata {
     if (keyword != null) {
       return keyword;
@@ -12046,6 +12616,7 @@
     return variables.beginToken;
   }
 }
+
 /**
  * Instances of the class `VariableDeclarationStatement` represent a list of variables that
  * are being declared in a context where a statement is required.
@@ -12058,7 +12629,6 @@
  * @coverage dart.engine.ast
  */
 class VariableDeclarationStatement extends Statement {
-
   /**
    * The variables being declared.
    */
@@ -12087,8 +12657,11 @@
    * @param semicolon the semicolon terminating the statement
    */
   VariableDeclarationStatement({VariableDeclarationList variableList, Token semicolon}) : this.full(variableList, semicolon);
+
   accept(ASTVisitor visitor) => visitor.visitVariableDeclarationStatement(this);
+
   Token get beginToken => _variableList.beginToken;
+
   Token get endToken => semicolon;
 
   /**
@@ -12106,10 +12679,12 @@
   void set variables(VariableDeclarationList variableList) {
     this._variableList = becomeParentOf(variableList);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_variableList, visitor);
   }
 }
+
 /**
  * Instances of the class `WhileStatement` represent a while statement.
  *
@@ -12121,7 +12696,6 @@
  * @coverage dart.engine.ast
  */
 class WhileStatement extends Statement {
-
   /**
    * The token representing the 'while' keyword.
    */
@@ -12174,7 +12748,9 @@
    * @param body the body of the loop
    */
   WhileStatement({Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement body}) : this.full(keyword, leftParenthesis, condition, rightParenthesis, body);
+
   accept(ASTVisitor visitor) => visitor.visitWhileStatement(this);
+
   Token get beginToken => keyword;
 
   /**
@@ -12190,6 +12766,7 @@
    * @return the expression used to determine whether to execute the body of the loop
    */
   Expression get condition => _condition;
+
   Token get endToken => _body.endToken;
 
   /**
@@ -12210,11 +12787,13 @@
   void set condition(Expression expression) {
     _condition = becomeParentOf(expression);
   }
+
   void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_body, visitor);
   }
 }
+
 /**
  * Instances of the class `WithClause` represent the with clause in a class declaration.
  *
@@ -12226,7 +12805,6 @@
  * @coverage dart.engine.ast
  */
 class WithClause extends ASTNode {
-
   /**
    * The token representing the 'with' keyword.
    */
@@ -12256,8 +12834,11 @@
    * @param mixinTypes the names of the mixins that were specified
    */
   WithClause({Token withKeyword, List<TypeName> mixinTypes}) : this.full(withKeyword, mixinTypes);
+
   accept(ASTVisitor visitor) => visitor.visitWithClause(this);
+
   Token get beginToken => withKeyword;
+
   Token get endToken => mixinTypes.endToken;
 
   /**
@@ -12268,10 +12849,12 @@
   void set mixinKeyword(Token withKeyword) {
     this.withKeyword = withKeyword;
   }
+
   void visitChildren(ASTVisitor visitor) {
     mixinTypes.accept(visitor);
   }
 }
+
 /**
  * Instances of the class `BreadthFirstVisitor` implement an AST visitor that will recursively
  * visit all of the nodes in an AST structure, similar to [GeneralizingASTVisitor]. This
@@ -12290,7 +12873,6 @@
  * @coverage dart.engine.ast
  */
 class BreadthFirstVisitor<R> extends GeneralizingASTVisitor<R> {
-
   /**
    * A queue holding the nodes that have not yet been visited in the order in which they ought to be
    * visited.
@@ -12315,22 +12897,28 @@
       next.accept(this);
     }
   }
+
   R visitNode(ASTNode node) {
     node.visitChildren(_childVisitor);
     return null;
   }
+
   BreadthFirstVisitor() {
     this._childVisitor = new GeneralizingASTVisitor_2(this);
   }
 }
+
 class GeneralizingASTVisitor_2 extends GeneralizingASTVisitor<Object> {
   final BreadthFirstVisitor BreadthFirstVisitor_this;
+
   GeneralizingASTVisitor_2(this.BreadthFirstVisitor_this) : super();
+
   Object visitNode(ASTNode node) {
     BreadthFirstVisitor_this._queue.add(node);
     return null;
   }
 }
+
 /**
  * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
@@ -12373,12 +12961,12 @@
  * @coverage dart.engine.ast
  */
 class ConstantEvaluator extends GeneralizingASTVisitor<Object> {
-
   /**
    * The value returned for expressions (or non-expression nodes) that are not compile-time constant
    * expressions.
    */
   static Object NOT_A_CONSTANT = new Object();
+
   Object visitAdjacentStrings(AdjacentStrings node) {
     JavaStringBuilder builder = new JavaStringBuilder();
     for (StringLiteral string in node.strings) {
@@ -12390,6 +12978,7 @@
     }
     return builder.toString();
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     Object leftOperand = node.leftOperand.accept(this);
     if (identical(leftOperand, NOT_A_CONSTANT)) {
@@ -12402,128 +12991,132 @@
     while (true) {
       if (node.operator.type == TokenType.AMPERSAND) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) & (rightOperand as int);
+          return (leftOperand as int) & (rightOperand as int);
         }
       } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
         if (leftOperand is bool && rightOperand is bool) {
-          return ((leftOperand as bool)) && ((rightOperand as bool));
+          return (leftOperand as bool) && (rightOperand as bool);
         }
       } else if (node.operator.type == TokenType.BANG_EQ) {
         if (leftOperand is bool && rightOperand is bool) {
-          return ((leftOperand as bool)) != ((rightOperand as bool));
+          return (leftOperand as bool) != (rightOperand as bool);
         } else if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) != rightOperand;
+          return (leftOperand as int) != rightOperand;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) != rightOperand;
+          return (leftOperand as double) != rightOperand;
         } else if (leftOperand is String && rightOperand is String) {
-          return ((leftOperand as String)) != rightOperand;
+          return (leftOperand as String) != rightOperand;
         }
       } else if (node.operator.type == TokenType.BAR) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) | (rightOperand as int);
+          return (leftOperand as int) | (rightOperand as int);
         }
       } else if (node.operator.type == TokenType.BAR_BAR) {
         if (leftOperand is bool && rightOperand is bool) {
-          return ((leftOperand as bool)) || ((rightOperand as bool));
+          return (leftOperand as bool) || (rightOperand as bool);
         }
       } else if (node.operator.type == TokenType.CARET) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) ^ (rightOperand as int);
+          return (leftOperand as int) ^ (rightOperand as int);
         }
       } else if (node.operator.type == TokenType.EQ_EQ) {
         if (leftOperand is bool && rightOperand is bool) {
           return identical(leftOperand as bool, rightOperand as bool);
         } else if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) == rightOperand;
+          return (leftOperand as int) == rightOperand;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) == rightOperand;
+          return (leftOperand as double) == rightOperand;
         } else if (leftOperand is String && rightOperand is String) {
-          return ((leftOperand as String)) == rightOperand;
+          return (leftOperand as String) == rightOperand;
         }
       } else if (node.operator.type == TokenType.GT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo(rightOperand as int) > 0;
+          return (leftOperand as int).compareTo(rightOperand as int) > 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo(rightOperand as double) > 0;
+          return (leftOperand as double).compareTo(rightOperand as double) > 0;
         }
       } else if (node.operator.type == TokenType.GT_EQ) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo(rightOperand as int) >= 0;
+          return (leftOperand as int).compareTo(rightOperand as int) >= 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo(rightOperand as double) >= 0;
+          return (leftOperand as double).compareTo(rightOperand as double) >= 0;
         }
       } else if (node.operator.type == TokenType.GT_GT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) >> ((rightOperand as int));
+          return (leftOperand as int) >> (rightOperand as int);
         }
       } else if (node.operator.type == TokenType.LT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo(rightOperand as int) < 0;
+          return (leftOperand as int).compareTo(rightOperand as int) < 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo(rightOperand as double) < 0;
+          return (leftOperand as double).compareTo(rightOperand as double) < 0;
         }
       } else if (node.operator.type == TokenType.LT_EQ) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo(rightOperand as int) <= 0;
+          return (leftOperand as int).compareTo(rightOperand as int) <= 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo(rightOperand as double) <= 0;
+          return (leftOperand as double).compareTo(rightOperand as double) <= 0;
         }
       } else if (node.operator.type == TokenType.LT_LT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) << ((rightOperand as int));
+          return (leftOperand as int) << (rightOperand as int);
         }
       } else if (node.operator.type == TokenType.MINUS) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) - (rightOperand as int);
+          return (leftOperand as int) - (rightOperand as int);
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) - ((rightOperand as double));
+          return (leftOperand as double) - (rightOperand as double);
         }
       } else if (node.operator.type == TokenType.PERCENT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).remainder(rightOperand as int);
+          return (leftOperand as int).remainder(rightOperand as int);
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) % ((rightOperand as double));
+          return (leftOperand as double) % (rightOperand as double);
         }
       } else if (node.operator.type == TokenType.PLUS) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) + (rightOperand as int);
+          return (leftOperand as int) + (rightOperand as int);
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) + ((rightOperand as double));
+          return (leftOperand as double) + (rightOperand as double);
         }
       } else if (node.operator.type == TokenType.STAR) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)) * (rightOperand as int);
+          return (leftOperand as int) * (rightOperand as int);
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) * ((rightOperand as double));
+          return (leftOperand as double) * (rightOperand as double);
         }
       } else if (node.operator.type == TokenType.SLASH) {
         if (leftOperand is int && rightOperand is int) {
           if (rightOperand != 0) {
-            return ((leftOperand as int)) ~/ (rightOperand as int);
+            return (leftOperand as int) ~/ (rightOperand as int);
           } else {
-            return ((leftOperand as int)).toDouble() / ((rightOperand as int)).toDouble();
+            return (leftOperand as int).toDouble() / (rightOperand as int).toDouble();
           }
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) / ((rightOperand as double));
+          return (leftOperand as double) / (rightOperand as double);
         }
       } else if (node.operator.type == TokenType.TILDE_SLASH) {
         if (leftOperand is int && rightOperand is int) {
           if (rightOperand != 0) {
-            return ((leftOperand as int)) ~/ (rightOperand as int);
+            return (leftOperand as int) ~/ (rightOperand as int);
           } else {
             return 0;
           }
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)) ~/ ((rightOperand as double));
+          return (leftOperand as double) ~/ (rightOperand as double);
         }
       }
       break;
     }
     return visitExpression(node);
   }
+
   Object visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
+
   Object visitDoubleLiteral(DoubleLiteral node) => node.value;
+
   Object visitIntegerLiteral(IntegerLiteral node) => node.value;
+
   Object visitInterpolationExpression(InterpolationExpression node) {
     Object value = node.expression.accept(this);
     if (value == null || value is bool || value is String || value is int || value is double) {
@@ -12531,7 +13124,9 @@
     }
     return NOT_A_CONSTANT;
   }
+
   Object visitInterpolationString(InterpolationString node) => node.value;
+
   Object visitListLiteral(ListLiteral node) {
     List<Object> list = new List<Object>();
     for (Expression element in node.elements) {
@@ -12543,6 +13138,7 @@
     }
     return list;
   }
+
   Object visitMapLiteral(MapLiteral node) {
     Map<String, Object> map = new Map<String, Object>();
     for (MapLiteralEntry entry in node.entries) {
@@ -12555,11 +13151,17 @@
     }
     return map;
   }
+
   Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
+
   Object visitNode(ASTNode node) => NOT_A_CONSTANT;
+
   Object visitNullLiteral(NullLiteral node) => null;
+
   Object visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) => getConstantValue(null);
+
   Object visitPrefixExpression(PrefixExpression node) {
     Object operand = node.operand.accept(this);
     if (identical(operand, NOT_A_CONSTANT)) {
@@ -12574,24 +13176,28 @@
         }
       } else if (node.operator.type == TokenType.TILDE) {
         if (operand is int) {
-          return ~((operand as int));
+          return ~(operand as int);
         }
       } else if (node.operator.type == TokenType.MINUS) {
         if (operand == null) {
           return null;
         } else if (operand is int) {
-          return -((operand as int));
+          return -(operand as int);
         } else if (operand is double) {
-          return -((operand as double));
+          return -(operand as double);
         }
       }
       break;
     }
     return NOT_A_CONSTANT;
   }
+
   Object visitPropertyAccess(PropertyAccess node) => getConstantValue(null);
+
   Object visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(null);
+
   Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
+
   Object visitStringInterpolation(StringInterpolation node) {
     JavaStringBuilder builder = new JavaStringBuilder();
     for (InterpolationElement element in node.elements) {
@@ -12603,6 +13209,7 @@
     }
     return builder.toString();
   }
+
   Object visitSymbolLiteral(SymbolLiteral node) {
     JavaStringBuilder builder = new JavaStringBuilder();
     for (Token component in node.components) {
@@ -12629,6 +13236,7 @@
     return NOT_A_CONSTANT;
   }
 }
+
 /**
  * Instances of the class `ElementLocator` locate the [Element]
  * associated with a given [ASTNode].
@@ -12636,7 +13244,6 @@
  * @coverage dart.engine.ast
  */
 class ElementLocator {
-
   /**
    * Locate the [Element] associated with the given [ASTNode].
    *
@@ -12648,16 +13255,23 @@
     return node.accept(mapper);
   }
 }
+
 /**
  * Visitor that maps nodes to elements.
  */
 class ElementLocator_ElementMapper extends GeneralizingASTVisitor<Element> {
   Element visitAssignmentExpression(AssignmentExpression node) => node.bestElement;
+
   Element visitBinaryExpression(BinaryExpression node) => node.bestElement;
+
   Element visitClassDeclaration(ClassDeclaration node) => node.element;
+
   Element visitCompilationUnit(CompilationUnit node) => node.element;
+
   Element visitConstructorDeclaration(ConstructorDeclaration node) => node.element;
+
   Element visitFunctionDeclaration(FunctionDeclaration node) => node.element;
+
   Element visitIdentifier(Identifier node) {
     ASTNode parent = node.parent;
     if (parent is ConstructorDeclaration) {
@@ -12670,16 +13284,16 @@
         }
         Element element = node.bestElement;
         if (element is ClassElement) {
-          return ((element as ClassElement)).unnamedConstructor;
+          return (element as ClassElement).unnamedConstructor;
         }
       }
     }
     if (parent is LibraryIdentifier) {
-      ASTNode grandParent = ((parent as LibraryIdentifier)).parent;
+      ASTNode grandParent = (parent as LibraryIdentifier).parent;
       if (grandParent is PartOfDirective) {
-        Element element = ((grandParent as PartOfDirective)).element;
+        Element element = (grandParent as PartOfDirective).element;
         if (element is LibraryElement) {
-          return ((element as LibraryElement)).definingCompilationUnit;
+          return (element as LibraryElement).definingCompilationUnit;
         }
       }
     }
@@ -12689,24 +13303,36 @@
     }
     return element;
   }
+
   Element visitImportDirective(ImportDirective node) => node.element;
+
   Element visitIndexExpression(IndexExpression node) => node.bestElement;
+
   Element visitInstanceCreationExpression(InstanceCreationExpression node) => node.staticElement;
+
   Element visitLibraryDirective(LibraryDirective node) => node.element;
+
   Element visitMethodDeclaration(MethodDeclaration node) => node.element;
+
   Element visitMethodInvocation(MethodInvocation node) => node.methodName.bestElement;
+
   Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
+
   Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.bestElement;
+
   Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
+
   Element visitStringLiteral(StringLiteral node) {
     ASTNode parent = node.parent;
     if (parent is UriBasedDirective) {
-      return ((parent as UriBasedDirective)).uriElement;
+      return (parent as UriBasedDirective).uriElement;
     }
     return null;
   }
+
   Element visitVariableDeclaration(VariableDeclaration node) => node.element;
 }
+
 /**
  * Instances of the class `GeneralizingASTVisitor` implement an AST visitor that will
  * recursively visit all of the nodes in an AST structure (like instances of the class
@@ -12727,134 +13353,259 @@
  */
 class GeneralizingASTVisitor<R> implements ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
+
   R visitAnnotatedNode(AnnotatedNode node) => visitNode(node);
+
   R visitAnnotation(Annotation node) => visitNode(node);
+
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitExpression(node);
+
   R visitArgumentList(ArgumentList node) => visitNode(node);
+
   R visitAsExpression(AsExpression node) => visitExpression(node);
+
   R visitAssertStatement(AssertStatement node) => visitStatement(node);
+
   R visitAssignmentExpression(AssignmentExpression node) => visitExpression(node);
+
   R visitBinaryExpression(BinaryExpression node) => visitExpression(node);
+
   R visitBlock(Block node) => visitStatement(node);
+
   R visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node);
+
   R visitBooleanLiteral(BooleanLiteral node) => visitLiteral(node);
+
   R visitBreakStatement(BreakStatement node) => visitStatement(node);
+
   R visitCascadeExpression(CascadeExpression node) => visitExpression(node);
+
   R visitCatchClause(CatchClause node) => visitNode(node);
+
   R visitClassDeclaration(ClassDeclaration node) => visitCompilationUnitMember(node);
+
   R visitClassMember(ClassMember node) => visitDeclaration(node);
+
   R visitClassTypeAlias(ClassTypeAlias node) => visitTypeAlias(node);
+
   R visitCombinator(Combinator node) => visitNode(node);
+
   R visitComment(Comment node) => visitNode(node);
+
   R visitCommentReference(CommentReference node) => visitNode(node);
+
   R visitCompilationUnit(CompilationUnit node) => visitNode(node);
+
   R visitCompilationUnitMember(CompilationUnitMember node) => visitDeclaration(node);
+
   R visitConditionalExpression(ConditionalExpression node) => visitExpression(node);
+
   R visitConstructorDeclaration(ConstructorDeclaration node) => visitClassMember(node);
+
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => visitConstructorInitializer(node);
+
   R visitConstructorInitializer(ConstructorInitializer node) => visitNode(node);
+
   R visitConstructorName(ConstructorName node) => visitNode(node);
+
   R visitContinueStatement(ContinueStatement node) => visitStatement(node);
+
   R visitDeclaration(Declaration node) => visitAnnotatedNode(node);
+
   R visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
+
   R visitDefaultFormalParameter(DefaultFormalParameter node) => visitFormalParameter(node);
+
   R visitDirective(Directive node) => visitAnnotatedNode(node);
+
   R visitDoStatement(DoStatement node) => visitStatement(node);
+
   R visitDoubleLiteral(DoubleLiteral node) => visitLiteral(node);
+
   R visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node);
+
   R visitEmptyStatement(EmptyStatement node) => visitStatement(node);
+
   R visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
+
   R visitExpression(Expression node) => visitNode(node);
+
   R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitFunctionBody(node);
+
   R visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
+
   R visitExtendsClause(ExtendsClause node) => visitNode(node);
+
   R visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
+
   R visitFieldFormalParameter(FieldFormalParameter node) => visitNormalFormalParameter(node);
+
   R visitForEachStatement(ForEachStatement node) => visitStatement(node);
+
   R visitFormalParameter(FormalParameter node) => visitNode(node);
+
   R visitFormalParameterList(FormalParameterList node) => visitNode(node);
+
   R visitForStatement(ForStatement node) => visitStatement(node);
+
   R visitFunctionBody(FunctionBody node) => visitNode(node);
+
   R visitFunctionDeclaration(FunctionDeclaration node) => visitCompilationUnitMember(node);
+
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => visitStatement(node);
+
   R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
+
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => visitExpression(node);
+
   R visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
+
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => visitNormalFormalParameter(node);
+
   R visitHideCombinator(HideCombinator node) => visitCombinator(node);
+
   R visitIdentifier(Identifier node) => visitExpression(node);
+
   R visitIfStatement(IfStatement node) => visitStatement(node);
+
   R visitImplementsClause(ImplementsClause node) => visitNode(node);
+
   R visitImportDirective(ImportDirective node) => visitNamespaceDirective(node);
+
   R visitIndexExpression(IndexExpression node) => visitExpression(node);
+
   R visitInstanceCreationExpression(InstanceCreationExpression node) => visitExpression(node);
+
   R visitIntegerLiteral(IntegerLiteral node) => visitLiteral(node);
+
   R visitInterpolationElement(InterpolationElement node) => visitNode(node);
+
   R visitInterpolationExpression(InterpolationExpression node) => visitInterpolationElement(node);
+
   R visitInterpolationString(InterpolationString node) => visitInterpolationElement(node);
+
   R visitIsExpression(IsExpression node) => visitExpression(node);
+
   R visitLabel(Label node) => visitNode(node);
+
   R visitLabeledStatement(LabeledStatement node) => visitStatement(node);
+
   R visitLibraryDirective(LibraryDirective node) => visitDirective(node);
+
   R visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node);
+
   R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
+
   R visitLiteral(Literal node) => visitExpression(node);
+
   R visitMapLiteral(MapLiteral node) => visitTypedLiteral(node);
+
   R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
+
   R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
+
   R visitMethodInvocation(MethodInvocation node) => visitExpression(node);
+
   R visitNamedExpression(NamedExpression node) => visitExpression(node);
+
   R visitNamespaceDirective(NamespaceDirective node) => visitUriBasedDirective(node);
+
   R visitNativeClause(NativeClause node) => visitNode(node);
+
   R visitNativeFunctionBody(NativeFunctionBody node) => visitFunctionBody(node);
+
   R visitNode(ASTNode node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitNormalFormalParameter(NormalFormalParameter node) => visitFormalParameter(node);
+
   R visitNullLiteral(NullLiteral node) => visitLiteral(node);
+
   R visitParenthesizedExpression(ParenthesizedExpression node) => visitExpression(node);
+
   R visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
+
   R visitPartOfDirective(PartOfDirective node) => visitDirective(node);
+
   R visitPostfixExpression(PostfixExpression node) => visitExpression(node);
+
   R visitPrefixedIdentifier(PrefixedIdentifier node) => visitIdentifier(node);
+
   R visitPrefixExpression(PrefixExpression node) => visitExpression(node);
+
   R visitPropertyAccess(PropertyAccess node) => visitExpression(node);
+
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => visitConstructorInitializer(node);
+
   R visitRethrowExpression(RethrowExpression node) => visitExpression(node);
+
   R visitReturnStatement(ReturnStatement node) => visitStatement(node);
+
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+
   R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
+
   R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNormalFormalParameter(node);
+
   R visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node);
+
   R visitSimpleStringLiteral(SimpleStringLiteral node) => visitStringLiteral(node);
+
   R visitStatement(Statement node) => visitNode(node);
+
   R visitStringInterpolation(StringInterpolation node) => visitStringLiteral(node);
+
   R visitStringLiteral(StringLiteral node) => visitLiteral(node);
+
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) => visitConstructorInitializer(node);
+
   R visitSuperExpression(SuperExpression node) => visitExpression(node);
+
   R visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
+
   R visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
+
   R visitSwitchMember(SwitchMember node) => visitNode(node);
+
   R visitSwitchStatement(SwitchStatement node) => visitStatement(node);
+
   R visitSymbolLiteral(SymbolLiteral node) => visitLiteral(node);
+
   R visitThisExpression(ThisExpression node) => visitExpression(node);
+
   R visitThrowExpression(ThrowExpression node) => visitExpression(node);
+
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => visitCompilationUnitMember(node);
+
   R visitTryStatement(TryStatement node) => visitStatement(node);
+
   R visitTypeAlias(TypeAlias node) => visitCompilationUnitMember(node);
+
   R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
+
   R visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
+
   R visitTypeName(TypeName node) => visitNode(node);
+
   R visitTypeParameter(TypeParameter node) => visitNode(node);
+
   R visitTypeParameterList(TypeParameterList node) => visitNode(node);
+
   R visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
+
   R visitVariableDeclaration(VariableDeclaration node) => visitDeclaration(node);
+
   R visitVariableDeclarationList(VariableDeclarationList node) => visitNode(node);
+
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) => visitStatement(node);
+
   R visitWhileStatement(WhileStatement node) => visitStatement(node);
+
   R visitWithClause(WithClause node) => visitNode(node);
 }
+
 /**
  * Instances of the class `NodeLocator` locate the [ASTNode] associated with a
  * source range, given the AST structure built from the source. More specifically, they will return
@@ -12864,7 +13615,6 @@
  * @coverage dart.engine.ast
  */
 class NodeLocator extends UnifyingASTVisitor<Object> {
-
   /**
    * The start offset of the range used to identify the node.
    */
@@ -12922,6 +13672,7 @@
     }
     return foundNode;
   }
+
   Object visitNode(ASTNode node) {
     int start = node.offset;
     int end = start + node.length;
@@ -12945,6 +13696,7 @@
     return null;
   }
 }
+
 /**
  * Instances of the class `NodeFoundException` are used to cancel visiting after a node has
  * been found.
@@ -12952,6 +13704,7 @@
 class NodeLocator_NodeFoundException extends RuntimeException {
   static int _serialVersionUID = 1;
 }
+
 /**
  * Instances of the class `RecursiveASTVisitor` implement an AST visitor that will recursively
  * visit all of the nodes in an AST structure. For example, using an instance of this class to visit
@@ -12968,415 +13721,518 @@
     node.visitChildren(this);
     return null;
   }
+
   R visitAnnotation(Annotation node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitArgumentList(ArgumentList node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitAsExpression(AsExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitAssertStatement(AssertStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitAssignmentExpression(AssignmentExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitBinaryExpression(BinaryExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitBlock(Block node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitBlockFunctionBody(BlockFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitBooleanLiteral(BooleanLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitBreakStatement(BreakStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitCascadeExpression(CascadeExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitCatchClause(CatchClause node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitClassDeclaration(ClassDeclaration node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitClassTypeAlias(ClassTypeAlias node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitComment(Comment node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitCommentReference(CommentReference node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitCompilationUnit(CompilationUnit node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitConditionalExpression(ConditionalExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitConstructorDeclaration(ConstructorDeclaration node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitConstructorName(ConstructorName node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitContinueStatement(ContinueStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitDeclaredIdentifier(DeclaredIdentifier node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitDefaultFormalParameter(DefaultFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitDoStatement(DoStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitDoubleLiteral(DoubleLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitEmptyFunctionBody(EmptyFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitEmptyStatement(EmptyStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitExportDirective(ExportDirective node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitExpressionFunctionBody(ExpressionFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitExpressionStatement(ExpressionStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitExtendsClause(ExtendsClause node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFieldDeclaration(FieldDeclaration node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFieldFormalParameter(FieldFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitForEachStatement(ForEachStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFormalParameterList(FormalParameterList node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitForStatement(ForStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFunctionDeclaration(FunctionDeclaration node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFunctionExpression(FunctionExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFunctionTypeAlias(FunctionTypeAlias node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitHideCombinator(HideCombinator node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitIfStatement(IfStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitImplementsClause(ImplementsClause node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitImportDirective(ImportDirective node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitIntegerLiteral(IntegerLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitInterpolationExpression(InterpolationExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitInterpolationString(InterpolationString node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitIsExpression(IsExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitLabel(Label node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitLabeledStatement(LabeledStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitLibraryDirective(LibraryDirective node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitLibraryIdentifier(LibraryIdentifier node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitListLiteral(ListLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitMapLiteral(MapLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitMapLiteralEntry(MapLiteralEntry node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitMethodDeclaration(MethodDeclaration node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitMethodInvocation(MethodInvocation node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitNamedExpression(NamedExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitNativeClause(NativeClause node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitNativeFunctionBody(NativeFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitNullLiteral(NullLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitParenthesizedExpression(ParenthesizedExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitPartDirective(PartDirective node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitPartOfDirective(PartOfDirective node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitPostfixExpression(PostfixExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitPrefixedIdentifier(PrefixedIdentifier node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitPropertyAccess(PropertyAccess node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitRethrowExpression(RethrowExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitReturnStatement(ReturnStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitScriptTag(ScriptTag node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitShowCombinator(ShowCombinator node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSimpleFormalParameter(SimpleFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSimpleIdentifier(SimpleIdentifier node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSimpleStringLiteral(SimpleStringLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitStringInterpolation(StringInterpolation node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSuperExpression(SuperExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSwitchCase(SwitchCase node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSwitchDefault(SwitchDefault node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSwitchStatement(SwitchStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitSymbolLiteral(SymbolLiteral node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitThisExpression(ThisExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitThrowExpression(ThrowExpression node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitTryStatement(TryStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitTypeArgumentList(TypeArgumentList node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitTypeName(TypeName node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitTypeParameter(TypeParameter node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitTypeParameterList(TypeParameterList node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitVariableDeclaration(VariableDeclaration node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitVariableDeclarationList(VariableDeclarationList node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitWhileStatement(WhileStatement node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitWithClause(WithClause node) {
     node.visitChildren(this);
     return null;
   }
 }
+
 /**
  * Instances of the class `SimpleASTVisitor` implement an AST visitor that will do nothing
  * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
@@ -13387,109 +14243,212 @@
  */
 class SimpleASTVisitor<R> implements ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node) => null;
+
   R visitAnnotation(Annotation node) => null;
+
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => null;
+
   R visitArgumentList(ArgumentList node) => null;
+
   R visitAsExpression(AsExpression node) => null;
+
   R visitAssertStatement(AssertStatement node) => null;
+
   R visitAssignmentExpression(AssignmentExpression node) => null;
+
   R visitBinaryExpression(BinaryExpression node) => null;
+
   R visitBlock(Block node) => null;
+
   R visitBlockFunctionBody(BlockFunctionBody node) => null;
+
   R visitBooleanLiteral(BooleanLiteral node) => null;
+
   R visitBreakStatement(BreakStatement node) => null;
+
   R visitCascadeExpression(CascadeExpression node) => null;
+
   R visitCatchClause(CatchClause node) => null;
+
   R visitClassDeclaration(ClassDeclaration node) => null;
+
   R visitClassTypeAlias(ClassTypeAlias node) => null;
+
   R visitComment(Comment node) => null;
+
   R visitCommentReference(CommentReference node) => null;
+
   R visitCompilationUnit(CompilationUnit node) => null;
+
   R visitConditionalExpression(ConditionalExpression node) => null;
+
   R visitConstructorDeclaration(ConstructorDeclaration node) => null;
+
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
+
   R visitConstructorName(ConstructorName node) => null;
+
   R visitContinueStatement(ContinueStatement node) => null;
+
   R visitDeclaredIdentifier(DeclaredIdentifier node) => null;
+
   R visitDefaultFormalParameter(DefaultFormalParameter node) => null;
+
   R visitDoStatement(DoStatement node) => null;
+
   R visitDoubleLiteral(DoubleLiteral node) => null;
+
   R visitEmptyFunctionBody(EmptyFunctionBody node) => null;
+
   R visitEmptyStatement(EmptyStatement node) => null;
+
   R visitExportDirective(ExportDirective node) => null;
+
   R visitExpressionFunctionBody(ExpressionFunctionBody node) => null;
+
   R visitExpressionStatement(ExpressionStatement node) => null;
+
   R visitExtendsClause(ExtendsClause node) => null;
+
   R visitFieldDeclaration(FieldDeclaration node) => null;
+
   R visitFieldFormalParameter(FieldFormalParameter node) => null;
+
   R visitForEachStatement(ForEachStatement node) => null;
+
   R visitFormalParameterList(FormalParameterList node) => null;
+
   R visitForStatement(ForStatement node) => null;
+
   R visitFunctionDeclaration(FunctionDeclaration node) => null;
+
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => null;
+
   R visitFunctionExpression(FunctionExpression node) => null;
+
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
+
   R visitFunctionTypeAlias(FunctionTypeAlias node) => null;
+
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => null;
+
   R visitHideCombinator(HideCombinator node) => null;
+
   R visitIfStatement(IfStatement node) => null;
+
   R visitImplementsClause(ImplementsClause node) => null;
+
   R visitImportDirective(ImportDirective node) => null;
+
   R visitIndexExpression(IndexExpression node) => null;
+
   R visitInstanceCreationExpression(InstanceCreationExpression node) => null;
+
   R visitIntegerLiteral(IntegerLiteral node) => null;
+
   R visitInterpolationExpression(InterpolationExpression node) => null;
+
   R visitInterpolationString(InterpolationString node) => null;
+
   R visitIsExpression(IsExpression node) => null;
+
   R visitLabel(Label node) => null;
+
   R visitLabeledStatement(LabeledStatement node) => null;
+
   R visitLibraryDirective(LibraryDirective node) => null;
+
   R visitLibraryIdentifier(LibraryIdentifier node) => null;
+
   R visitListLiteral(ListLiteral node) => null;
+
   R visitMapLiteral(MapLiteral node) => null;
+
   R visitMapLiteralEntry(MapLiteralEntry node) => null;
+
   R visitMethodDeclaration(MethodDeclaration node) => null;
+
   R visitMethodInvocation(MethodInvocation node) => null;
+
   R visitNamedExpression(NamedExpression node) => null;
+
   R visitNativeClause(NativeClause node) => null;
+
   R visitNativeFunctionBody(NativeFunctionBody node) => null;
+
   R visitNullLiteral(NullLiteral node) => null;
+
   R visitParenthesizedExpression(ParenthesizedExpression node) => null;
+
   R visitPartDirective(PartDirective node) => null;
+
   R visitPartOfDirective(PartOfDirective node) => null;
+
   R visitPostfixExpression(PostfixExpression node) => null;
+
   R visitPrefixedIdentifier(PrefixedIdentifier node) => null;
+
   R visitPrefixExpression(PrefixExpression node) => null;
+
   R visitPropertyAccess(PropertyAccess node) => null;
+
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => null;
+
   R visitRethrowExpression(RethrowExpression node) => null;
+
   R visitReturnStatement(ReturnStatement node) => null;
+
   R visitScriptTag(ScriptTag node) => null;
+
   R visitShowCombinator(ShowCombinator node) => null;
+
   R visitSimpleFormalParameter(SimpleFormalParameter node) => null;
+
   R visitSimpleIdentifier(SimpleIdentifier node) => null;
+
   R visitSimpleStringLiteral(SimpleStringLiteral node) => null;
+
   R visitStringInterpolation(StringInterpolation node) => null;
+
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) => null;
+
   R visitSuperExpression(SuperExpression node) => null;
+
   R visitSwitchCase(SwitchCase node) => null;
+
   R visitSwitchDefault(SwitchDefault node) => null;
+
   R visitSwitchStatement(SwitchStatement node) => null;
+
   R visitSymbolLiteral(SymbolLiteral node) => null;
+
   R visitThisExpression(ThisExpression node) => null;
+
   R visitThrowExpression(ThrowExpression node) => null;
+
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => null;
+
   R visitTryStatement(TryStatement node) => null;
+
   R visitTypeArgumentList(TypeArgumentList node) => null;
+
   R visitTypeName(TypeName node) => null;
+
   R visitTypeParameter(TypeParameter node) => null;
+
   R visitTypeParameterList(TypeParameterList node) => null;
+
   R visitVariableDeclaration(VariableDeclaration node) => null;
+
   R visitVariableDeclarationList(VariableDeclarationList node) => null;
+
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) => null;
+
   R visitWhileStatement(WhileStatement node) => null;
+
   R visitWithClause(WithClause node) => null;
 }
+
 /**
  * Instances of the class `ToSourceVisitor` write a source representation of a visited AST
  * node (and all of it's children) to a writer.
@@ -13497,7 +14456,6 @@
  * @coverage dart.engine.ast
  */
 class ToSourceVisitor implements ASTVisitor<Object> {
-
   /**
    * The writer to which the source is to be written.
    */
@@ -13512,10 +14470,12 @@
   ToSourceVisitor(PrintWriter writer) {
     this._writer = writer;
   }
+
   Object visitAdjacentStrings(AdjacentStrings node) {
     visitList2(node.strings, " ");
     return null;
   }
+
   Object visitAnnotation(Annotation node) {
     _writer.print('@');
     visit(node.name);
@@ -13523,29 +14483,34 @@
     visit(node.arguments);
     return null;
   }
+
   Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     _writer.print('?');
     visit(node.identifier);
     return null;
   }
+
   Object visitArgumentList(ArgumentList node) {
     _writer.print('(');
     visitList2(node.arguments, ", ");
     _writer.print(')');
     return null;
   }
+
   Object visitAsExpression(AsExpression node) {
     visit(node.expression);
     _writer.print(" as ");
     visit(node.type);
     return null;
   }
+
   Object visitAssertStatement(AssertStatement node) {
     _writer.print("assert (");
     visit(node.condition);
     _writer.print(");");
     return null;
   }
+
   Object visitAssignmentExpression(AssignmentExpression node) {
     visit(node.leftHandSide);
     _writer.print(' ');
@@ -13554,6 +14519,7 @@
     visit(node.rightHandSide);
     return null;
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     visit(node.leftOperand);
     _writer.print(' ');
@@ -13562,31 +14528,37 @@
     visit(node.rightOperand);
     return null;
   }
+
   Object visitBlock(Block node) {
     _writer.print('{');
     visitList2(node.statements, " ");
     _writer.print('}');
     return null;
   }
+
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     visit(node.block);
     return null;
   }
+
   Object visitBooleanLiteral(BooleanLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitBreakStatement(BreakStatement node) {
     _writer.print("break");
     visit3(" ", node.label);
     _writer.print(";");
     return null;
   }
+
   Object visitCascadeExpression(CascadeExpression node) {
     visit(node.target);
     visitList(node.cascadeSections);
     return null;
   }
+
   Object visitCatchClause(CatchClause node) {
     visit3("on ", node.exceptionType);
     if (node.catchKeyword != null) {
@@ -13603,6 +14575,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     visit5(node.abstractKeyword, " ");
     _writer.print("class ");
@@ -13616,6 +14589,7 @@
     _writer.print("}");
     return null;
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     _writer.print("class ");
     visit(node.name);
@@ -13630,8 +14604,11 @@
     _writer.print(";");
     return null;
   }
+
   Object visitComment(Comment node) => null;
+
   Object visitCommentReference(CommentReference node) => null;
+
   Object visitCompilationUnit(CompilationUnit node) {
     ScriptTag scriptTag = node.scriptTag;
     NodeList<Directive> directives = node.directives;
@@ -13642,6 +14619,7 @@
     visitList4(prefix, node.declarations, " ");
     return null;
   }
+
   Object visitConditionalExpression(ConditionalExpression node) {
     visit(node.condition);
     _writer.print(" ? ");
@@ -13650,6 +14628,7 @@
     visit(node.elseExpression);
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     visit5(node.externalKeyword, " ");
     visit5(node.constKeyword, " ");
@@ -13662,6 +14641,7 @@
     visit4(" ", node.body);
     return null;
   }
+
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     visit5(node.keyword, ".");
     visit(node.fieldName);
@@ -13669,23 +14649,27 @@
     visit(node.expression);
     return null;
   }
+
   Object visitConstructorName(ConstructorName node) {
     visit(node.type);
     visit3(".", node.name);
     return null;
   }
+
   Object visitContinueStatement(ContinueStatement node) {
     _writer.print("continue");
     visit3(" ", node.label);
     _writer.print(";");
     return null;
   }
+
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     visit5(node.keyword, " ");
     visit2(node.type, " ");
     visit(node.identifier);
     return null;
   }
+
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     visit(node.parameter);
     if (node.separator != null) {
@@ -13695,6 +14679,7 @@
     }
     return null;
   }
+
   Object visitDoStatement(DoStatement node) {
     _writer.print("do ");
     visit(node.body);
@@ -13703,18 +14688,22 @@
     _writer.print(");");
     return null;
   }
+
   Object visitDoubleLiteral(DoubleLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitEmptyFunctionBody(EmptyFunctionBody node) {
     _writer.print(';');
     return null;
   }
+
   Object visitEmptyStatement(EmptyStatement node) {
     _writer.print(';');
     return null;
   }
+
   Object visitExportDirective(ExportDirective node) {
     _writer.print("export ");
     visit(node.uri);
@@ -13722,6 +14711,7 @@
     _writer.print(';');
     return null;
   }
+
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _writer.print("=> ");
     visit(node.expression);
@@ -13730,22 +14720,26 @@
     }
     return null;
   }
+
   Object visitExpressionStatement(ExpressionStatement node) {
     visit(node.expression);
     _writer.print(';');
     return null;
   }
+
   Object visitExtendsClause(ExtendsClause node) {
     _writer.print("extends ");
     visit(node.superclass);
     return null;
   }
+
   Object visitFieldDeclaration(FieldDeclaration node) {
     visit5(node.staticKeyword, " ");
     visit(node.fields);
     _writer.print(";");
     return null;
   }
+
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     visit5(node.keyword, " ");
     visit2(node.type, " ");
@@ -13754,6 +14748,7 @@
     visit(node.parameters);
     return null;
   }
+
   Object visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     _writer.print("for (");
@@ -13768,6 +14763,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitFormalParameterList(FormalParameterList node) {
     String groupEnd = null;
     _writer.print('(');
@@ -13795,6 +14791,7 @@
     _writer.print(')');
     return null;
   }
+
   Object visitForStatement(ForStatement node) {
     Expression initialization = node.initialization;
     _writer.print("for (");
@@ -13811,6 +14808,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     visit2(node.returnType, " ");
     visit5(node.propertyKeyword, " ");
@@ -13818,22 +14816,26 @@
     visit(node.functionExpression);
     return null;
   }
+
   Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     visit(node.functionDeclaration);
     _writer.print(';');
     return null;
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     visit(node.parameters);
     _writer.print(' ');
     visit(node.body);
     return null;
   }
+
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     visit(node.function);
     visit(node.argumentList);
     return null;
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     _writer.print("typedef ");
     visit2(node.returnType, " ");
@@ -13843,17 +14845,20 @@
     _writer.print(";");
     return null;
   }
+
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     visit2(node.returnType, " ");
     visit(node.identifier);
     visit(node.parameters);
     return null;
   }
+
   Object visitHideCombinator(HideCombinator node) {
     _writer.print("hide ");
     visitList2(node.hiddenNames, ", ");
     return null;
   }
+
   Object visitIfStatement(IfStatement node) {
     _writer.print("if (");
     visit(node.condition);
@@ -13862,11 +14867,13 @@
     visit3(" else ", node.elseStatement);
     return null;
   }
+
   Object visitImplementsClause(ImplementsClause node) {
     _writer.print("implements ");
     visitList2(node.interfaces, ", ");
     return null;
   }
+
   Object visitImportDirective(ImportDirective node) {
     _writer.print("import ");
     visit(node.uri);
@@ -13875,6 +14882,7 @@
     _writer.print(';');
     return null;
   }
+
   Object visitIndexExpression(IndexExpression node) {
     if (node.isCascaded) {
       _writer.print("..");
@@ -13886,16 +14894,19 @@
     _writer.print(']');
     return null;
   }
+
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     visit5(node.keyword, " ");
     visit(node.constructorName);
     visit(node.argumentList);
     return null;
   }
+
   Object visitIntegerLiteral(IntegerLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitInterpolationExpression(InterpolationExpression node) {
     if (node.rightBracket != null) {
       _writer.print("\${");
@@ -13907,10 +14918,12 @@
     }
     return null;
   }
+
   Object visitInterpolationString(InterpolationString node) {
     _writer.print(node.contents.lexeme);
     return null;
   }
+
   Object visitIsExpression(IsExpression node) {
     visit(node.expression);
     if (node.notOperator == null) {
@@ -13921,26 +14934,31 @@
     visit(node.type);
     return null;
   }
+
   Object visitLabel(Label node) {
     visit(node.label);
     _writer.print(":");
     return null;
   }
+
   Object visitLabeledStatement(LabeledStatement node) {
     visitList3(node.labels, " ", " ");
     visit(node.statement);
     return null;
   }
+
   Object visitLibraryDirective(LibraryDirective node) {
     _writer.print("library ");
     visit(node.name);
     _writer.print(';');
     return null;
   }
+
   Object visitLibraryIdentifier(LibraryIdentifier node) {
     _writer.print(node.name);
     return null;
   }
+
   Object visitListLiteral(ListLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
@@ -13952,6 +14970,7 @@
     _writer.print("]");
     return null;
   }
+
   Object visitMapLiteral(MapLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
@@ -13963,12 +14982,14 @@
     _writer.print("}");
     return null;
   }
+
   Object visitMapLiteralEntry(MapLiteralEntry node) {
     visit(node.key);
     _writer.print(" : ");
     visit(node.value);
     return null;
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     visit5(node.externalKeyword, " ");
     visit5(node.modifierKeyword, " ");
@@ -13982,6 +15003,7 @@
     visit4(" ", node.body);
     return null;
   }
+
   Object visitMethodInvocation(MethodInvocation node) {
     if (node.isCascaded) {
       _writer.print("..");
@@ -13992,60 +15014,71 @@
     visit(node.argumentList);
     return null;
   }
+
   Object visitNamedExpression(NamedExpression node) {
     visit(node.name);
     visit3(" ", node.expression);
     return null;
   }
+
   Object visitNativeClause(NativeClause node) {
     _writer.print("native ");
     visit(node.name);
     return null;
   }
+
   Object visitNativeFunctionBody(NativeFunctionBody node) {
     _writer.print("native ");
     visit(node.stringLiteral);
     _writer.print(';');
     return null;
   }
+
   Object visitNullLiteral(NullLiteral node) {
     _writer.print("null");
     return null;
   }
+
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     _writer.print('(');
     visit(node.expression);
     _writer.print(')');
     return null;
   }
+
   Object visitPartDirective(PartDirective node) {
     _writer.print("part ");
     visit(node.uri);
     _writer.print(';');
     return null;
   }
+
   Object visitPartOfDirective(PartOfDirective node) {
     _writer.print("part of ");
     visit(node.libraryName);
     _writer.print(';');
     return null;
   }
+
   Object visitPostfixExpression(PostfixExpression node) {
     visit(node.operand);
     _writer.print(node.operator.lexeme);
     return null;
   }
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     visit(node.prefix);
     _writer.print('.');
     visit(node.identifier);
     return null;
   }
+
   Object visitPrefixExpression(PrefixExpression node) {
     _writer.print(node.operator.lexeme);
     visit(node.operand);
     return null;
   }
+
   Object visitPropertyAccess(PropertyAccess node) {
     if (node.isCascaded) {
       _writer.print("..");
@@ -14056,16 +15089,19 @@
     visit(node.propertyName);
     return null;
   }
+
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     _writer.print("this");
     visit3(".", node.constructorName);
     visit(node.argumentList);
     return null;
   }
+
   Object visitRethrowExpression(RethrowExpression node) {
     _writer.print("rethrow");
     return null;
   }
+
   Object visitReturnStatement(ReturnStatement node) {
     Expression expression = node.expression;
     if (expression == null) {
@@ -14077,43 +15113,52 @@
     }
     return null;
   }
+
   Object visitScriptTag(ScriptTag node) {
     _writer.print(node.scriptTag.lexeme);
     return null;
   }
+
   Object visitShowCombinator(ShowCombinator node) {
     _writer.print("show ");
     visitList2(node.shownNames, ", ");
     return null;
   }
+
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     visit5(node.keyword, " ");
     visit2(node.type, " ");
     visit(node.identifier);
     return null;
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     _writer.print(node.token.lexeme);
     return null;
   }
+
   Object visitSimpleStringLiteral(SimpleStringLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitStringInterpolation(StringInterpolation node) {
     visitList(node.elements);
     return null;
   }
+
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _writer.print("super");
     visit3(".", node.constructorName);
     visit(node.argumentList);
     return null;
   }
+
   Object visitSuperExpression(SuperExpression node) {
     _writer.print("super");
     return null;
   }
+
   Object visitSwitchCase(SwitchCase node) {
     visitList3(node.labels, " ", " ");
     _writer.print("case ");
@@ -14122,12 +15167,14 @@
     visitList2(node.statements, " ");
     return null;
   }
+
   Object visitSwitchDefault(SwitchDefault node) {
     visitList3(node.labels, " ", " ");
     _writer.print("default: ");
     visitList2(node.statements, " ");
     return null;
   }
+
   Object visitSwitchStatement(SwitchStatement node) {
     _writer.print("switch (");
     visit(node.expression);
@@ -14136,6 +15183,7 @@
     _writer.print("}");
     return null;
   }
+
   Object visitSymbolLiteral(SymbolLiteral node) {
     _writer.print("#");
     List<Token> components = node.components;
@@ -14147,19 +15195,23 @@
     }
     return null;
   }
+
   Object visitThisExpression(ThisExpression node) {
     _writer.print("this");
     return null;
   }
+
   Object visitThrowExpression(ThrowExpression node) {
     _writer.print("throw ");
     visit(node.expression);
     return null;
   }
+
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     visit2(node.variables, ";");
     return null;
   }
+
   Object visitTryStatement(TryStatement node) {
     _writer.print("try ");
     visit(node.body);
@@ -14167,44 +15219,52 @@
     visit3(" finally ", node.finallyBlock);
     return null;
   }
+
   Object visitTypeArgumentList(TypeArgumentList node) {
     _writer.print('<');
     visitList2(node.arguments, ", ");
     _writer.print('>');
     return null;
   }
+
   Object visitTypeName(TypeName node) {
     visit(node.name);
     visit(node.typeArguments);
     return null;
   }
+
   Object visitTypeParameter(TypeParameter node) {
     visit(node.name);
     visit3(" extends ", node.bound);
     return null;
   }
+
   Object visitTypeParameterList(TypeParameterList node) {
     _writer.print('<');
     visitList2(node.typeParameters, ", ");
     _writer.print('>');
     return null;
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     visit(node.name);
     visit3(" = ", node.initializer);
     return null;
   }
+
   Object visitVariableDeclarationList(VariableDeclarationList node) {
     visit5(node.keyword, " ");
     visit2(node.type, " ");
     visitList2(node.variables, ", ");
     return null;
   }
+
   Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     visit(node.variables);
     _writer.print(";");
     return null;
   }
+
   Object visitWhileStatement(WhileStatement node) {
     _writer.print("while (");
     visit(node.condition);
@@ -14212,6 +15272,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitWithClause(WithClause node) {
     _writer.print("with ");
     visitList2(node.mixinTypes, ", ");
@@ -14353,6 +15414,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `UnifyingASTVisitor` implement an AST visitor that will recursively
  * visit all of the nodes in an AST structure (like instances of the class
@@ -14367,113 +15429,217 @@
  */
 class UnifyingASTVisitor<R> implements ASTVisitor<R> {
   R visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
+
   R visitAnnotation(Annotation node) => visitNode(node);
+
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitNode(node);
+
   R visitArgumentList(ArgumentList node) => visitNode(node);
+
   R visitAsExpression(AsExpression node) => visitNode(node);
+
   R visitAssertStatement(AssertStatement node) => visitNode(node);
+
   R visitAssignmentExpression(AssignmentExpression node) => visitNode(node);
+
   R visitBinaryExpression(BinaryExpression node) => visitNode(node);
+
   R visitBlock(Block node) => visitNode(node);
+
   R visitBlockFunctionBody(BlockFunctionBody node) => visitNode(node);
+
   R visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
+
   R visitBreakStatement(BreakStatement node) => visitNode(node);
+
   R visitCascadeExpression(CascadeExpression node) => visitNode(node);
+
   R visitCatchClause(CatchClause node) => visitNode(node);
+
   R visitClassDeclaration(ClassDeclaration node) => visitNode(node);
+
   R visitClassTypeAlias(ClassTypeAlias node) => visitNode(node);
+
   R visitComment(Comment node) => visitNode(node);
+
   R visitCommentReference(CommentReference node) => visitNode(node);
+
   R visitCompilationUnit(CompilationUnit node) => visitNode(node);
+
   R visitConditionalExpression(ConditionalExpression node) => visitNode(node);
+
   R visitConstructorDeclaration(ConstructorDeclaration node) => visitNode(node);
+
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => visitNode(node);
+
   R visitConstructorName(ConstructorName node) => visitNode(node);
+
   R visitContinueStatement(ContinueStatement node) => visitNode(node);
+
   R visitDeclaredIdentifier(DeclaredIdentifier node) => visitNode(node);
+
   R visitDefaultFormalParameter(DefaultFormalParameter node) => visitNode(node);
+
   R visitDoStatement(DoStatement node) => visitNode(node);
+
   R visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
+
   R visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
+
   R visitEmptyStatement(EmptyStatement node) => visitNode(node);
+
   R visitExportDirective(ExportDirective node) => visitNode(node);
+
   R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitNode(node);
+
   R visitExpressionStatement(ExpressionStatement node) => visitNode(node);
+
   R visitExtendsClause(ExtendsClause node) => visitNode(node);
+
   R visitFieldDeclaration(FieldDeclaration node) => visitNode(node);
+
   R visitFieldFormalParameter(FieldFormalParameter node) => visitNode(node);
+
   R visitForEachStatement(ForEachStatement node) => visitNode(node);
+
   R visitFormalParameterList(FormalParameterList node) => visitNode(node);
+
   R visitForStatement(ForStatement node) => visitNode(node);
+
   R visitFunctionDeclaration(FunctionDeclaration node) => visitNode(node);
+
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => visitNode(node);
+
   R visitFunctionExpression(FunctionExpression node) => visitNode(node);
+
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => visitNode(node);
+
   R visitFunctionTypeAlias(FunctionTypeAlias node) => visitNode(node);
+
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => visitNode(node);
+
   R visitHideCombinator(HideCombinator node) => visitNode(node);
+
   R visitIfStatement(IfStatement node) => visitNode(node);
+
   R visitImplementsClause(ImplementsClause node) => visitNode(node);
+
   R visitImportDirective(ImportDirective node) => visitNode(node);
+
   R visitIndexExpression(IndexExpression node) => visitNode(node);
+
   R visitInstanceCreationExpression(InstanceCreationExpression node) => visitNode(node);
+
   R visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
+
   R visitInterpolationExpression(InterpolationExpression node) => visitNode(node);
+
   R visitInterpolationString(InterpolationString node) => visitNode(node);
+
   R visitIsExpression(IsExpression node) => visitNode(node);
+
   R visitLabel(Label node) => visitNode(node);
+
   R visitLabeledStatement(LabeledStatement node) => visitNode(node);
+
   R visitLibraryDirective(LibraryDirective node) => visitNode(node);
+
   R visitLibraryIdentifier(LibraryIdentifier node) => visitNode(node);
+
   R visitListLiteral(ListLiteral node) => visitNode(node);
+
   R visitMapLiteral(MapLiteral node) => visitNode(node);
+
   R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
+
   R visitMethodDeclaration(MethodDeclaration node) => visitNode(node);
+
   R visitMethodInvocation(MethodInvocation node) => visitNode(node);
+
   R visitNamedExpression(NamedExpression node) => visitNode(node);
+
   R visitNativeClause(NativeClause node) => visitNode(node);
+
   R visitNativeFunctionBody(NativeFunctionBody node) => visitNode(node);
+
   R visitNode(ASTNode node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitNullLiteral(NullLiteral node) => visitNode(node);
+
   R visitParenthesizedExpression(ParenthesizedExpression node) => visitNode(node);
+
   R visitPartDirective(PartDirective node) => visitNode(node);
+
   R visitPartOfDirective(PartOfDirective node) => visitNode(node);
+
   R visitPostfixExpression(PostfixExpression node) => visitNode(node);
+
   R visitPrefixedIdentifier(PrefixedIdentifier node) => visitNode(node);
+
   R visitPrefixExpression(PrefixExpression node) => visitNode(node);
+
   R visitPropertyAccess(PropertyAccess node) => visitNode(node);
+
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => visitNode(node);
+
   R visitRethrowExpression(RethrowExpression node) => visitNode(node);
+
   R visitReturnStatement(ReturnStatement node) => visitNode(node);
+
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+
   R visitShowCombinator(ShowCombinator node) => visitNode(node);
+
   R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNode(node);
+
   R visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
+
   R visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
+
   R visitStringInterpolation(StringInterpolation node) => visitNode(node);
+
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) => visitNode(node);
+
   R visitSuperExpression(SuperExpression node) => visitNode(node);
+
   R visitSwitchCase(SwitchCase node) => visitNode(node);
+
   R visitSwitchDefault(SwitchDefault node) => visitNode(node);
+
   R visitSwitchStatement(SwitchStatement node) => visitNode(node);
+
   R visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
+
   R visitThisExpression(ThisExpression node) => visitNode(node);
+
   R visitThrowExpression(ThrowExpression node) => visitNode(node);
+
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => visitNode(node);
+
   R visitTryStatement(TryStatement node) => visitNode(node);
+
   R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
+
   R visitTypeName(TypeName node) => visitNode(node);
+
   R visitTypeParameter(TypeParameter node) => visitNode(node);
+
   R visitTypeParameterList(TypeParameterList node) => visitNode(node);
+
   R visitVariableDeclaration(VariableDeclaration node) => visitNode(node);
+
   R visitVariableDeclarationList(VariableDeclarationList node) => visitNode(node);
+
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) => visitNode(node);
+
   R visitWhileStatement(WhileStatement node) => visitNode(node);
+
   R visitWithClause(WithClause node) => visitNode(node);
 }
+
 /**
  * Instances of the class `ASTCloner` implement an object that will clone any AST structure
  * that it visits. The cloner will only clone the structure, it will not preserve any resolution
@@ -14481,25 +15647,41 @@
  */
 class ASTCloner implements ASTVisitor<ASTNode> {
   AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings.full(clone3(node.strings));
+
   Annotation visitAnnotation(Annotation node) => new Annotation.full(node.atSign, clone2(node.name), node.period, clone2(node.constructorName), clone2(node.arguments));
+
   ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) => new ArgumentDefinitionTest.full(node.question, clone2(node.identifier));
+
   ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList.full(node.leftParenthesis, clone3(node.arguments), node.rightParenthesis);
+
   AsExpression visitAsExpression(AsExpression node) => new AsExpression.full(clone2(node.expression), node.asOperator, clone2(node.type));
+
   ASTNode visitAssertStatement(AssertStatement node) => new AssertStatement.full(node.keyword, node.leftParenthesis, clone2(node.condition), node.rightParenthesis, node.semicolon);
+
   AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression.full(clone2(node.leftHandSide), node.operator, clone2(node.rightHandSide));
+
   BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression.full(clone2(node.leftOperand), node.operator, clone2(node.rightOperand));
+
   Block visitBlock(Block node) => new Block.full(node.leftBracket, clone3(node.statements), node.rightBracket);
+
   BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody.full(clone2(node.block));
+
   BooleanLiteral visitBooleanLiteral(BooleanLiteral node) => new BooleanLiteral.full(node.literal, node.value);
+
   BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement.full(node.keyword, clone2(node.label), node.semicolon);
+
   CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression.full(clone2(node.target), clone3(node.cascadeSections));
+
   CatchClause visitCatchClause(CatchClause node) => new CatchClause.full(node.onKeyword, clone2(node.exceptionType), node.catchKeyword, node.leftParenthesis, clone2(node.exceptionParameter), node.comma, clone2(node.stackTraceParameter), node.rightParenthesis, clone2(node.body));
+
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration copy = new ClassDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.abstractKeyword, node.classKeyword, clone2(node.name), clone2(node.typeParameters), clone2(node.extendsClause), clone2(node.withClause), clone2(node.implementsClause), node.leftBracket, clone3(node.members), node.rightBracket);
     copy.nativeClause = clone2(node.nativeClause);
     return copy;
   }
+
   ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.name), clone2(node.typeParameters), node.equals, node.abstractKeyword, clone2(node.superclass), clone2(node.withClause), clone2(node.implementsClause), node.semicolon);
+
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
       return Comment.createDocumentationComment2(node.tokens, clone3(node.references));
@@ -14508,29 +15690,49 @@
     }
     return Comment.createEndOfLineComment(node.tokens);
   }
+
   CommentReference visitCommentReference(CommentReference node) => new CommentReference.full(node.newKeyword, clone2(node.identifier));
+
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
     CompilationUnit clone = new CompilationUnit.full(node.beginToken, clone2(node.scriptTag), clone3(node.directives), clone3(node.declarations), node.endToken);
     clone.lineInfo = node.lineInfo;
     return clone;
   }
+
   ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression.full(clone2(node.condition), node.question, clone2(node.thenExpression), node.colon, clone2(node.elseExpression));
+
   ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, clone2(node.returnType), node.period, clone2(node.name), clone2(node.parameters), node.separator, clone3(node.initializers), clone2(node.redirectedConstructor), clone2(node.body));
+
   ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer.full(node.keyword, node.period, clone2(node.fieldName), node.equals, clone2(node.expression));
+
   ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName.full(clone2(node.type), node.period, clone2(node.name));
+
   ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement.full(node.keyword, clone2(node.label), node.semicolon);
+
   DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.type), clone2(node.identifier));
+
   DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter.full(clone2(node.parameter), node.kind, node.separator, clone2(node.defaultValue));
+
   DoStatement visitDoStatement(DoStatement node) => new DoStatement.full(node.doKeyword, clone2(node.body), node.whileKeyword, node.leftParenthesis, clone2(node.condition), node.rightParenthesis, node.semicolon);
+
   DoubleLiteral visitDoubleLiteral(DoubleLiteral node) => new DoubleLiteral.full(node.literal, node.value);
+
   EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody.full(node.semicolon);
+
   EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement.full(node.semicolon);
+
   ExportDirective visitExportDirective(ExportDirective node) => new ExportDirective.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.uri), clone3(node.combinators), node.semicolon);
+
   ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody.full(node.functionDefinition, clone2(node.expression), node.semicolon);
+
   ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement.full(clone2(node.expression), node.semicolon);
+
   ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause.full(node.keyword, clone2(node.superclass));
+
   FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.staticKeyword, clone2(node.fields), node.semicolon);
+
   FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.type), node.thisToken, node.period, clone2(node.identifier), clone2(node.parameters));
+
   ForEachStatement visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable == null) {
@@ -14538,18 +15740,31 @@
     }
     return new ForEachStatement.con1_full(node.forKeyword, node.leftParenthesis, clone2(loopVariable), node.inKeyword, clone2(node.iterator), node.rightParenthesis, clone2(node.body));
   }
+
   FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList.full(node.leftParenthesis, clone3(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
+
   ForStatement visitForStatement(ForStatement node) => new ForStatement.full(node.forKeyword, node.leftParenthesis, clone2(node.variables), clone2(node.initialization), node.leftSeparator, clone2(node.condition), node.rightSeparator, clone3(node.updaters), node.rightParenthesis, clone2(node.body));
+
   FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.externalKeyword, clone2(node.returnType), node.propertyKeyword, clone2(node.name), clone2(node.functionExpression));
+
   FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement.full(clone2(node.functionDeclaration));
+
   FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression.full(clone2(node.parameters), clone2(node.body));
+
   FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation.full(clone2(node.function), clone2(node.argumentList));
+
   FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.returnType), clone2(node.name), clone2(node.typeParameters), clone2(node.parameters), node.semicolon);
+
   FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.returnType), clone2(node.identifier), clone2(node.parameters));
+
   HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator.full(node.keyword, clone3(node.hiddenNames));
+
   IfStatement visitIfStatement(IfStatement node) => new IfStatement.full(node.ifKeyword, node.leftParenthesis, clone2(node.condition), node.rightParenthesis, clone2(node.thenStatement), node.elseKeyword, clone2(node.elseStatement));
+
   ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause.full(node.keyword, clone3(node.interfaces));
+
   ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.uri), node.asToken, clone2(node.prefix), clone3(node.combinators), node.semicolon);
+
   IndexExpression visitIndexExpression(IndexExpression node) {
     Token period = node.period;
     if (period == null) {
@@ -14558,65 +15773,120 @@
       return new IndexExpression.forCascade_full(period, node.leftBracket, clone2(node.index), node.rightBracket);
     }
   }
+
   InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression.full(node.keyword, clone2(node.constructorName), clone2(node.argumentList));
+
   IntegerLiteral visitIntegerLiteral(IntegerLiteral node) => new IntegerLiteral.full(node.literal, node.value);
+
   InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression.full(node.leftBracket, clone2(node.expression), node.rightBracket);
+
   InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString.full(node.contents, node.value);
+
   IsExpression visitIsExpression(IsExpression node) => new IsExpression.full(clone2(node.expression), node.isOperator, node.notOperator, clone2(node.type));
+
   Label visitLabel(Label node) => new Label.full(clone2(node.label), node.colon);
+
   LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement.full(clone3(node.labels), clone2(node.statement));
+
   LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective.full(clone2(node.documentationComment), clone3(node.metadata), node.libraryToken, clone2(node.name), node.semicolon);
+
   LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier.full(clone3(node.components));
+
   ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral.full(node.constKeyword, clone2(node.typeArguments), node.leftBracket, clone3(node.elements), node.rightBracket);
+
   MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral.full(node.constKeyword, clone2(node.typeArguments), node.leftBracket, clone3(node.entries), node.rightBracket);
+
   MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry.full(clone2(node.key), node.separator, clone2(node.value));
+
   MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.externalKeyword, node.modifierKeyword, clone2(node.returnType), node.propertyKeyword, node.operatorKeyword, clone2(node.name), clone2(node.parameters), clone2(node.body));
+
   MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation.full(clone2(node.target), node.period, clone2(node.methodName), clone2(node.argumentList));
+
   NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression.full(clone2(node.name), clone2(node.expression));
+
   ASTNode visitNativeClause(NativeClause node) => new NativeClause.full(node.keyword, clone2(node.name));
+
   NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody.full(node.nativeToken, clone2(node.stringLiteral), node.semicolon);
+
   NullLiteral visitNullLiteral(NullLiteral node) => new NullLiteral.full(node.literal);
+
   ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression.full(node.leftParenthesis, clone2(node.expression), node.rightParenthesis);
+
   PartDirective visitPartDirective(PartDirective node) => new PartDirective.full(clone2(node.documentationComment), clone3(node.metadata), node.partToken, clone2(node.uri), node.semicolon);
+
   PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective.full(clone2(node.documentationComment), clone3(node.metadata), node.partToken, node.ofToken, clone2(node.libraryName), node.semicolon);
+
   PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression.full(clone2(node.operand), node.operator);
+
   PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier.full(clone2(node.prefix), node.period, clone2(node.identifier));
+
   PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression.full(node.operator, clone2(node.operand));
+
   PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess.full(clone2(node.target), node.operator, clone2(node.propertyName));
+
   RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation.full(node.keyword, node.period, clone2(node.constructorName), clone2(node.argumentList));
+
   RethrowExpression visitRethrowExpression(RethrowExpression node) => new RethrowExpression.full(node.keyword);
+
   ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement.full(node.keyword, clone2(node.expression), node.semicolon);
+
   ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag.full(node.scriptTag);
+
   ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator.full(node.keyword, clone3(node.shownNames));
+
   SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.type), clone2(node.identifier));
+
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) => new SimpleIdentifier.full(node.token);
+
   SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) => new SimpleStringLiteral.full(node.literal, node.value);
+
   StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation.full(clone3(node.elements));
+
   SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation.full(node.keyword, node.period, clone2(node.constructorName), clone2(node.argumentList));
+
   SuperExpression visitSuperExpression(SuperExpression node) => new SuperExpression.full(node.keyword);
+
   SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase.full(clone3(node.labels), node.keyword, clone2(node.expression), node.colon, clone3(node.statements));
+
   SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault.full(clone3(node.labels), node.keyword, node.colon, clone3(node.statements));
+
   SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement.full(node.keyword, node.leftParenthesis, clone2(node.expression), node.rightParenthesis, node.leftBracket, clone3(node.members), node.rightBracket);
+
   ASTNode visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral.full(node.poundSign, node.components);
+
   ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression.full(node.keyword);
+
   ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression.full(node.keyword, clone2(node.expression));
+
   TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.variables), node.semicolon);
+
   TryStatement visitTryStatement(TryStatement node) => new TryStatement.full(node.tryKeyword, clone2(node.body), clone3(node.catchClauses), node.finallyKeyword, clone2(node.finallyBlock));
+
   TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList.full(node.leftBracket, clone3(node.arguments), node.rightBracket);
+
   TypeName visitTypeName(TypeName node) => new TypeName.full(clone2(node.name), clone2(node.typeArguments));
+
   TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.name), node.keyword, clone2(node.bound));
+
   TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList.full(node.leftBracket, clone3(node.typeParameters), node.rightBracket);
+
   VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration.full(null, clone3(node.metadata), clone2(node.name), node.equals, clone2(node.initializer));
+
   VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList.full(null, clone3(node.metadata), node.keyword, clone2(node.type), clone3(node.variables));
+
   VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement.full(clone2(node.variables), node.semicolon);
+
   WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement.full(node.keyword, node.leftParenthesis, clone2(node.condition), node.rightParenthesis, clone2(node.body));
+
   WithClause visitWithClause(WithClause node) => new WithClause.full(node.withKeyword, clone3(node.mixinTypes));
+
   ASTNode clone2(ASTNode node) {
     if (node == null) {
       return null;
     }
     return node.accept(this) as ASTNode;
   }
+
   List clone3(NodeList nodes) {
     List clonedNodes = new List();
     for (ASTNode node in nodes) {
@@ -14625,12 +15895,12 @@
     return clonedNodes;
   }
 }
+
 /**
  * Instances of the class `ASTComparator` compare the structure of two ASTNodes to see whether
  * they are equal.
  */
 class ASTComparator implements ASTVisitor<bool> {
-
   /**
    * Return `true` if the two AST nodes are equal.
    *
@@ -14648,414 +15918,517 @@
    * beginning of each visit method (until [isEqual] is invoked).
    */
   ASTNode _other;
+
   bool visitAdjacentStrings(AdjacentStrings node) {
     AdjacentStrings other = this._other as AdjacentStrings;
     return isEqual5(node.strings, other.strings);
   }
+
   bool visitAnnotation(Annotation node) {
     Annotation other = this._other as Annotation;
     return isEqual6(node.atSign, other.atSign) && isEqual(node.name, other.name) && isEqual6(node.period, other.period) && isEqual(node.constructorName, other.constructorName) && isEqual(node.arguments, other.arguments);
   }
+
   bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     ArgumentDefinitionTest other = this._other as ArgumentDefinitionTest;
     return isEqual6(node.question, other.question) && isEqual(node.identifier, other.identifier);
   }
+
   bool visitArgumentList(ArgumentList node) {
     ArgumentList other = this._other as ArgumentList;
     return isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual5(node.arguments, other.arguments) && isEqual6(node.rightParenthesis, other.rightParenthesis);
   }
+
   bool visitAsExpression(AsExpression node) {
     AsExpression other = this._other as AsExpression;
     return isEqual(node.expression, other.expression) && isEqual6(node.asOperator, other.asOperator) && isEqual(node.type, other.type);
   }
+
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement other = this._other as AssertStatement;
     return isEqual6(node.keyword, other.keyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression other = this._other as AssignmentExpression;
     return isEqual(node.leftHandSide, other.leftHandSide) && isEqual6(node.operator, other.operator) && isEqual(node.rightHandSide, other.rightHandSide);
   }
+
   bool visitBinaryExpression(BinaryExpression node) {
     BinaryExpression other = this._other as BinaryExpression;
     return isEqual(node.leftOperand, other.leftOperand) && isEqual6(node.operator, other.operator) && isEqual(node.rightOperand, other.rightOperand);
   }
+
   bool visitBlock(Block node) {
     Block other = this._other as Block;
     return isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.statements, other.statements) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitBlockFunctionBody(BlockFunctionBody node) {
     BlockFunctionBody other = this._other as BlockFunctionBody;
     return isEqual(node.block, other.block);
   }
+
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral other = this._other as BooleanLiteral;
     return isEqual6(node.literal, other.literal) && identical(node.value, other.value);
   }
+
   bool visitBreakStatement(BreakStatement node) {
     BreakStatement other = this._other as BreakStatement;
     return isEqual6(node.keyword, other.keyword) && isEqual(node.label, other.label) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitCascadeExpression(CascadeExpression node) {
     CascadeExpression other = this._other as CascadeExpression;
     return isEqual(node.target, other.target) && isEqual5(node.cascadeSections, other.cascadeSections);
   }
+
   bool visitCatchClause(CatchClause node) {
     CatchClause other = this._other as CatchClause;
     return isEqual6(node.onKeyword, other.onKeyword) && isEqual(node.exceptionType, other.exceptionType) && isEqual6(node.catchKeyword, other.catchKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.exceptionParameter, other.exceptionParameter) && isEqual6(node.comma, other.comma) && isEqual(node.stackTraceParameter, other.stackTraceParameter) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
   }
+
   bool visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration other = this._other as ClassDeclaration;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.abstractKeyword, other.abstractKeyword) && isEqual6(node.classKeyword, other.classKeyword) && isEqual(node.name, other.name) && isEqual(node.typeParameters, other.typeParameters) && isEqual(node.extendsClause, other.extendsClause) && isEqual(node.withClause, other.withClause) && isEqual(node.implementsClause, other.implementsClause) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.members, other.members) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitClassTypeAlias(ClassTypeAlias node) {
     ClassTypeAlias other = this._other as ClassTypeAlias;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.name, other.name) && isEqual(node.typeParameters, other.typeParameters) && isEqual6(node.equals, other.equals) && isEqual6(node.abstractKeyword, other.abstractKeyword) && isEqual(node.superclass, other.superclass) && isEqual(node.withClause, other.withClause) && isEqual(node.implementsClause, other.implementsClause) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitComment(Comment node) {
     Comment other = this._other as Comment;
     return isEqual5(node.references, other.references);
   }
+
   bool visitCommentReference(CommentReference node) {
     CommentReference other = this._other as CommentReference;
     return isEqual6(node.newKeyword, other.newKeyword) && isEqual(node.identifier, other.identifier);
   }
+
   bool visitCompilationUnit(CompilationUnit node) {
     CompilationUnit other = this._other as CompilationUnit;
     return isEqual6(node.beginToken, other.beginToken) && isEqual(node.scriptTag, other.scriptTag) && isEqual5(node.directives, other.directives) && isEqual5(node.declarations, other.declarations) && isEqual6(node.endToken, other.endToken);
   }
+
   bool visitConditionalExpression(ConditionalExpression node) {
     ConditionalExpression other = this._other as ConditionalExpression;
     return isEqual(node.condition, other.condition) && isEqual6(node.question, other.question) && isEqual(node.thenExpression, other.thenExpression) && isEqual6(node.colon, other.colon) && isEqual(node.elseExpression, other.elseExpression);
   }
+
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorDeclaration other = this._other as ConstructorDeclaration;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.externalKeyword, other.externalKeyword) && isEqual6(node.constKeyword, other.constKeyword) && isEqual6(node.factoryKeyword, other.factoryKeyword) && isEqual(node.returnType, other.returnType) && isEqual6(node.period, other.period) && isEqual(node.name, other.name) && isEqual(node.parameters, other.parameters) && isEqual6(node.separator, other.separator) && isEqual5(node.initializers, other.initializers) && isEqual(node.redirectedConstructor, other.redirectedConstructor) && isEqual(node.body, other.body);
   }
+
   bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     ConstructorFieldInitializer other = this._other as ConstructorFieldInitializer;
     return isEqual6(node.keyword, other.keyword) && isEqual6(node.period, other.period) && isEqual(node.fieldName, other.fieldName) && isEqual6(node.equals, other.equals) && isEqual(node.expression, other.expression);
   }
+
   bool visitConstructorName(ConstructorName node) {
     ConstructorName other = this._other as ConstructorName;
     return isEqual(node.type, other.type) && isEqual6(node.period, other.period) && isEqual(node.name, other.name);
   }
+
   bool visitContinueStatement(ContinueStatement node) {
     ContinueStatement other = this._other as ContinueStatement;
     return isEqual6(node.keyword, other.keyword) && isEqual(node.label, other.label) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitDeclaredIdentifier(DeclaredIdentifier node) {
     DeclaredIdentifier other = this._other as DeclaredIdentifier;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual(node.identifier, other.identifier);
   }
+
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter other = this._other as DefaultFormalParameter;
     return isEqual(node.parameter, other.parameter) && identical(node.kind, other.kind) && isEqual6(node.separator, other.separator) && isEqual(node.defaultValue, other.defaultValue);
   }
+
   bool visitDoStatement(DoStatement node) {
     DoStatement other = this._other as DoStatement;
     return isEqual6(node.doKeyword, other.doKeyword) && isEqual(node.body, other.body) && isEqual6(node.whileKeyword, other.whileKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitDoubleLiteral(DoubleLiteral node) {
     DoubleLiteral other = this._other as DoubleLiteral;
     return isEqual6(node.literal, other.literal) && node.value == other.value;
   }
+
   bool visitEmptyFunctionBody(EmptyFunctionBody node) {
     EmptyFunctionBody other = this._other as EmptyFunctionBody;
     return isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitEmptyStatement(EmptyStatement node) {
     EmptyStatement other = this._other as EmptyStatement;
     return isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitExportDirective(ExportDirective node) {
     ExportDirective other = this._other as ExportDirective;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.uri, other.uri) && isEqual5(node.combinators, other.combinators) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
     ExpressionFunctionBody other = this._other as ExpressionFunctionBody;
     return isEqual6(node.functionDefinition, other.functionDefinition) && isEqual(node.expression, other.expression) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitExpressionStatement(ExpressionStatement node) {
     ExpressionStatement other = this._other as ExpressionStatement;
     return isEqual(node.expression, other.expression) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitExtendsClause(ExtendsClause node) {
     ExtendsClause other = this._other as ExtendsClause;
     return isEqual6(node.keyword, other.keyword) && isEqual(node.superclass, other.superclass);
   }
+
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration other = this._other as FieldDeclaration;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.staticKeyword, other.staticKeyword) && isEqual(node.fields, other.fields) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitFieldFormalParameter(FieldFormalParameter node) {
     FieldFormalParameter other = this._other as FieldFormalParameter;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual6(node.thisToken, other.thisToken) && isEqual6(node.period, other.period) && isEqual(node.identifier, other.identifier);
   }
+
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement other = this._other as ForEachStatement;
     return isEqual6(node.forKeyword, other.forKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.loopVariable, other.loopVariable) && isEqual6(node.inKeyword, other.inKeyword) && isEqual(node.iterator, other.iterator) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
   }
+
   bool visitFormalParameterList(FormalParameterList node) {
     FormalParameterList other = this._other as FormalParameterList;
     return isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual5(node.parameters, other.parameters) && isEqual6(node.leftDelimiter, other.leftDelimiter) && isEqual6(node.rightDelimiter, other.rightDelimiter) && isEqual6(node.rightParenthesis, other.rightParenthesis);
   }
+
   bool visitForStatement(ForStatement node) {
     ForStatement other = this._other as ForStatement;
     return isEqual6(node.forKeyword, other.forKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.variables, other.variables) && isEqual(node.initialization, other.initialization) && isEqual6(node.leftSeparator, other.leftSeparator) && isEqual(node.condition, other.condition) && isEqual6(node.rightSeparator, other.rightSeparator) && isEqual5(node.updaters, other.updaters) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
   }
+
   bool visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionDeclaration other = this._other as FunctionDeclaration;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.externalKeyword, other.externalKeyword) && isEqual(node.returnType, other.returnType) && isEqual6(node.propertyKeyword, other.propertyKeyword) && isEqual(node.name, other.name) && isEqual(node.functionExpression, other.functionExpression);
   }
+
   bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     FunctionDeclarationStatement other = this._other as FunctionDeclarationStatement;
     return isEqual(node.functionDeclaration, other.functionDeclaration);
   }
+
   bool visitFunctionExpression(FunctionExpression node) {
     FunctionExpression other = this._other as FunctionExpression;
     return isEqual(node.parameters, other.parameters) && isEqual(node.body, other.body);
   }
+
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     FunctionExpressionInvocation other = this._other as FunctionExpressionInvocation;
     return isEqual(node.function, other.function) && isEqual(node.argumentList, other.argumentList);
   }
+
   bool visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAlias other = this._other as FunctionTypeAlias;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.returnType, other.returnType) && isEqual(node.name, other.name) && isEqual(node.typeParameters, other.typeParameters) && isEqual(node.parameters, other.parameters) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     FunctionTypedFormalParameter other = this._other as FunctionTypedFormalParameter;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.returnType, other.returnType) && isEqual(node.identifier, other.identifier) && isEqual(node.parameters, other.parameters);
   }
+
   bool visitHideCombinator(HideCombinator node) {
     HideCombinator other = this._other as HideCombinator;
     return isEqual6(node.keyword, other.keyword) && isEqual5(node.hiddenNames, other.hiddenNames);
   }
+
   bool visitIfStatement(IfStatement node) {
     IfStatement other = this._other as IfStatement;
     return isEqual6(node.ifKeyword, other.ifKeyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.thenStatement, other.thenStatement) && isEqual6(node.elseKeyword, other.elseKeyword) && isEqual(node.elseStatement, other.elseStatement);
   }
+
   bool visitImplementsClause(ImplementsClause node) {
     ImplementsClause other = this._other as ImplementsClause;
     return isEqual6(node.keyword, other.keyword) && isEqual5(node.interfaces, other.interfaces);
   }
+
   bool visitImportDirective(ImportDirective node) {
     ImportDirective other = this._other as ImportDirective;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.uri, other.uri) && isEqual6(node.asToken, other.asToken) && isEqual(node.prefix, other.prefix) && isEqual5(node.combinators, other.combinators) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitIndexExpression(IndexExpression node) {
     IndexExpression other = this._other as IndexExpression;
     return isEqual(node.target, other.target) && isEqual6(node.leftBracket, other.leftBracket) && isEqual(node.index, other.index) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression other = this._other as InstanceCreationExpression;
     return isEqual6(node.keyword, other.keyword) && isEqual(node.constructorName, other.constructorName) && isEqual(node.argumentList, other.argumentList);
   }
+
   bool visitIntegerLiteral(IntegerLiteral node) {
     IntegerLiteral other = this._other as IntegerLiteral;
     return isEqual6(node.literal, other.literal) && identical(node.value, other.value);
   }
+
   bool visitInterpolationExpression(InterpolationExpression node) {
     InterpolationExpression other = this._other as InterpolationExpression;
     return isEqual6(node.leftBracket, other.leftBracket) && isEqual(node.expression, other.expression) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitInterpolationString(InterpolationString node) {
     InterpolationString other = this._other as InterpolationString;
     return isEqual6(node.contents, other.contents) && node.value == other.value;
   }
+
   bool visitIsExpression(IsExpression node) {
     IsExpression other = this._other as IsExpression;
     return isEqual(node.expression, other.expression) && isEqual6(node.isOperator, other.isOperator) && isEqual6(node.notOperator, other.notOperator) && isEqual(node.type, other.type);
   }
+
   bool visitLabel(Label node) {
     Label other = this._other as Label;
     return isEqual(node.label, other.label) && isEqual6(node.colon, other.colon);
   }
+
   bool visitLabeledStatement(LabeledStatement node) {
     LabeledStatement other = this._other as LabeledStatement;
     return isEqual5(node.labels, other.labels) && isEqual(node.statement, other.statement);
   }
+
   bool visitLibraryDirective(LibraryDirective node) {
     LibraryDirective other = this._other as LibraryDirective;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.libraryToken, other.libraryToken) && isEqual(node.name, other.name) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitLibraryIdentifier(LibraryIdentifier node) {
     LibraryIdentifier other = this._other as LibraryIdentifier;
     return isEqual5(node.components, other.components);
   }
+
   bool visitListLiteral(ListLiteral node) {
     ListLiteral other = this._other as ListLiteral;
     return isEqual6(node.constKeyword, other.constKeyword) && isEqual(node.typeArguments, other.typeArguments) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.elements, other.elements) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitMapLiteral(MapLiteral node) {
     MapLiteral other = this._other as MapLiteral;
     return isEqual6(node.constKeyword, other.constKeyword) && isEqual(node.typeArguments, other.typeArguments) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.entries, other.entries) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry other = this._other as MapLiteralEntry;
     return isEqual(node.key, other.key) && isEqual6(node.separator, other.separator) && isEqual(node.value, other.value);
   }
+
   bool visitMethodDeclaration(MethodDeclaration node) {
     MethodDeclaration other = this._other as MethodDeclaration;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.externalKeyword, other.externalKeyword) && isEqual6(node.modifierKeyword, other.modifierKeyword) && isEqual(node.returnType, other.returnType) && isEqual6(node.propertyKeyword, other.propertyKeyword) && isEqual6(node.propertyKeyword, other.propertyKeyword) && isEqual(node.name, other.name) && isEqual(node.parameters, other.parameters) && isEqual(node.body, other.body);
   }
+
   bool visitMethodInvocation(MethodInvocation node) {
     MethodInvocation other = this._other as MethodInvocation;
     return isEqual(node.target, other.target) && isEqual6(node.period, other.period) && isEqual(node.methodName, other.methodName) && isEqual(node.argumentList, other.argumentList);
   }
+
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression other = this._other as NamedExpression;
     return isEqual(node.name, other.name) && isEqual(node.expression, other.expression);
   }
+
   bool visitNativeClause(NativeClause node) {
     NativeClause other = this._other as NativeClause;
     return isEqual6(node.keyword, other.keyword) && isEqual(node.name, other.name);
   }
+
   bool visitNativeFunctionBody(NativeFunctionBody node) {
     NativeFunctionBody other = this._other as NativeFunctionBody;
     return isEqual6(node.nativeToken, other.nativeToken) && isEqual(node.stringLiteral, other.stringLiteral) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitNullLiteral(NullLiteral node) {
     NullLiteral other = this._other as NullLiteral;
     return isEqual6(node.literal, other.literal);
   }
+
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression other = this._other as ParenthesizedExpression;
     return isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.expression, other.expression) && isEqual6(node.rightParenthesis, other.rightParenthesis);
   }
+
   bool visitPartDirective(PartDirective node) {
     PartDirective other = this._other as PartDirective;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.partToken, other.partToken) && isEqual(node.uri, other.uri) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitPartOfDirective(PartOfDirective node) {
     PartOfDirective other = this._other as PartOfDirective;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.partToken, other.partToken) && isEqual6(node.ofToken, other.ofToken) && isEqual(node.libraryName, other.libraryName) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitPostfixExpression(PostfixExpression node) {
     PostfixExpression other = this._other as PostfixExpression;
     return isEqual(node.operand, other.operand) && isEqual6(node.operator, other.operator);
   }
+
   bool visitPrefixedIdentifier(PrefixedIdentifier node) {
     PrefixedIdentifier other = this._other as PrefixedIdentifier;
     return isEqual(node.prefix, other.prefix) && isEqual6(node.period, other.period) && isEqual(node.identifier, other.identifier);
   }
+
   bool visitPrefixExpression(PrefixExpression node) {
     PrefixExpression other = this._other as PrefixExpression;
     return isEqual6(node.operator, other.operator) && isEqual(node.operand, other.operand);
   }
+
   bool visitPropertyAccess(PropertyAccess node) {
     PropertyAccess other = this._other as PropertyAccess;
     return isEqual(node.target, other.target) && isEqual6(node.operator, other.operator) && isEqual(node.propertyName, other.propertyName);
   }
+
   bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation other = this._other as RedirectingConstructorInvocation;
     return isEqual6(node.keyword, other.keyword) && isEqual6(node.period, other.period) && isEqual(node.constructorName, other.constructorName) && isEqual(node.argumentList, other.argumentList);
   }
+
   bool visitRethrowExpression(RethrowExpression node) {
     RethrowExpression other = this._other as RethrowExpression;
     return isEqual6(node.keyword, other.keyword);
   }
+
   bool visitReturnStatement(ReturnStatement node) {
     ReturnStatement other = this._other as ReturnStatement;
     return isEqual6(node.keyword, other.keyword) && isEqual(node.expression, other.expression) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitScriptTag(ScriptTag node) {
     ScriptTag other = this._other as ScriptTag;
     return isEqual6(node.scriptTag, other.scriptTag);
   }
+
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator other = this._other as ShowCombinator;
     return isEqual6(node.keyword, other.keyword) && isEqual5(node.shownNames, other.shownNames);
   }
+
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter other = this._other as SimpleFormalParameter;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual(node.identifier, other.identifier);
   }
+
   bool visitSimpleIdentifier(SimpleIdentifier node) {
     SimpleIdentifier other = this._other as SimpleIdentifier;
     return isEqual6(node.token, other.token);
   }
+
   bool visitSimpleStringLiteral(SimpleStringLiteral node) {
     SimpleStringLiteral other = this._other as SimpleStringLiteral;
     return isEqual6(node.literal, other.literal) && identical(node.value, other.value);
   }
+
   bool visitStringInterpolation(StringInterpolation node) {
     StringInterpolation other = this._other as StringInterpolation;
     return isEqual5(node.elements, other.elements);
   }
+
   bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SuperConstructorInvocation other = this._other as SuperConstructorInvocation;
     return isEqual6(node.keyword, other.keyword) && isEqual6(node.period, other.period) && isEqual(node.constructorName, other.constructorName) && isEqual(node.argumentList, other.argumentList);
   }
+
   bool visitSuperExpression(SuperExpression node) {
     SuperExpression other = this._other as SuperExpression;
     return isEqual6(node.keyword, other.keyword);
   }
+
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase other = this._other as SwitchCase;
     return isEqual5(node.labels, other.labels) && isEqual6(node.keyword, other.keyword) && isEqual(node.expression, other.expression) && isEqual6(node.colon, other.colon) && isEqual5(node.statements, other.statements);
   }
+
   bool visitSwitchDefault(SwitchDefault node) {
     SwitchDefault other = this._other as SwitchDefault;
     return isEqual5(node.labels, other.labels) && isEqual6(node.keyword, other.keyword) && isEqual6(node.colon, other.colon) && isEqual5(node.statements, other.statements);
   }
+
   bool visitSwitchStatement(SwitchStatement node) {
     SwitchStatement other = this._other as SwitchStatement;
     return isEqual6(node.keyword, other.keyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.expression, other.expression) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.members, other.members) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitSymbolLiteral(SymbolLiteral node) {
     SymbolLiteral other = this._other as SymbolLiteral;
     return isEqual6(node.poundSign, other.poundSign) && isEqual7(node.components, other.components);
   }
+
   bool visitThisExpression(ThisExpression node) {
     ThisExpression other = this._other as ThisExpression;
     return isEqual6(node.keyword, other.keyword);
   }
+
   bool visitThrowExpression(ThrowExpression node) {
     ThrowExpression other = this._other as ThrowExpression;
     return isEqual6(node.keyword, other.keyword) && isEqual(node.expression, other.expression);
   }
+
   bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     TopLevelVariableDeclaration other = this._other as TopLevelVariableDeclaration;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.variables, other.variables) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitTryStatement(TryStatement node) {
     TryStatement other = this._other as TryStatement;
     return isEqual6(node.tryKeyword, other.tryKeyword) && isEqual(node.body, other.body) && isEqual5(node.catchClauses, other.catchClauses) && isEqual6(node.finallyKeyword, other.finallyKeyword) && isEqual(node.finallyBlock, other.finallyBlock);
   }
+
   bool visitTypeArgumentList(TypeArgumentList node) {
     TypeArgumentList other = this._other as TypeArgumentList;
     return isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.arguments, other.arguments) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitTypeName(TypeName node) {
     TypeName other = this._other as TypeName;
     return isEqual(node.name, other.name) && isEqual(node.typeArguments, other.typeArguments);
   }
+
   bool visitTypeParameter(TypeParameter node) {
     TypeParameter other = this._other as TypeParameter;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.name, other.name) && isEqual6(node.keyword, other.keyword) && isEqual(node.bound, other.bound);
   }
+
   bool visitTypeParameterList(TypeParameterList node) {
     TypeParameterList other = this._other as TypeParameterList;
     return isEqual6(node.leftBracket, other.leftBracket) && isEqual5(node.typeParameters, other.typeParameters) && isEqual6(node.rightBracket, other.rightBracket);
   }
+
   bool visitVariableDeclaration(VariableDeclaration node) {
     VariableDeclaration other = this._other as VariableDeclaration;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual(node.name, other.name) && isEqual6(node.equals, other.equals) && isEqual(node.initializer, other.initializer);
   }
+
   bool visitVariableDeclarationList(VariableDeclarationList node) {
     VariableDeclarationList other = this._other as VariableDeclarationList;
     return isEqual(node.documentationComment, other.documentationComment) && isEqual5(node.metadata, other.metadata) && isEqual6(node.keyword, other.keyword) && isEqual(node.type, other.type) && isEqual5(node.variables, other.variables);
   }
+
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     VariableDeclarationStatement other = this._other as VariableDeclarationStatement;
     return isEqual(node.variables, other.variables) && isEqual6(node.semicolon, other.semicolon);
   }
+
   bool visitWhileStatement(WhileStatement node) {
     WhileStatement other = this._other as WhileStatement;
     return isEqual6(node.keyword, other.keyword) && isEqual6(node.leftParenthesis, other.leftParenthesis) && isEqual(node.condition, other.condition) && isEqual6(node.rightParenthesis, other.rightParenthesis) && isEqual(node.body, other.body);
   }
+
   bool visitWithClause(WithClause node) {
     WithClause other = this._other as WithClause;
     return isEqual6(node.withKeyword, other.withKeyword) && isEqual5(node.mixinTypes, other.mixinTypes);
@@ -15145,6 +16518,7 @@
     return true;
   }
 }
+
 /**
  * Instances of the class `IncrementalASTCloner` implement an object that will clone any AST
  * structure that it visits. The cloner will clone the structure, replacing the specified ASTNode
@@ -15152,7 +16526,6 @@
  * results.
  */
 class IncrementalASTCloner implements ASTVisitor<ASTNode> {
-
   /**
    * The node to be replaced during the cloning process.
    */
@@ -15181,26 +16554,33 @@
     this._newNode = newNode;
     this._tokenMap = tokenMap;
   }
+
   AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings.full(clone5(node.strings));
+
   Annotation visitAnnotation(Annotation node) {
     Annotation copy = new Annotation.full(map(node.atSign), clone4(node.name), map(node.period), clone4(node.constructorName), clone4(node.arguments));
     copy.element = node.element;
     return copy;
   }
+
   ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     ArgumentDefinitionTest copy = new ArgumentDefinitionTest.full(map(node.question), clone4(node.identifier));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList.full(map(node.leftParenthesis), clone5(node.arguments), map(node.rightParenthesis));
+
   AsExpression visitAsExpression(AsExpression node) {
     AsExpression copy = new AsExpression.full(clone4(node.expression), map(node.asOperator), clone4(node.type));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ASTNode visitAssertStatement(AssertStatement node) => new AssertStatement.full(map(node.keyword), map(node.leftParenthesis), clone4(node.condition), map(node.rightParenthesis), map(node.semicolon));
+
   AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression copy = new AssignmentExpression.full(clone4(node.leftHandSide), map(node.operator), clone4(node.rightHandSide));
     copy.propagatedElement = node.propagatedElement;
@@ -15209,6 +16589,7 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   BinaryExpression visitBinaryExpression(BinaryExpression node) {
     BinaryExpression copy = new BinaryExpression.full(clone4(node.leftOperand), map(node.operator), clone4(node.rightOperand));
     copy.propagatedElement = node.propagatedElement;
@@ -15217,28 +16598,37 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   Block visitBlock(Block node) => new Block.full(map(node.leftBracket), clone5(node.statements), map(node.rightBracket));
+
   BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody.full(clone4(node.block));
+
   BooleanLiteral visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral copy = new BooleanLiteral.full(map(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement.full(map(node.keyword), clone4(node.label), map(node.semicolon));
+
   CascadeExpression visitCascadeExpression(CascadeExpression node) {
     CascadeExpression copy = new CascadeExpression.full(clone4(node.target), clone5(node.cascadeSections));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   CatchClause visitCatchClause(CatchClause node) => new CatchClause.full(map(node.onKeyword), clone4(node.exceptionType), map(node.catchKeyword), map(node.leftParenthesis), clone4(node.exceptionParameter), map(node.comma), clone4(node.stackTraceParameter), map(node.rightParenthesis), clone4(node.body));
+
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration copy = new ClassDeclaration.full(clone4(node.documentationComment), clone5(node.metadata), map(node.abstractKeyword), map(node.classKeyword), clone4(node.name), clone4(node.typeParameters), clone4(node.extendsClause), clone4(node.withClause), clone4(node.implementsClause), map(node.leftBracket), clone5(node.members), map(node.rightBracket));
     copy.nativeClause = clone4(node.nativeClause);
     return copy;
   }
+
   ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias.full(clone4(node.documentationComment), clone5(node.metadata), map(node.keyword), clone4(node.name), clone4(node.typeParameters), map(node.equals), map(node.abstractKeyword), clone4(node.superclass), clone4(node.withClause), clone4(node.implementsClause), map(node.semicolon));
+
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
       return Comment.createDocumentationComment2(map2(node.tokens), clone5(node.references));
@@ -15247,52 +16637,72 @@
     }
     return Comment.createEndOfLineComment(map2(node.tokens));
   }
+
   CommentReference visitCommentReference(CommentReference node) => new CommentReference.full(map(node.newKeyword), clone4(node.identifier));
+
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
     CompilationUnit copy = new CompilationUnit.full(map(node.beginToken), clone4(node.scriptTag), clone5(node.directives), clone5(node.declarations), map(node.endToken));
     copy.lineInfo = node.lineInfo;
     copy.element = node.element;
     return copy;
   }
+
   ConditionalExpression visitConditionalExpression(ConditionalExpression node) {
     ConditionalExpression copy = new ConditionalExpression.full(clone4(node.condition), map(node.question), clone4(node.thenExpression), map(node.colon), clone4(node.elseExpression));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorDeclaration copy = new ConstructorDeclaration.full(clone4(node.documentationComment), clone5(node.metadata), map(node.externalKeyword), map(node.constKeyword), map(node.factoryKeyword), clone4(node.returnType), map(node.period), clone4(node.name), clone4(node.parameters), map(node.separator), clone5(node.initializers), clone4(node.redirectedConstructor), clone4(node.body));
     copy.element = node.element;
     return copy;
   }
+
   ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer.full(map(node.keyword), map(node.period), clone4(node.fieldName), map(node.equals), clone4(node.expression));
+
   ConstructorName visitConstructorName(ConstructorName node) {
     ConstructorName copy = new ConstructorName.full(clone4(node.type), map(node.period), clone4(node.name));
     copy.staticElement = node.staticElement;
     return copy;
   }
+
   ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement.full(map(node.keyword), clone4(node.label), map(node.semicolon));
+
   DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier.full(clone4(node.documentationComment), clone5(node.metadata), map(node.keyword), clone4(node.type), clone4(node.identifier));
+
   DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter.full(clone4(node.parameter), node.kind, map(node.separator), clone4(node.defaultValue));
+
   DoStatement visitDoStatement(DoStatement node) => new DoStatement.full(map(node.doKeyword), clone4(node.body), map(node.whileKeyword), map(node.leftParenthesis), clone4(node.condition), map(node.rightParenthesis), map(node.semicolon));
+
   DoubleLiteral visitDoubleLiteral(DoubleLiteral node) {
     DoubleLiteral copy = new DoubleLiteral.full(map(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody.full(map(node.semicolon));
+
   EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement.full(map(node.semicolon));
+
   ExportDirective visitExportDirective(ExportDirective node) {
     ExportDirective copy = new ExportDirective.full(clone4(node.documentationComment), clone5(node.metadata), map(node.keyword), clone4(node.uri), clone5(node.combinators), map(node.semicolon));
     copy.element = node.element;
     return copy;
   }
+
   ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody.full(map(node.functionDefinition), clone4(node.expression), map(node.semicolon));
+
   ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement.full(clone4(node.expression), map(node.semicolon));
+
   ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause.full(map(node.keyword), clone4(node.superclass));
+
   FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration.full(clone4(node.documentationComment), clone5(node.metadata), map(node.staticKeyword), clone4(node.fields), map(node.semicolon));
+
   FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter.full(clone4(node.documentationComment), clone5(node.metadata), map(node.keyword), clone4(node.type), map(node.thisToken), map(node.period), clone4(node.identifier), clone4(node.parameters));
+
   ForEachStatement visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable == null) {
@@ -15300,10 +16710,15 @@
     }
     return new ForEachStatement.con1_full(map(node.forKeyword), map(node.leftParenthesis), clone4(loopVariable), map(node.inKeyword), clone4(node.iterator), map(node.rightParenthesis), clone4(node.body));
   }
+
   FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList.full(map(node.leftParenthesis), clone5(node.parameters), map(node.leftDelimiter), map(node.rightDelimiter), map(node.rightParenthesis));
+
   ForStatement visitForStatement(ForStatement node) => new ForStatement.full(map(node.forKeyword), map(node.leftParenthesis), clone4(node.variables), clone4(node.initialization), map(node.leftSeparator), clone4(node.condition), map(node.rightSeparator), clone5(node.updaters), map(node.rightParenthesis), clone4(node.body));
+
   FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration.full(clone4(node.documentationComment), clone5(node.metadata), map(node.externalKeyword), clone4(node.returnType), map(node.propertyKeyword), clone4(node.name), clone4(node.functionExpression));
+
   FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement.full(clone4(node.functionDeclaration));
+
   FunctionExpression visitFunctionExpression(FunctionExpression node) {
     FunctionExpression copy = new FunctionExpression.full(clone4(node.parameters), clone4(node.body));
     copy.element = node.element;
@@ -15311,6 +16726,7 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     FunctionExpressionInvocation copy = new FunctionExpressionInvocation.full(clone4(node.function), clone4(node.argumentList));
     copy.propagatedElement = node.propagatedElement;
@@ -15319,12 +16735,19 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias.full(clone4(node.documentationComment), clone5(node.metadata), map(node.keyword), clone4(node.returnType), clone4(node.name), clone4(node.typeParameters), clone4(node.parameters), map(node.semicolon));
+
   FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter.full(clone4(node.documentationComment), clone5(node.metadata), clone4(node.returnType), clone4(node.identifier), clone4(node.parameters));
+
   HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator.full(map(node.keyword), clone5(node.hiddenNames));
+
   IfStatement visitIfStatement(IfStatement node) => new IfStatement.full(map(node.ifKeyword), map(node.leftParenthesis), clone4(node.condition), map(node.rightParenthesis), clone4(node.thenStatement), map(node.elseKeyword), clone4(node.elseStatement));
+
   ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause.full(map(node.keyword), clone5(node.interfaces));
+
   ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective.full(clone4(node.documentationComment), clone5(node.metadata), map(node.keyword), clone4(node.uri), map(node.asToken), clone4(node.prefix), clone5(node.combinators), map(node.semicolon));
+
   IndexExpression visitIndexExpression(IndexExpression node) {
     Token period = map(node.period);
     IndexExpression copy;
@@ -15340,6 +16763,7 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression copy = new InstanceCreationExpression.full(map(node.keyword), clone4(node.constructorName), clone4(node.argumentList));
     copy.propagatedType = node.propagatedType;
@@ -15347,79 +16771,100 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   IntegerLiteral visitIntegerLiteral(IntegerLiteral node) {
     IntegerLiteral copy = new IntegerLiteral.full(map(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression.full(map(node.leftBracket), clone4(node.expression), map(node.rightBracket));
+
   InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString.full(map(node.contents), node.value);
+
   IsExpression visitIsExpression(IsExpression node) {
     IsExpression copy = new IsExpression.full(clone4(node.expression), map(node.isOperator), map(node.notOperator), clone4(node.type));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   Label visitLabel(Label node) => new Label.full(clone4(node.label), map(node.colon));
+
   LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement.full(clone5(node.labels), clone4(node.statement));
+
   LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective.full(clone4(node.documentationComment), clone5(node.metadata), map(node.libraryToken), clone4(node.name), map(node.semicolon));
+
   LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) {
     LibraryIdentifier copy = new LibraryIdentifier.full(clone5(node.components));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ListLiteral visitListLiteral(ListLiteral node) {
     ListLiteral copy = new ListLiteral.full(map(node.constKeyword), clone4(node.typeArguments), map(node.leftBracket), clone5(node.elements), map(node.rightBracket));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   MapLiteral visitMapLiteral(MapLiteral node) {
     MapLiteral copy = new MapLiteral.full(map(node.constKeyword), clone4(node.typeArguments), map(node.leftBracket), clone5(node.entries), map(node.rightBracket));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry.full(clone4(node.key), map(node.separator), clone4(node.value));
+
   MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration.full(clone4(node.documentationComment), clone5(node.metadata), map(node.externalKeyword), map(node.modifierKeyword), clone4(node.returnType), map(node.propertyKeyword), map(node.operatorKeyword), clone4(node.name), clone4(node.parameters), clone4(node.body));
+
   MethodInvocation visitMethodInvocation(MethodInvocation node) {
     MethodInvocation copy = new MethodInvocation.full(clone4(node.target), map(node.period), clone4(node.methodName), clone4(node.argumentList));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   NamedExpression visitNamedExpression(NamedExpression node) {
     NamedExpression copy = new NamedExpression.full(clone4(node.name), clone4(node.expression));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ASTNode visitNativeClause(NativeClause node) => new NativeClause.full(map(node.keyword), clone4(node.name));
+
   NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody.full(map(node.nativeToken), clone4(node.stringLiteral), map(node.semicolon));
+
   NullLiteral visitNullLiteral(NullLiteral node) {
     NullLiteral copy = new NullLiteral.full(map(node.literal));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression copy = new ParenthesizedExpression.full(map(node.leftParenthesis), clone4(node.expression), map(node.rightParenthesis));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   PartDirective visitPartDirective(PartDirective node) {
     PartDirective copy = new PartDirective.full(clone4(node.documentationComment), clone5(node.metadata), map(node.partToken), clone4(node.uri), map(node.semicolon));
     copy.element = node.element;
     return copy;
   }
+
   PartOfDirective visitPartOfDirective(PartOfDirective node) {
     PartOfDirective copy = new PartOfDirective.full(clone4(node.documentationComment), clone5(node.metadata), map(node.partToken), map(node.ofToken), clone4(node.libraryName), map(node.semicolon));
     copy.element = node.element;
     return copy;
   }
+
   PostfixExpression visitPostfixExpression(PostfixExpression node) {
     PostfixExpression copy = new PostfixExpression.full(clone4(node.operand), map(node.operator));
     copy.propagatedElement = node.propagatedElement;
@@ -15428,12 +16873,14 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) {
     PrefixedIdentifier copy = new PrefixedIdentifier.full(clone4(node.prefix), map(node.period), clone4(node.identifier));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   PrefixExpression visitPrefixExpression(PrefixExpression node) {
     PrefixExpression copy = new PrefixExpression.full(map(node.operator), clone4(node.operand));
     copy.propagatedElement = node.propagatedElement;
@@ -15442,27 +16889,35 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   PropertyAccess visitPropertyAccess(PropertyAccess node) {
     PropertyAccess copy = new PropertyAccess.full(clone4(node.target), map(node.operator), clone4(node.propertyName));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation copy = new RedirectingConstructorInvocation.full(map(node.keyword), map(node.period), clone4(node.constructorName), clone4(node.argumentList));
     copy.staticElement = node.staticElement;
     return copy;
   }
+
   RethrowExpression visitRethrowExpression(RethrowExpression node) {
     RethrowExpression copy = new RethrowExpression.full(map(node.keyword));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement.full(map(node.keyword), clone4(node.expression), map(node.semicolon));
+
   ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag.full(map(node.scriptTag));
+
   ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator.full(map(node.keyword), clone5(node.shownNames));
+
   SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter.full(clone4(node.documentationComment), clone5(node.metadata), map(node.keyword), clone4(node.type), clone4(node.identifier));
+
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
     SimpleIdentifier copy = new SimpleIdentifier.full(map(node.token));
     copy.auxiliaryElements = node.auxiliaryElements;
@@ -15472,65 +16927,87 @@
     copy.staticType = node.staticType;
     return copy;
   }
+
   SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) {
     SimpleStringLiteral copy = new SimpleStringLiteral.full(map(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   StringInterpolation visitStringInterpolation(StringInterpolation node) {
     StringInterpolation copy = new StringInterpolation.full(clone5(node.elements));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SuperConstructorInvocation copy = new SuperConstructorInvocation.full(map(node.keyword), map(node.period), clone4(node.constructorName), clone4(node.argumentList));
     copy.staticElement = node.staticElement;
     return copy;
   }
+
   SuperExpression visitSuperExpression(SuperExpression node) {
     SuperExpression copy = new SuperExpression.full(map(node.keyword));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase.full(clone5(node.labels), map(node.keyword), clone4(node.expression), map(node.colon), clone5(node.statements));
+
   SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault.full(clone5(node.labels), map(node.keyword), map(node.colon), clone5(node.statements));
+
   SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement.full(map(node.keyword), map(node.leftParenthesis), clone4(node.expression), map(node.rightParenthesis), map(node.leftBracket), clone5(node.members), map(node.rightBracket));
+
   ASTNode visitSymbolLiteral(SymbolLiteral node) {
     SymbolLiteral copy = new SymbolLiteral.full(map(node.poundSign), map2(node.components));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ThisExpression visitThisExpression(ThisExpression node) {
     ThisExpression copy = new ThisExpression.full(map(node.keyword));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   ThrowExpression visitThrowExpression(ThrowExpression node) {
     ThrowExpression copy = new ThrowExpression.full(map(node.keyword), clone4(node.expression));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
+
   TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration.full(clone4(node.documentationComment), clone5(node.metadata), clone4(node.variables), map(node.semicolon));
+
   TryStatement visitTryStatement(TryStatement node) => new TryStatement.full(map(node.tryKeyword), clone4(node.body), clone5(node.catchClauses), map(node.finallyKeyword), clone4(node.finallyBlock));
+
   TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList.full(map(node.leftBracket), clone5(node.arguments), map(node.rightBracket));
+
   TypeName visitTypeName(TypeName node) {
     TypeName copy = new TypeName.full(clone4(node.name), clone4(node.typeArguments));
     copy.type = node.type;
     return copy;
   }
+
   TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter.full(clone4(node.documentationComment), clone5(node.metadata), clone4(node.name), map(node.keyword), clone4(node.bound));
+
   TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList.full(map(node.leftBracket), clone5(node.typeParameters), map(node.rightBracket));
+
   VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration.full(null, clone5(node.metadata), clone4(node.name), map(node.equals), clone4(node.initializer));
+
   VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList.full(null, clone5(node.metadata), map(node.keyword), clone4(node.type), clone5(node.variables));
+
   VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement.full(clone4(node.variables), map(node.semicolon));
+
   WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement.full(map(node.keyword), map(node.leftParenthesis), clone4(node.condition), map(node.rightParenthesis), clone4(node.body));
+
   WithClause visitWithClause(WithClause node) => new WithClause.full(map(node.withKeyword), clone5(node.mixinTypes));
+
   ASTNode clone4(ASTNode node) {
     if (node == null) {
       return null;
@@ -15540,6 +17017,7 @@
     }
     return node.accept(this) as ASTNode;
   }
+
   List clone5(NodeList nodes) {
     List clonedNodes = new List();
     for (ASTNode node in nodes) {
@@ -15547,12 +17025,14 @@
     }
     return clonedNodes;
   }
+
   Token map(Token oldToken) {
     if (oldToken == null) {
       return null;
     }
     return _tokenMap.get(oldToken);
   }
+
   List<Token> map2(List<Token> oldTokens) {
     List<Token> newTokens = new List<Token>(oldTokens.length);
     for (int index = 0; index < newTokens.length; index++) {
@@ -15561,6 +17041,7 @@
     return newTokens;
   }
 }
+
 /**
  * Traverse the AST from initial child node to successive parents, building a collection of local
  * variable and parameter names visible to the initial child node. In case of name shadowing, the
@@ -15573,22 +17054,30 @@
  */
 class ScopedNameFinder extends GeneralizingASTVisitor<Object> {
   Declaration declaration;
+
   ASTNode _immediateChild;
+
   final Map<String, SimpleIdentifier> locals = new Map<String, SimpleIdentifier>();
+
   int _position = 0;
+
   bool _referenceIsWithinLocalFunction = false;
+
   ScopedNameFinder(int position) {
     this._position = position;
   }
+
   Object visitBlock(Block node) {
     checkStatements(node.statements);
     return super.visitBlock(node);
   }
+
   Object visitCatchClause(CatchClause node) {
     addToScope(node.exceptionParameter);
     addToScope(node.stackTraceParameter);
     return super.visitCatchClause(node);
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     if (_immediateChild != node.parameters) {
       addParameters(node.parameters.parameters);
@@ -15596,10 +17085,12 @@
     declaration = node;
     return null;
   }
+
   Object visitFieldDeclaration(FieldDeclaration node) {
     declaration = node;
     return null;
   }
+
   Object visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable != null) {
@@ -15607,12 +17098,14 @@
     }
     return super.visitForEachStatement(node);
   }
+
   Object visitForStatement(ForStatement node) {
     if (_immediateChild != node.variables && node.variables != null) {
       addVariables(node.variables.variables);
     }
     return super.visitForStatement(node);
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     if (node.parent is! FunctionDeclarationStatement) {
       declaration = node;
@@ -15620,16 +17113,19 @@
     }
     return super.visitFunctionDeclaration(node);
   }
+
   Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     _referenceIsWithinLocalFunction = true;
     return super.visitFunctionDeclarationStatement(node);
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parameters != null && _immediateChild != node.parameters) {
       addParameters(node.parameters.parameters);
     }
     return super.visitFunctionExpression(node);
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     declaration = node;
     if (node.parameters == null) {
@@ -15640,6 +17136,7 @@
     }
     return null;
   }
+
   Object visitNode(ASTNode node) {
     _immediateChild = node;
     ASTNode parent = node.parent;
@@ -15648,23 +17145,28 @@
     }
     return null;
   }
+
   Object visitSwitchMember(SwitchMember node) {
     checkStatements(node.statements);
     return super.visitSwitchMember(node);
   }
+
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     declaration = node;
     return null;
   }
+
   Object visitTypeAlias(TypeAlias node) {
     declaration = node;
     return null;
   }
+
   void addParameters(NodeList<FormalParameter> vars) {
     for (FormalParameter var2 in vars) {
       addToScope(var2.identifier);
     }
   }
+
   void addToScope(SimpleIdentifier identifier) {
     if (identifier != null && isInRange(identifier)) {
       String name = identifier.name;
@@ -15673,6 +17175,7 @@
       }
     }
   }
+
   void addVariables(NodeList<VariableDeclaration> vars) {
     for (VariableDeclaration var2 in vars) {
       addToScope(var2.name);
@@ -15690,12 +17193,13 @@
         return;
       }
       if (stmt is VariableDeclarationStatement) {
-        addVariables(((stmt as VariableDeclarationStatement)).variables.variables);
+        addVariables((stmt as VariableDeclarationStatement).variables.variables);
       } else if (stmt is FunctionDeclarationStatement && !_referenceIsWithinLocalFunction) {
-        addToScope(((stmt as FunctionDeclarationStatement)).functionDeclaration.name);
+        addToScope((stmt as FunctionDeclarationStatement).functionDeclaration.name);
       }
     }
   }
+
   bool isInRange(ASTNode node) {
     if (_position < 0) {
       return true;
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 014d829..b616ffe 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -1,6 +1,8 @@
 // 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 engine.constant;
+
 import 'java_core.dart';
 import 'source.dart' show Source;
 import 'error.dart' show AnalysisError, ErrorCode, CompileTimeErrorCode;
@@ -8,6 +10,7 @@
 import 'ast.dart';
 import 'element.dart';
 import 'engine.dart' show AnalysisEngine;
+
 /**
  * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
@@ -48,7 +51,6 @@
  * those values.
  */
 class ConstantEvaluator {
-
   /**
    * The source containing the expression(s) that will be evaluated.
    */
@@ -62,25 +64,26 @@
   ConstantEvaluator(Source source) {
     this._source = source;
   }
+
   EvaluationResult evaluate(Expression expression) {
     EvaluationResultImpl result = expression.accept(new ConstantVisitor());
     if (result is ValidResult) {
-      return EvaluationResult.forValue(((result as ValidResult)).value);
+      return EvaluationResult.forValue((result as ValidResult).value);
     }
     List<AnalysisError> errors = new List<AnalysisError>();
-    for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
+    for (ErrorResult_ErrorData data in (result as ErrorResult).errorData) {
       ASTNode node = data.node;
       errors.add(new AnalysisError.con2(_source, node.offset, node.length, data.errorCode, []));
     }
     return EvaluationResult.forErrors(new List.from(errors));
   }
 }
+
 /**
  * Instances of the class `EvaluationResult` represent the result of attempting to evaluate an
  * expression.
  */
 class EvaluationResult {
-
   /**
    * Return an evaluation result representing the result of evaluating an expression that is not a
    * compile-time constant because of the given errors.
@@ -137,17 +140,18 @@
    */
   bool get isValid => _errors == null;
 }
+
 /**
  * Instances of the class `ConstantFinder` are used to traverse the AST structures of all of
  * the compilation units being resolved and build a table mapping constant variable elements to the
  * declarations of those variables.
  */
 class ConstantFinder extends RecursiveASTVisitor<Object> {
-
   /**
    * A table mapping constant variable elements to the declarations of those variables.
    */
   final Map<VariableElement, VariableDeclaration> variableMap = new Map<VariableElement, VariableDeclaration>();
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
@@ -160,6 +164,7 @@
     return null;
   }
 }
+
 /**
  * Instances of the class `ConstantValueComputer` compute the values of constant variables in
  * one or more compilation units. The expected usage pattern is for the compilation units to be
@@ -168,7 +173,6 @@
  * method [computeValues] will result in unpredictable behavior.
  */
 class ConstantValueComputer {
-
   /**
    * The object used to find constant variables in the compilation units that were added.
    */
@@ -237,10 +241,10 @@
       return;
     }
     EvaluationResultImpl result = declaration.initializer.accept(new ConstantVisitor());
-    ((variable as VariableElementImpl)).evaluationResult = result;
+    (variable as VariableElementImpl).evaluationResult = result;
     if (result is ErrorResult) {
       List<AnalysisError> errors = new List<AnalysisError>();
-      for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
+      for (ErrorResult_ErrorData data in (result as ErrorResult).errorData) {
         ASTNode node = data.node;
         Source source = variable.getAncestor(CompilationUnitElement).source;
         errors.add(new AnalysisError.con2(source, node.offset, node.length, data.errorCode, []));
@@ -259,6 +263,7 @@
   void generateCycleError(List<VariableElement> variablesInCycle, VariableElement variable) {
   }
 }
+
 /**
  * Instances of the class `ConstantVisitor` evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
@@ -304,12 +309,13 @@
     }
     return result;
   }
+
   EvaluationResultImpl visitBinaryExpression(BinaryExpression node) {
     EvaluationResultImpl leftResult = node.leftOperand.accept(this);
     EvaluationResultImpl rightResult = node.rightOperand.accept(this);
     TokenType operatorType = node.operator.type;
     if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) {
-      if (leftResult is ValidResult && ((leftResult as ValidResult)).isNull || rightResult is ValidResult && ((rightResult as ValidResult)).isNull) {
+      if (leftResult is ValidResult && (leftResult as ValidResult).isNull || rightResult is ValidResult && (rightResult as ValidResult).isNull) {
         return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
       }
     }
@@ -357,7 +363,9 @@
     }
     return error(node, null);
   }
+
   EvaluationResultImpl visitBooleanLiteral(BooleanLiteral node) => node.value ? ValidResult.RESULT_TRUE : ValidResult.RESULT_FALSE;
+
   EvaluationResultImpl visitConditionalExpression(ConditionalExpression node) {
     Expression condition = node.condition;
     EvaluationResultImpl conditionResult = condition.accept(this);
@@ -375,7 +383,9 @@
     }
     return (identical(conditionResult, ValidResult.RESULT_TRUE)) ? thenResult : elseResult;
   }
+
   EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => new ValidResult(node.value);
+
   EvaluationResultImpl visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (!node.isConst) {
       return error(node, null);
@@ -387,12 +397,16 @@
     }
     return error(node, null);
   }
+
   EvaluationResultImpl visitIntegerLiteral(IntegerLiteral node) => new ValidResult(node.value);
+
   EvaluationResultImpl visitInterpolationExpression(InterpolationExpression node) {
     EvaluationResultImpl result = node.expression.accept(this);
     return result.performToString(node);
   }
+
   EvaluationResultImpl visitInterpolationString(InterpolationString node) => new ValidResult(node.value);
+
   EvaluationResultImpl visitListLiteral(ListLiteral node) {
     if (node.constKeyword == null) {
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL);
@@ -406,6 +420,7 @@
     }
     return ValidResult.RESULT_OBJECT;
   }
+
   EvaluationResultImpl visitMapLiteral(MapLiteral node) {
     if (node.constKeyword == null) {
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL);
@@ -420,6 +435,7 @@
     }
     return ValidResult.RESULT_OBJECT;
   }
+
   EvaluationResultImpl visitMethodInvocation(MethodInvocation node) {
     Element element = node.methodName.staticElement;
     if (element is FunctionElement) {
@@ -429,7 +445,7 @@
         if (arguments.length == 2) {
           Element enclosingElement = function.enclosingElement;
           if (enclosingElement is CompilationUnitElement) {
-            LibraryElement library = ((enclosingElement as CompilationUnitElement)).library;
+            LibraryElement library = (enclosingElement as CompilationUnitElement).library;
             if (library.isDartCore) {
               EvaluationResultImpl leftArgument = arguments[0].accept(this);
               EvaluationResultImpl rightArgument = arguments[1].accept(this);
@@ -441,10 +457,15 @@
     }
     return error(node, null);
   }
+
   EvaluationResultImpl visitNamedExpression(NamedExpression node) => node.expression.accept(this);
+
   EvaluationResultImpl visitNode(ASTNode node) => error(node, null);
+
   EvaluationResultImpl visitNullLiteral(NullLiteral node) => ValidResult.RESULT_NULL;
+
   EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
+
   EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixNode = node.prefix;
     Element prefixElement = prefixNode.staticElement;
@@ -456,9 +477,10 @@
     }
     return getConstantValue(node, node.staticElement);
   }
+
   EvaluationResultImpl visitPrefixExpression(PrefixExpression node) {
     EvaluationResultImpl operand = node.operand.accept(this);
-    if (operand is ValidResult && ((operand as ValidResult)).isNull) {
+    if (operand is ValidResult && (operand as ValidResult).isNull) {
       return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
     }
     while (true) {
@@ -473,9 +495,13 @@
     }
     return error(node, null);
   }
+
   EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantValue(node, node.propertyName.staticElement);
+
   EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(node, node.staticElement);
+
   EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => new ValidResult(node.value);
+
   EvaluationResultImpl visitStringInterpolation(StringInterpolation node) {
     EvaluationResultImpl result = null;
     for (InterpolationElement element in node.elements) {
@@ -487,6 +513,7 @@
     }
     return result;
   }
+
   EvaluationResultImpl visitSymbolLiteral(SymbolLiteral node) => ValidResult.RESULT_SYMBOL;
 
   /**
@@ -507,7 +534,7 @@
    */
   EvaluationResultImpl getConstantValue(ASTNode node, Element element) {
     if (element is PropertyAccessorElement) {
-      element = ((element as PropertyAccessorElement)).variable;
+      element = (element as PropertyAccessorElement).variable;
     }
     if (element is VariableElementImpl) {
       VariableElementImpl variableElementImpl = element as VariableElementImpl;
@@ -516,10 +543,10 @@
         return value;
       }
     } else if (element is ExecutableElement) {
-      if (((element as ExecutableElement)).isStatic) {
+      if ((element as ExecutableElement).isStatic) {
         return new ValidResult(element);
       }
-    } else if (element is ClassElement) {
+    } else if (element is ClassElement || element is FunctionTypeAliasElement) {
       return ValidResult.RESULT_OBJECT;
     }
     return error(node, null);
@@ -545,6 +572,7 @@
     return leftResult;
   }
 }
+
 /**
  * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are
  * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
@@ -554,7 +582,6 @@
  * @param N the type of the nodes in the graph
  */
 class DirectedGraph<N> {
-
   /**
    * The table encoding the edges in the graph. An edge is represented by an entry mapping the head
    * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
@@ -703,12 +730,12 @@
     return null;
   }
 }
+
 /**
  * Instances of the class `ErrorResult` represent the result of evaluating an expression that
  * is not a valid compile time constant.
  */
 class ErrorResult extends EvaluationResultImpl {
-
   /**
    * The errors that prevent the expression from being a valid compile time constant.
    */
@@ -736,75 +763,141 @@
     errorData.addAll(firstResult.errorData);
     errorData.addAll(secondResult.errorData);
   }
+
   EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToError(node, this);
+
   EvaluationResultImpl applyBooleanConversion(ASTNode node) => this;
+
   EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndError(node, this);
+
   EvaluationResultImpl bitNot(Expression node) => this;
+
   EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrError(node, this);
+
   EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorError(node, this);
+
   EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateError(node, this);
+
   EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideError(node, this);
+
   EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualError(node, this);
+
   bool equalValues(EvaluationResultImpl result) => false;
+
   EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanError(node, this);
+
   EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualError(node, this);
+
   EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideError(node, this);
+
   EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanError(node, this);
+
   EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualError(node, this);
+
   EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndError(node, this);
+
   EvaluationResultImpl logicalNot(Expression node) => this;
+
   EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrError(node, this);
+
   EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusError(node, this);
+
   EvaluationResultImpl negated(Expression node) => this;
+
   EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualError(node, this);
+
   EvaluationResultImpl performToString(ASTNode node) => this;
+
   EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderError(node, this);
+
   EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftError(node, this);
+
   EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightError(node, this);
+
   EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesError(node, this);
+
   EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand) => this;
+
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand) => this;
 }
-class ErrorResult_ErrorData {
 
+class ErrorResult_ErrorData {
   /**
    * The node against which the error should be reported.
    */
@@ -827,6 +920,7 @@
     this.errorCode = errorCode;
   }
 }
+
 /**
  * Instances of the class `InternalResult` represent the result of attempting to evaluate a
  * expression.
@@ -841,77 +935,141 @@
    * @return the result of applying boolean conversion to the given value
    */
   EvaluationResultImpl applyBooleanConversion(ASTNode node);
+
   EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl bitNot(Expression node);
+
   EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand);
+
   bool equalValues(EvaluationResultImpl result);
+
   EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl logicalNot(Expression node);
+
   EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl negated(Expression node);
+
   EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl performToString(ASTNode node);
+
   EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand);
+
   EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand);
+
   EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand);
+
   EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand);
+
   EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand);
+
   EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand);
+
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand);
+
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand);
 }
+
 /**
  * Instances of the class `ReferenceFinder` add reference information for a given variable to
  * the bi-directional mapping used to order the evaluation of constants.
  */
 class ReferenceFinder extends RecursiveASTVisitor<Object> {
-
   /**
    * The element representing the variable whose initializer will be visited.
    */
@@ -935,10 +1093,11 @@
     this._source = source;
     this._referenceGraph = referenceGraph;
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     Element element = node.staticElement;
     if (element is PropertyAccessorElement) {
-      element = ((element as PropertyAccessorElement)).variable;
+      element = (element as PropertyAccessorElement).variable;
     }
     if (element is VariableElement) {
       VariableElement variable = element as VariableElement;
@@ -949,12 +1108,12 @@
     return null;
   }
 }
+
 /**
  * Instances of the class `ValidResult` represent the result of attempting to evaluate a valid
  * compile time constant expression.
  */
 class ValidResult extends EvaluationResultImpl {
-
   /**
    * A result object representing the value 'false'.
    */
@@ -1025,6 +1184,7 @@
   ValidResult(Object value) {
     this.value = value;
   }
+
   EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(node, this);
 
   /**
@@ -1034,7 +1194,9 @@
    * @return the result of applying boolean conversion to the given value
    */
   EvaluationResultImpl applyBooleanConversion(ASTNode node) => booleanConversion(node, value);
+
   EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndValid(node, this);
+
   EvaluationResultImpl bitNot(Expression node) {
     if (isSomeInt) {
       return RESULT_INT;
@@ -1042,22 +1204,35 @@
     if (value == null) {
       return error(node);
     } else if (value is int) {
-      return valueOf(~((value as int)));
+      return valueOf(~(value as int));
     }
     return error(node);
   }
+
   EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrValid(node, this);
+
   EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorValid(node, this);
+
   EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateValid(node, this);
+
   EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideValid(node, this);
+
   EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualValid(node, this);
+
   bool equalValues(EvaluationResultImpl result) => identical(equalEqual(null, result), RESULT_TRUE);
+
   EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanValid(node, this);
+
   EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualValid(node, this);
+
   EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(node, this);
+
   EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanValid(node, this);
+
   EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualValid(node, this);
+
   EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndValid(node, this);
+
   EvaluationResultImpl logicalNot(Expression node) {
     if (isSomeBool) {
       return RESULT_BOOL;
@@ -1065,12 +1240,15 @@
     if (value == null) {
       return RESULT_TRUE;
     } else if (value is bool) {
-      return ((value as bool)) ? RESULT_FALSE : RESULT_TRUE;
+      return (value as bool) ? RESULT_FALSE : RESULT_TRUE;
     }
     return error(node);
   }
+
   EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrValid(node, this);
+
   EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusValid(node, this);
+
   EvaluationResultImpl negated(Expression node) {
     if (isSomeNum) {
       return RESULT_INT;
@@ -1078,22 +1256,24 @@
     if (value == null) {
       return error(node);
     } else if (value is int) {
-      return valueOf(-((value as int)));
+      return valueOf(-(value as int));
     } else if (value is double) {
-      return valueOf3(-((value as double)));
+      return valueOf3(-(value as double));
     }
     return error(node);
   }
+
   EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualValid(node, this);
+
   EvaluationResultImpl performToString(ASTNode node) {
     if (value == null) {
       return valueOf4("null");
     } else if (value is bool) {
-      return valueOf4(((value as bool)).toString());
+      return valueOf4((value as bool).toString());
     } else if (value is int) {
-      return valueOf4(((value as int)).toString());
+      return valueOf4((value as int).toString());
     } else if (value is double) {
-      return valueOf4(((value as double)).toString());
+      return valueOf4((value as double).toString());
     } else if (value is String) {
       return this;
     } else if (isSomeBool) {
@@ -1105,17 +1285,24 @@
     }
     return error(node);
   }
+
   EvaluationResultImpl remainder(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderValid(node, this);
+
   EvaluationResultImpl shiftLeft(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftValid(node, this);
+
   EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightValid(node, this);
+
   EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesValid(node, this);
+
   String toString() {
     if (value == null) {
       return "null";
     }
     return value.toString();
   }
+
   EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1132,24 +1319,26 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf(((leftValue as int)) + (value as int));
+        return valueOf((leftValue as int) + (value as int));
       } else if (value is double) {
-        return valueOf3(((leftValue as int)).toDouble() + ((value as double)));
+        return valueOf3((leftValue as int).toDouble() + (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf3(((leftValue as double)) + ((value as int)).toDouble());
+        return valueOf3((leftValue as double) + (value as int).toDouble());
       } else if (value is double) {
-        return valueOf3(((leftValue as double)) + ((value as double)));
+        return valueOf3((leftValue as double) + (value as double));
       }
     } else if (leftValue is String) {
       if (value is String) {
-        return valueOf4("${((leftValue as String))}${((value as String))}");
+        return valueOf4("${(leftValue as String)}${(value as String)}");
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyInt || !leftOperand.isAnyInt) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1164,7 +1353,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf(((leftValue as int)) & (value as int));
+        return valueOf((leftValue as int) & (value as int));
       }
       return error(node.leftOperand);
     }
@@ -1173,7 +1362,9 @@
     }
     return union(error(node.leftOperand), error(node.rightOperand));
   }
+
   EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyInt || !leftOperand.isAnyInt) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1188,7 +1379,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf(((leftValue as int)) | (value as int));
+        return valueOf((leftValue as int) | (value as int));
       }
       return error(node.leftOperand);
     }
@@ -1197,7 +1388,9 @@
     }
     return union(error(node.leftOperand), error(node.rightOperand));
   }
+
   EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyInt || !leftOperand.isAnyInt) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1212,7 +1405,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf(((leftValue as int)) ^ (value as int));
+        return valueOf((leftValue as int) ^ (value as int));
       }
       return error(node.leftOperand);
     }
@@ -1221,15 +1414,19 @@
     }
     return union(error(node.leftOperand), error(node.rightOperand));
   }
+
   EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand) {
     Object leftValue = leftOperand.value;
     if (leftValue is String && value is String) {
-      return valueOf4("${((leftValue as String))}${((value as String))}");
+      return valueOf4("${(leftValue as String)}${(value as String)}");
     }
     return error(node);
   }
+
   EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1244,23 +1441,25 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        if (((value as int)) == 0) {
-          return valueOf3(((leftValue as int)).toDouble() / ((value as int)).toDouble());
+        if ((value as int) == 0) {
+          return valueOf3((leftValue as int).toDouble() / (value as int).toDouble());
         }
-        return valueOf(((leftValue as int)) ~/ (value as int));
+        return valueOf((leftValue as int) ~/ (value as int));
       } else if (value is double) {
-        return valueOf3(((leftValue as int)).toDouble() / ((value as double)));
+        return valueOf3((leftValue as int).toDouble() / (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf3(((leftValue as double)) / ((value as int)).toDouble());
+        return valueOf3((leftValue as double) / (value as int).toDouble());
       } else if (value is double) {
-        return valueOf3(((leftValue as double)) / ((value as double)));
+        return valueOf3((leftValue as double) / (value as double));
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) {
     if (node is BinaryExpression) {
       if (!isAnyNullBoolNumString || !leftOperand.isAnyNullBoolNumString) {
@@ -1270,35 +1469,29 @@
     Object leftValue = leftOperand.value;
     if (leftValue == null) {
       return valueOf2(value == null);
-    } else if (leftValue is bool) {
-      if (value is bool) {
-        return valueOf2(identical(leftValue as bool, value as bool));
-      }
-      return RESULT_FALSE;
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf2(((leftValue as int)) == value);
+        return valueOf2((leftValue as int) == value);
       } else if (value is double) {
         return valueOf2(toDouble(leftValue as int) == value);
       }
       return RESULT_FALSE;
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf2(((leftValue as double)) == toDouble(value as int));
+        return valueOf2((leftValue as double) == toDouble(value as int));
       } else if (value is double) {
-        return valueOf2(((leftValue as double)) == value);
+        return valueOf2((leftValue as double) == value);
       }
       return RESULT_FALSE;
-    } else if (leftValue is String) {
-      if (value is String) {
-        return valueOf2(((leftValue as String)) == value);
-      }
-      return RESULT_FALSE;
+    } else {
+      return valueOf2(leftValue == value);
     }
-    return RESULT_FALSE;
   }
+
   EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1313,19 +1506,20 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf2(((leftValue as int)).compareTo(value as int) >= 0);
+        return valueOf2((leftValue as int).compareTo(value as int) >= 0);
       } else if (value is double) {
-        return valueOf2(((leftValue as int)).toDouble() >= ((value as double)));
+        return valueOf2((leftValue as int).toDouble() >= (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf2(((leftValue as double)) >= ((value as int)).toDouble());
+        return valueOf2((leftValue as double) >= (value as int).toDouble());
       } else if (value is double) {
-        return valueOf2(((leftValue as double)) >= ((value as double)));
+        return valueOf2((leftValue as double) >= (value as double));
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1340,20 +1534,22 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf2(((leftValue as int)).compareTo(value as int) > 0);
+        return valueOf2((leftValue as int).compareTo(value as int) > 0);
       } else if (value is double) {
-        return valueOf2(((leftValue as int)).toDouble() > ((value as double)));
+        return valueOf2((leftValue as int).toDouble() > (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf2(((leftValue as double)) > ((value as int)).toDouble());
+        return valueOf2((leftValue as double) > (value as int).toDouble());
       } else if (value is double) {
-        return valueOf2(((leftValue as double)) > ((value as double)));
+        return valueOf2((leftValue as double) > (value as double));
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1368,27 +1564,30 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        if (((value as int)) == 0) {
+        if ((value as int) == 0) {
           return error2(node, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE);
         }
-        return valueOf(((leftValue as int)) ~/ (value as int));
+        return valueOf((leftValue as int) ~/ (value as int));
       } else if (value is double) {
-        double result = ((leftValue as int)).toDouble() / ((value as double));
+        double result = (leftValue as int).toDouble() / (value as double);
         return valueOf(result.toInt());
       }
     } else if (leftValue is double) {
       if (value is int) {
-        double result = ((leftValue as double)) / ((value as int)).toDouble();
+        double result = (leftValue as double) / (value as int).toDouble();
         return valueOf(result.toInt());
       } else if (value is double) {
-        double result = ((leftValue as double)) / ((value as double));
+        double result = (leftValue as double) / (value as double);
         return valueOf(result.toInt());
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1403,19 +1602,20 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf2(((leftValue as int)).compareTo(value as int) <= 0);
+        return valueOf2((leftValue as int).compareTo(value as int) <= 0);
       } else if (value is double) {
-        return valueOf2(((leftValue as int)).toDouble() <= ((value as double)));
+        return valueOf2((leftValue as int).toDouble() <= (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf2(((leftValue as double)) <= ((value as int)).toDouble());
+        return valueOf2((leftValue as double) <= (value as int).toDouble());
       } else if (value is double) {
-        return valueOf2(((leftValue as double)) <= ((value as double)));
+        return valueOf2((leftValue as double) <= (value as double));
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1430,20 +1630,22 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf2(((leftValue as int)).compareTo(value as int) < 0);
+        return valueOf2((leftValue as int).compareTo(value as int) < 0);
       } else if (value is double) {
-        return valueOf2(((leftValue as int)).toDouble() < ((value as double)));
+        return valueOf2((leftValue as int).toDouble() < (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf2(((leftValue as double)) < ((value as int)).toDouble());
+        return valueOf2((leftValue as double) < (value as int).toDouble());
       } else if (value is double) {
-        return valueOf2(((leftValue as double)) < ((value as double)));
+        return valueOf2((leftValue as double) < (value as double));
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyBool || !leftOperand.isAnyBool) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
@@ -1460,7 +1662,9 @@
     }
     return error(node);
   }
+
   EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyBool || !leftOperand.isAnyBool) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
@@ -1469,12 +1673,14 @@
       return RESULT_BOOL;
     }
     Object leftValue = leftOperand.value;
-    if (leftValue is bool && ((leftValue as bool))) {
+    if (leftValue is bool && (leftValue as bool)) {
       return RESULT_TRUE;
     }
     return booleanConversion(node.rightOperand, value);
   }
+
   EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1491,20 +1697,22 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf(((leftValue as int)) - (value as int));
+        return valueOf((leftValue as int) - (value as int));
       } else if (value is double) {
-        return valueOf3(((leftValue as int)).toDouble() - ((value as double)));
+        return valueOf3((leftValue as int).toDouble() - (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf3(((leftValue as double)) - ((value as int)).toDouble());
+        return valueOf3((leftValue as double) - (value as int).toDouble());
       } else if (value is double) {
-        return valueOf3(((leftValue as double)) - ((value as double)));
+        return valueOf3((leftValue as double) - (value as double));
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNullBoolNumString || !leftOperand.isAnyNullBoolNumString) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
@@ -1514,32 +1722,34 @@
       return valueOf2(value != null);
     } else if (leftValue is bool) {
       if (value is bool) {
-        return valueOf2(((leftValue as bool)) != ((value as bool)));
+        return valueOf2((leftValue as bool) != (value as bool));
       }
       return RESULT_TRUE;
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf2(((leftValue as int)) != value);
+        return valueOf2((leftValue as int) != value);
       } else if (value is double) {
         return valueOf2(toDouble(leftValue as int) != value);
       }
       return RESULT_TRUE;
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf2(((leftValue as double)) != toDouble(value as int));
+        return valueOf2((leftValue as double) != toDouble(value as int));
       } else if (value is double) {
-        return valueOf2(((leftValue as double)) != value);
+        return valueOf2((leftValue as double) != value);
       }
       return RESULT_TRUE;
     } else if (leftValue is String) {
       if (value is String) {
-        return valueOf2(((leftValue as String)) != value);
+        return valueOf2((leftValue as String) != value);
       }
       return RESULT_TRUE;
     }
     return RESULT_TRUE;
   }
+
   EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1556,23 +1766,25 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        if (((value as int)) == 0) {
-          return valueOf3(((leftValue as int)).toDouble() % ((value as int)).toDouble());
+        if ((value as int) == 0) {
+          return valueOf3((leftValue as int).toDouble() % (value as int).toDouble());
         }
-        return valueOf(((leftValue as int)).remainder(value as int));
+        return valueOf((leftValue as int).remainder(value as int));
       } else if (value is double) {
-        return valueOf3(((leftValue as int)).toDouble() % ((value as double)));
+        return valueOf3((leftValue as int).toDouble() % (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf3(((leftValue as double)) % ((value as int)).toDouble());
+        return valueOf3((leftValue as double) % (value as int).toDouble());
       } else if (value is double) {
-        return valueOf3(((leftValue as double)) % ((value as double)));
+        return valueOf3((leftValue as double) % (value as double));
       }
     }
     return error(node);
   }
+
   EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyInt || !leftOperand.isAnyInt) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1596,7 +1808,9 @@
     }
     return union(error(node.leftOperand), error(node.rightOperand));
   }
+
   EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyInt || !leftOperand.isAnyInt) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
@@ -1611,7 +1825,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf(((leftValue as int)) >> ((value as int)));
+        return valueOf((leftValue as int) >> (value as int));
       }
       return error(node.rightOperand);
     }
@@ -1620,7 +1834,9 @@
     }
     return union(error(node.leftOperand), error(node.rightOperand));
   }
+
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
   EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand) {
     if (!isAnyNum || !leftOperand.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
@@ -1637,19 +1853,20 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (value is int) {
-        return valueOf(((leftValue as int)) * (value as int));
+        return valueOf((leftValue as int) * (value as int));
       } else if (value is double) {
-        return valueOf3(((leftValue as int)).toDouble() * ((value as double)));
+        return valueOf3((leftValue as int).toDouble() * (value as double));
       }
     } else if (leftValue is double) {
       if (value is int) {
-        return valueOf3(((leftValue as double)) * ((value as int)).toDouble());
+        return valueOf3((leftValue as double) * (value as int).toDouble());
       } else if (value is double) {
-        return valueOf3(((leftValue as double)) * ((value as double)));
+        return valueOf3((leftValue as double) * (value as double));
       }
     }
     return error(node);
   }
+
   bool get isNull => identical(this, RESULT_NULL);
 
   /**
@@ -1669,6 +1886,7 @@
     }
     return error(node);
   }
+
   ErrorResult error(ASTNode node) => error2(node, CompileTimeErrorCode.INVALID_CONSTANT);
 
   /**
@@ -1714,6 +1932,7 @@
    * Checks if this result has type "num" (or "int"), exact value of which we don't know.
    */
   bool get isSomeNum => identical(this, RESULT_DYNAMIC) || identical(this, RESULT_INT) || identical(this, RESULT_NUM);
+
   double toDouble(int value) => value.toDouble();
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 4aa51c0..ce01e2f 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -1,6 +1,8 @@
 // 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 engine.element;
+
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -13,13 +15,13 @@
 import 'engine.dart' show AnalysisContext;
 import 'constant.dart' show EvaluationResultImpl;
 import 'utilities_dart.dart';
+
 /**
  * The interface `ClassElement` defines the behavior of elements that represent a class.
  *
  * @coverage dart.engine.element
  */
 abstract class ClassElement implements Element {
-
   /**
    * Return an array containing all of the accessors (getters and setters) declared in this class.
    *
@@ -263,12 +265,12 @@
    */
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library);
 }
+
 /**
  * The interface `ClassMemberElement` defines the behavior of elements that are contained
  * within a [ClassElement].
  */
 abstract class ClassMemberElement implements Element {
-
   /**
    * Return the type in which this member is defined.
    *
@@ -284,6 +286,7 @@
    */
   bool get isStatic;
 }
+
 /**
  * The interface `CompilationUnitElement` defines the behavior of elements representing a
  * compilation unit.
@@ -291,7 +294,6 @@
  * @coverage dart.engine.element
  */
 abstract class CompilationUnitElement implements Element, UriReferencedElement {
-
   /**
    * Return an array containing all of the top-level accessors (getters and setters) contained in
    * this compilation unit.
@@ -344,6 +346,7 @@
    */
   List<ClassElement> get types;
 }
+
 /**
  * The interface `ConstructorElement` defines the behavior of elements representing a
  * constructor or a factory method defined within a type.
@@ -351,7 +354,6 @@
  * @coverage dart.engine.element
  */
 abstract class ConstructorElement implements ClassMemberElement, ExecutableElement {
-
   /**
    * Return the constructor to which this constructor is redirecting.
    *
@@ -381,6 +383,7 @@
    */
   bool get isFactory;
 }
+
 /**
  * The interface `Element` defines the behavior common to all of the elements in the element
  * model. Generally speaking, the element model is a semantic model of the program that represents
@@ -404,7 +407,6 @@
  * @coverage dart.engine.element
  */
 abstract class Element {
-
   /**
    * A comparator that can be used to sort elements by their name offset. Elements with a smaller
    * offset will be sorted to be before elements with a larger name offset.
@@ -533,6 +535,14 @@
   bool isAccessibleIn(LibraryElement library);
 
   /**
+   * Return `true` if this element has an annotation of the form '@deprecated' or
+   * '@Deprecated('..')'.
+   *
+   * @return `true` if this element is deprecated
+   */
+  bool get isDeprecated;
+
+  /**
    * Return `true` if this element is synthetic. A synthetic element is an element that is not
    * represented in the source code explicitly, but is implied by the source code, such as the
    * default constructor for a class that does not explicitly define any constructors.
@@ -549,6 +559,7 @@
    */
   void visitChildren(ElementVisitor visitor);
 }
+
 /**
  * The interface `ElementAnnotation` defines the behavior of objects representing a single
  * annotation associated with an element.
@@ -556,7 +567,6 @@
  * @coverage dart.engine.element
  */
 abstract class ElementAnnotation {
-
   /**
    * Return the element representing the field, variable, or const constructor being used as an
    * annotation.
@@ -565,6 +575,7 @@
    */
   Element get element;
 }
+
 /**
  * The enumeration `ElementKind` defines the various kinds of elements in the element model.
  *
@@ -572,30 +583,55 @@
  */
 class ElementKind extends Enum<ElementKind> {
   static final ElementKind CLASS = new ElementKind('CLASS', 0, "class");
+
   static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT', 1, "compilation unit");
+
   static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 2, "constructor");
+
   static final ElementKind DYNAMIC = new ElementKind('DYNAMIC', 3, "<dynamic>");
+
   static final ElementKind EMBEDDED_HTML_SCRIPT = new ElementKind('EMBEDDED_HTML_SCRIPT', 4, "embedded html script");
+
   static final ElementKind ERROR = new ElementKind('ERROR', 5, "<error>");
+
   static final ElementKind EXPORT = new ElementKind('EXPORT', 6, "export directive");
+
   static final ElementKind EXTERNAL_HTML_SCRIPT = new ElementKind('EXTERNAL_HTML_SCRIPT', 7, "external html script");
+
   static final ElementKind FIELD = new ElementKind('FIELD', 8, "field");
+
   static final ElementKind FUNCTION = new ElementKind('FUNCTION', 9, "function");
+
   static final ElementKind GETTER = new ElementKind('GETTER', 10, "getter");
+
   static final ElementKind HTML = new ElementKind('HTML', 11, "html");
+
   static final ElementKind IMPORT = new ElementKind('IMPORT', 12, "import directive");
+
   static final ElementKind LABEL = new ElementKind('LABEL', 13, "label");
+
   static final ElementKind LIBRARY = new ElementKind('LIBRARY', 14, "library");
+
   static final ElementKind LOCAL_VARIABLE = new ElementKind('LOCAL_VARIABLE', 15, "local variable");
+
   static final ElementKind METHOD = new ElementKind('METHOD', 16, "method");
+
   static final ElementKind NAME = new ElementKind('NAME', 17, "<name>");
+
   static final ElementKind PARAMETER = new ElementKind('PARAMETER', 18, "parameter");
+
   static final ElementKind PREFIX = new ElementKind('PREFIX', 19, "import prefix");
+
   static final ElementKind SETTER = new ElementKind('SETTER', 20, "setter");
+
   static final ElementKind TOP_LEVEL_VARIABLE = new ElementKind('TOP_LEVEL_VARIABLE', 21, "top level variable");
+
   static final ElementKind FUNCTION_TYPE_ALIAS = new ElementKind('FUNCTION_TYPE_ALIAS', 22, "function type alias");
+
   static final ElementKind TYPE_PARAMETER = new ElementKind('TYPE_PARAMETER', 23, "type parameter");
+
   static final ElementKind UNIVERSE = new ElementKind('UNIVERSE', 24, "<universe>");
+
   static final List<ElementKind> values = [
       CLASS,
       COMPILATION_UNIT,
@@ -651,6 +687,7 @@
     this.displayName = displayName;
   }
 }
+
 /**
  * The interface `ElementLocation` defines the behavior of objects that represent the location
  * of an element within the element model.
@@ -658,7 +695,6 @@
  * @coverage dart.engine.element
  */
 abstract class ElementLocation {
-
   /**
    * Return an encoded representation of this location that can be used to create a location that is
    * equal to this location.
@@ -667,6 +703,7 @@
    */
   String get encoding;
 }
+
 /**
  * The interface `ElementVisitor` defines the behavior of objects that can be used to visit an
  * element structure.
@@ -675,28 +712,50 @@
  */
 abstract class ElementVisitor<R> {
   R visitClassElement(ClassElement element);
+
   R visitCompilationUnitElement(CompilationUnitElement element);
+
   R visitConstructorElement(ConstructorElement element);
+
   R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element);
+
   R visitExportElement(ExportElement element);
+
   R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element);
+
   R visitFieldElement(FieldElement element);
+
   R visitFieldFormalParameterElement(FieldFormalParameterElement element);
+
   R visitFunctionElement(FunctionElement element);
+
   R visitFunctionTypeAliasElement(FunctionTypeAliasElement element);
+
   R visitHtmlElement(HtmlElement element);
+
   R visitImportElement(ImportElement element);
+
   R visitLabelElement(LabelElement element);
+
   R visitLibraryElement(LibraryElement element);
+
   R visitLocalVariableElement(LocalVariableElement element);
+
   R visitMethodElement(MethodElement element);
+
   R visitMultiplyDefinedElement(MultiplyDefinedElement element);
+
   R visitParameterElement(ParameterElement element);
+
   R visitPrefixElement(PrefixElement element);
+
   R visitPropertyAccessorElement(PropertyAccessorElement element);
+
   R visitTopLevelVariableElement(TopLevelVariableElement element);
+
   R visitTypeParameterElement(TypeParameterElement element);
 }
+
 /**
  * The interface `EmbeddedHtmlScriptElement` defines the behavior of elements representing a
  * script tag in an HTML file having content that defines a Dart library.
@@ -704,7 +763,6 @@
  * @coverage dart.engine.element
  */
 abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement {
-
   /**
    * Return the library element defined by the content of the script tag.
    *
@@ -712,6 +770,7 @@
    */
   LibraryElement get scriptLibrary;
 }
+
 /**
  * The interface `ExecutableElement` defines the behavior of elements representing an
  * executable object, including functions, methods, constructors, getters, and setters.
@@ -719,7 +778,6 @@
  * @coverage dart.engine.element
  */
 abstract class ExecutableElement implements Element {
-
   /**
    * Return an array containing all of the functions defined within this executable element.
    *
@@ -779,6 +837,7 @@
    */
   bool get isStatic;
 }
+
 /**
  * The interface `ExportElement` defines the behavior of objects representing information
  * about a single export directive within a library.
@@ -786,7 +845,6 @@
  * @coverage dart.engine.element
  */
 abstract class ExportElement implements Element, UriReferencedElement {
-
   /**
    * An empty array of export elements.
    */
@@ -807,6 +865,7 @@
    */
   LibraryElement get exportedLibrary;
 }
+
 /**
  * The interface `ExternalHtmlScriptElement` defines the behavior of elements representing a
  * script tag in an HTML file having a `source` attribute that references a Dart library
@@ -815,7 +874,6 @@
  * @coverage dart.engine.element
  */
 abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
-
   /**
    * Return the source referenced by this element, or `null` if this element does not
    * reference a Dart library source file.
@@ -824,6 +882,7 @@
    */
   Source get scriptSource;
 }
+
 /**
  * The interface `FieldElement` defines the behavior of elements representing a field defined
  * within a type.
@@ -832,12 +891,12 @@
  */
 abstract class FieldElement implements ClassMemberElement, PropertyInducingElement {
 }
+
 /**
  * The interface `FieldFormalParameterElement` defines the behavior of elements representing a
  * field formal parameter defined within a constructor element.
  */
 abstract class FieldFormalParameterElement implements ParameterElement {
-
   /**
    * Return the field element associated with this field formal parameter, or `null` if the
    * parameter references a field that doesn't exist.
@@ -846,6 +905,7 @@
    */
   FieldElement get field;
 }
+
 /**
  * The interface `FunctionElement` defines the behavior of elements representing a function.
  *
@@ -853,6 +913,7 @@
  */
 abstract class FunctionElement implements ExecutableElement, LocalElement {
 }
+
 /**
  * The interface `FunctionTypeAliasElement` defines the behavior of elements representing a
  * function type alias (`typedef`).
@@ -860,7 +921,6 @@
  * @coverage dart.engine.element
  */
 abstract class FunctionTypeAliasElement implements Element {
-
   /**
    * Return the compilation unit in which this type alias is defined.
    *
@@ -896,6 +956,7 @@
    */
   List<TypeParameterElement> get typeParameters;
 }
+
 /**
  * The interface `HideElementCombinator` defines the behavior of combinators that cause some
  * of the names in a namespace to be hidden when being imported.
@@ -903,7 +964,6 @@
  * @coverage dart.engine.element
  */
 abstract class HideElementCombinator implements NamespaceCombinator {
-
   /**
    * Return an array containing the names that are not to be made visible in the importing library
    * even if they are defined in the imported library.
@@ -912,13 +972,13 @@
    */
   List<String> get hiddenNames;
 }
+
 /**
  * The interface `HtmlElement` defines the behavior of elements representing an HTML file.
  *
  * @coverage dart.engine.element
  */
 abstract class HtmlElement implements Element {
-
   /**
    * Return an array containing all of the script elements contained in the HTML file. This includes
    * scripts with libraries that are defined by the content of a script tag as well as libraries
@@ -928,6 +988,7 @@
    */
   List<HtmlScriptElement> get scripts;
 }
+
 /**
  * The interface `HtmlScriptElement` defines the behavior of elements representing a script
  * tag in an HTML file.
@@ -938,6 +999,7 @@
  */
 abstract class HtmlScriptElement implements Element {
 }
+
 /**
  * The interface `ImportElement` defines the behavior of objects representing information
  * about a single import directive within a library.
@@ -945,7 +1007,6 @@
  * @coverage dart.engine.element
  */
 abstract class ImportElement implements Element, UriReferencedElement {
-
   /**
    * An empty array of import elements.
    */
@@ -991,6 +1052,7 @@
    */
   int get uriEnd;
 }
+
 /**
  * The interface `LabelElement` defines the behavior of elements representing a label
  * associated with a statement.
@@ -998,7 +1060,6 @@
  * @coverage dart.engine.element
  */
 abstract class LabelElement implements Element {
-
   /**
    * Return the executable element in which this label is defined.
    *
@@ -1006,13 +1067,13 @@
    */
   ExecutableElement get enclosingElement;
 }
+
 /**
  * The interface `LibraryElement` defines the behavior of elements representing a library.
  *
  * @coverage dart.engine.element
  */
 abstract class LibraryElement implements Element {
-
   /**
    * Return the compilation unit that defines this library.
    *
@@ -1115,6 +1176,7 @@
    */
   bool isUpToDate2(int timeStamp);
 }
+
 /**
  * The interface `LocalElement` defines the behavior of elements that can be (but are not
  * required to be) defined within a method or function (an [ExecutableElement]).
@@ -1122,7 +1184,6 @@
  * @coverage dart.engine.element
  */
 abstract class LocalElement implements Element {
-
   /**
    * Return a source range that covers the approximate portion of the source in which the name of
    * this element is visible, or `null` if there is no single range of characters within which
@@ -1142,6 +1203,7 @@
    */
   SourceRange get visibleRange;
 }
+
 /**
  * The interface `LocalVariableElement` defines the behavior common to elements that represent
  * a local variable.
@@ -1150,6 +1212,7 @@
  */
 abstract class LocalVariableElement implements LocalElement, VariableElement {
 }
+
 /**
  * The interface `MethodElement` defines the behavior of elements that represent a method
  * defined within a type.
@@ -1157,7 +1220,6 @@
  * @coverage dart.engine.element
  */
 abstract class MethodElement implements ClassMemberElement, ExecutableElement {
-
   /**
    * Return `true` if this method is abstract. Methods are abstract if they are not external
    * and have no body.
@@ -1166,6 +1228,7 @@
    */
   bool get isAbstract;
 }
+
 /**
  * The interface `MultiplyDefinedElement` defines the behavior of pseudo-elements that
  * represent multiple elements defined within a single scope that have the same name. This situation
@@ -1176,7 +1239,6 @@
  * @coverage dart.engine.element
  */
 abstract class MultiplyDefinedElement implements Element {
-
   /**
    * Return an array containing all of the elements that were defined within the scope to have the
    * same name.
@@ -1192,6 +1254,7 @@
    */
   Type2 get type;
 }
+
 /**
  * The interface `NamespaceCombinator` defines the behavior common to objects that control how
  * namespaces are combined.
@@ -1199,12 +1262,12 @@
  * @coverage dart.engine.element
  */
 abstract class NamespaceCombinator {
-
   /**
    * An empty array of namespace combinators.
    */
   static final List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0);
 }
+
 /**
  * The interface `ParameterElement` defines the behavior of elements representing a parameter
  * defined within an executable element.
@@ -1212,7 +1275,6 @@
  * @coverage dart.engine.element
  */
 abstract class ParameterElement implements LocalElement, VariableElement {
-
   /**
    * Return a source range that covers the portion of the source in which the default value for this
    * parameter is specified, or `null` if there is no default value.
@@ -1243,6 +1305,7 @@
    */
   bool get isInitializingFormal;
 }
+
 /**
  * The interface `PrefixElement` defines the behavior common to elements that represent a
  * prefix used to import one or more libraries into another library.
@@ -1250,7 +1313,6 @@
  * @coverage dart.engine.element
  */
 abstract class PrefixElement implements Element {
-
   /**
    * Return the library into which other libraries are imported using this prefix.
    *
@@ -1265,6 +1327,7 @@
    */
   List<LibraryElement> get importedLibraries;
 }
+
 /**
  * The interface `PropertyAccessorElement` defines the behavior of elements representing a
  * getter or a setter. Note that explicitly defined property accessors implicitly define a synthetic
@@ -1283,7 +1346,6 @@
  * @coverage dart.engine.element
  */
 abstract class PropertyAccessorElement implements ExecutableElement {
-
   /**
    * Return the accessor representing the getter that corresponds to (has the same name as) this
    * setter, or `null` if this accessor is not a setter or if there is no corresponding
@@ -1332,6 +1394,7 @@
    */
   bool get isSetter;
 }
+
 /**
  * The interface `PropertyInducingElement` defines the behavior of elements representing a
  * variable that has an associated getter and possibly a setter. Note that explicitly defined
@@ -1351,7 +1414,6 @@
  * @coverage dart.engine.element
  */
 abstract class PropertyInducingElement implements VariableElement {
-
   /**
    * Return the getter associated with this variable. If this variable was explicitly defined (is
    * not synthetic) then the getter associated with it will be synthetic.
@@ -1379,6 +1441,7 @@
    */
   bool get isStatic;
 }
+
 /**
  * The interface `ShowElementCombinator` defines the behavior of combinators that cause some
  * of the names in a namespace to be visible (and the rest hidden) when being imported.
@@ -1386,7 +1449,6 @@
  * @coverage dart.engine.element
  */
 abstract class ShowElementCombinator implements NamespaceCombinator {
-
   /**
    * Return the offset of the character immediately following the last character of this node.
    *
@@ -1409,6 +1471,7 @@
    */
   List<String> get shownNames;
 }
+
 /**
  * The interface `TopLevelVariableElement` defines the behavior of elements representing a
  * top-level variable.
@@ -1417,6 +1480,7 @@
  */
 abstract class TopLevelVariableElement implements PropertyInducingElement {
 }
+
 /**
  * The interface `TypeParameterElement` defines the behavior of elements representing a type
  * parameter.
@@ -1424,7 +1488,6 @@
  * @coverage dart.engine.element
  */
 abstract class TypeParameterElement implements Element {
-
   /**
    * Return the type representing the bound associated with this parameter, or `null` if this
    * parameter does not have an explicit bound.
@@ -1440,6 +1503,7 @@
    */
   TypeParameterType get type;
 }
+
 /**
  * The interface `UndefinedElement` defines the behavior of pseudo-elements that represent
  * names that are undefined. This situation is not allowed by the language, so objects implementing
@@ -1450,6 +1514,7 @@
  */
 abstract class UndefinedElement implements Element {
 }
+
 /**
  * The interface `UriReferencedElement` defines the behavior of objects included into a
  * library using some URI.
@@ -1457,7 +1522,6 @@
  * @coverage dart.engine.element
  */
 abstract class UriReferencedElement implements Element {
-
   /**
    * Return the URI that is used to include this element into the enclosing library, or `null`
    * if this is the defining compilation unit of a library.
@@ -1466,6 +1530,7 @@
    */
   String get uri;
 }
+
 /**
  * The interface `VariableElement` defines the behavior common to elements that represent a
  * variable.
@@ -1473,7 +1538,6 @@
  * @coverage dart.engine.element
  */
 abstract class VariableElement implements Element {
-
   /**
    * Return a synthetic function representing this variable's initializer, or `null` if this
    * variable does not have an initializer. The function will have no parameters. The return type of
@@ -1507,6 +1571,7 @@
    */
   bool get isFinal;
 }
+
 /**
  * Instances of the class `GeneralizingElementVisitor` implement an element visitor that will
  * recursively visit all of the elements in an element model (like instances of the class
@@ -1566,25 +1631,42 @@
  */
 class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
   R visitClassElement(ClassElement element) => visitElement(element);
+
   R visitCompilationUnitElement(CompilationUnitElement element) => visitElement(element);
+
   R visitConstructorElement(ConstructorElement element) => visitExecutableElement(element);
+
   R visitElement(Element element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => visitHtmlScriptElement(element);
+
   R visitExecutableElement(ExecutableElement element) => visitElement(element);
+
   R visitExportElement(ExportElement element) => visitElement(element);
+
   R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => visitHtmlScriptElement(element);
+
   R visitFieldElement(FieldElement element) => visitPropertyInducingElement(element);
+
   R visitFieldFormalParameterElement(FieldFormalParameterElement element) => visitParameterElement(element);
+
   R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
+
   R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => visitElement(element);
+
   R visitHtmlElement(HtmlElement element) => visitElement(element);
+
   R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element);
+
   R visitImportElement(ImportElement element) => visitElement(element);
+
   R visitLabelElement(LabelElement element) => visitElement(element);
+
   R visitLibraryElement(LibraryElement element) => visitElement(element);
+
   R visitLocalElement(LocalElement element) {
     if (element is LocalVariableElement) {
       return visitVariableElement(element as LocalVariableElement);
@@ -1595,17 +1677,28 @@
     }
     return null;
   }
+
   R visitLocalVariableElement(LocalVariableElement element) => visitLocalElement(element);
+
   R visitMethodElement(MethodElement element) => visitExecutableElement(element);
+
   R visitMultiplyDefinedElement(MultiplyDefinedElement element) => visitElement(element);
+
   R visitParameterElement(ParameterElement element) => visitLocalElement(element);
+
   R visitPrefixElement(PrefixElement element) => visitElement(element);
+
   R visitPropertyAccessorElement(PropertyAccessorElement element) => visitExecutableElement(element);
+
   R visitPropertyInducingElement(PropertyInducingElement element) => visitVariableElement(element);
+
   R visitTopLevelVariableElement(TopLevelVariableElement element) => visitPropertyInducingElement(element);
+
   R visitTypeParameterElement(TypeParameterElement element) => visitElement(element);
+
   R visitVariableElement(VariableElement element) => visitElement(element);
 }
+
 /**
  * Instances of the class `RecursiveElementVisitor` implement an element visitor that will
  * recursively visit all of the element in an element model. For example, using an instance of this
@@ -1623,91 +1716,113 @@
     element.visitChildren(this);
     return null;
   }
+
   R visitCompilationUnitElement(CompilationUnitElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitConstructorElement(ConstructorElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitExportElement(ExportElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitFieldElement(FieldElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitFieldFormalParameterElement(FieldFormalParameterElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitFunctionElement(FunctionElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitHtmlElement(HtmlElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitImportElement(ImportElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitLabelElement(LabelElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitLibraryElement(LibraryElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitLocalVariableElement(LocalVariableElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitMethodElement(MethodElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitParameterElement(ParameterElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitPrefixElement(PrefixElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitPropertyAccessorElement(PropertyAccessorElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitTopLevelVariableElement(TopLevelVariableElement element) {
     element.visitChildren(this);
     return null;
   }
+
   R visitTypeParameterElement(TypeParameterElement element) {
     element.visitChildren(this);
     return null;
   }
 }
+
 /**
  * Instances of the class `SimpleElementVisitor` implement an element visitor that will do
  * nothing when visiting an element. It is intended to be a superclass for classes that use the
@@ -1718,28 +1833,50 @@
  */
 class SimpleElementVisitor<R> implements ElementVisitor<R> {
   R visitClassElement(ClassElement element) => null;
+
   R visitCompilationUnitElement(CompilationUnitElement element) => null;
+
   R visitConstructorElement(ConstructorElement element) => null;
+
   R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null;
+
   R visitExportElement(ExportElement element) => null;
+
   R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null;
+
   R visitFieldElement(FieldElement element) => null;
+
   R visitFieldFormalParameterElement(FieldFormalParameterElement element) => null;
+
   R visitFunctionElement(FunctionElement element) => null;
+
   R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null;
+
   R visitHtmlElement(HtmlElement element) => null;
+
   R visitImportElement(ImportElement element) => null;
+
   R visitLabelElement(LabelElement element) => null;
+
   R visitLibraryElement(LibraryElement element) => null;
+
   R visitLocalVariableElement(LocalVariableElement element) => null;
+
   R visitMethodElement(MethodElement element) => null;
+
   R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
+
   R visitParameterElement(ParameterElement element) => null;
+
   R visitPrefixElement(PrefixElement element) => null;
+
   R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
+
   R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
+
   R visitTypeParameterElement(TypeParameterElement element) => null;
 }
+
 /**
  * For AST nodes that could be in both the getter and setter contexts ([IndexExpression]s and
  * [SimpleIdentifier]s), the additional resolved elements are stored in the AST node, in an
@@ -1748,7 +1885,6 @@
  * [ExecutableElement]s, not just a single [ExecutableElement].
  */
 class AuxiliaryElements {
-
   /**
    * The element based on propagated type information, or `null` if the AST structure has not
    * been resolved or if this identifier could not be resolved.
@@ -1772,13 +1908,13 @@
     this.propagatedElement = propagatedElement;
   }
 }
+
 /**
  * Instances of the class `ClassElementImpl` implement a `ClassElement`.
  *
  * @coverage dart.engine.element
  */
 class ClassElementImpl extends ElementImpl implements ClassElement {
-
   /**
    * An array containing all of the accessors (getters and setters) contained in this class.
    */
@@ -1836,41 +1972,46 @@
    * @param name the name of this element
    */
   ClassElementImpl(Identifier name) : super.con1(name);
+
   accept(ElementVisitor visitor) => visitor.visitClassElement(this);
+
   List<PropertyAccessorElement> get accessors => _accessors;
+
   List<InterfaceType> get allSupertypes {
     List<InterfaceType> list = new List<InterfaceType>();
     collectAllSupertypes(list);
     return new List.from(list);
   }
+
   ElementImpl getChild(String identifier) {
     for (PropertyAccessorElement accessor in _accessors) {
-      if (((accessor as PropertyAccessorElementImpl)).identifier == identifier) {
+      if ((accessor as PropertyAccessorElementImpl).identifier == identifier) {
         return accessor as PropertyAccessorElementImpl;
       }
     }
     for (ConstructorElement constructor in _constructors) {
-      if (((constructor as ConstructorElementImpl)).identifier == identifier) {
+      if ((constructor as ConstructorElementImpl).identifier == identifier) {
         return constructor as ConstructorElementImpl;
       }
     }
     for (FieldElement field in _fields) {
-      if (((field as FieldElementImpl)).identifier == identifier) {
+      if ((field as FieldElementImpl).identifier == identifier) {
         return field as FieldElementImpl;
       }
     }
     for (MethodElement method in _methods) {
-      if (((method as MethodElementImpl)).identifier == identifier) {
+      if ((method as MethodElementImpl).identifier == identifier) {
         return method as MethodElementImpl;
       }
     }
     for (TypeParameterElement typeParameter in _typeParameters) {
-      if (((typeParameter as TypeParameterElementImpl)).identifier == identifier) {
+      if ((typeParameter as TypeParameterElementImpl).identifier == identifier) {
         return typeParameter as TypeParameterElementImpl;
       }
     }
     return null;
   }
+
   List<ConstructorElement> get constructors => _constructors;
 
   /**
@@ -1888,7 +2029,9 @@
     }
     return null;
   }
+
   List<FieldElement> get fields => _fields;
+
   PropertyAccessorElement getGetter(String getterName) {
     for (PropertyAccessorElement accessor in _accessors) {
       if (accessor.isGetter && accessor.name == getterName) {
@@ -1897,8 +2040,11 @@
     }
     return null;
   }
+
   List<InterfaceType> get interfaces => _interfaces;
+
   ElementKind get kind => ElementKind.CLASS;
+
   MethodElement getMethod(String methodName) {
     for (MethodElement method in _methods) {
       if (method.name == methodName) {
@@ -1907,8 +2053,11 @@
     }
     return null;
   }
+
   List<MethodElement> get methods => _methods;
+
   List<InterfaceType> get mixins => _mixins;
+
   ConstructorElement getNamedConstructor(String name) {
     for (ConstructorElement element in constructors) {
       String elementName = element.name;
@@ -1918,6 +2067,7 @@
     }
     return null;
   }
+
   PropertyAccessorElement getSetter(String setterName) {
     if (!setterName.endsWith("=")) {
       setterName += '=';
@@ -1929,9 +2079,13 @@
     }
     return null;
   }
+
   InterfaceType get supertype => _supertype;
+
   InterfaceType get type => _type;
+
   List<TypeParameterElement> get typeParameters => _typeParameters;
+
   ConstructorElement get unnamedConstructor {
     for (ConstructorElement element in constructors) {
       String name = element.displayName;
@@ -1941,6 +2095,7 @@
     }
     return null;
   }
+
   bool hasNonFinalField() {
     List<ClassElement> classesToVisit = new List<ClassElement>();
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
@@ -1968,10 +2123,15 @@
     }
     return false;
   }
+
   bool hasReferenceToSuper() => hasModifier(Modifier.REFERENCES_SUPER);
+
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
+
   bool get isTypedef => hasModifier(Modifier.TYPEDEF);
+
   bool get isValidMixin => hasModifier(Modifier.MIXIN);
+
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -1998,6 +2158,7 @@
     }
     return null;
   }
+
   MethodElement lookUpMethod(String methodName, LibraryElement library) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -2024,6 +2185,7 @@
     }
     return null;
   }
+
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -2067,7 +2229,7 @@
    */
   void set accessors(List<PropertyAccessorElement> accessors) {
     for (PropertyAccessorElement accessor in accessors) {
-      ((accessor as PropertyAccessorElementImpl)).enclosingElement = this;
+      (accessor as PropertyAccessorElementImpl).enclosingElement = this;
     }
     this._accessors = accessors;
   }
@@ -2079,7 +2241,7 @@
    */
   void set constructors(List<ConstructorElement> constructors) {
     for (ConstructorElement constructor in constructors) {
-      ((constructor as ConstructorElementImpl)).enclosingElement = this;
+      (constructor as ConstructorElementImpl).enclosingElement = this;
     }
     this._constructors = constructors;
   }
@@ -2091,7 +2253,7 @@
    */
   void set fields(List<FieldElement> fields) {
     for (FieldElement field in fields) {
-      ((field as FieldElementImpl)).enclosingElement = this;
+      (field as FieldElementImpl).enclosingElement = this;
     }
     this._fields = fields;
   }
@@ -2121,7 +2283,7 @@
    */
   void set methods(List<MethodElement> methods) {
     for (MethodElement method in methods) {
-      ((method as MethodElementImpl)).enclosingElement = this;
+      (method as MethodElementImpl).enclosingElement = this;
     }
     this._methods = methods;
   }
@@ -2170,7 +2332,7 @@
    */
   void set typeParameters(List<TypeParameterElement> typeParameters) {
     for (TypeParameterElement typeParameter in typeParameters) {
-      ((typeParameter as TypeParameterElementImpl)).enclosingElement = this;
+      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
     }
     this._typeParameters = typeParameters;
   }
@@ -2183,6 +2345,7 @@
   void set validMixin(bool isValidMixin) {
     setModifier(Modifier.MIXIN, isValidMixin);
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_accessors, visitor);
@@ -2191,6 +2354,7 @@
     safelyVisitChildren(_methods, visitor);
     safelyVisitChildren(_typeParameters, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     String name = displayName;
     if (name == null) {
@@ -2205,11 +2369,12 @@
         if (i > 0) {
           builder.append(", ");
         }
-        ((_typeParameters[i] as TypeParameterElementImpl)).appendTo(builder);
+        (_typeParameters[i] as TypeParameterElementImpl).appendTo(builder);
       }
       builder.append(">");
     }
   }
+
   void collectAllSupertypes(List<InterfaceType> supertypes) {
     List<InterfaceType> typesToVisit = new List<InterfaceType>();
     List<ClassElement> visitedClasses = new List<ClassElement>();
@@ -2239,6 +2404,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `CompilationUnitElementImpl` implement a
  * [CompilationUnitElement].
@@ -2246,7 +2412,6 @@
  * @coverage dart.engine.element
  */
 class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitElement {
-
   /**
    * An empty array of compilation unit elements.
    */
@@ -2295,43 +2460,54 @@
    * @param name the name of this element
    */
   CompilationUnitElementImpl(String name) : super.con2(name, -1);
+
   accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this);
-  bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && _source == ((object as CompilationUnitElementImpl)).source;
+
+  bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && _source == (object as CompilationUnitElementImpl).source;
+
   List<PropertyAccessorElement> get accessors => _accessors;
+
   ElementImpl getChild(String identifier) {
     for (PropertyAccessorElement accessor in _accessors) {
-      if (((accessor as PropertyAccessorElementImpl)).identifier == identifier) {
+      if ((accessor as PropertyAccessorElementImpl).identifier == identifier) {
         return accessor as PropertyAccessorElementImpl;
       }
     }
     for (VariableElement variable in _variables) {
-      if (((variable as VariableElementImpl)).identifier == identifier) {
+      if ((variable as VariableElementImpl).identifier == identifier) {
         return variable as VariableElementImpl;
       }
     }
     for (ExecutableElement function in _functions) {
-      if (((function as ExecutableElementImpl)).identifier == identifier) {
+      if ((function as ExecutableElementImpl).identifier == identifier) {
         return function as ExecutableElementImpl;
       }
     }
     for (FunctionTypeAliasElement typeAlias in _typeAliases) {
-      if (((typeAlias as FunctionTypeAliasElementImpl)).identifier == identifier) {
+      if ((typeAlias as FunctionTypeAliasElementImpl).identifier == identifier) {
         return typeAlias as FunctionTypeAliasElementImpl;
       }
     }
     for (ClassElement type in _types) {
-      if (((type as ClassElementImpl)).identifier == identifier) {
+      if ((type as ClassElementImpl).identifier == identifier) {
         return type as ClassElementImpl;
       }
     }
     return null;
   }
+
   LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
+
   List<FunctionElement> get functions => _functions;
+
   List<FunctionTypeAliasElement> get functionTypeAliases => _typeAliases;
+
   ElementKind get kind => ElementKind.COMPILATION_UNIT;
+
   Source get source => _source;
+
   List<TopLevelVariableElement> get topLevelVariables => _variables;
+
   ClassElement getType(String className) {
     for (ClassElement type in _types) {
       if (type.name == className) {
@@ -2340,8 +2516,11 @@
     }
     return null;
   }
+
   List<ClassElement> get types => _types;
+
   String get uri => _uri;
+
   int get hashCode => _source.hashCode;
 
   /**
@@ -2352,7 +2531,7 @@
    */
   void set accessors(List<PropertyAccessorElement> accessors) {
     for (PropertyAccessorElement accessor in accessors) {
-      ((accessor as PropertyAccessorElementImpl)).enclosingElement = this;
+      (accessor as PropertyAccessorElementImpl).enclosingElement = this;
     }
     this._accessors = accessors;
   }
@@ -2364,7 +2543,7 @@
    */
   void set functions(List<FunctionElement> functions) {
     for (FunctionElement function in functions) {
-      ((function as FunctionElementImpl)).enclosingElement = this;
+      (function as FunctionElementImpl).enclosingElement = this;
     }
     this._functions = functions;
   }
@@ -2385,7 +2564,7 @@
    */
   void set topLevelVariables(List<TopLevelVariableElement> variables) {
     for (TopLevelVariableElement field in variables) {
-      ((field as TopLevelVariableElementImpl)).enclosingElement = this;
+      (field as TopLevelVariableElementImpl).enclosingElement = this;
     }
     this._variables = variables;
   }
@@ -2397,7 +2576,7 @@
    */
   void set typeAliases(List<FunctionTypeAliasElement> typeAliases) {
     for (FunctionTypeAliasElement typeAlias in typeAliases) {
-      ((typeAlias as FunctionTypeAliasElementImpl)).enclosingElement = this;
+      (typeAlias as FunctionTypeAliasElementImpl).enclosingElement = this;
     }
     this._typeAliases = typeAliases;
   }
@@ -2409,7 +2588,7 @@
    */
   void set types(List<ClassElement> types) {
     for (ClassElement type in types) {
-      ((type as ClassElementImpl)).enclosingElement = this;
+      (type as ClassElementImpl).enclosingElement = this;
     }
     this._types = types;
   }
@@ -2422,6 +2601,7 @@
   void set uri(String uri) {
     this._uri = uri;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_accessors, visitor);
@@ -2430,6 +2610,7 @@
     safelyVisitChildren(_types, visitor);
     safelyVisitChildren(_variables, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     if (_source == null) {
       builder.append("{compilation unit}");
@@ -2437,14 +2618,15 @@
       builder.append(_source.fullName);
     }
   }
+
   String get identifier => source.encoding;
 }
+
 /**
  * Instances of the class `ConstFieldElementImpl` implement a `FieldElement` for a
  * 'const' field that has an initializer.
  */
 class ConstFieldElementImpl extends FieldElementImpl {
-
   /**
    * The result of evaluating this variable's initializer.
    */
@@ -2456,11 +2638,14 @@
    * @param name the name of this element
    */
   ConstFieldElementImpl(Identifier name) : super.con1(name);
+
   EvaluationResultImpl get evaluationResult => _result;
+
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
 }
+
 /**
  * Instances of the class `ConstLocalVariableElementImpl` implement a
  * `LocalVariableElement` for a local 'const' variable that has an initializer.
@@ -2468,7 +2653,6 @@
  * @coverage dart.engine.element
  */
 class ConstLocalVariableElementImpl extends LocalVariableElementImpl {
-
   /**
    * The result of evaluating this variable's initializer.
    */
@@ -2480,17 +2664,19 @@
    * @param name the name of this element
    */
   ConstLocalVariableElementImpl(Identifier name) : super(name);
+
   EvaluationResultImpl get evaluationResult => _result;
+
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
 }
+
 /**
  * Instances of the class `ConstTopLevelVariableElementImpl` implement a
  * `TopLevelVariableElement` for a top-level 'const' variable that has an initializer.
  */
 class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl {
-
   /**
    * The result of evaluating this variable's initializer.
    */
@@ -2502,18 +2688,20 @@
    * @param name the name of this element
    */
   ConstTopLevelVariableElementImpl(Identifier name) : super.con1(name);
+
   EvaluationResultImpl get evaluationResult => _result;
+
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
 }
+
 /**
  * Instances of the class `ConstructorElementImpl` implement a `ConstructorElement`.
  *
  * @coverage dart.engine.element
  */
 class ConstructorElementImpl extends ExecutableElementImpl implements ConstructorElement {
-
   /**
    * An empty array of constructor elements.
    */
@@ -2530,11 +2718,17 @@
    * @param name the name of this element
    */
   ConstructorElementImpl(Identifier name) : super.con1(name);
+
   accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
   ElementKind get kind => ElementKind.CONSTRUCTOR;
+
   ConstructorElement get redirectedConstructor => _redirectedConstructor;
+
   bool get isConst => hasModifier(Modifier.CONST);
+
   bool get isDefaultConstructor {
     String name = this.name;
     if (name != null && name.length != 0) {
@@ -2547,7 +2741,9 @@
     }
     return true;
   }
+
   bool get isFactory => hasModifier(Modifier.FACTORY);
+
   bool get isStatic => false;
 
   /**
@@ -2576,6 +2772,7 @@
   void set redirectedConstructor(ConstructorElement redirectedConstructor) {
     this._redirectedConstructor = redirectedConstructor;
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append(enclosingElement.displayName);
     String name = displayName;
@@ -2586,6 +2783,7 @@
     super.appendTo(builder);
   }
 }
+
 /**
  * Instances of the class `DefaultFieldFormalParameterElementImpl` implement a
  * `FieldFormalParameterElementImpl` for parameters that have an initializer.
@@ -2593,7 +2791,6 @@
  * @coverage dart.engine.element
  */
 class DefaultFieldFormalParameterElementImpl extends FieldFormalParameterElementImpl {
-
   /**
    * The result of evaluating this variable's initializer.
    */
@@ -2605,11 +2802,14 @@
    * @param name the name of this element
    */
   DefaultFieldFormalParameterElementImpl(Identifier name) : super(name);
+
   EvaluationResultImpl get evaluationResult => _result;
+
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
 }
+
 /**
  * Instances of the class `DefaultParameterElementImpl` implement a `ParameterElement`
  * for parameters that have an initializer.
@@ -2617,7 +2817,6 @@
  * @coverage dart.engine.element
  */
 class DefaultParameterElementImpl extends ParameterElementImpl {
-
   /**
    * The result of evaluating this variable's initializer.
    */
@@ -2629,11 +2828,14 @@
    * @param name the name of this element
    */
   DefaultParameterElementImpl(Identifier name) : super.con1(name);
+
   EvaluationResultImpl get evaluationResult => _result;
+
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
 }
+
 /**
  * Instances of the class `DynamicElementImpl` represent the synthetic element representing
  * the declaration of the type `dynamic`.
@@ -2641,7 +2843,6 @@
  * @coverage dart.engine.element
  */
 class DynamicElementImpl extends ElementImpl {
-
   /**
    * Return the unique instance of this class.
    *
@@ -2662,16 +2863,18 @@
   DynamicElementImpl() : super.con2(Keyword.DYNAMIC.syntax, -1) {
     setModifier(Modifier.SYNTHETIC, true);
   }
+
   accept(ElementVisitor visitor) => null;
+
   ElementKind get kind => ElementKind.DYNAMIC;
 }
+
 /**
  * Instances of the class `ElementAnnotationImpl` implement an [ElementAnnotation].
  *
  * @coverage dart.engine.element
  */
 class ElementAnnotationImpl implements ElementAnnotation {
-
   /**
    * The element representing the field, variable, or constructor being used as an annotation.
    */
@@ -2691,9 +2894,12 @@
   ElementAnnotationImpl(Element element) {
     this._element = element;
   }
+
   Element get element => _element;
+
   String toString() => "@${_element.toString()}";
 }
+
 /**
  * The abstract class `ElementImpl` implements the behavior common to objects that implement
  * an [Element].
@@ -2701,7 +2907,6 @@
  * @coverage dart.engine.element
  */
 abstract class ElementImpl implements Element {
-
   /**
    * The enclosing element of this element, or `null` if this element is at the root of the
    * element structure.
@@ -2752,6 +2957,7 @@
     this._name = StringUtilities.intern(name);
     this._nameOffset = nameOffset;
   }
+
   String computeDocumentationComment() {
     AnalysisContext context = this.context;
     if (context == null) {
@@ -2759,6 +2965,7 @@
     }
     return context.computeDocumentationComment(this);
   }
+
   bool operator ==(Object object) {
     if (identical(this, object)) {
       return true;
@@ -2766,8 +2973,9 @@
     if (object == null || hashCode != object.hashCode) {
       return false;
     }
-    return object.runtimeType == runtimeType && ((object as Element)).location == location;
+    return object.runtimeType == runtimeType && (object as Element).location == location;
   }
+
   Element getAncestor(Type elementClass) {
     Element ancestor = _enclosingElement;
     while (ancestor != null && !isInstanceOf(ancestor, elementClass)) {
@@ -2784,37 +2992,69 @@
    * @return the child of this element with the given identifier
    */
   ElementImpl getChild(String identifier) => null;
+
   AnalysisContext get context {
     if (_enclosingElement == null) {
       return null;
     }
     return _enclosingElement.context;
   }
+
   String get displayName => _name;
+
   Element get enclosingElement => _enclosingElement;
+
   LibraryElement get library => getAncestor(LibraryElement);
+
   ElementLocation get location => new ElementLocationImpl.con1(this);
+
   List<ElementAnnotation> get metadata => _metadata;
+
   String get name => _name;
+
   int get nameOffset => _nameOffset;
+
   Source get source {
     if (_enclosingElement == null) {
       return null;
     }
     return _enclosingElement.source;
   }
+
   int get hashCode {
     if (_cachedHashCode == 0) {
       _cachedHashCode = location.hashCode;
     }
     return _cachedHashCode;
   }
+
   bool isAccessibleIn(LibraryElement library) {
     if (Identifier.isPrivateName(_name)) {
       return library == this.library;
     }
     return true;
   }
+
+  bool get isDeprecated {
+    for (ElementAnnotation annotation in _metadata) {
+      Element element = annotation.element;
+      if (element != null) {
+        LibraryElement lib = element.library;
+        if (lib != null && lib.isDartCore) {
+          if (element is ConstructorElement) {
+            ConstructorElement constructorElement = element as ConstructorElement;
+            if (constructorElement.enclosingElement.name == "Deprecated") {
+              return true;
+            }
+          } else if (element is PropertyAccessorElement && element.name == "deprecated") {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
   bool get isSynthetic => hasModifier(Modifier.SYNTHETIC);
 
   /**
@@ -2845,11 +3085,13 @@
   void set synthetic(bool isSynthetic) {
     setModifier(Modifier.SYNTHETIC, isSynthetic);
   }
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     appendTo(builder);
     return builder.toString();
   }
+
   void visitChildren(ElementVisitor visitor) {
   }
 
@@ -2930,13 +3172,13 @@
     _modifiers = BooleanArray.set(_modifiers, modifier, value);
   }
 }
+
 /**
  * Instances of the class `ElementLocationImpl` implement an [ElementLocation].
  *
  * @coverage dart.engine.element
  */
 class ElementLocationImpl implements ElementLocation {
-
   /**
    * The path to the element whose location is represented by this object.
    */
@@ -2956,7 +3198,7 @@
     List<String> components = new List<String>();
     Element ancestor = element;
     while (ancestor != null) {
-      components.insert(0, ((ancestor as ElementImpl)).identifier);
+      components.insert(0, (ancestor as ElementImpl).identifier);
       ancestor = ancestor.enclosingElement;
     }
     this.components = new List.from(components);
@@ -2970,6 +3212,7 @@
   ElementLocationImpl.con2(String encoding) {
     this.components = decode(encoding);
   }
+
   bool operator ==(Object object) {
     if (identical(this, object)) {
       return true;
@@ -2996,6 +3239,7 @@
     }
     return true;
   }
+
   String get encoding {
     JavaStringBuilder builder = new JavaStringBuilder();
     int length = components.length;
@@ -3007,6 +3251,7 @@
     }
     return builder.toString();
   }
+
   int get hashCode {
     int result = 1;
     for (int i = 0; i < components.length; i++) {
@@ -3021,6 +3266,7 @@
     }
     return result;
   }
+
   String toString() => encoding;
 
   /**
@@ -3110,6 +3356,7 @@
     return sourceComponent.substring(1).hashCode;
   }
 }
+
 /**
  * Instances of the class `EmbeddedHtmlScriptElementImpl` implement an
  * [EmbeddedHtmlScriptElement].
@@ -3117,7 +3364,6 @@
  * @coverage dart.engine.element
  */
 class EmbeddedHtmlScriptElementImpl extends HtmlScriptElementImpl implements EmbeddedHtmlScriptElement {
-
   /**
    * The library defined by the script tag's content.
    */
@@ -3129,8 +3375,11 @@
    * @param node the XML node from which this element is derived (not `null`)
    */
   EmbeddedHtmlScriptElementImpl(XmlTagNode node) : super(node);
+
   accept(ElementVisitor visitor) => visitor.visitEmbeddedHtmlScriptElement(this);
+
   ElementKind get kind => ElementKind.EMBEDDED_HTML_SCRIPT;
+
   LibraryElement get scriptLibrary => _scriptLibrary;
 
   /**
@@ -3142,10 +3391,12 @@
     scriptLibrary.enclosingElement = this;
     this._scriptLibrary = scriptLibrary;
   }
+
   void visitChildren(ElementVisitor visitor) {
     safelyVisitChild(_scriptLibrary, visitor);
   }
 }
+
 /**
  * The abstract class `ExecutableElementImpl` implements the behavior common to
  * `ExecutableElement`s.
@@ -3153,7 +3404,6 @@
  * @coverage dart.engine.element
  */
 abstract class ExecutableElementImpl extends ElementImpl implements ExecutableElement {
-
   /**
    * An array containing all of the functions defined within this executable element.
    */
@@ -3204,35 +3454,43 @@
    *          declaration of this element
    */
   ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
+
   ElementImpl getChild(String identifier) {
     for (ExecutableElement function in _functions) {
-      if (((function as ExecutableElementImpl)).identifier == identifier) {
+      if ((function as ExecutableElementImpl).identifier == identifier) {
         return function as ExecutableElementImpl;
       }
     }
     for (LabelElement label in _labels) {
-      if (((label as LabelElementImpl)).identifier == identifier) {
+      if ((label as LabelElementImpl).identifier == identifier) {
         return label as LabelElementImpl;
       }
     }
     for (VariableElement variable in _localVariables) {
-      if (((variable as VariableElementImpl)).identifier == identifier) {
+      if ((variable as VariableElementImpl).identifier == identifier) {
         return variable as VariableElementImpl;
       }
     }
     for (ParameterElement parameter in _parameters) {
-      if (((parameter as ParameterElementImpl)).identifier == identifier) {
+      if ((parameter as ParameterElementImpl).identifier == identifier) {
         return parameter as ParameterElementImpl;
       }
     }
     return null;
   }
+
   List<FunctionElement> get functions => _functions;
+
   List<LabelElement> get labels => _labels;
+
   List<LocalVariableElement> get localVariables => _localVariables;
+
   List<ParameterElement> get parameters => _parameters;
+
   Type2 get returnType => _returnType;
+
   FunctionType get type => _type;
+
   bool get isOperator => false;
 
   /**
@@ -3242,7 +3500,7 @@
    */
   void set functions(List<FunctionElement> functions) {
     for (FunctionElement function in functions) {
-      ((function as FunctionElementImpl)).enclosingElement = this;
+      (function as FunctionElementImpl).enclosingElement = this;
     }
     this._functions = functions;
   }
@@ -3254,7 +3512,7 @@
    */
   void set labels(List<LabelElement> labels) {
     for (LabelElement label in labels) {
-      ((label as LabelElementImpl)).enclosingElement = this;
+      (label as LabelElementImpl).enclosingElement = this;
     }
     this._labels = labels;
   }
@@ -3266,7 +3524,7 @@
    */
   void set localVariables(List<LocalVariableElement> localVariables) {
     for (LocalVariableElement variable in localVariables) {
-      ((variable as LocalVariableElementImpl)).enclosingElement = this;
+      (variable as LocalVariableElementImpl).enclosingElement = this;
     }
     this._localVariables = localVariables;
   }
@@ -3278,7 +3536,7 @@
    */
   void set parameters(List<ParameterElement> parameters) {
     for (ParameterElement parameter in parameters) {
-      ((parameter as ParameterElementImpl)).enclosingElement = this;
+      (parameter as ParameterElementImpl).enclosingElement = this;
     }
     this._parameters = parameters;
   }
@@ -3300,6 +3558,7 @@
   void set type(FunctionType type) {
     this._type = type;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_functions, visitor);
@@ -3307,6 +3566,7 @@
     safelyVisitChildren(_localVariables, visitor);
     safelyVisitChildren(_parameters, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append("(");
     int parameterCount = _parameters.length;
@@ -3314,7 +3574,7 @@
       if (i > 0) {
         builder.append(", ");
       }
-      ((_parameters[i] as ParameterElementImpl)).appendTo(builder);
+      (_parameters[i] as ParameterElementImpl).appendTo(builder);
     }
     builder.append(")");
     if (_type != null) {
@@ -3323,13 +3583,13 @@
     }
   }
 }
+
 /**
  * Instances of the class `ExportElementImpl` implement an [ExportElement].
  *
  * @coverage dart.engine.element
  */
 class ExportElementImpl extends ElementImpl implements ExportElement {
-
   /**
    * The URI that is specified by this directive.
    */
@@ -3350,10 +3610,15 @@
    * Initialize a newly created export element.
    */
   ExportElementImpl() : super.con1(null);
+
   accept(ElementVisitor visitor) => visitor.visitExportElement(this);
+
   List<NamespaceCombinator> get combinators => _combinators;
+
   LibraryElement get exportedLibrary => _exportedLibrary;
+
   ElementKind get kind => ElementKind.EXPORT;
+
   String get uri => _uri;
 
   /**
@@ -3384,12 +3649,15 @@
   void set uri(String uri) {
     this._uri = uri;
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append("export ");
-    ((_exportedLibrary as LibraryElementImpl)).appendTo(builder);
+    (_exportedLibrary as LibraryElementImpl).appendTo(builder);
   }
+
   String get identifier => _exportedLibrary.name;
 }
+
 /**
  * Instances of the class `ExternalHtmlScriptElementImpl` implement an
  * [ExternalHtmlScriptElement].
@@ -3397,7 +3665,6 @@
  * @coverage dart.engine.element
  */
 class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl implements ExternalHtmlScriptElement {
-
   /**
    * The source specified in the `source` attribute or `null` if unspecified.
    */
@@ -3409,8 +3676,11 @@
    * @param node the XML node from which this element is derived (not `null`)
    */
   ExternalHtmlScriptElementImpl(XmlTagNode node) : super(node);
+
   accept(ElementVisitor visitor) => visitor.visitExternalHtmlScriptElement(this);
+
   ElementKind get kind => ElementKind.EXTERNAL_HTML_SCRIPT;
+
   Source get scriptSource => _scriptSource;
 
   /**
@@ -3422,13 +3692,13 @@
     this._scriptSource = scriptSource;
   }
 }
+
 /**
  * Instances of the class `FieldElementImpl` implement a `FieldElement`.
  *
  * @coverage dart.engine.element
  */
 class FieldElementImpl extends PropertyInducingElementImpl implements FieldElement {
-
   /**
    * An empty array of field elements.
    */
@@ -3447,9 +3717,13 @@
    * @param name the name of this element
    */
   FieldElementImpl.con2(String name) : super.con2(name);
+
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
+
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
   ElementKind get kind => ElementKind.FIELD;
+
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   /**
@@ -3461,6 +3735,7 @@
     setModifier(Modifier.STATIC, isStatic);
   }
 }
+
 /**
  * Instances of the class `FieldFormalParameterElementImpl` extend
  * [ParameterElementImpl] to provide the additional information of the [FieldElement]
@@ -3469,7 +3744,6 @@
  * @coverage dart.engine.element
  */
 class FieldFormalParameterElementImpl extends ParameterElementImpl implements FieldFormalParameterElement {
-
   /**
    * The field associated with this field formal parameter.
    */
@@ -3481,8 +3755,11 @@
    * @param name the name of this element
    */
   FieldFormalParameterElementImpl(Identifier name) : super.con1(name);
+
   accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
+
   FieldElement get field => _field;
+
   bool get isInitializingFormal => true;
 
   /**
@@ -3494,13 +3771,13 @@
     this._field = field;
   }
 }
+
 /**
  * Instances of the class `FunctionElementImpl` implement a `FunctionElement`.
  *
  * @coverage dart.engine.element
  */
 class FunctionElementImpl extends ExecutableElementImpl implements FunctionElement {
-
   /**
    * The offset to the beginning of the visible range for this element.
    */
@@ -3539,14 +3816,18 @@
    *          declaration of this element
    */
   FunctionElementImpl.con2(int nameOffset) : super.con2("", nameOffset);
+
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
+
   ElementKind get kind => ElementKind.FUNCTION;
+
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
       return null;
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
+
   bool get isStatic => enclosingElement is CompilationUnitElement;
 
   /**
@@ -3561,6 +3842,7 @@
     _visibleRangeOffset = offset;
     _visibleRangeLength = length;
   }
+
   void appendTo(JavaStringBuilder builder) {
     String name = displayName;
     if (name != null) {
@@ -3568,8 +3850,10 @@
     }
     super.appendTo(builder);
   }
+
   String get identifier => "${name}@${nameOffset}";
 }
+
 /**
  * Instances of the class `FunctionTypeAliasElementImpl` implement a
  * `FunctionTypeAliasElement`.
@@ -3577,7 +3861,6 @@
  * @coverage dart.engine.element
  */
 class FunctionTypeAliasElementImpl extends ElementImpl implements FunctionTypeAliasElement {
-
   /**
    * An array containing all of the parameters defined by this type alias.
    */
@@ -3609,25 +3892,33 @@
    * @param name the name of this element
    */
   FunctionTypeAliasElementImpl(Identifier name) : super.con1(name);
+
   accept(ElementVisitor visitor) => visitor.visitFunctionTypeAliasElement(this);
+
   ElementImpl getChild(String identifier) {
     for (VariableElement parameter in _parameters) {
-      if (((parameter as VariableElementImpl)).identifier == identifier) {
+      if ((parameter as VariableElementImpl).identifier == identifier) {
         return parameter as VariableElementImpl;
       }
     }
     for (TypeParameterElement typeParameter in _typeParameters) {
-      if (((typeParameter as TypeParameterElementImpl)).identifier == identifier) {
+      if ((typeParameter as TypeParameterElementImpl).identifier == identifier) {
         return typeParameter as TypeParameterElementImpl;
       }
     }
     return null;
   }
+
   CompilationUnitElement get enclosingElement => super.enclosingElement as CompilationUnitElement;
+
   ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
+
   List<ParameterElement> get parameters => _parameters;
+
   Type2 get returnType => _returnType;
+
   FunctionType get type => _type;
+
   List<TypeParameterElement> get typeParameters => _typeParameters;
 
   /**
@@ -3638,7 +3929,7 @@
   void set parameters(List<ParameterElement> parameters) {
     if (parameters != null) {
       for (ParameterElement parameter in parameters) {
-        ((parameter as ParameterElementImpl)).enclosingElement = this;
+        (parameter as ParameterElementImpl).enclosingElement = this;
       }
     }
     this._parameters = parameters;
@@ -3669,7 +3960,7 @@
    */
   void set typeParameters(List<TypeParameterElement> typeParameters) {
     for (TypeParameterElement typeParameter in typeParameters) {
-      ((typeParameter as TypeParameterElementImpl)).enclosingElement = this;
+      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
     }
     this._typeParameters = typeParameters;
   }
@@ -3695,11 +3986,13 @@
   void shareTypeParameters(List<TypeParameterElement> typeParameters) {
     this._typeParameters = typeParameters;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_parameters, visitor);
     safelyVisitChildren(_typeParameters, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append("typedef ");
     builder.append(displayName);
@@ -3710,7 +4003,7 @@
         if (i > 0) {
           builder.append(", ");
         }
-        ((_typeParameters[i] as TypeParameterElementImpl)).appendTo(builder);
+        (_typeParameters[i] as TypeParameterElementImpl).appendTo(builder);
       }
       builder.append(">");
     }
@@ -3720,7 +4013,7 @@
       if (i > 0) {
         builder.append(", ");
       }
-      ((_parameters[i] as ParameterElementImpl)).appendTo(builder);
+      (_parameters[i] as ParameterElementImpl).appendTo(builder);
     }
     builder.append(")");
     if (_type != null) {
@@ -3729,6 +4022,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `HideElementCombinatorImpl` implement a
  * [HideElementCombinator].
@@ -3736,12 +4030,12 @@
  * @coverage dart.engine.element
  */
 class HideElementCombinatorImpl implements HideElementCombinator {
-
   /**
    * The names that are not to be made visible in the importing library even if they are defined in
    * the imported library.
    */
   List<String> _hiddenNames = StringUtilities.EMPTY_ARRAY;
+
   List<String> get hiddenNames => _hiddenNames;
 
   /**
@@ -3753,6 +4047,7 @@
   void set hiddenNames(List<String> hiddenNames) {
     this._hiddenNames = hiddenNames;
   }
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("show ");
@@ -3766,13 +4061,13 @@
     return builder.toString();
   }
 }
+
 /**
  * Instances of the class `HtmlElementImpl` implement an [HtmlElement].
  *
  * @coverage dart.engine.element
  */
 class HtmlElementImpl extends ElementImpl implements HtmlElement {
-
   /**
    * An empty array of HTML file elements.
    */
@@ -3802,12 +4097,19 @@
   HtmlElementImpl(AnalysisContext context, String name) : super.con2(name, -1) {
     this._context = context;
   }
+
   accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
-  bool operator ==(Object object) => runtimeType == object.runtimeType && _source == ((object as CompilationUnitElementImpl)).source;
+
+  bool operator ==(Object object) => runtimeType == object.runtimeType && _source == (object as CompilationUnitElementImpl).source;
+
   AnalysisContext get context => _context;
+
   ElementKind get kind => ElementKind.HTML;
+
   List<HtmlScriptElement> get scripts => _scripts;
+
   Source get source => _source;
+
   int get hashCode => _source.hashCode;
 
   /**
@@ -3820,7 +4122,7 @@
       scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
     }
     for (HtmlScriptElement script in scripts) {
-      ((script as HtmlScriptElementImpl)).enclosingElement = this;
+      (script as HtmlScriptElementImpl).enclosingElement = this;
     }
     this._scripts = scripts;
   }
@@ -3833,10 +4135,12 @@
   void set source(Source source) {
     this._source = source;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_scripts, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     if (_source == null) {
       builder.append("{HTML file}");
@@ -3845,13 +4149,13 @@
     }
   }
 }
+
 /**
  * Instances of the class `HtmlScriptElementImpl` implement an [HtmlScriptElement].
  *
  * @coverage dart.engine.element
  */
 abstract class HtmlScriptElementImpl extends ElementImpl implements HtmlScriptElement {
-
   /**
    * An empty array of HTML script elements.
    */
@@ -3864,13 +4168,13 @@
    */
   HtmlScriptElementImpl(XmlTagNode node) : super.con2(node.tag.lexeme, node.tag.offset);
 }
+
 /**
  * Instances of the class `ImportElementImpl` implement an [ImportElement].
  *
  * @coverage dart.engine.element
  */
 class ImportElementImpl extends ElementImpl implements ImportElement {
-
   /**
    * The offset of this directive, may be `-1` if synthetic.
    */
@@ -3914,13 +4218,21 @@
    * Initialize a newly created import element.
    */
   ImportElementImpl() : super.con1(null);
+
   accept(ElementVisitor visitor) => visitor.visitImportElement(this);
+
   List<NamespaceCombinator> get combinators => _combinators;
+
   LibraryElement get importedLibrary => _importedLibrary;
+
   ElementKind get kind => ElementKind.IMPORT;
+
   PrefixElement get prefix => _prefix;
+
   int get prefixOffset => _prefixOffset;
+
   String get uri => _uri;
+
   int get uriEnd => _uriEnd;
 
   /**
@@ -3983,23 +4295,26 @@
   void set uriEnd(int uriEnd) {
     this._uriEnd = uriEnd;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_prefix, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append("import ");
-    ((_importedLibrary as LibraryElementImpl)).appendTo(builder);
+    (_importedLibrary as LibraryElementImpl).appendTo(builder);
   }
-  String get identifier => "${((_importedLibrary as LibraryElementImpl)).identifier}@${_offset}";
+
+  String get identifier => "${(_importedLibrary as LibraryElementImpl).identifier}@${_offset}";
 }
+
 /**
  * Instances of the class `LabelElementImpl` implement a `LabelElement`.
  *
  * @coverage dart.engine.element
  */
 class LabelElementImpl extends ElementImpl implements LabelElement {
-
   /**
    * A flag indicating whether this label is associated with a `switch` statement.
    */
@@ -4028,17 +4343,20 @@
     this.isOnSwitchStatement = onSwitchStatement;
     this.isOnSwitchMember = onSwitchMember;
   }
+
   accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
+
   ExecutableElement get enclosingElement => super.enclosingElement as ExecutableElement;
+
   ElementKind get kind => ElementKind.LABEL;
 }
+
 /**
  * Instances of the class `LibraryElementImpl` implement a `LibraryElement`.
  *
  * @coverage dart.engine.element
  */
 class LibraryElementImpl extends ElementImpl implements LibraryElement {
-
   /**
    * An empty array of library elements.
    */
@@ -4116,32 +4434,39 @@
   LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.con1(name) {
     this._context = context;
   }
+
   accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
-  bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && _definingCompilationUnit == ((object as LibraryElementImpl)).definingCompilationUnit;
+
+  bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && _definingCompilationUnit == (object as LibraryElementImpl).definingCompilationUnit;
+
   ElementImpl getChild(String identifier) {
-    if (((_definingCompilationUnit as CompilationUnitElementImpl)).identifier == identifier) {
+    if ((_definingCompilationUnit as CompilationUnitElementImpl).identifier == identifier) {
       return _definingCompilationUnit as CompilationUnitElementImpl;
     }
     for (CompilationUnitElement part in _parts) {
-      if (((part as CompilationUnitElementImpl)).identifier == identifier) {
+      if ((part as CompilationUnitElementImpl).identifier == identifier) {
         return part as CompilationUnitElementImpl;
       }
     }
     for (ImportElement importElement in _imports) {
-      if (((importElement as ImportElementImpl)).identifier == identifier) {
+      if ((importElement as ImportElementImpl).identifier == identifier) {
         return importElement as ImportElementImpl;
       }
     }
     for (ExportElement exportElement in _exports) {
-      if (((exportElement as ExportElementImpl)).identifier == identifier) {
+      if ((exportElement as ExportElementImpl).identifier == identifier) {
         return exportElement as ExportElementImpl;
       }
     }
     return null;
   }
+
   AnalysisContext get context => _context;
+
   CompilationUnitElement get definingCompilationUnit => _definingCompilationUnit;
+
   FunctionElement get entryPoint => _entryPoint;
+
   List<LibraryElement> get exportedLibraries {
     Set<LibraryElement> libraries = new Set<LibraryElement>();
     for (ExportElement element in _exports) {
@@ -4152,7 +4477,9 @@
     }
     return new List.from(libraries);
   }
+
   List<ExportElement> get exports => _exports;
+
   List<LibraryElement> get importedLibraries {
     Set<LibraryElement> libraries = new Set<LibraryElement>();
     for (ImportElement element in _imports) {
@@ -4163,10 +4490,15 @@
     }
     return new List.from(libraries);
   }
+
   List<ImportElement> get imports => _imports;
+
   ElementKind get kind => ElementKind.LIBRARY;
+
   LibraryElement get library => this;
+
   List<CompilationUnitElement> get parts => _parts;
+
   List<PrefixElement> get prefixes {
     Set<PrefixElement> prefixes = new Set<PrefixElement>();
     for (ImportElement element in _imports) {
@@ -4177,12 +4509,14 @@
     }
     return new List.from(prefixes);
   }
+
   Source get source {
     if (_definingCompilationUnit == null) {
       return null;
     }
     return _definingCompilationUnit.source;
   }
+
   ClassElement getType(String className) {
     ClassElement type = _definingCompilationUnit.getType(className);
     if (type != null) {
@@ -4196,10 +4530,15 @@
     }
     return null;
   }
+
   int get hashCode => _definingCompilationUnit.hashCode;
+
   bool get isBrowserApplication => _entryPoint != null && isOrImportsBrowserLibrary;
+
   bool get isDartCore => name == "dart.core";
+
   bool get isInSdk => name.startsWith("dart.");
+
   bool isUpToDate2(int timeStamp) {
     Set<LibraryElement> visitedLibraries = new Set();
     return isUpToDate(this, timeStamp, visitedLibraries);
@@ -4211,7 +4550,7 @@
    * @param definingCompilationUnit the compilation unit that defines this library
    */
   void set definingCompilationUnit(CompilationUnitElement definingCompilationUnit) {
-    ((definingCompilationUnit as CompilationUnitElementImpl)).enclosingElement = this;
+    (definingCompilationUnit as CompilationUnitElementImpl).enclosingElement = this;
     this._definingCompilationUnit = definingCompilationUnit;
   }
 
@@ -4231,7 +4570,7 @@
    */
   void set exports(List<ExportElement> exports) {
     for (ExportElement exportElement in exports) {
-      ((exportElement as ExportElementImpl)).enclosingElement = this;
+      (exportElement as ExportElementImpl).enclosingElement = this;
     }
     this._exports = exports;
   }
@@ -4243,7 +4582,7 @@
    */
   void set imports(List<ImportElement> imports) {
     for (ImportElement importElement in imports) {
-      ((importElement as ImportElementImpl)).enclosingElement = this;
+      (importElement as ImportElementImpl).enclosingElement = this;
       PrefixElementImpl prefix = importElement.prefix as PrefixElementImpl;
       if (prefix != null) {
         prefix.enclosingElement = this;
@@ -4260,10 +4599,11 @@
    */
   void set parts(List<CompilationUnitElement> parts) {
     for (CompilationUnitElement compilationUnit in parts) {
-      ((compilationUnit as CompilationUnitElementImpl)).enclosingElement = this;
+      (compilationUnit as CompilationUnitElementImpl).enclosingElement = this;
     }
     this._parts = parts;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_definingCompilationUnit, visitor);
@@ -4271,6 +4611,7 @@
     safelyVisitChildren(_imports, visitor);
     safelyVisitChildren(_parts, visitor);
   }
+
   String get identifier => _definingCompilationUnit.source.encoding;
 
   /**
@@ -4302,13 +4643,13 @@
     return false;
   }
 }
+
 /**
  * Instances of the class `LocalVariableElementImpl` implement a `LocalVariableElement`.
  *
  * @coverage dart.engine.element
  */
 class LocalVariableElementImpl extends VariableElementImpl implements LocalVariableElement {
-
   /**
    * Is `true` if this variable is potentially mutated somewhere in its scope.
    */
@@ -4341,15 +4682,20 @@
    * @param name the name of this element
    */
   LocalVariableElementImpl(Identifier name) : super.con1(name);
+
   accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this);
+
   ElementKind get kind => ElementKind.LOCAL_VARIABLE;
+
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
       return null;
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
+
   bool get isPotentiallyMutatedInClosure => _isPotentiallyMutatedInClosure2;
+
   bool get isPotentiallyMutatedInScope => _isPotentiallyMutatedInScope2;
 
   /**
@@ -4378,20 +4724,22 @@
     _visibleRangeOffset = offset;
     _visibleRangeLength = length;
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append(type);
     builder.append(" ");
     builder.append(displayName);
   }
+
   String get identifier => "${super.identifier}@${nameOffset}";
 }
+
 /**
  * Instances of the class `MethodElementImpl` implement a `MethodElement`.
  *
  * @coverage dart.engine.element
  */
 class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
-
   /**
    * An empty array of method elements.
    */
@@ -4412,9 +4760,13 @@
    *          declaration of this element
    */
   MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
+
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
+
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
   ElementKind get kind => ElementKind.METHOD;
+
   String get name {
     String name = super.name;
     if (isOperator && name == "-") {
@@ -4424,7 +4776,9 @@
     }
     return super.name;
   }
+
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
+
   bool get isOperator {
     String name = displayName;
     if (name.isEmpty) {
@@ -4433,6 +4787,7 @@
     int first = name.codeUnitAt(0);
     return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A) || first == 0x5F || first == 0x24);
   }
+
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   /**
@@ -4452,6 +4807,7 @@
   void set static(bool isStatic) {
     setModifier(Modifier.STATIC, isStatic);
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append(enclosingElement.displayName);
     builder.append(".");
@@ -4459,6 +4815,7 @@
     super.appendTo(builder);
   }
 }
+
 /**
  * The enumeration `Modifier` defines constants for all of the modifiers defined by the Dart
  * language and for a few additional flags that are useful.
@@ -4467,16 +4824,27 @@
  */
 class Modifier extends Enum<Modifier> {
   static final Modifier ABSTRACT = new Modifier('ABSTRACT', 0);
+
   static final Modifier CONST = new Modifier('CONST', 1);
+
   static final Modifier FACTORY = new Modifier('FACTORY', 2);
+
   static final Modifier FINAL = new Modifier('FINAL', 3);
+
   static final Modifier GETTER = new Modifier('GETTER', 4);
+
   static final Modifier MIXIN = new Modifier('MIXIN', 5);
+
   static final Modifier REFERENCES_SUPER = new Modifier('REFERENCES_SUPER', 6);
+
   static final Modifier SETTER = new Modifier('SETTER', 7);
+
   static final Modifier STATIC = new Modifier('STATIC', 8);
+
   static final Modifier SYNTHETIC = new Modifier('SYNTHETIC', 9);
+
   static final Modifier TYPEDEF = new Modifier('TYPEDEF', 10);
+
   static final List<Modifier> values = [
       ABSTRACT,
       CONST,
@@ -4489,8 +4857,10 @@
       STATIC,
       SYNTHETIC,
       TYPEDEF];
+
   Modifier(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * Instances of the class `MultiplyDefinedElementImpl` represent a collection of elements that
  * have the same name within the same scope.
@@ -4498,7 +4868,6 @@
  * @coverage dart.engine.element
  */
 class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
-
   /**
    * Return an element that represents the given conflicting elements.
    *
@@ -4526,7 +4895,7 @@
    */
   static void add(Set<Element> elements, Element element) {
     if (element is MultiplyDefinedElementImpl) {
-      for (Element conflictingElement in ((element as MultiplyDefinedElementImpl))._conflictingElements) {
+      for (Element conflictingElement in (element as MultiplyDefinedElementImpl)._conflictingElements) {
         javaSetAdd(elements, conflictingElement);
       }
     } else {
@@ -4576,21 +4945,37 @@
     _name = conflictingElements[0].name;
     this._conflictingElements = conflictingElements;
   }
+
   accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
+
   String computeDocumentationComment() => null;
+
   Element getAncestor(Type elementClass) => null;
+
   List<Element> get conflictingElements => _conflictingElements;
+
   AnalysisContext get context => _context;
+
   String get displayName => _name;
+
   Element get enclosingElement => null;
+
   ElementKind get kind => ElementKind.ERROR;
+
   LibraryElement get library => null;
+
   ElementLocation get location => null;
+
   List<ElementAnnotation> get metadata => ElementAnnotationImpl.EMPTY_ARRAY;
+
   String get name => _name;
+
   int get nameOffset => -1;
+
   Source get source => null;
+
   Type2 get type => DynamicTypeImpl.instance;
+
   bool isAccessibleIn(LibraryElement library) {
     for (Element element in _conflictingElements) {
       if (element.isAccessibleIn(library)) {
@@ -4599,7 +4984,11 @@
     }
     return false;
   }
+
+  bool get isDeprecated => false;
+
   bool get isSynthetic => true;
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("[");
@@ -4608,21 +4997,22 @@
       if (i > 0) {
         builder.append(", ");
       }
-      ((_conflictingElements[i] as ElementImpl)).appendTo(builder);
+      (_conflictingElements[i] as ElementImpl).appendTo(builder);
     }
     builder.append("]");
     return builder.toString();
   }
+
   void visitChildren(ElementVisitor visitor) {
   }
 }
+
 /**
  * Instances of the class `ParameterElementImpl` implement a `ParameterElement`.
  *
  * @coverage dart.engine.element
  */
 class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
-
   /**
    * Is `true` if this variable is potentially mutated somewhere in its scope.
    */
@@ -4686,24 +5076,33 @@
    *          declaration of this element
    */
   ParameterElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
+
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+
   SourceRange get defaultValueRange {
     if (_defaultValueRangeLength < 0) {
       return null;
     }
     return new SourceRange(_defaultValueRangeOffset, _defaultValueRangeLength);
   }
+
   ElementKind get kind => ElementKind.PARAMETER;
+
   ParameterKind get parameterKind => _parameterKind;
+
   List<ParameterElement> get parameters => _parameters;
+
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
       return null;
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
+
   bool get isInitializingFormal => false;
+
   bool get isPotentiallyMutatedInClosure => _isPotentiallyMutatedInClosure3;
+
   bool get isPotentiallyMutatedInScope => _isPotentiallyMutatedInScope3;
 
   /**
@@ -4749,7 +5148,7 @@
    */
   void set parameters(List<ParameterElement> parameters) {
     for (ParameterElement parameter in parameters) {
-      ((parameter as ParameterElementImpl)).enclosingElement = this;
+      (parameter as ParameterElementImpl).enclosingElement = this;
     }
     this._parameters = parameters;
   }
@@ -4766,10 +5165,12 @@
     _visibleRangeOffset = offset;
     _visibleRangeLength = length;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_parameters, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     String left = "";
     String right = "";
@@ -4790,13 +5191,13 @@
     builder.append(right);
   }
 }
+
 /**
  * Instances of the class `PrefixElementImpl` implement a `PrefixElement`.
  *
  * @coverage dart.engine.element
  */
 class PrefixElementImpl extends ElementImpl implements PrefixElement {
-
   /**
    * An array containing all of the libraries that are imported using this prefix.
    */
@@ -4813,9 +5214,13 @@
    * @param name the name of this element
    */
   PrefixElementImpl(Identifier name) : super.con1(name);
+
   accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
+
   LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
+
   List<LibraryElement> get importedLibraries => _importedLibraries;
+
   ElementKind get kind => ElementKind.PREFIX;
 
   /**
@@ -4825,16 +5230,19 @@
    */
   void set importedLibraries(List<LibraryElement> importedLibraries) {
     for (LibraryElement library in importedLibraries) {
-      ((library as LibraryElementImpl)).enclosingElement = this;
+      (library as LibraryElementImpl).enclosingElement = this;
     }
     this._importedLibraries = importedLibraries;
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append("as ");
     super.appendTo(builder);
   }
+
   String get identifier => "_${super.identifier}";
 }
+
 /**
  * Instances of the class `PropertyAccessorElementImpl` implement a
  * `PropertyAccessorElement`.
@@ -4842,7 +5250,6 @@
  * @coverage dart.engine.element
  */
 class PropertyAccessorElementImpl extends ExecutableElementImpl implements PropertyAccessorElement {
-
   /**
    * The variable associated with this accessor.
    */
@@ -4870,36 +5277,47 @@
     this._variable = variable;
     synthetic = true;
   }
+
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
-  bool operator ==(Object object) => super == object && identical(isGetter, ((object as PropertyAccessorElement)).isGetter);
+
+  bool operator ==(Object object) => super == object && identical(isGetter, (object as PropertyAccessorElement).isGetter);
+
   PropertyAccessorElement get correspondingGetter {
     if (isGetter || _variable == null) {
       return null;
     }
     return _variable.getter;
   }
+
   PropertyAccessorElement get correspondingSetter {
     if (isSetter || _variable == null) {
       return null;
     }
     return _variable.setter;
   }
+
   ElementKind get kind {
     if (isGetter) {
       return ElementKind.GETTER;
     }
     return ElementKind.SETTER;
   }
+
   String get name {
     if (isSetter) {
       return "${super.name}=";
     }
     return super.name;
   }
+
   PropertyInducingElement get variable => _variable;
+
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
+
   bool get isGetter => hasModifier(Modifier.GETTER);
+
   bool get isSetter => hasModifier(Modifier.SETTER);
+
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   /**
@@ -4946,12 +5364,14 @@
   void set variable(PropertyInducingElement variable) {
     this._variable = variable;
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append(isGetter ? "get " : "set ");
     builder.append(variable.displayName);
     super.appendTo(builder);
   }
 }
+
 /**
  * Instances of the class `PropertyInducingElementImpl` implement a
  * `PropertyInducingElement`.
@@ -4959,7 +5379,6 @@
  * @coverage dart.engine.element
  */
 abstract class PropertyInducingElementImpl extends VariableElementImpl implements PropertyInducingElement {
-
   /**
    * The getter associated with this element.
    */
@@ -4991,7 +5410,9 @@
   PropertyInducingElementImpl.con2(String name) : super.con2(name, -1) {
     synthetic = true;
   }
+
   PropertyAccessorElement get getter => _getter;
+
   PropertyAccessorElement get setter => _setter;
 
   /**
@@ -5012,6 +5433,7 @@
     this._setter = setter;
   }
 }
+
 /**
  * Instances of the class `ShowElementCombinatorImpl` implement a
  * [ShowElementCombinator].
@@ -5019,7 +5441,6 @@
  * @coverage dart.engine.element
  */
 class ShowElementCombinatorImpl implements ShowElementCombinator {
-
   /**
    * The names that are to be made visible in the importing library if they are defined in the
    * imported library.
@@ -5035,8 +5456,11 @@
    * The offset of the 'show' keyword of this element.
    */
   int _offset = 0;
+
   int get end => _end;
+
   int get offset => _offset;
+
   List<String> get shownNames => _shownNames;
 
   /**
@@ -5062,6 +5486,7 @@
   void set shownNames(List<String> shownNames) {
     this._shownNames = shownNames;
   }
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("show ");
@@ -5075,6 +5500,7 @@
     return builder.toString();
   }
 }
+
 /**
  * Instances of the class `TopLevelVariableElementImpl` implement a
  * `TopLevelVariableElement`.
@@ -5082,7 +5508,6 @@
  * @coverage dart.engine.element
  */
 class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements TopLevelVariableElement {
-
   /**
    * An empty array of top-level variable elements.
    */
@@ -5101,17 +5526,20 @@
    * @param name the name of this element
    */
   TopLevelVariableElementImpl.con2(String name) : super.con2(name);
+
   accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
+
   ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
+
   bool get isStatic => true;
 }
+
 /**
  * Instances of the class `TypeParameterElementImpl` implement a [TypeParameterElement].
  *
  * @coverage dart.engine.element
  */
 class TypeParameterElementImpl extends ElementImpl implements TypeParameterElement {
-
   /**
    * The type defined by this type parameter.
    */
@@ -5134,9 +5562,13 @@
    * @param name the name of this element
    */
   TypeParameterElementImpl(Identifier name) : super.con1(name);
+
   accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this);
+
   Type2 get bound => _bound;
+
   ElementKind get kind => ElementKind.TYPE_PARAMETER;
+
   TypeParameterType get type => _type;
 
   /**
@@ -5156,6 +5588,7 @@
   void set type(TypeParameterType type) {
     this._type = type;
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append(displayName);
     if (_bound != null) {
@@ -5164,13 +5597,13 @@
     }
   }
 }
+
 /**
  * Instances of the class `VariableElementImpl` implement a `VariableElement`.
  *
  * @coverage dart.engine.element
  */
 abstract class VariableElementImpl extends ElementImpl implements VariableElement {
-
   /**
    * The declared type of this variable.
    */
@@ -5211,9 +5644,13 @@
    * @return the result of evaluating this variable's initializer
    */
   EvaluationResultImpl get evaluationResult => null;
+
   FunctionElement get initializer => _initializer;
+
   Type2 get type => _type;
+
   bool get isConst => hasModifier(Modifier.CONST);
+
   bool get isFinal => hasModifier(Modifier.FINAL);
 
   /**
@@ -5267,7 +5704,7 @@
    */
   void set initializer(FunctionElement initializer) {
     if (initializer != null) {
-      ((initializer as FunctionElementImpl)).enclosingElement = this;
+      (initializer as FunctionElementImpl).enclosingElement = this;
     }
     this._initializer = initializer;
   }
@@ -5280,22 +5717,24 @@
   void set type(Type2 type) {
     this._type = type;
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_initializer, visitor);
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append(type);
     builder.append(" ");
     builder.append(displayName);
   }
 }
+
 /**
  * Instances of the class `ConstructorMember` represent a constructor element defined in a
  * parameterized type where the values of the type parameters are known.
  */
 class ConstructorMember extends ExecutableMember implements ConstructorElement {
-
   /**
    * If the given constructor's type is different when any type parameters from the defining type's
    * declaration are replaced with the actual type arguments from the defining type, create a
@@ -5331,13 +5770,21 @@
    * @param definingType the type in which the element is defined
    */
   ConstructorMember(ConstructorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
   accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+
   ConstructorElement get baseElement => super.baseElement as ConstructorElement;
+
   ClassElement get enclosingElement => baseElement.enclosingElement;
+
   ConstructorElement get redirectedConstructor => from(baseElement.redirectedConstructor, definingType);
+
   bool get isConst => baseElement.isConst;
+
   bool get isDefaultConstructor => baseElement.isDefaultConstructor;
+
   bool get isFactory => baseElement.isFactory;
+
   String toString() {
     ConstructorElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -5364,15 +5811,16 @@
     }
     return builder.toString();
   }
+
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
+
 /**
  * The abstract class `ExecutableMember` defines the behavior common to members that represent
  * an executable element defined in a parameterized type where the values of the type parameters are
  * known.
  */
 abstract class ExecutableMember extends Member implements ExecutableElement {
-
   /**
    * Initialize a newly created element to represent an executable element of the given
    * parameterized type.
@@ -5381,14 +5829,19 @@
    * @param definingType the type in which the element is defined
    */
   ExecutableMember(ExecutableElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
   ExecutableElement get baseElement => super.baseElement as ExecutableElement;
+
   List<FunctionElement> get functions {
     throw new UnsupportedOperationException();
   }
+
   List<LabelElement> get labels => baseElement.labels;
+
   List<LocalVariableElement> get localVariables {
     throw new UnsupportedOperationException();
   }
+
   List<ParameterElement> get parameters {
     List<ParameterElement> baseParameters = baseElement.parameters;
     int parameterCount = baseParameters.length;
@@ -5401,10 +5854,15 @@
     }
     return parameterizedParameters;
   }
+
   Type2 get returnType => substituteFor(baseElement.returnType);
+
   FunctionType get type => substituteFor(baseElement.type);
+
   bool get isOperator => baseElement.isOperator;
+
   bool get isStatic => baseElement.isStatic;
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(baseElement.functions, visitor);
@@ -5413,12 +5871,12 @@
     safelyVisitChildren(parameters, visitor);
   }
 }
+
 /**
  * Instances of the class `FieldMember` represent a field element defined in a parameterized
  * type where the values of the type parameters are known.
  */
 class FieldMember extends VariableMember implements FieldElement {
-
   /**
    * If the given field's type is different when any type parameters from the defining type's
    * declaration are replaced with the actual type arguments from the defining type, create a field
@@ -5454,20 +5912,27 @@
    * @param definingType the type in which the element is defined
    */
   FieldMember(FieldElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
+
   FieldElement get baseElement => super.baseElement as FieldElement;
+
   ClassElement get enclosingElement => baseElement.enclosingElement;
+
   PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
+
   PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
+
   bool get isStatic => baseElement.isStatic;
+
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
+
 /**
  * The abstract class `Member` defines the behavior common to elements that represent members
  * of parameterized types.
  */
 abstract class Member implements Element {
-
   /**
    * The element on which the parameterized element was created.
    */
@@ -5488,7 +5953,9 @@
     this._baseElement = baseElement;
     this._definingType = definingType;
   }
+
   String computeDocumentationComment() => _baseElement.computeDocumentationComment();
+
   Element getAncestor(Type elementClass) => baseElement.getAncestor(elementClass);
 
   /**
@@ -5497,17 +5964,31 @@
    * @return the element on which the parameterized element was created
    */
   Element get baseElement => _baseElement;
+
   AnalysisContext get context => _baseElement.context;
+
   String get displayName => _baseElement.displayName;
+
   ElementKind get kind => _baseElement.kind;
+
   LibraryElement get library => _baseElement.library;
+
   ElementLocation get location => _baseElement.location;
+
   List<ElementAnnotation> get metadata => _baseElement.metadata;
+
   String get name => _baseElement.name;
+
   int get nameOffset => _baseElement.nameOffset;
+
   Source get source => _baseElement.source;
+
   bool isAccessibleIn(LibraryElement library) => _baseElement.isAccessibleIn(library);
+
+  bool get isDeprecated => _baseElement.isDeprecated;
+
   bool get isSynthetic => _baseElement.isSynthetic;
+
   void visitChildren(ElementVisitor visitor) {
   }
 
@@ -5573,12 +6054,12 @@
     return substitutedTypes;
   }
 }
+
 /**
  * Instances of the class `MethodMember` represent a method element defined in a parameterized
  * type where the values of the type parameters are known.
  */
 class MethodMember extends ExecutableMember implements MethodElement {
-
   /**
    * If the given method's type is different when any type parameters from the defining type's
    * declaration are replaced with the actual type arguments from the defining type, create a method
@@ -5611,10 +6092,15 @@
    * @param definingType the type in which the element is defined
    */
   MethodMember(MethodElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
+
   MethodElement get baseElement => super.baseElement as MethodElement;
+
   ClassElement get enclosingElement => baseElement.enclosingElement;
+
   bool get isAbstract => baseElement.isAbstract;
+
   String toString() {
     MethodElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -5639,12 +6125,12 @@
     return builder.toString();
   }
 }
+
 /**
  * Instances of the class `ParameterMember` represent a parameter element defined in a
  * parameterized type where the values of the type parameters are known.
  */
 class ParameterMember extends VariableMember implements ParameterElement {
-
   /**
    * If the given parameter's type is different when any type parameters from the defining type's
    * declaration are replaced with the actual type arguments from the defining type, create a
@@ -5679,7 +6165,9 @@
    * @param definingType the type in which the element is defined
    */
   ParameterMember(ParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
+
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+
   Element getAncestor(Type elementClass) {
     Element element = baseElement.getAncestor(elementClass);
     ParameterizedType definingType = this.definingType;
@@ -5695,10 +6183,15 @@
     }
     return element;
   }
+
   ParameterElement get baseElement => super.baseElement as ParameterElement;
+
   SourceRange get defaultValueRange => baseElement.defaultValueRange;
+
   Element get enclosingElement => baseElement.enclosingElement;
+
   ParameterKind get parameterKind => baseElement.parameterKind;
+
   List<ParameterElement> get parameters {
     List<ParameterElement> baseParameters = baseElement.parameters;
     int parameterCount = baseParameters.length;
@@ -5711,8 +6204,11 @@
     }
     return parameterizedParameters;
   }
+
   SourceRange get visibleRange => baseElement.visibleRange;
+
   bool get isInitializingFormal => baseElement.isInitializingFormal;
+
   String toString() {
     ParameterElement baseElement = this.baseElement;
     String left = "";
@@ -5735,17 +6231,18 @@
     builder.append(right);
     return builder.toString();
   }
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(parameters, visitor);
   }
 }
+
 /**
  * Instances of the class `PropertyAccessorMember` represent a property accessor element
  * defined in a parameterized type where the values of the type parameters are known.
  */
 class PropertyAccessorMember extends ExecutableMember implements PropertyAccessorElement {
-
   /**
    * If the given property accessor's type is different when any type parameters from the defining
    * type's declaration are replaced with the actual type arguments from the defining type, create a
@@ -5779,11 +6276,17 @@
    * @param definingType the type in which the element is defined
    */
   PropertyAccessorMember(PropertyAccessorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
+
   PropertyAccessorElement get baseElement => super.baseElement as PropertyAccessorElement;
+
   PropertyAccessorElement get correspondingGetter => from(baseElement.correspondingGetter, definingType);
+
   PropertyAccessorElement get correspondingSetter => from(baseElement.correspondingSetter, definingType);
+
   Element get enclosingElement => baseElement.enclosingElement;
+
   PropertyInducingElement get variable {
     PropertyInducingElement variable = baseElement.variable;
     if (variable is FieldElement) {
@@ -5791,9 +6294,13 @@
     }
     return variable;
   }
+
   bool get isAbstract => baseElement.isAbstract;
+
   bool get isGetter => baseElement.isGetter;
+
   bool get isSetter => baseElement.isSetter;
+
   String toString() {
     PropertyAccessorElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -5822,15 +6329,16 @@
     }
     return builder.toString();
   }
+
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
+
 /**
  * The abstract class `VariableMember` defines the behavior common to members that represent a
  * variable element defined in a parameterized type where the values of the type parameters are
  * known.
  */
 abstract class VariableMember extends Member implements VariableElement {
-
   /**
    * Initialize a newly created element to represent an executable element of the given
    * parameterized type.
@@ -5839,25 +6347,31 @@
    * @param definingType the type in which the element is defined
    */
   VariableMember(VariableElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
+
   VariableElement get baseElement => super.baseElement as VariableElement;
+
   FunctionElement get initializer {
     throw new UnsupportedOperationException();
   }
+
   Type2 get type => substituteFor(baseElement.type);
+
   bool get isConst => baseElement.isConst;
+
   bool get isFinal => baseElement.isFinal;
+
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(baseElement.initializer, visitor);
   }
 }
+
 /**
  * The unique instance of the class `BottomTypeImpl` implements the type `bottom`.
  *
  * @coverage dart.engine.type
  */
 class BottomTypeImpl extends TypeImpl {
-
   /**
    * The unique instance of this class.
    */
@@ -5867,20 +6381,26 @@
    * Prevent the creation of instances of this class.
    */
   BottomTypeImpl() : super(null, "<bottom>");
+
   bool operator ==(Object object) => identical(object, this);
+
   bool get isBottom => true;
+
   bool isMoreSpecificThan3(Type2 type, bool withDynamic) => true;
+
   bool isSubtypeOf(Type2 type) => true;
+
   bool isSupertypeOf(Type2 type) => false;
+
   BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
+
 /**
  * The unique instance of the class `DynamicTypeImpl` implements the type `dynamic`.
  *
  * @coverage dart.engine.type
  */
 class DynamicTypeImpl extends TypeImpl {
-
   /**
    * The unique instance of this class.
    */
@@ -5890,18 +6410,24 @@
    * Prevent the creation of instances of this class.
    */
   DynamicTypeImpl() : super(new DynamicElementImpl(), Keyword.DYNAMIC.syntax) {
-    ((element as DynamicElementImpl)).type = this;
+    (element as DynamicElementImpl).type = this;
   }
+
   bool operator ==(Object object) => object is DynamicTypeImpl;
+
   bool get isDynamic => true;
+
   bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (identical(this, type)) {
       return true;
     }
     return withDynamic;
   }
+
   bool isSubtypeOf(Type2 type) => true;
+
   bool isSupertypeOf(Type2 type) => true;
+
   Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
     int length = parameterTypes.length;
     for (int i = 0; i < length; i++) {
@@ -5912,6 +6438,7 @@
     return this;
   }
 }
+
 /**
  * Instances of the class `FunctionTypeImpl` defines the behavior common to objects
  * representing the type of a function, method, constructor, getter, or setter.
@@ -5919,7 +6446,6 @@
  * @coverage dart.engine.type
  */
 class FunctionTypeImpl extends TypeImpl implements FunctionType {
-
   /**
    * Return `true` if all of the name/type pairs in the first map are equal to the
    * corresponding name/type pairs in the second map. The maps are expected to iterate over their
@@ -5966,6 +6492,7 @@
    * @param element the element representing the declaration of the function type
    */
   FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name);
+
   bool operator ==(Object object) {
     if (object is! FunctionTypeImpl) {
       return false;
@@ -5973,6 +6500,7 @@
     FunctionTypeImpl otherType = object as FunctionTypeImpl;
     return (element == otherType.element) && JavaArrays.equals(normalParameterTypes, otherType.normalParameterTypes) && JavaArrays.equals(optionalParameterTypes, otherType.optionalParameterTypes) && equals2(namedParameterTypes, otherType.namedParameterTypes) && (returnType == otherType.returnType);
   }
+
   String get displayName {
     String name = this.name;
     if (name == null || name.length == 0) {
@@ -6039,6 +6567,7 @@
     }
     return name;
   }
+
   Map<String, Type2> get namedParameterTypes {
     LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
     List<ParameterElement> parameters = baseParameters;
@@ -6053,6 +6582,7 @@
     }
     return namedParameterTypes;
   }
+
   List<Type2> get normalParameterTypes {
     List<ParameterElement> parameters = baseParameters;
     if (parameters.length == 0) {
@@ -6067,6 +6597,7 @@
     }
     return new List.from(types);
   }
+
   List<Type2> get optionalParameterTypes {
     List<ParameterElement> parameters = baseParameters;
     if (parameters.length == 0) {
@@ -6081,6 +6612,7 @@
     }
     return new List.from(types);
   }
+
   List<ParameterElement> get parameters {
     List<ParameterElement> baseParameters = this.baseParameters;
     int parameterCount = baseParameters.length;
@@ -6093,6 +6625,7 @@
     }
     return specializedParameters;
   }
+
   Type2 get returnType {
     Type2 baseReturnType = this.baseReturnType;
     if (baseReturnType == null) {
@@ -6100,11 +6633,13 @@
     }
     return baseReturnType.substitute2(_typeArguments, TypeParameterTypeImpl.getTypes(typeParameters));
   }
+
   List<Type2> get typeArguments => _typeArguments;
+
   List<TypeParameterElement> get typeParameters {
     Element element = this.element;
     if (element is FunctionTypeAliasElement) {
-      return ((element as FunctionTypeAliasElement)).typeParameters;
+      return (element as FunctionTypeAliasElement).typeParameters;
     }
     ClassElement definingClass = element.getAncestor(ClassElement);
     if (definingClass != null) {
@@ -6112,6 +6647,7 @@
     }
     return TypeParameterElementImpl.EMPTY_ARRAY;
   }
+
   int get hashCode {
     Element element = this.element;
     if (element == null) {
@@ -6119,7 +6655,9 @@
     }
     return element.hashCode;
   }
+
   bool isAssignableTo(Type2 type) => this.isSubtypeOf(type);
+
   bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (type == null) {
       return false;
@@ -6205,6 +6743,7 @@
     Type2 sRetType = s.returnType;
     return sRetType.isVoid || tRetType.isMoreSpecificThan3(sRetType, withDynamic);
   }
+
   bool isSubtypeOf(Type2 type) {
     if (type == null) {
       return false;
@@ -6299,7 +6838,9 @@
   void set typeArguments(List<Type2> typeArguments) {
     this._typeArguments = typeArguments;
   }
+
   FunctionTypeImpl substitute3(List<Type2> argumentTypes) => substitute2(argumentTypes, typeArguments);
+
   FunctionTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
     if (argumentTypes.length != parameterTypes.length) {
       throw new IllegalArgumentException("argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
@@ -6312,6 +6853,7 @@
     newType.typeArguments = TypeImpl.substitute(_typeArguments, argumentTypes, parameterTypes);
     return newType;
   }
+
   void appendTo(JavaStringBuilder builder) {
     List<Type2> normalParameterTypes = this.normalParameterTypes;
     List<Type2> optionalParameterTypes = this.optionalParameterTypes;
@@ -6326,7 +6868,7 @@
         } else {
           needsComma = true;
         }
-        ((type as TypeImpl)).appendTo(builder);
+        (type as TypeImpl).appendTo(builder);
       }
     }
     if (optionalParameterTypes.length > 0) {
@@ -6341,7 +6883,7 @@
         } else {
           needsComma = true;
         }
-        ((type as TypeImpl)).appendTo(builder);
+        (type as TypeImpl).appendTo(builder);
       }
       builder.append("]");
       needsComma = true;
@@ -6360,7 +6902,7 @@
         }
         builder.append(entry.getKey());
         builder.append(": ");
-        ((entry.getValue() as TypeImpl)).appendTo(builder);
+        (entry.getValue() as TypeImpl).appendTo(builder);
       }
       builder.append("}");
       needsComma = true;
@@ -6369,7 +6911,7 @@
     if (returnType == null) {
       builder.append("null");
     } else {
-      ((returnType as TypeImpl)).appendTo(builder);
+      (returnType as TypeImpl).appendTo(builder);
     }
   }
 
@@ -6379,9 +6921,9 @@
   List<ParameterElement> get baseParameters {
     Element element = this.element;
     if (element is ExecutableElement) {
-      return ((element as ExecutableElement)).parameters;
+      return (element as ExecutableElement).parameters;
     } else {
-      return ((element as FunctionTypeAliasElement)).parameters;
+      return (element as FunctionTypeAliasElement).parameters;
     }
   }
 
@@ -6393,12 +6935,13 @@
   Type2 get baseReturnType {
     Element element = this.element;
     if (element is ExecutableElement) {
-      return ((element as ExecutableElement)).returnType;
+      return (element as ExecutableElement).returnType;
     } else {
-      return ((element as FunctionTypeAliasElement)).returnType;
+      return (element as FunctionTypeAliasElement).returnType;
     }
   }
 }
+
 /**
  * Instances of the class `InterfaceTypeImpl` defines the behavior common to objects
  * representing the type introduced by either a class or an interface, or a reference to such a
@@ -6407,7 +6950,6 @@
  * @coverage dart.engine.type
  */
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
-
   /**
    * An empty array of types.
    */
@@ -6583,6 +7125,7 @@
    * @param name the name of the type
    */
   InterfaceTypeImpl.con2(String name) : super(null, name);
+
   bool operator ==(Object object) {
     if (object is! InterfaceTypeImpl) {
       return false;
@@ -6590,6 +7133,7 @@
     InterfaceTypeImpl otherType = object as InterfaceTypeImpl;
     return (element == otherType.element) && JavaArrays.equals(_typeArguments, otherType._typeArguments);
   }
+
   List<PropertyAccessorElement> get accessors {
     List<PropertyAccessorElement> accessors = element.accessors;
     List<PropertyAccessorElement> members = new List<PropertyAccessorElement>(accessors.length);
@@ -6598,6 +7142,7 @@
     }
     return members;
   }
+
   String get displayName {
     String name = this.name;
     List<Type2> typeArguments = this.typeArguments;
@@ -6624,8 +7169,11 @@
     }
     return name;
   }
+
   ClassElement get element => super.element as ClassElement;
-  PropertyAccessorElement getGetter(String getterName) => PropertyAccessorMember.from(((element as ClassElementImpl)).getGetter(getterName), this);
+
+  PropertyAccessorElement getGetter(String getterName) => PropertyAccessorMember.from((element as ClassElementImpl).getGetter(getterName), this);
+
   List<InterfaceType> get interfaces {
     ClassElement classElement = element;
     List<InterfaceType> interfaces = classElement.interfaces;
@@ -6641,6 +7189,7 @@
     }
     return typedInterfaces;
   }
+
   Type2 getLeastUpperBound(Type2 type) {
     if (identical(type, this)) {
       return this;
@@ -6682,7 +7231,9 @@
     }
     return null;
   }
-  MethodElement getMethod(String methodName) => MethodMember.from(((element as ClassElementImpl)).getMethod(methodName), this);
+
+  MethodElement getMethod(String methodName) => MethodMember.from((element as ClassElementImpl).getMethod(methodName), this);
+
   List<MethodElement> get methods {
     List<MethodElement> methods = element.methods;
     List<MethodElement> members = new List<MethodElement>(methods.length);
@@ -6691,6 +7242,7 @@
     }
     return members;
   }
+
   List<InterfaceType> get mixins {
     ClassElement classElement = element;
     List<InterfaceType> mixins = classElement.mixins;
@@ -6706,7 +7258,9 @@
     }
     return typedMixins;
   }
-  PropertyAccessorElement getSetter(String setterName) => PropertyAccessorMember.from(((element as ClassElementImpl)).getSetter(setterName), this);
+
+  PropertyAccessorElement getSetter(String setterName) => PropertyAccessorMember.from((element as ClassElementImpl).getSetter(setterName), this);
+
   InterfaceType get superclass {
     ClassElement classElement = element;
     InterfaceType supertype = classElement.supertype;
@@ -6715,8 +7269,11 @@
     }
     return supertype.substitute2(_typeArguments, classElement.type.typeArguments);
   }
+
   List<Type2> get typeArguments => _typeArguments;
+
   List<TypeParameterElement> get typeParameters => element.typeParameters;
+
   int get hashCode {
     ClassElement element = this.element;
     if (element == null) {
@@ -6724,6 +7281,7 @@
     }
     return element.hashCode;
   }
+
   bool get isDartCoreFunction {
     ClassElement element = this.element;
     if (element == null) {
@@ -6731,6 +7289,7 @@
     }
     return element.name == "Function" && element.library.isDartCore;
   }
+
   bool isDirectSupertypeOf(InterfaceType type) {
     InterfaceType i = this;
     InterfaceType j = type;
@@ -6759,6 +7318,7 @@
     }
     return false;
   }
+
   bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (identical(type, DynamicTypeImpl.instance)) {
       return true;
@@ -6767,7 +7327,9 @@
     }
     return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>(), withDynamic);
   }
+
   bool get isObject => element.supertype == null;
+
   bool isSubtypeOf(Type2 type) {
     if (identical(type, DynamicTypeImpl.instance)) {
       return true;
@@ -6787,6 +7349,7 @@
     }
     return isSubtypeOf2(type as InterfaceType, new Set<ClassElement>());
   }
+
   ConstructorElement lookUpConstructor(String constructorName, LibraryElement library) {
     ConstructorElement constructorElement;
     if (constructorName == null) {
@@ -6799,6 +7362,7 @@
     }
     return ConstructorMember.from(constructorElement, this);
   }
+
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
     PropertyAccessorElement element = getGetter(getterName);
     if (element != null && element.isAccessibleIn(library)) {
@@ -6806,6 +7370,7 @@
     }
     return lookUpGetterInSuperclass(getterName, library);
   }
+
   PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
       PropertyAccessorElement element = mixin.getGetter(getterName);
@@ -6833,6 +7398,7 @@
     }
     return null;
   }
+
   MethodElement lookUpMethod(String methodName, LibraryElement library) {
     MethodElement element = getMethod(methodName);
     if (element != null && element.isAccessibleIn(library)) {
@@ -6840,6 +7406,7 @@
     }
     return lookUpMethodInSuperclass(methodName, library);
   }
+
   MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
       MethodElement element = mixin.getMethod(methodName);
@@ -6867,6 +7434,7 @@
     }
     return null;
   }
+
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
     PropertyAccessorElement element = getSetter(setterName);
     if (element != null && element.isAccessibleIn(library)) {
@@ -6874,6 +7442,7 @@
     }
     return lookUpSetterInSuperclass(setterName, library);
   }
+
   PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
       PropertyAccessorElement element = mixin.getSetter(setterName);
@@ -6910,7 +7479,9 @@
   void set typeArguments(List<Type2> typeArguments) {
     this._typeArguments = typeArguments;
   }
+
   InterfaceTypeImpl substitute4(List<Type2> argumentTypes) => substitute2(argumentTypes, typeArguments);
+
   InterfaceTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
     if (argumentTypes.length != parameterTypes.length) {
       throw new IllegalArgumentException("argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
@@ -6926,6 +7497,7 @@
     newType.typeArguments = newTypeArguments;
     return newType;
   }
+
   void appendTo(JavaStringBuilder builder) {
     builder.append(name);
     int argumentCount = _typeArguments.length;
@@ -6935,11 +7507,12 @@
         if (i > 0) {
           builder.append(", ");
         }
-        ((_typeArguments[i] as TypeImpl)).appendTo(builder);
+        (_typeArguments[i] as TypeImpl).appendTo(builder);
       }
       builder.append(">");
     }
   }
+
   bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses, bool withDynamic) {
     if (this == s) {
       return true;
@@ -6968,21 +7541,22 @@
     }
     javaSetAdd(visitedClasses, element);
     InterfaceType supertype = superclass;
-    if (supertype != null && ((supertype as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
+    if (supertype != null && (supertype as InterfaceTypeImpl).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
       return true;
     }
     for (InterfaceType interfaceType in interfaces) {
-      if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
+      if ((interfaceType as InterfaceTypeImpl).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
         return true;
       }
     }
     for (InterfaceType mixinType in mixins) {
-      if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
+      if ((mixinType as InterfaceTypeImpl).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
         return true;
       }
     }
     return false;
   }
+
   bool isSubtypeOf2(InterfaceType type, Set<ClassElement> visitedClasses) {
     InterfaceType typeT = this;
     InterfaceType typeS = type;
@@ -7009,24 +7583,25 @@
       return true;
     }
     InterfaceType supertype = superclass;
-    if (supertype != null && ((supertype as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+    if (supertype != null && (supertype as InterfaceTypeImpl).isSubtypeOf2(typeS, visitedClasses)) {
       return true;
     }
     List<InterfaceType> interfaceTypes = interfaces;
     for (InterfaceType interfaceType in interfaceTypes) {
-      if (((interfaceType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+      if ((interfaceType as InterfaceTypeImpl).isSubtypeOf2(typeS, visitedClasses)) {
         return true;
       }
     }
     List<InterfaceType> mixinTypes = mixins;
     for (InterfaceType mixinType in mixinTypes) {
-      if (((mixinType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+      if ((mixinType as InterfaceTypeImpl).isSubtypeOf2(typeS, visitedClasses)) {
         return true;
       }
     }
     return false;
   }
 }
+
 /**
  * The abstract class `TypeImpl` implements the behavior common to objects representing the
  * declared type of elements in the element model.
@@ -7034,7 +7609,6 @@
  * @coverage dart.engine.type
  */
 abstract class TypeImpl implements Type2 {
-
   /**
    * Return an array containing the results of using the given argument types and parameter types to
    * perform a substitution on all of the given types.
@@ -7082,19 +7656,33 @@
     this._element = element;
     this._name = name;
   }
+
   String get displayName => name;
+
   Element get element => _element;
+
   Type2 getLeastUpperBound(Type2 type) => null;
+
   String get name => _name;
+
   bool isAssignableTo(Type2 type) => this.isSubtypeOf(type) || type.isSubtypeOf(this);
+
   bool get isBottom => false;
+
   bool get isDartCoreFunction => false;
+
   bool get isDynamic => false;
+
   bool isMoreSpecificThan(Type2 type) => isMoreSpecificThan3(type, false);
+
   bool isMoreSpecificThan3(Type2 type, bool withDynamic) => false;
+
   bool get isObject => false;
+
   bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
+
   bool get isVoid => false;
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     appendTo(builder);
@@ -7114,6 +7702,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `TypeParameterTypeImpl` defines the behavior of objects representing
  * the type introduced by a type parameter.
@@ -7121,7 +7710,6 @@
  * @coverage dart.engine.type
  */
 class TypeParameterTypeImpl extends TypeImpl implements TypeParameterType {
-
   /**
    * An empty array of type parameter types.
    */
@@ -7154,9 +7742,13 @@
    * @param element the element representing the declaration of the type parameter
    */
   TypeParameterTypeImpl(TypeParameterElement element) : super(element, element.name);
-  bool operator ==(Object object) => object is TypeParameterTypeImpl && (element == ((object as TypeParameterTypeImpl)).element);
+
+  bool operator ==(Object object) => object is TypeParameterTypeImpl && (element == (object as TypeParameterTypeImpl).element);
+
   TypeParameterElement get element => super.element as TypeParameterElement;
+
   int get hashCode => element.hashCode;
+
   bool isMoreSpecificThan3(Type2 s, bool withDynamic) {
     if (this == s) {
       return true;
@@ -7169,7 +7761,9 @@
     }
     return isMoreSpecificThan4(s, new Set<Type2>(), withDynamic);
   }
+
   bool isSubtypeOf(Type2 s) => isMoreSpecificThan3(s, true);
+
   Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
     int length = parameterTypes.length;
     for (int i = 0; i < length; i++) {
@@ -7179,6 +7773,7 @@
     }
     return this;
   }
+
   bool isMoreSpecificThan4(Type2 s, Set<Type2> visitedTypes, bool withDynamic) {
     Type2 bound = element.bound;
     if (s == bound) {
@@ -7201,13 +7796,13 @@
     return bound.isMoreSpecificThan3(s, withDynamic);
   }
 }
+
 /**
  * The unique instance of the class `VoidTypeImpl` implements the type `void`.
  *
  * @coverage dart.engine.type
  */
 class VoidTypeImpl extends TypeImpl implements VoidType {
-
   /**
    * The unique instance of this class.
    */
@@ -7217,11 +7812,18 @@
    * Prevent the creation of instances of this class.
    */
   VoidTypeImpl() : super(null, Keyword.VOID.syntax);
+
   bool operator ==(Object object) => identical(object, this);
+
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) => isSubtypeOf(type);
+
   bool isSubtypeOf(Type2 type) => identical(type, this) || identical(type, DynamicTypeImpl.instance);
+
   bool get isVoid => true;
+
   VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
 }
+
 /**
  * The interface `FunctionType` defines the behavior common to objects representing the type
  * of a function, method, constructor, getter, or setter. Function types come in three variations:
@@ -7238,7 +7840,6 @@
  * @coverage dart.engine.type
  */
 abstract class FunctionType implements ParameterizedType {
-
   /**
    * Return a map from the names of named parameters to the types of the named parameters of this
    * type of function. The entries in the map will be iterated in the same order as the order in
@@ -7357,8 +7958,10 @@
    * @return the result of performing the substitution
    */
   FunctionType substitute3(List<Type2> argumentTypes);
+
   FunctionType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
+
 /**
  * The interface `InterfaceType` defines the behavior common to objects representing the type
  * introduced by either a class or an interface, or a reference to such a type.
@@ -7366,13 +7969,13 @@
  * @coverage dart.engine.type
  */
 abstract class InterfaceType implements ParameterizedType {
-
   /**
    * Return an array containing all of the accessors (getters and setters) declared in this type.
    *
    * @return the accessors declared in this type
    */
   List<PropertyAccessorElement> get accessors;
+
   ClassElement get element;
 
   /**
@@ -7659,8 +8262,10 @@
    * @return the result of performing the substitution
    */
   InterfaceType substitute4(List<Type2> argumentTypes);
+
   InterfaceType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
+
 /**
  * The interface `ParameterizedType` defines the behavior common to objects representing a
  * type with type parameters, such as a class or function type alias.
@@ -7668,7 +8273,6 @@
  * @coverage dart.engine.type
  */
 abstract class ParameterizedType implements Type2 {
-
   /**
    * Return an array containing the actual types of the type arguments. If this type's element does
    * not have type parameters, then the array should be empty (although it is possible for type
@@ -7687,6 +8291,7 @@
    */
   List<TypeParameterElement> get typeParameters;
 }
+
 /**
  * The interface `Type` defines the behavior of objects representing the declared type of
  * elements in the element model.
@@ -7694,7 +8299,6 @@
  * @coverage dart.engine.type
  */
 abstract class Type2 {
-
   /**
    * Return the name of this type as it should appear when presented to users in contexts such as
    * error messages.
@@ -7825,6 +8429,7 @@
    */
   Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
 }
+
 /**
  * The interface `TypeParameterType` defines the behavior of objects representing the type
  * introduced by a type parameter.
@@ -7834,6 +8439,7 @@
 abstract class TypeParameterType implements Type2 {
   TypeParameterElement get element;
 }
+
 /**
  * The interface `VoidType` defines the behavior of the unique object representing the type
  * `void`.
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 904598b..5ca1fee 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1,6 +1,8 @@
 // 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 engine;
+
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'utilities_collection.dart';
@@ -15,6 +17,7 @@
 import 'element.dart';
 import 'resolver.dart';
 import 'html.dart' show XmlTagNode, XmlAttributeNode, RecursiveXmlVisitor, HtmlScanner, HtmlScanResult, HtmlParser, HtmlParseResult, HtmlUnit;
+
 /**
  * The unique instance of the class `AnalysisEngine` serves as the entry point for the
  * functionality provided by the analysis engine.
@@ -22,7 +25,6 @@
  * @coverage dart.engine
  */
 class AnalysisEngine {
-
   /**
    * The suffix used for Dart source files.
    */
@@ -105,11 +107,11 @@
     this._logger = logger == null ? Logger.NULL : logger;
   }
 }
+
 /**
  * Container with statistics about the [AnalysisContext].
  */
 abstract class AnalysisContentStatistics {
-
   /**
    * Return the exceptions that caused some entries to have a state of [CacheState#ERROR].
    *
@@ -124,17 +126,24 @@
    */
   List<AnalysisContentStatistics_CacheRow> get cacheRows;
 }
+
 /**
  * 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
@@ -170,7 +179,6 @@
  * proposed future state, such as the state after a refactoring.
  */
 abstract class AnalysisContext {
-
   /**
    * 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.
@@ -620,12 +628,12 @@
    */
   Iterable<Source> sourcesToResolve(List<Source> changedSources);
 }
+
 /**
  * The interface `AnalysisErrorInfo` contains the analysis errors and line information for the
  * errors.
  */
 abstract class AnalysisErrorInfo {
-
   /**
    * Return the errors that as a result of the analysis, or `null` if there were no errors.
    *
@@ -641,6 +649,7 @@
    */
   LineInfo get lineInfo;
 }
+
 /**
  * Instances of the class `AnalysisException` represent an exception that occurred during the
  * analysis of one or more sources.
@@ -648,7 +657,6 @@
  * @coverage dart.engine
  */
 class AnalysisException extends JavaException {
-
   /**
    * Initialize a newly created exception.
    */
@@ -676,12 +684,12 @@
    */
   AnalysisException.con3(Exception cause) : super.withCause(cause);
 }
+
 /**
  * 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.
  */
 abstract class AnalysisOptions {
-
   /**
    * Return the maximum number of sources for which AST structures should be kept in the cache.
    *
@@ -712,11 +720,11 @@
    */
   bool get strictMode;
 }
+
 /**
  * Instances of the class `AnalysisResult`
  */
 class AnalysisResult {
-
   /**
    * The change notices associated with this result, or `null` if there were no changes and
    * there is no more work to be done.
@@ -753,6 +761,7 @@
     this.performTime = performTime;
   }
 }
+
 /**
  * The interface `ChangeNotice` defines the behavior of objects that represent a change to the
  * analysis results associated with a given source.
@@ -760,7 +769,6 @@
  * @coverage dart.engine
  */
 abstract class ChangeNotice implements AnalysisErrorInfo {
-
   /**
    * Return the fully resolved AST that changed as a result of the analysis, or `null` if the
    * AST was not changed.
@@ -776,6 +784,7 @@
    */
   Source get source;
 }
+
 /**
  * Instances of the class `ChangeSet` indicate what sources have been added, changed, or
  * removed.
@@ -783,7 +792,6 @@
  * @coverage dart.engine
  */
 class ChangeSet {
-
   /**
    * A list containing the sources that have been added.
    */
@@ -852,6 +860,7 @@
       removedContainers.add(container);
     }
   }
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     bool needsSeparator = appendSources(builder, added3, false, "added");
@@ -902,12 +911,12 @@
     return true;
   }
 }
+
 /**
  * Instances of the class `AnalysisCache` implement an LRU cache of information related to
  * analysis.
  */
 class AnalysisCache {
-
   /**
    * A table mapping the sources known to the context to the information known about the source.
    */
@@ -1031,11 +1040,11 @@
     }
     SourceEntry sourceEntry = _sourceMap[removedSource];
     if (sourceEntry is HtmlEntry) {
-      HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+      HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
       htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
       _sourceMap[removedSource] = htmlCopy;
     } else if (sourceEntry is DartEntry) {
-      DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+      DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
       dartCopy.flushAstStructures();
       _sourceMap[removedSource] = dartCopy;
     }
@@ -1067,12 +1076,12 @@
     return _recentlyUsed.removeAt(sourceToRemove);
   }
 }
+
 /**
  * Instances of the class `CacheRetentionPolicy` define the behavior of objects that determine
  * how important it is for data to be retained in the analysis cache.
  */
 abstract class CacheRetentionPolicy {
-
   /**
    * Return the priority of retaining the AST structure for the given source.
    *
@@ -1082,11 +1091,11 @@
    */
   RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry);
 }
+
 /**
  * The enumeration `CacheState` defines the possible states of cached data.
  */
 class CacheState extends Enum<CacheState> {
-
   /**
    * The data is not in the cache and the last time an attempt was made to compute the data an
    * exception occurred, making it pointless to attempt.
@@ -1141,9 +1150,12 @@
    *
    */
   static final CacheState VALID = new CacheState('VALID', 4);
+
   static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
+
   CacheState(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * The interface `DartEntry` defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual Dart file.
@@ -1151,7 +1163,6 @@
  * @coverage dart.engine
  */
 abstract class DartEntry implements SourceEntry {
-
   /**
    * The data descriptor representing the library element for the library. This data is only
    * available for Dart files that are the defining compilation unit of a library.
@@ -1274,6 +1285,7 @@
    * @return the value of the data represented by the given descriptor and library
    */
   Object getValue2(DataDescriptor descriptor, Source librarySource);
+
   DartEntryImpl get writableCopy;
 
   /**
@@ -1291,13 +1303,13 @@
    */
   bool get isRefactoringSafe;
 }
+
 /**
  * Instances of the class `DartEntryImpl` implement a [DartEntry].
  *
  * @coverage dart.engine
  */
 class DartEntryImpl extends SourceEntryImpl implements DartEntry {
-
   /**
    * The state of the cached source kind.
    */
@@ -1434,6 +1446,7 @@
     }
     _resolutionState.flushAstStructures();
   }
+
   List<AnalysisError> get allErrors {
     List<AnalysisError> errors = new List<AnalysisError>();
     for (AnalysisError error in _parseErrors) {
@@ -1458,6 +1471,7 @@
     }
     return new List.from(errors);
   }
+
   CompilationUnit get anyParsedCompilationUnit {
     if (identical(_parsedUnitState, CacheState.VALID)) {
       _parsedUnitAccessed = true;
@@ -1465,6 +1479,7 @@
     }
     return anyResolvedCompilationUnit;
   }
+
   CompilationUnit get anyResolvedCompilationUnit {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -1476,6 +1491,7 @@
     ;
     return null;
   }
+
   SourceKind get kind => _sourceKind;
 
   /**
@@ -1520,6 +1536,7 @@
     ;
     return null;
   }
+
   CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
       return _elementState;
@@ -1545,6 +1562,7 @@
       return super.getState(descriptor);
     }
   }
+
   CacheState getState2(DataDescriptor descriptor, Source librarySource) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -1570,6 +1588,7 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
+
   Object getValue(DataDescriptor descriptor) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
       return _element as Object;
@@ -1595,6 +1614,7 @@
     }
     return super.getValue(descriptor);
   }
+
   Object getValue2(DataDescriptor descriptor, Source librarySource) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -1622,11 +1642,13 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
+
   DartEntryImpl get writableCopy {
     DartEntryImpl copy = new DartEntryImpl();
     copy.copyFrom(this);
     return copy;
   }
+
   bool hasInvalidData(DataDescriptor descriptor) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
       return identical(_elementState, CacheState.INVALID);
@@ -1700,6 +1722,7 @@
     }
     discardCachedResolutionInformation();
   }
+
   bool get isRefactoringSafe {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -1880,6 +1903,7 @@
       _parseErrorsState = CacheState.VALID;
     }
   }
+
   void setState(DataDescriptor descriptor, CacheState state) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = updatedValue(state, _element, null);
@@ -1947,6 +1971,7 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
+
   void setValue(DataDescriptor descriptor, Object value) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = value as LibraryElement;
@@ -2009,6 +2034,7 @@
       state._hintsState = CacheState.VALID;
     }
   }
+
   void copyFrom(SourceEntryImpl entry) {
     super.copyFrom(entry);
     DartEntryImpl other = entry as DartEntryImpl;
@@ -2034,6 +2060,7 @@
     _launchableState = other._launchableState;
     _bitmask = other._bitmask;
   }
+
   void writeOn(JavaStringBuilder builder) {
     builder.append("Dart: ");
     super.writeOn(builder);
@@ -2124,12 +2151,12 @@
     return BooleanArray.set2(currentValue, bitIndex, false);
   }
 }
+
 /**
  * Instances of the class `ResolutionState` represent the information produced by resolving
  * a compilation unit as part of a specific library.
  */
 class DartEntryImpl_ResolutionState {
-
   /**
    * The next resolution state or `null` if none.
    */
@@ -2300,12 +2327,12 @@
     }
   }
 }
+
 /**
  * Instances of the class `DataDescriptor` are immutable constants representing data that can
  * be stored in the cache.
  */
 class DataDescriptor<E> {
-
   /**
    * The name of the descriptor, used for debugging purposes.
    */
@@ -2319,8 +2346,10 @@
   DataDescriptor(String name) {
     this._name = name;
   }
+
   String toString() => _name;
 }
+
 /**
  * The interface `HtmlEntry` defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual HTML file.
@@ -2328,7 +2357,6 @@
  * @coverage dart.engine
  */
 abstract class HtmlEntry implements SourceEntry {
-
   /**
    * The data descriptor representing the HTML element.
    */
@@ -2360,15 +2388,16 @@
    * @return all of the errors associated with the compilation unit
    */
   List<AnalysisError> get allErrors;
+
   HtmlEntryImpl get writableCopy;
 }
+
 /**
  * Instances of the class `HtmlEntryImpl` implement an [HtmlEntry].
  *
  * @coverage dart.engine
  */
 class HtmlEntryImpl extends SourceEntryImpl implements HtmlEntry {
-
   /**
    * The state of the cached parsed (but not resolved) HTML unit.
    */
@@ -2421,6 +2450,7 @@
    * currently cached.
    */
   List<AnalysisError> _hints = AnalysisError.NO_ERRORS;
+
   List<AnalysisError> get allErrors {
     List<AnalysisError> errors = new List<AnalysisError>();
     for (AnalysisError error in _resolutionErrors) {
@@ -2434,7 +2464,9 @@
     }
     return new List.from(errors);
   }
+
   SourceKind get kind => SourceKind.HTML;
+
   CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, HtmlEntry.ELEMENT)) {
       return _elementState;
@@ -2449,6 +2481,7 @@
     }
     return super.getState(descriptor);
   }
+
   Object getValue(DataDescriptor descriptor) {
     if (identical(descriptor, HtmlEntry.ELEMENT)) {
       return _element as Object;
@@ -2463,6 +2496,7 @@
     }
     return super.getValue(descriptor);
   }
+
   HtmlEntryImpl get writableCopy {
     HtmlEntryImpl copy = new HtmlEntryImpl();
     copy.copyFrom(this);
@@ -2494,13 +2528,26 @@
   }
 
   /**
+   * Record that an error was encountered while attempting to parse the source associated with this
+   * entry.
+   */
+  void recordParseError() {
+    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+    setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
+    setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
+    recordResolutionError();
+  }
+
+  /**
    * Record that an error was encountered while attempting to resolve the source associated with
    * this entry.
    */
   void recordResolutionError() {
     setState(HtmlEntry.ELEMENT, CacheState.ERROR);
     setState(HtmlEntry.RESOLUTION_ERRORS, CacheState.ERROR);
+    setState(HtmlEntry.HINTS, CacheState.ERROR);
   }
+
   void setState(DataDescriptor descriptor, CacheState state) {
     if (identical(descriptor, HtmlEntry.ELEMENT)) {
       _element = updatedValue(state, _element, null);
@@ -2521,6 +2568,7 @@
       super.setState(descriptor, state);
     }
   }
+
   void setValue(DataDescriptor descriptor, Object value) {
     if (identical(descriptor, HtmlEntry.ELEMENT)) {
       _element = value as HtmlElement;
@@ -2541,6 +2589,7 @@
       super.setValue(descriptor, value);
     }
   }
+
   void copyFrom(SourceEntryImpl entry) {
     super.copyFrom(entry);
     HtmlEntryImpl other = entry as HtmlEntryImpl;
@@ -2555,6 +2604,7 @@
     _hints = other._hints;
     _hintsState = other._hintsState;
   }
+
   void writeOn(JavaStringBuilder builder) {
     builder.append("Html: ");
     super.writeOn(builder);
@@ -2568,12 +2618,12 @@
     builder.append(_elementState);
   }
 }
+
 /**
  * The enumerated type `RetentionPriority` represents the priority of data in the cache in
  * terms of the desirability of retaining some specified data about a specified source.
  */
 class RetentionPriority extends Enum<RetentionPriority> {
-
   /**
    * A priority indicating that a given piece of data can be removed from the cache without
    * reservation.
@@ -2592,9 +2642,12 @@
    * Currently used for data related to a priority source.
    */
   static final RetentionPriority HIGH = new RetentionPriority('HIGH', 2);
+
   static final List<RetentionPriority> values = [LOW, MEDIUM, HIGH];
+
   RetentionPriority(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * The interface `SourceEntry` defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual source, no matter what kind of source it is.
@@ -2605,7 +2658,6 @@
  * @coverage dart.engine
  */
 abstract class SourceEntry {
-
   /**
    * The data descriptor representing the line information.
    */
@@ -2659,6 +2711,7 @@
    */
   SourceEntryImpl get writableCopy;
 }
+
 /**
  * Instances of the abstract class `SourceEntryImpl` implement the behavior common to all
  * [SourceEntry].
@@ -2666,7 +2719,6 @@
  * @coverage dart.engine
  */
 abstract class SourceEntryImpl implements SourceEntry {
-
   /**
    * The most recent time at which the state of the source matched the state represented by this
    * entry.
@@ -2696,7 +2748,9 @@
    * @return the exception that caused one or more values to be uncomputable
    */
   AnalysisException get exception => _exception;
+
   int get modificationTime => _modificationTime;
+
   CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, SourceEntry.LINE_INFO)) {
       return _lineInfoState;
@@ -2704,6 +2758,7 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
+
   Object getValue(DataDescriptor descriptor) {
     if (identical(descriptor, SourceEntry.LINE_INFO)) {
       return _lineInfo as Object;
@@ -2761,6 +2816,7 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     writeOn(builder);
@@ -2809,23 +2865,30 @@
     builder.append(_lineInfoState);
   }
 }
+
 /**
  * Implementation of the [AnalysisContentStatistics].
  */
 class AnalysisContentStatisticsImpl implements AnalysisContentStatistics {
   Map<String, AnalysisContentStatistics_CacheRow> _dataMap = new Map<String, AnalysisContentStatistics_CacheRow>();
+
   Set<AnalysisException> _exceptions = new Set<AnalysisException>();
+
   List<AnalysisContentStatistics_CacheRow> get cacheRows {
     Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
     return new List.from(items);
   }
+
   List<AnalysisException> get exceptions => new List.from(_exceptions);
+
   void putCacheItem(DartEntry dartEntry, DataDescriptor descriptor) {
     putCacheItem3(dartEntry, descriptor, dartEntry.getState(descriptor));
   }
+
   void putCacheItem2(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
     putCacheItem3(dartEntry, descriptor, dartEntry.getState2(descriptor, librarySource));
   }
+
   void putCacheItem3(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
     String rowName = rowDesc.toString();
     AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
@@ -2842,24 +2905,40 @@
     }
   }
 }
+
 class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
   String _name;
+
   int _errorCount = 0;
+
   int _flushedCount = 0;
+
   int _inProcessCount = 0;
+
   int _invalidCount = 0;
+
   int _validCount = 0;
+
   AnalysisContentStatisticsImpl_CacheRowImpl(String name) {
     this._name = name;
   }
-  bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && ((obj as AnalysisContentStatisticsImpl_CacheRowImpl))._name == _name;
+
+  bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && (obj as AnalysisContentStatisticsImpl_CacheRowImpl)._name == _name;
+
   int get errorCount => _errorCount;
+
   int get flushedCount => _flushedCount;
+
   int get inProcessCount => _inProcessCount;
+
   int get invalidCount => _invalidCount;
+
   String get name => _name;
+
   int get validCount => _validCount;
+
   int get hashCode => _name.hashCode;
+
   void incState(CacheState state) {
     if (identical(state, CacheState.ERROR)) {
       _errorCount++;
@@ -2878,13 +2957,13 @@
     }
   }
 }
+
 /**
  * Instances of the class `AnalysisContextImpl` implement an [AnalysisContext].
  *
  * @coverage dart.engine
  */
 class AnalysisContextImpl implements InternalAnalysisContext {
-
   /**
    * The difference between the maximum cache size and the maximum priority order size. The priority
    * list must be capped so that it is less than the cache size. Failure to do so can result in an
@@ -2949,9 +3028,11 @@
     _resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this);
     _cache = new AnalysisCache(AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, new AnalysisContextImpl_ContextRetentionPolicy(this));
   }
+
   void addSourceInfo(Source source, SourceEntry info) {
     _cache.put(source, info);
   }
+
   void applyChanges(ChangeSet changeSet) {
     if (changeSet.isEmpty) {
       return;
@@ -2977,7 +3058,7 @@
         for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
           SourceEntry sourceEntry = mapEntry.getValue();
           if (!mapEntry.getKey().isInSystemLibrary && sourceEntry is DartEntry) {
-            DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+            DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
             dartCopy.invalidateAllResolutionInformation();
             mapEntry.setValue(dartCopy);
           }
@@ -2985,6 +3066,7 @@
       }
     }
   }
+
   String computeDocumentationComment(Element element) {
     if (element == null) {
       return null;
@@ -3001,7 +3083,7 @@
     ASTNode nameNode = locator.searchWithin(unit);
     while (nameNode != null) {
       if (nameNode is AnnotatedNode) {
-        Comment comment = ((nameNode as AnnotatedNode)).documentationComment;
+        Comment comment = (nameNode as AnnotatedNode).documentationComment;
         if (comment == null) {
           return null;
         }
@@ -3019,6 +3101,7 @@
     }
     return null;
   }
+
   List<AnalysisError> computeErrors(Source source) {
     bool enableHints = _options.hint;
     SourceEntry sourceEntry = getReadableSourceEntry(source);
@@ -3053,9 +3136,13 @@
     }
     return AnalysisError.NO_ERRORS;
   }
+
   List<Source> computeExportedLibraries(Source source) => getDartParseData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+
   HtmlElement computeHtmlElement(Source source) => getHtmlResolutionData(source, HtmlEntry.ELEMENT, null);
+
   List<Source> computeImportedLibraries(Source source) => getDartParseData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+
   SourceKind computeKindOf(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry == null) {
@@ -3069,7 +3156,9 @@
     }
     return sourceEntry.kind;
   }
+
   LibraryElement computeLibraryElement(Source source) => getDartResolutionData2(source, source, DartEntry.ELEMENT, null);
+
   LineInfo computeLineInfo(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry is HtmlEntry) {
@@ -3079,6 +3168,7 @@
     }
     return null;
   }
+
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
     while (true) {
       {
@@ -3104,6 +3194,7 @@
       cacheDartParseData(source, getReadableDartEntry(source), DartEntry.PARSED_UNIT);
     }
   }
+
   ResolvableHtmlUnit computeResolvableHtmlUnit(Source source) {
     HtmlEntry htmlEntry = getReadableHtmlEntry(source);
     if (htmlEntry == null) {
@@ -3116,7 +3207,9 @@
     }
     return new ResolvableHtmlUnit(htmlEntry.modificationTime, unit);
   }
+
   AnalysisContext extractContext(SourceContainer container) => extractContextInto(container, AnalysisEngine.instance.createAnalysisContext() as InternalAnalysisContext);
+
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) {
     List<Source> sourcesToRemove = new List<Source>();
     {
@@ -3130,10 +3223,12 @@
     }
     return newContext;
   }
+
   AnalysisOptions get analysisOptions => _options;
+
   Element getElement(ElementLocation location) {
     try {
-      List<String> components = ((location as ElementLocationImpl)).components;
+      List<String> components = (location as ElementLocationImpl).components;
       Source librarySource = computeSourceFromEncoding(components[0]);
       ElementImpl element = computeLibraryElement(librarySource) as ElementImpl;
       for (int i = 1; i < components.length; i++) {
@@ -3147,6 +3242,7 @@
       return null;
     }
   }
+
   AnalysisErrorInfo getErrors(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry is DartEntry) {
@@ -3158,13 +3254,15 @@
     }
     return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null);
   }
+
   HtmlElement getHtmlElement(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry is HtmlEntry) {
-      return ((sourceEntry as HtmlEntry)).getValue(HtmlEntry.ELEMENT);
+      return (sourceEntry as HtmlEntry).getValue(HtmlEntry.ELEMENT);
     }
     return null;
   }
+
   List<Source> getHtmlFilesReferencing(Source source) {
     SourceKind sourceKind = getKindOf(source);
     if (sourceKind == null) {
@@ -3179,7 +3277,7 @@
           for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
             SourceEntry sourceEntry = entry.getValue();
             if (identical(sourceEntry.kind, SourceKind.HTML)) {
-              List<Source> referencedLibraries = ((sourceEntry as HtmlEntry)).getValue(HtmlEntry.REFERENCED_LIBRARIES);
+              List<Source> referencedLibraries = (sourceEntry as HtmlEntry).getValue(HtmlEntry.REFERENCED_LIBRARIES);
               if (containsAny(referencedLibraries, librarySources)) {
                 htmlSources.add(entry.getKey());
               }
@@ -3194,7 +3292,9 @@
       return new List.from(htmlSources);
     }
   }
+
   List<Source> get htmlSources => getSources(SourceKind.HTML);
+
   SourceKind getKindOf(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry == null) {
@@ -3202,6 +3302,7 @@
     }
     return sourceEntry.kind;
   }
+
   List<Source> get launchableClientLibrarySources {
     List<Source> sources = new List<Source>();
     {
@@ -3215,6 +3316,7 @@
     }
     return new List.from(sources);
   }
+
   List<Source> get launchableServerLibrarySources {
     List<Source> sources = new List<Source>();
     {
@@ -3228,6 +3330,7 @@
     }
     return new List.from(sources);
   }
+
   List<Source> getLibrariesContaining(Source source) {
     {
       SourceEntry sourceEntry = _cache.get(source);
@@ -3238,7 +3341,7 @@
       for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
         sourceEntry = entry.getValue();
         if (identical(sourceEntry.kind, SourceKind.LIBRARY)) {
-          if (contains(((sourceEntry as DartEntry)).getValue(DartEntry.INCLUDED_PARTS), source)) {
+          if (contains((sourceEntry as DartEntry).getValue(DartEntry.INCLUDED_PARTS), source)) {
             librarySources.add(entry.getKey());
           }
         }
@@ -3249,16 +3352,17 @@
       return new List.from(librarySources);
     }
   }
+
   List<Source> getLibrariesDependingOn(Source librarySource) {
     {
       List<Source> dependentLibraries = new List<Source>();
       for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
         SourceEntry sourceEntry = entry.getValue();
         if (identical(sourceEntry.kind, SourceKind.LIBRARY)) {
-          if (contains(((sourceEntry as DartEntry)).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) {
+          if (contains((sourceEntry as DartEntry).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) {
             dependentLibraries.add(entry.getKey());
           }
-          if (contains(((sourceEntry as DartEntry)).getValue(DartEntry.IMPORTED_LIBRARIES), librarySource)) {
+          if (contains((sourceEntry as DartEntry).getValue(DartEntry.IMPORTED_LIBRARIES), librarySource)) {
             dependentLibraries.add(entry.getKey());
           }
         }
@@ -3269,14 +3373,17 @@
       return new List.from(dependentLibraries);
     }
   }
+
   LibraryElement getLibraryElement(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry is DartEntry) {
-      return ((sourceEntry as DartEntry)).getValue(DartEntry.ELEMENT);
+      return (sourceEntry as DartEntry).getValue(DartEntry.ELEMENT);
     }
     return null;
   }
+
   List<Source> get librarySources => getSources(SourceKind.LIBRARY);
+
   LineInfo getLineInfo(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry != null) {
@@ -3284,6 +3391,7 @@
     }
     return null;
   }
+
   Namespace getPublicNamespace(LibraryElement library) {
     Source source = library.definingCompilationUnit.source;
     DartEntry dartEntry = getReadableDartEntry(source);
@@ -3312,6 +3420,7 @@
     }
     return namespace;
   }
+
   Namespace getPublicNamespace2(Source source) {
     DartEntry dartEntry = getReadableDartEntry(source);
     if (dartEntry == null) {
@@ -3339,13 +3448,14 @@
     }
     return namespace;
   }
+
   List<Source> get refactoringUnsafeSources {
     List<Source> sources = new List<Source>();
     {
       for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
         SourceEntry sourceEntry = entry.getValue();
         if (sourceEntry is DartEntry) {
-          if (!((sourceEntry as DartEntry)).isRefactoringSafe) {
+          if (!(sourceEntry as DartEntry).isRefactoringSafe) {
             sources.add(entry.getKey());
           }
         }
@@ -3353,19 +3463,22 @@
     }
     return new List.from(sources);
   }
+
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     if (library == null) {
       return null;
     }
     return getResolvedCompilationUnit2(unitSource, library.source);
   }
+
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
     SourceEntry sourceEntry = getReadableSourceEntry(unitSource);
     if (sourceEntry is DartEntry) {
-      return ((sourceEntry as DartEntry)).getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+      return (sourceEntry as DartEntry).getValue2(DartEntry.RESOLVED_UNIT, librarySource);
     }
     return null;
   }
+
   SourceFactory get sourceFactory => _sourceFactory;
 
   /**
@@ -3388,6 +3501,7 @@
     }
     return new List<Source>.from(sources);
   }
+
   AnalysisContentStatistics get statistics {
     AnalysisContentStatisticsImpl statistics = new AnalysisContentStatisticsImpl();
     {
@@ -3421,6 +3535,7 @@
     }
     return statistics;
   }
+
   TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSource, LibraryElement libraryElement) {
     DartEntry dartEntry = getReadableDartEntry(unitSource);
     if (dartEntry == null) {
@@ -3430,6 +3545,7 @@
     dartEntry = cacheDartResolutionData(unitSource, librarySource, dartEntry, DartEntry.RESOLVED_UNIT);
     return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource));
   }
+
   bool isClientLibrary(Source librarySource) {
     SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
@@ -3438,6 +3554,7 @@
     }
     return false;
   }
+
   bool isServerLibrary(Source librarySource) {
     SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
@@ -3446,15 +3563,16 @@
     }
     return false;
   }
+
   void mergeContext(AnalysisContext context) {
     if (context is InstrumentedAnalysisContextImpl) {
-      context = ((context as InstrumentedAnalysisContextImpl)).basis;
+      context = (context as InstrumentedAnalysisContextImpl).basis;
     }
     if (context is! AnalysisContextImpl) {
       return;
     }
     {
-      for (MapEntry<Source, SourceEntry> entry in ((context as AnalysisContextImpl))._cache.entrySet()) {
+      for (MapEntry<Source, SourceEntry> entry in (context as AnalysisContextImpl)._cache.entrySet()) {
         Source newSource = entry.getKey();
         SourceEntry existingEntry = getReadableSourceEntry(newSource);
         if (existingEntry == null) {
@@ -3464,8 +3582,11 @@
       }
     }
   }
+
   CompilationUnit parseCompilationUnit(Source source) => getDartParseData2(source, DartEntry.PARSED_UNIT, null);
+
   HtmlUnit parseHtmlUnit(Source source) => getHtmlParseData(source, HtmlEntry.PARSED_UNIT, null);
+
   AnalysisResult performAnalysisTask() {
     int getStart = JavaSystem.currentTimeMillis();
     AnalysisTask task = nextTaskAnalysisTask;
@@ -3484,6 +3605,7 @@
     int performEnd = JavaSystem.currentTimeMillis();
     return new AnalysisResult(getChangeNotices(false), getEnd - getStart, task.runtimeType.toString(), performEnd - performStart);
   }
+
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     {
       Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
@@ -3499,14 +3621,18 @@
       }
     }
   }
+
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
     if (library == null) {
       return null;
     }
     return resolveCompilationUnit2(unitSource, library.source);
   }
+
   CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) => getDartResolutionData2(unitSource, librarySource, DartEntry.RESOLVED_UNIT, null);
+
   HtmlUnit resolveHtmlUnit(Source htmlSource) => parseHtmlUnit(htmlSource);
+
   void set analysisOptions(AnalysisOptions options) {
     {
       bool needsRecompute = this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint);
@@ -3529,6 +3655,7 @@
       }
     }
   }
+
   void set analysisPriorityOrder(List<Source> sources) {
     {
       if (sources == null || sources.isEmpty) {
@@ -3547,6 +3674,7 @@
       }
     }
   }
+
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     {
       String originalContents = _sourceFactory.setContents(source, contents);
@@ -3563,6 +3691,7 @@
       }
     }
   }
+
   void setContents(Source source, String contents) {
     {
       String originalContents = _sourceFactory.setContents(source, contents);
@@ -3576,6 +3705,7 @@
       _incrementalAnalysisCache = IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
     }
   }
+
   void set sourceFactory(SourceFactory factory) {
     {
       if (identical(_sourceFactory, factory)) {
@@ -3591,6 +3721,7 @@
       invalidateAllResolutionInformation();
     }
   }
+
   Iterable<Source> sourcesToResolve(List<Source> changedSources) {
     List<Source> librarySources = new List<Source>();
     for (Source source in changedSources) {
@@ -4090,6 +4221,13 @@
   AnalysisTask getNextTaskAnalysisTask2(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled) {
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry as DartEntry;
+      if (!source.exists()) {
+        DartEntryImpl dartCopy = dartEntry.writableCopy;
+        dartCopy.recordParseError();
+        dartCopy.exception = new AnalysisException.con1("Source does not exist");
+        _cache.put(source, dartCopy);
+        return null;
+      }
       CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
       if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
         DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -4111,7 +4249,7 @@
         if (libraryEntry is DartEntry) {
           CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
           if (identical(elementState, CacheState.INVALID) || (isPriority && identical(elementState, CacheState.FLUSHED))) {
-            DartEntryImpl libraryCopy = ((libraryEntry as DartEntry)).writableCopy;
+            DartEntryImpl libraryCopy = (libraryEntry as DartEntry).writableCopy;
             libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
             _cache.put(librarySource, libraryCopy);
             return new ResolveDartLibraryTask(this, source, librarySource);
@@ -4149,6 +4287,13 @@
       }
     } else if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+      if (!source.exists()) {
+        HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+        htmlCopy.recordParseError();
+        htmlCopy.exception = new AnalysisException.con1("Source does not exist");
+        _cache.put(source, htmlCopy);
+        return null;
+      }
       CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
       if (identical(parsedUnitState, CacheState.INVALID) || (isPriority && identical(parsedUnitState, CacheState.FLUSHED))) {
         HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
@@ -4352,11 +4497,11 @@
     for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
       SourceEntry sourceEntry = mapEntry.getValue();
       if (sourceEntry is HtmlEntry) {
-        HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+        HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
         htmlCopy.invalidateAllResolutionInformation();
         mapEntry.setValue(htmlCopy);
       } else if (sourceEntry is DartEntry) {
-        DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+        DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
         dartCopy.invalidateAllResolutionInformation();
         mapEntry.setValue(dartCopy);
       }
@@ -4382,7 +4527,7 @@
       for (Source partSource in includedParts) {
         SourceEntry partEntry = _cache.get(partSource);
         if (partEntry is DartEntry) {
-          DartEntryImpl partCopy = ((partEntry as DartEntry)).writableCopy;
+          DartEntryImpl partCopy = (partEntry as DartEntry).writableCopy;
           partCopy.invalidateAllResolutionInformation();
           _cache.put(partSource, partCopy);
         }
@@ -4521,7 +4666,7 @@
         if (thrownException == null) {
           thrownException = new AnalysisException.con1("GenerateDartHintsTask returned a null hint map without throwing an exception: ${librarySource.fullName}");
         }
-        DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+        DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
         dartCopy.setState2(DartEntry.HINTS, librarySource, CacheState.ERROR);
         dartCopy.exception = thrownException;
         _cache.put(librarySource, dartCopy);
@@ -4701,7 +4846,7 @@
             throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
           }
         }
-        HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+        HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
         if (thrownException == null) {
           LineInfo lineInfo = task.lineInfo;
           HtmlUnit unit = task.htmlUnit;
@@ -4711,15 +4856,13 @@
           ChangeNoticeImpl notice = getNotice(source);
           notice.setErrors(htmlEntry.allErrors, lineInfo);
         } else {
-          htmlCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
-          htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
-          htmlCopy.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
+          htmlCopy.recordParseError();
         }
         htmlCopy.exception = thrownException;
         _cache.put(source, htmlCopy);
         htmlEntry = htmlCopy;
       } else {
-        HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+        HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
         if (thrownException == null || resultTime >= 0) {
           if (identical(htmlCopy.getState(SourceEntry.LINE_INFO), CacheState.IN_PROCESS)) {
             htmlCopy.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
@@ -5003,7 +5146,7 @@
   void sourceChanged(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry is HtmlEntry) {
-      HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+      HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
       htmlCopy.modificationTime = source.modificationStamp;
       htmlCopy.invalidateAllInformation();
       _cache.put(source, htmlCopy);
@@ -5019,7 +5162,7 @@
       for (Source library in librariesToInvalidate) {
         invalidateLibraryResolution(library);
       }
-      DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+      DartEntryImpl dartCopy = (sourceEntry as DartEntry).writableCopy;
       dartCopy.modificationTime = source.modificationStamp;
       dartCopy.invalidateAllInformation();
       _cache.put(source, dartCopy);
@@ -5048,25 +5191,38 @@
     _cache.remove(source);
   }
 }
+
 /**
  * Instances of the class `AnalysisTaskResultRecorder` are used by an analysis context to
  * record the results of a task.
  */
 class AnalysisContextImpl_AnalysisTaskResultRecorder implements AnalysisTaskVisitor<SourceEntry> {
   final AnalysisContextImpl AnalysisContextImpl_this;
+
   AnalysisContextImpl_AnalysisTaskResultRecorder(this.AnalysisContextImpl_this);
+
   SourceEntry visitGenerateDartErrorsTask(GenerateDartErrorsTask task) => AnalysisContextImpl_this.recordGenerateDartErrorsTask(task);
+
   SourceEntry visitGenerateDartHintsTask(GenerateDartHintsTask task) => AnalysisContextImpl_this.recordGenerateDartHintsTask(task);
+
   SourceEntry visitIncrementalAnalysisTask(IncrementalAnalysisTask task) => AnalysisContextImpl_this.recordIncrementalAnalysisTaskResults(task);
+
   DartEntry visitParseDartTask(ParseDartTask task) => AnalysisContextImpl_this.recordParseDartTaskResults(task);
+
   HtmlEntry visitParseHtmlTask(ParseHtmlTask task) => AnalysisContextImpl_this.recordParseHtmlTaskResults(task);
+
   DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task);
+
   SourceEntry visitResolveDartUnitTask(ResolveDartUnitTask task) => AnalysisContextImpl_this.recordResolveDartUnitTaskResults(task);
+
   SourceEntry visitResolveHtmlTask(ResolveHtmlTask task) => AnalysisContextImpl_this.recordResolveHtmlTaskResults(task);
 }
+
 class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy {
   final AnalysisContextImpl AnalysisContextImpl_this;
+
   AnalysisContextImpl_ContextRetentionPolicy(this.AnalysisContextImpl_this);
+
   RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) {
     for (Source prioritySource in AnalysisContextImpl_this._priorityOrder) {
       if (source == prioritySource) {
@@ -5081,14 +5237,15 @@
     }
     return RetentionPriority.LOW;
   }
+
   bool astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.HINTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
 }
+
 /**
  * Instances of the class `AnalysisErrorInfoImpl` represent the analysis errors and line info
  * associated with a source.
  */
 class AnalysisErrorInfoImpl implements AnalysisErrorInfo {
-
   /**
    * The analysis errors associated with a source, or `null` if there are no errors.
    */
@@ -5125,12 +5282,12 @@
    */
   LineInfo get lineInfo => _lineInfo;
 }
+
 /**
  * Instances of the class `AnalysisOptions` represent a set of analysis options used to
  * control the behavior of an analysis context.
  */
 class AnalysisOptionsImpl implements AnalysisOptions {
-
   /**
    * The maximum number of sources for which data should be kept in the cache.
    */
@@ -5175,8 +5332,11 @@
     _hint = options.hint;
     _strictMode = options.strictMode;
   }
+
   int get cacheSize => _cacheSize;
+
   bool get dart2jsHint => _dart2jsHint;
+
   bool get hint => _hint;
 
   /**
@@ -5227,6 +5387,7 @@
     _strictMode = isStrict;
   }
 }
+
 /**
  * Instances of the class `ChangeNoticeImpl` represent a change to the analysis results
  * associated with a given source.
@@ -5234,7 +5395,6 @@
  * @coverage dart.engine
  */
 class ChangeNoticeImpl implements ChangeNotice {
-
   /**
    * The source for which the result is being reported.
    */
@@ -5325,8 +5485,10 @@
       AnalysisEngine.instance.logger.logError2("No line info: ${_source}", new JavaException());
     }
   }
+
   String toString() => "Changes for ${_source.fullName}";
 }
+
 /**
  * Instances of the class `DelegatingAnalysisContextImpl` extend [AnalysisContextImpl
  ] to delegate sources to the appropriate analysis context. For instance, if the
@@ -5335,7 +5497,6 @@
  * @coverage dart.engine
  */
 class DelegatingAnalysisContextImpl extends AnalysisContextImpl {
-
   /**
    * This references the [InternalAnalysisContext] held onto by the [DartSdk] which is
    * used (instead of this [AnalysisContext]) for SDK sources. This field is set when
@@ -5344,6 +5505,7 @@
    * will be such a resolver.
    */
   InternalAnalysisContext _sdkAnalysisContext;
+
   void addSourceInfo(Source source, SourceEntry info) {
     if (source.isInSystemLibrary) {
       _sdkAnalysisContext.addSourceInfo(source, info);
@@ -5351,6 +5513,7 @@
       super.addSourceInfo(source, info);
     }
   }
+
   List<AnalysisError> computeErrors(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeErrors(source);
@@ -5358,6 +5521,7 @@
       return super.computeErrors(source);
     }
   }
+
   List<Source> computeExportedLibraries(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeExportedLibraries(source);
@@ -5365,6 +5529,7 @@
       return super.computeExportedLibraries(source);
     }
   }
+
   HtmlElement computeHtmlElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeHtmlElement(source);
@@ -5372,6 +5537,7 @@
       return super.computeHtmlElement(source);
     }
   }
+
   List<Source> computeImportedLibraries(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeImportedLibraries(source);
@@ -5379,6 +5545,7 @@
       return super.computeImportedLibraries(source);
     }
   }
+
   SourceKind computeKindOf(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeKindOf(source);
@@ -5386,6 +5553,7 @@
       return super.computeKindOf(source);
     }
   }
+
   LibraryElement computeLibraryElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeLibraryElement(source);
@@ -5393,6 +5561,7 @@
       return super.computeLibraryElement(source);
     }
   }
+
   LineInfo computeLineInfo(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeLineInfo(source);
@@ -5400,6 +5569,7 @@
       return super.computeLineInfo(source);
     }
   }
+
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeResolvableCompilationUnit(source);
@@ -5407,6 +5577,7 @@
       return super.computeResolvableCompilationUnit(source);
     }
   }
+
   AnalysisErrorInfo getErrors(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getErrors(source);
@@ -5414,6 +5585,7 @@
       return super.getErrors(source);
     }
   }
+
   HtmlElement getHtmlElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getHtmlElement(source);
@@ -5421,6 +5593,7 @@
       return super.getHtmlElement(source);
     }
   }
+
   List<Source> getHtmlFilesReferencing(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getHtmlFilesReferencing(source);
@@ -5428,6 +5601,7 @@
       return super.getHtmlFilesReferencing(source);
     }
   }
+
   SourceKind getKindOf(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getKindOf(source);
@@ -5435,6 +5609,7 @@
       return super.getKindOf(source);
     }
   }
+
   List<Source> getLibrariesContaining(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getLibrariesContaining(source);
@@ -5442,6 +5617,7 @@
       return super.getLibrariesContaining(source);
     }
   }
+
   List<Source> getLibrariesDependingOn(Source librarySource) {
     if (librarySource.isInSystemLibrary) {
       return _sdkAnalysisContext.getLibrariesDependingOn(librarySource);
@@ -5449,6 +5625,7 @@
       return super.getLibrariesDependingOn(librarySource);
     }
   }
+
   LibraryElement getLibraryElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getLibraryElement(source);
@@ -5456,7 +5633,9 @@
       return super.getLibraryElement(source);
     }
   }
+
   List<Source> get librarySources => ArrayUtils.addAll(super.librarySources, _sdkAnalysisContext.librarySources);
+
   LineInfo getLineInfo(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getLineInfo(source);
@@ -5464,6 +5643,7 @@
       return super.getLineInfo(source);
     }
   }
+
   Namespace getPublicNamespace(LibraryElement library) {
     Source source = library.source;
     if (source.isInSystemLibrary) {
@@ -5472,6 +5652,7 @@
       return super.getPublicNamespace(library);
     }
   }
+
   Namespace getPublicNamespace2(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getPublicNamespace2(source);
@@ -5479,6 +5660,7 @@
       return super.getPublicNamespace2(source);
     }
   }
+
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.getResolvedCompilationUnit(unitSource, library);
@@ -5486,6 +5668,7 @@
       return super.getResolvedCompilationUnit(unitSource, library);
     }
   }
+
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.getResolvedCompilationUnit2(unitSource, librarySource);
@@ -5493,6 +5676,7 @@
       return super.getResolvedCompilationUnit2(unitSource, librarySource);
     }
   }
+
   bool isClientLibrary(Source librarySource) {
     if (librarySource.isInSystemLibrary) {
       return _sdkAnalysisContext.isClientLibrary(librarySource);
@@ -5500,6 +5684,7 @@
       return super.isClientLibrary(librarySource);
     }
   }
+
   bool isServerLibrary(Source librarySource) {
     if (librarySource.isInSystemLibrary) {
       return _sdkAnalysisContext.isServerLibrary(librarySource);
@@ -5507,6 +5692,7 @@
       return super.isServerLibrary(librarySource);
     }
   }
+
   CompilationUnit parseCompilationUnit(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.parseCompilationUnit(source);
@@ -5514,6 +5700,7 @@
       return super.parseCompilationUnit(source);
     }
   }
+
   HtmlUnit parseHtmlUnit(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.parseHtmlUnit(source);
@@ -5521,6 +5708,7 @@
       return super.parseHtmlUnit(source);
     }
   }
+
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     if (elementMap.isEmpty) {
       return;
@@ -5532,6 +5720,7 @@
       super.recordLibraryElements(elementMap);
     }
   }
+
   CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.resolveCompilationUnit(source, library);
@@ -5539,6 +5728,7 @@
       return super.resolveCompilationUnit(source, library);
     }
   }
+
   CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.resolveCompilationUnit2(unitSource, librarySource);
@@ -5546,6 +5736,7 @@
       return super.resolveCompilationUnit2(unitSource, librarySource);
     }
   }
+
   HtmlUnit resolveHtmlUnit(Source unitSource) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.resolveHtmlUnit(unitSource);
@@ -5553,6 +5744,7 @@
       return super.resolveHtmlUnit(unitSource);
     }
   }
+
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     if (source.isInSystemLibrary) {
       _sdkAnalysisContext.setChangedContents(source, contents, offset, oldLength, newLength);
@@ -5560,6 +5752,7 @@
       super.setChangedContents(source, contents, offset, oldLength, newLength);
     }
   }
+
   void setContents(Source source, String contents) {
     if (source.isInSystemLibrary) {
       _sdkAnalysisContext.setContents(source, contents);
@@ -5567,6 +5760,7 @@
       super.setContents(source, contents);
     }
   }
+
   void set sourceFactory(SourceFactory factory) {
     super.sourceFactory = factory;
     DartSdk sdk = factory.dartSdk;
@@ -5581,6 +5775,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `IncrementalAnalysisCache` hold information used to perform
  * incremental analysis.
@@ -5588,7 +5783,6 @@
  * @see AnalysisContextImpl#setChangedContents(Source, String, int, int, int)
  */
 class IncrementalAnalysisCache {
-
   /**
    * Determine if the incremental analysis result can be cached for the next incremental analysis.
    *
@@ -5690,14 +5884,23 @@
     }
     return cache;
   }
+
   Source librarySource;
+
   Source source;
+
   String oldContents;
+
   CompilationUnit resolvedUnit;
+
   String newContents;
+
   int offset = 0;
+
   int oldLength = 0;
+
   int newLength = 0;
+
   IncrementalAnalysisCache(Source librarySource, Source source, CompilationUnit resolvedUnit, String oldContents, String newContents, int offset, int oldLength, int newLength) {
     this.librarySource = librarySource;
     this.source = source;
@@ -5714,8 +5917,9 @@
    *
    * @return `true` if the cache contains changes to be analyzed, else `false`
    */
-  bool hasWork() => oldLength > 0 && newLength > 0;
+  bool hasWork() => oldLength > 0 || newLength > 0;
 }
+
 /**
  * Instances of the class `InstrumentedAnalysisContextImpl` implement an
  * [AnalysisContext] by recording instrumentation data and delegating to
@@ -5724,7 +5928,6 @@
  * @coverage dart.engine
  */
 class InstrumentedAnalysisContextImpl implements InternalAnalysisContext {
-
   /**
    * Record an exception that was thrown during analysis.
    *
@@ -5760,9 +5963,11 @@
   InstrumentedAnalysisContextImpl.con1(InternalAnalysisContext context) {
     basis = context;
   }
+
   void addSourceInfo(Source source, SourceEntry info) {
     basis.addSourceInfo(source, info);
   }
+
   void applyChanges(ChangeSet changeSet) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-applyChanges");
     try {
@@ -5772,6 +5977,7 @@
       instrumentation.log();
     }
   }
+
   String computeDocumentationComment(Element element) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeDocumentationComment");
     try {
@@ -5781,6 +5987,7 @@
       instrumentation.log();
     }
   }
+
   List<AnalysisError> computeErrors(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeErrors");
     try {
@@ -5792,6 +5999,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> computeExportedLibraries(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeExportedLibraries");
     try {
@@ -5801,6 +6009,7 @@
       instrumentation.log();
     }
   }
+
   HtmlElement computeHtmlElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeHtmlElement");
     try {
@@ -5813,6 +6022,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> computeImportedLibraries(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeImportedLibraries");
     try {
@@ -5822,6 +6032,7 @@
       instrumentation.log();
     }
   }
+
   SourceKind computeKindOf(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeKindOf");
     try {
@@ -5831,6 +6042,7 @@
       instrumentation.log();
     }
   }
+
   LibraryElement computeLibraryElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeLibraryElement");
     try {
@@ -5843,6 +6055,7 @@
       instrumentation.log();
     }
   }
+
   LineInfo computeLineInfo(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeLineInfo");
     try {
@@ -5855,8 +6068,11 @@
       instrumentation.log();
     }
   }
+
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) => basis.computeResolvableCompilationUnit(source);
+
   ResolvableHtmlUnit computeResolvableHtmlUnit(Source source) => basis.computeResolvableHtmlUnit(source);
+
   AnalysisContext extractContext(SourceContainer container) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-extractContext");
     try {
@@ -5868,7 +6084,9 @@
       instrumentation.log();
     }
   }
+
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) => basis.extractContextInto(container, newContext);
+
   AnalysisOptions get analysisOptions {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getAnalysisOptions");
     try {
@@ -5878,6 +6096,7 @@
       instrumentation.log();
     }
   }
+
   Element getElement(ElementLocation location) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getElement");
     try {
@@ -5887,6 +6106,7 @@
       instrumentation.log();
     }
   }
+
   AnalysisErrorInfo getErrors(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getErrors");
     try {
@@ -5900,6 +6120,7 @@
       instrumentation.log();
     }
   }
+
   HtmlElement getHtmlElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlElement");
     try {
@@ -5909,6 +6130,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> getHtmlFilesReferencing(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlFilesReferencing");
     try {
@@ -5922,6 +6144,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> get htmlSources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlSources");
     try {
@@ -5935,6 +6158,7 @@
       instrumentation.log();
     }
   }
+
   SourceKind getKindOf(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getKindOf");
     try {
@@ -5944,6 +6168,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> get launchableClientLibrarySources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLaunchableClientLibrarySources");
     try {
@@ -5957,6 +6182,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> get launchableServerLibrarySources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLaunchableServerLibrarySources");
     try {
@@ -5970,6 +6196,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> getLibrariesContaining(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesContaining");
     try {
@@ -5983,6 +6210,7 @@
       instrumentation.log2(2);
     }
   }
+
   List<Source> getLibrariesDependingOn(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesDependingOn");
     try {
@@ -5996,6 +6224,7 @@
       instrumentation.log();
     }
   }
+
   LibraryElement getLibraryElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibraryElement");
     try {
@@ -6005,6 +6234,7 @@
       instrumentation.log();
     }
   }
+
   List<Source> get librarySources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrarySources");
     try {
@@ -6018,6 +6248,7 @@
       instrumentation.log();
     }
   }
+
   LineInfo getLineInfo(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLineInfo");
     try {
@@ -6027,9 +6258,13 @@
       instrumentation.log();
     }
   }
+
   Namespace getPublicNamespace(LibraryElement library) => basis.getPublicNamespace(library);
+
   Namespace getPublicNamespace2(Source source) => basis.getPublicNamespace2(source);
+
   List<Source> get refactoringUnsafeSources => basis.refactoringUnsafeSources;
+
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedCompilationUnit");
     try {
@@ -6039,6 +6274,7 @@
       instrumentation.log();
     }
   }
+
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedCompilationUnit");
     try {
@@ -6048,6 +6284,7 @@
       instrumentation.log2(2);
     }
   }
+
   SourceFactory get sourceFactory {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getSourceFactory");
     try {
@@ -6057,8 +6294,11 @@
       instrumentation.log2(2);
     }
   }
+
   AnalysisContentStatistics get statistics => basis.statistics;
+
   TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSource, LibraryElement libraryElement) => basis.internalResolveCompilationUnit(unitSource, libraryElement);
+
   bool isClientLibrary(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isClientLibrary");
     try {
@@ -6068,6 +6308,7 @@
       instrumentation.log();
     }
   }
+
   bool isServerLibrary(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isServerLibrary");
     try {
@@ -6077,18 +6318,20 @@
       instrumentation.log();
     }
   }
+
   void mergeContext(AnalysisContext context) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-mergeContext");
     try {
       instrumentation.metric3("contextId", _contextId);
       if (context is InstrumentedAnalysisContextImpl) {
-        context = ((context as InstrumentedAnalysisContextImpl)).basis;
+        context = (context as InstrumentedAnalysisContextImpl).basis;
       }
       basis.mergeContext(context);
     } finally {
       instrumentation.log();
     }
   }
+
   CompilationUnit parseCompilationUnit(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-parseCompilationUnit");
     try {
@@ -6101,6 +6344,7 @@
       instrumentation.log();
     }
   }
+
   HtmlUnit parseHtmlUnit(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-parseHtmlUnit");
     try {
@@ -6113,6 +6357,7 @@
       instrumentation.log();
     }
   }
+
   AnalysisResult performAnalysisTask() {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-performAnalysisTask");
     try {
@@ -6126,9 +6371,11 @@
       instrumentation.log2(2);
     }
   }
+
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     basis.recordLibraryElements(elementMap);
   }
+
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit");
     try {
@@ -6141,6 +6388,7 @@
       instrumentation.log();
     }
   }
+
   CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit");
     try {
@@ -6153,6 +6401,7 @@
       instrumentation.log();
     }
   }
+
   HtmlUnit resolveHtmlUnit(Source htmlSource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveHtmlUnit");
     try {
@@ -6165,6 +6414,7 @@
       instrumentation.log();
     }
   }
+
   void set analysisOptions(AnalysisOptions options) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setAnalysisOptions");
     try {
@@ -6174,6 +6424,7 @@
       instrumentation.log();
     }
   }
+
   void set analysisPriorityOrder(List<Source> sources) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setAnalysisPriorityOrder");
     try {
@@ -6183,6 +6434,7 @@
       instrumentation.log();
     }
   }
+
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setChangedContents");
     try {
@@ -6192,6 +6444,7 @@
       instrumentation.log();
     }
   }
+
   void setContents(Source source, String contents) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setContents");
     try {
@@ -6201,6 +6454,7 @@
       instrumentation.log();
     }
   }
+
   void set sourceFactory(SourceFactory factory) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setSourceFactory");
     try {
@@ -6210,6 +6464,7 @@
       instrumentation.log();
     }
   }
+
   Iterable<Source> sourcesToResolve(List<Source> changedSources) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-sourcesToResolve");
     try {
@@ -6220,12 +6475,12 @@
     }
   }
 }
+
 /**
  * The interface `InternalAnalysisContext` defines additional behavior for an analysis context
  * that is required by internal users of the context.
  */
 abstract class InternalAnalysisContext implements AnalysisContext {
-
   /**
    * Add the given source with the given information to this context.
    *
@@ -6334,11 +6589,11 @@
    */
   void recordLibraryElements(Map<Source, LibraryElement> elementMap);
 }
+
 /**
  * Container with global [AnalysisContext] performance statistics.
  */
 class PerformanceStatistics {
-
   /**
    * The [TimeCounter] for time spent in scanning.
    */
@@ -6364,6 +6619,7 @@
    */
   static TimeCounter hints = new TimeCounter();
 }
+
 /**
  * Instances of the class `RecordingErrorListener` implement an error listener that will
  * record the errors that are reported to it in a way that is appropriate for caching those errors
@@ -6372,7 +6628,6 @@
  * @coverage dart.engine
  */
 class RecordingErrorListener implements AnalysisErrorListener {
-
   /**
    * A HashMap of lists containing the errors that were collected, keyed by each [Source].
    */
@@ -6422,6 +6677,7 @@
       return new List.from(errorsForSource);
     }
   }
+
   void onError(AnalysisError error) {
     Source source = error.source;
     Set<AnalysisError> errorsForSource = _errors[source];
@@ -6432,6 +6688,7 @@
     javaSetAdd(errorsForSource, error);
   }
 }
+
 /**
  * Instances of the class `ResolutionEraser` remove any resolution information from an AST
  * structure when used to visit that structure.
@@ -6442,81 +6699,96 @@
     node.propagatedElement = null;
     return super.visitAssignmentExpression(node);
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitBinaryExpression(node);
   }
+
   Object visitCompilationUnit(CompilationUnit node) {
     node.element = null;
     return super.visitCompilationUnit(node);
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     node.element = null;
     return super.visitConstructorDeclaration(node);
   }
+
   Object visitConstructorName(ConstructorName node) {
     node.staticElement = null;
     return super.visitConstructorName(node);
   }
+
   Object visitDirective(Directive node) {
     node.element = null;
     return super.visitDirective(node);
   }
+
   Object visitExpression(Expression node) {
     node.staticType = null;
     node.propagatedType = null;
     return super.visitExpression(node);
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     node.element = null;
     return super.visitFunctionExpression(node);
   }
+
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitFunctionExpressionInvocation(node);
   }
+
   Object visitIndexExpression(IndexExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitIndexExpression(node);
   }
+
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.staticElement = null;
     return super.visitInstanceCreationExpression(node);
   }
+
   Object visitPostfixExpression(PostfixExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitPostfixExpression(node);
   }
+
   Object visitPrefixExpression(PrefixExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitPrefixExpression(node);
   }
+
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     node.staticElement = null;
     return super.visitRedirectingConstructorInvocation(node);
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitSimpleIdentifier(node);
   }
+
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     node.staticElement = null;
     return super.visitSuperConstructorInvocation(node);
   }
 }
+
 /**
  * Instances of the class `ResolvableCompilationUnit` represent a compilation unit that is not
  * referenced by any other objects and for which we have modification stamp information. It is used
  * by the [LibraryResolver] to resolve a library.
  */
 class ResolvableCompilationUnit extends TimestampedData<CompilationUnit> {
-
   /**
    * Initialize a newly created holder to hold the given values.
    *
@@ -6532,13 +6804,13 @@
    */
   CompilationUnit get compilationUnit => data;
 }
+
 /**
  * Instances of the class `ResolvableHtmlUnit` represent an HTML unit that is not referenced
  * by any other objects and for which we have modification stamp information. It is used by the
  * [ResolveHtmlTask] to resolve an HTML source.
  */
 class ResolvableHtmlUnit extends TimestampedData<HtmlUnit> {
-
   /**
    * Initialize a newly created holder to hold the given values.
    *
@@ -6554,12 +6826,12 @@
    */
   HtmlUnit get compilationUnit => data;
 }
+
 /**
  * Instances of the class `TimestampedData` represent analysis data for which we have a
  * modification time.
  */
 class TimestampedData<E> {
-
   /**
    * The modification time of the source from which the data was created.
    */
@@ -6581,12 +6853,12 @@
     this.data = data;
   }
 }
+
 /**
  * The abstract class `AnalysisTask` defines the behavior of objects used to perform an
  * analysis task.
  */
 abstract class AnalysisTask {
-
   /**
    * The context in which the task is to be performed.
    */
@@ -6632,6 +6904,7 @@
     }
     return accept(visitor);
   }
+
   String toString() => taskDescription;
 
   /**
@@ -6664,13 +6937,13 @@
     }
   }
 }
+
 /**
  * The interface `AnalysisTaskVisitor` defines the behavior of objects that can visit tasks.
  * While tasks are not structured in any interesting way, this class provides the ability to
  * dispatch to an appropriate method.
  */
 abstract class AnalysisTaskVisitor<E> {
-
   /**
    * Visit a [GenerateDartErrorsTask].
    *
@@ -6743,12 +7016,12 @@
    */
   E visitResolveHtmlTask(ResolveHtmlTask task);
 }
+
 /**
  * Instances of the class `GenerateDartErrorsTask` generate errors and warnings for a single
  * Dart source.
  */
 class GenerateDartErrorsTask extends AnalysisTask {
-
   /**
    * The source for which errors and warnings are to be produced.
    */
@@ -6780,8 +7053,11 @@
     this.source = source;
     this.libraryElement = libraryElement;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
+
   String get taskDescription => "generate errors and warnings for ${source.fullName}";
+
   void internalPerform() {
     InternalAnalysisContext context = this.context;
     TimestampedData<CompilationUnit> data = context.internalResolveCompilationUnit(source, libraryElement);
@@ -6804,11 +7080,11 @@
     }
   }
 }
+
 /**
  * Instances of the class `GenerateDartHintsTask` generate hints for a single Dart library.
  */
 class GenerateDartHintsTask extends AnalysisTask {
-
   /**
    * The element model for the library being analyzed.
    */
@@ -6829,7 +7105,9 @@
   GenerateDartHintsTask(InternalAnalysisContext context, LibraryElement libraryElement) : super(context) {
     this.libraryElement = libraryElement;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
+
   String get taskDescription {
     Source librarySource = libraryElement.source;
     if (librarySource == null) {
@@ -6837,6 +7115,7 @@
     }
     return "generate Dart hints for ${librarySource.fullName}";
   }
+
   void internalPerform() {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     List<CompilationUnitElement> parts = libraryElement.parts;
@@ -6881,11 +7160,11 @@
    */
   TimestampedData<CompilationUnit> getCompilationUnit(Source unitSource) => context.internalResolveCompilationUnit(unitSource, libraryElement);
 }
+
 /**
  * Instances of the class `IncrementalAnalysisTask` incrementally update existing analysis.
  */
 class IncrementalAnalysisTask extends AnalysisTask {
-
   /**
    * The information used to perform incremental analysis.
    */
@@ -6905,6 +7184,7 @@
   IncrementalAnalysisTask(InternalAnalysisContext context, IncrementalAnalysisCache cache) : super(context) {
     this.cache = cache;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
 
   /**
@@ -6913,7 +7193,9 @@
    * @return the source
    */
   Source get source => cache != null ? cache.source : null;
+
   String get taskDescription => "incremental analysis ${(cache != null ? cache.source : "null")}";
+
   void internalPerform() {
     if (cache == null) {
       return;
@@ -6921,11 +7203,11 @@
     compilationUnit = cache.resolvedUnit;
   }
 }
+
 /**
  * Instances of the class `ParseDartTask` parse a specific source as a Dart file.
  */
 class ParseDartTask extends AnalysisTask {
-
   /**
    * The source to be parsed.
    */
@@ -6985,6 +7267,7 @@
   ParseDartTask(InternalAnalysisContext context, Source source) : super(context) {
     this.source = source;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
 
   /**
@@ -7026,18 +7309,20 @@
    * @return `true` if the source contains a 'part of' directive
    */
   bool hasPartOfDirective() => _hasPartOfDirective2;
+
   String get taskDescription {
     if (source == null) {
       return "parse as dart null source";
     }
     return "parse as dart ${source.fullName}";
   }
+
   void internalPerform() {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     List<Token> token = [null];
     TimeCounter_TimeCounterHandle timeCounterScan = PerformanceStatistics.scan.start();
     try {
-      Source_ContentReceiver receiver = new Source_ContentReceiver_11(this, errorListener, token);
+      Source_ContentReceiver receiver = new Source_ContentReceiver_12(this, errorListener, token);
       try {
         source.getContents(receiver);
       } on JavaException catch (exception) {
@@ -7120,17 +7405,23 @@
     return new List.from(sources);
   }
 }
-class Source_ContentReceiver_11 implements Source_ContentReceiver {
+
+class Source_ContentReceiver_12 implements Source_ContentReceiver {
   final ParseDartTask ParseDartTask_this;
+
   RecordingErrorListener errorListener;
+
   List<Token> token;
-  Source_ContentReceiver_11(this.ParseDartTask_this, this.errorListener, this.token);
+
+  Source_ContentReceiver_12(this.ParseDartTask_this, this.errorListener, this.token);
+
   void accept(CharBuffer contents, int modificationTime) {
     ParseDartTask_this.modificationTime = modificationTime;
     Scanner scanner = new Scanner(ParseDartTask_this.source, new CharSequenceReader(contents), errorListener);
     token[0] = scanner.tokenize();
     ParseDartTask_this.lineInfo = new LineInfo(scanner.lineStarts);
   }
+
   void accept2(String contents, int modificationTime) {
     ParseDartTask_this.modificationTime = modificationTime;
     Scanner scanner = new Scanner(ParseDartTask_this.source, new CharSequenceReader(new CharSequence(contents)), errorListener);
@@ -7138,11 +7429,11 @@
     ParseDartTask_this.lineInfo = new LineInfo(scanner.lineStarts);
   }
 }
+
 /**
  * Instances of the class `ParseHtmlTask` parse a specific source as an HTML file.
  */
 class ParseHtmlTask extends AnalysisTask {
-
   /**
    * The source to be parsed.
    */
@@ -7198,13 +7489,16 @@
   ParseHtmlTask(InternalAnalysisContext context, Source source) : super(context) {
     this.source = source;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this);
+
   String get taskDescription {
     if (source == null) {
       return "parse as html null source";
     }
     return "parse as html ${source.fullName}";
   }
+
   void internalPerform() {
     HtmlScanner scanner = new HtmlScanner(source);
     try {
@@ -7227,17 +7521,21 @@
    */
   List<Source> get librarySources {
     List<Source> libraries = new List<Source>();
-    htmlUnit.accept(new RecursiveXmlVisitor_12(this, libraries));
+    htmlUnit.accept(new RecursiveXmlVisitor_13(this, libraries));
     if (libraries.isEmpty) {
       return Source.EMPTY_ARRAY;
     }
     return new List.from(libraries);
   }
 }
-class RecursiveXmlVisitor_12 extends RecursiveXmlVisitor<Object> {
+
+class RecursiveXmlVisitor_13 extends RecursiveXmlVisitor<Object> {
   final ParseHtmlTask ParseHtmlTask_this;
+
   List<Source> libraries;
-  RecursiveXmlVisitor_12(this.ParseHtmlTask_this, this.libraries) : super();
+
+  RecursiveXmlVisitor_13(this.ParseHtmlTask_this, this.libraries) : super();
+
   Object visitXmlTagNode(XmlTagNode node) {
     if (javaStringEqualsIgnoreCase(node.tag.lexeme, ParseHtmlTask._TAG_SCRIPT)) {
       bool isDartScript = false;
@@ -7266,11 +7564,11 @@
     return super.visitXmlTagNode(node);
   }
 }
+
 /**
  * Instances of the class `ResolveDartLibraryTask` parse a specific Dart library.
  */
 class ResolveDartLibraryTask extends AnalysisTask {
-
   /**
    * The source representing the file whose compilation unit is to be returned.
    */
@@ -7297,24 +7595,27 @@
     this.unitSource = unitSource;
     this.librarySource = librarySource;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryTask(this);
+
   String get taskDescription {
     if (librarySource == null) {
       return "resolve library null source";
     }
     return "resolve library ${librarySource.fullName}";
   }
+
   void internalPerform() {
     libraryResolver = new LibraryResolver(context);
     libraryResolver.resolveLibrary(librarySource, true);
   }
 }
+
 /**
  * Instances of the class `ResolveDartUnitTask` resolve a single Dart file based on a existing
  * element model.
  */
 class ResolveDartUnitTask extends AnalysisTask {
-
   /**
    * The source that is to be resolved.
    */
@@ -7346,6 +7647,7 @@
     this.source = source;
     this._libraryElement = libraryElement;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartUnitTask(this);
 
   /**
@@ -7354,6 +7656,7 @@
    * @return the source for the library containing the source that is to be resolved
    */
   Source get librarySource => _libraryElement.source;
+
   String get taskDescription {
     Source librarySource = _libraryElement.source;
     if (librarySource == null) {
@@ -7361,6 +7664,7 @@
     }
     return "resolve unit ${librarySource.fullName}";
   }
+
   void internalPerform() {
     Source coreLibrarySource = _libraryElement.context.sourceFactory.forUri(DartSdk.DART_CORE);
     LibraryElement coreElement = context.computeLibraryElement(coreLibrarySource);
@@ -7418,11 +7722,11 @@
     return null;
   }
 }
+
 /**
  * Instances of the class `ResolveHtmlTask` resolve a specific source as an HTML file.
  */
 class ResolveHtmlTask extends AnalysisTask {
-
   /**
    * The source to be resolved.
    */
@@ -7452,13 +7756,16 @@
   ResolveHtmlTask(InternalAnalysisContext context, Source source) : super(context) {
     this.source = source;
   }
+
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveHtmlTask(this);
+
   String get taskDescription {
     if (source == null) {
       return "resolve as html null source";
     }
     return "resolve as html ${source.fullName}";
   }
+
   void internalPerform() {
     ResolvableHtmlUnit resolvableHtmlUnit = context.computeResolvableHtmlUnit(source);
     HtmlUnit unit = resolvableHtmlUnit.compilationUnit;
@@ -7471,6 +7778,7 @@
     resolutionErrors = builder.errorListener.getErrors2(source);
   }
 }
+
 /**
  * The interface `Logger` defines the behavior of objects that can be used to receive
  * information about errors within the analysis engine. Implementations usually write this
@@ -7520,18 +7828,23 @@
    */
   void logInformation2(String message, Exception exception);
 }
+
 /**
  * Implementation of [Logger] that does nothing.
  */
 class Logger_NullLogger implements Logger {
   void logError(String message) {
   }
+
   void logError2(String message, Exception exception) {
   }
+
   void logError3(Exception exception) {
   }
+
   void logInformation(String message) {
   }
+
   void logInformation2(String message, Exception exception) {
   }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 81d6249..70123b4 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -1,10 +1,14 @@
 // 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 engine.error;
+
 import 'java_core.dart';
 import 'source.dart';
-import 'ast.dart' show ASTNode;
 import 'scanner.dart' show Token;
+import 'ast.dart' show ASTNode;
+import 'element.dart' show Element;
+
 /**
  * Instances of the enumeration `ErrorSeverity` represent the severity of an [ErrorCode]
  * .
@@ -12,7 +16,6 @@
  * @coverage dart.engine.error
  */
 class ErrorSeverity extends Enum<ErrorSeverity> {
-
   /**
    * The severity representing a non-error. This is never used for any error code, but is useful for
    * clients.
@@ -34,6 +37,7 @@
    * The severity representing an error.
    */
   static final ErrorSeverity ERROR = new ErrorSeverity('ERROR', 3, "E", "error");
+
   static final List<ErrorSeverity> values = [NONE, INFO, WARNING, ERROR];
 
   /**
@@ -65,11 +69,11 @@
    */
   ErrorSeverity max(ErrorSeverity severity) => this.ordinal >= severity.ordinal ? this : severity;
 }
+
 /**
  * Instances of the class `AnalysisErrorWithProperties`
  */
 class AnalysisErrorWithProperties extends AnalysisError {
-
   /**
    * The properties associated with this error.
    */
@@ -95,6 +99,7 @@
    * @param arguments the arguments used to build the error message
    */
   AnalysisErrorWithProperties.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) : super.con2(source, offset, length, errorCode, arguments);
+
   Object getProperty(ErrorProperty property) => _propertyMap[property];
 
   /**
@@ -108,6 +113,7 @@
     _propertyMap[property] = value;
   }
 }
+
 /**
  * Instances of the class `ErrorReporter` wrap an error listener with utility methods used to
  * create the errors being reported.
@@ -115,7 +121,6 @@
  * @coverage dart.engine.error
  */
 class ErrorReporter {
-
   /**
    * The error listener to which errors will be reported.
    */
@@ -174,7 +179,18 @@
    * @param arguments the arguments to the error, used to compose the error message
    */
   void reportError2(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
-    reportError3(errorCode, node.offset, node.length, arguments);
+    reportError4(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param element the element which name should be used as the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportError3(ErrorCode errorCode, Element element, List<Object> arguments) {
+    reportError4(errorCode, element.nameOffset, element.displayName.length, arguments);
   }
 
   /**
@@ -185,7 +201,7 @@
    * @param length the length of the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError3(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void reportError4(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
   }
 
@@ -196,8 +212,8 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError4(ErrorCode errorCode, Token token, List<Object> arguments) {
-    reportError3(errorCode, token.offset, token.length, arguments);
+  void reportError5(ErrorCode errorCode, Token token, List<Object> arguments) {
+    reportError4(errorCode, token.offset, token.length, arguments);
   }
 
   /**
@@ -210,6 +226,7 @@
     this._source = source == null ? _defaultSource : source;
   }
 }
+
 /**
  * Instances of the class `AnalysisError` represent an error discovered during the analysis of
  * some Dart code.
@@ -218,7 +235,6 @@
  * @coverage dart.engine.error
  */
 class AnalysisError {
-
   /**
    * An empty array of errors used when no errors are expected.
    */
@@ -320,6 +336,7 @@
       this.correction = JavaString.format(correctionTemplate, arguments);
     }
   }
+
   bool operator ==(Object obj) {
     if (identical(obj, this)) {
       return true;
@@ -354,12 +371,14 @@
    * @return the value of the given property
    */
   Object getProperty(ErrorProperty property) => null;
+
   int get hashCode {
     int hashCode = offset;
     hashCode ^= (message != null) ? message.hashCode : 0;
     hashCode ^= (source != null) ? source.hashCode : 0;
     return hashCode;
   }
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append((source != null) ? source.fullName : "<unknown source>");
@@ -372,29 +391,32 @@
     return builder.toString();
   }
 }
+
 /**
  * The enumeration `ErrorProperty` defines the properties that can be associated with an
  * [AnalysisError].
  */
 class ErrorProperty extends Enum<ErrorProperty> {
-
   /**
    * A property whose value is an array of [ExecutableElement] that should
    * be but are not implemented by a concrete class.
    */
   static final ErrorProperty UNIMPLEMENTED_METHODS = new ErrorProperty('UNIMPLEMENTED_METHODS', 0);
+
   static final List<ErrorProperty> values = [UNIMPLEMENTED_METHODS];
+
   ErrorProperty(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * The enumeration `TodoCode` defines the single TODO `ErrorCode`.
  */
 class TodoCode extends Enum<TodoCode> implements ErrorCode {
-
   /**
    * The single enum of TodoCode.
    */
   static final TodoCode TODO = new TodoCode('TODO', 0);
+
   static final List<TodoCode> values = [TODO];
 
   /**
@@ -411,18 +433,23 @@
    * * TODOS
    */
   static RegExp TODO_REGEX = new RegExp("([\\s/\\*])((TODO[^\\w\\d][^\\r\\n]*)|(TODO:?\$))");
+
   TodoCode(String name, int ordinal) : super(name, ordinal);
+
   String get correction => null;
+
   ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
+
   String get message => "%s";
+
   ErrorType get type => ErrorType.TODO;
 }
+
 /**
  * The enumeration `HintCode` defines the hints and coding recommendations for best practices
  * which are not mentioned in the Dart Language Specification.
  */
 class HintCode extends Enum<HintCode> implements ErrorCode {
-
   /**
    * Dead code is code that is never reached, this can happen for instance if a statement follows a
    * return statement.
@@ -445,34 +472,41 @@
   static final HintCode DEAD_CODE_ON_CATCH_SUBTYPE = new HintCode.con1('DEAD_CODE_ON_CATCH_SUBTYPE', 2, "Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'");
 
   /**
+   * Deprecated members should not be invoked or used.
+   *
+   * @param memberName the name of the member
+   */
+  static final HintCode DEPRECATED_MEMBER_USE = new HintCode.con1('DEPRECATED_MEMBER_USE', 3, "'%s' is deprecated");
+
+  /**
    * Duplicate imports.
    */
-  static final HintCode DUPLICATE_IMPORT = new HintCode.con1('DUPLICATE_IMPORT', 3, "Duplicate import");
+  static final HintCode DUPLICATE_IMPORT = new HintCode.con1('DUPLICATE_IMPORT', 4, "Duplicate import");
 
   /**
    * Hint to use the ~/ operator.
    */
-  static final HintCode DIVISION_OPTIMIZATION = new HintCode.con1('DIVISION_OPTIMIZATION', 4, "The operator x ~/ y is more efficient than (x / y).toInt()");
+  static final HintCode DIVISION_OPTIMIZATION = new HintCode.con1('DIVISION_OPTIMIZATION', 5, "The operator x ~/ y is more efficient than (x / y).toInt()");
 
   /**
    * Hint for the `x is double` type checks.
    */
-  static final HintCode IS_DOUBLE = new HintCode.con1('IS_DOUBLE', 5, "When compiled to JS, this test might return true when the left hand side is an int");
+  static final HintCode IS_DOUBLE = new HintCode.con1('IS_DOUBLE', 6, "When compiled to JS, this test might return true when the left hand side is an int");
 
   /**
    * Hint for the `x is int` type checks.
    */
-  static final HintCode IS_INT = new HintCode.con1('IS_INT', 6, "When compiled to JS, this test might return true when the left hand side is a double");
+  static final HintCode IS_INT = new HintCode.con1('IS_INT', 7, "When compiled to JS, this test might return true when the left hand side is a double");
 
   /**
    * Hint for the `x is! double` type checks.
    */
-  static final HintCode IS_NOT_DOUBLE = new HintCode.con1('IS_NOT_DOUBLE', 7, "When compiled to JS, this test might return false when the left hand side is an int");
+  static final HintCode IS_NOT_DOUBLE = new HintCode.con1('IS_NOT_DOUBLE', 8, "When compiled to JS, this test might return false when the left hand side is an int");
 
   /**
    * Hint for the `x is! int` type checks.
    */
-  static final HintCode IS_NOT_INT = new HintCode.con1('IS_NOT_INT', 8, "When compiled to JS, this test might return false when the left hand side is a double");
+  static final HintCode IS_NOT_INT = new HintCode.con1('IS_NOT_INT', 9, "When compiled to JS, this test might return false when the left hand side is a double");
 
   /**
    * It is not in best practice to declare a private method that happens to override the method in a
@@ -483,24 +517,24 @@
    * @param memberName some private member name
    * @param className the class name where the member is overriding the functionality
    */
-  static final HintCode OVERRIDDING_PRIVATE_MEMBER = new HintCode.con1('OVERRIDDING_PRIVATE_MEMBER', 9, "The %s '%s' does not override the definition from '%s' because it is private and in a different library");
+  static final HintCode OVERRIDDING_PRIVATE_MEMBER = new HintCode.con1('OVERRIDDING_PRIVATE_MEMBER', 10, "The %s '%s' does not override the definition from '%s' because it is private and in a different library");
 
   /**
    * Hint for classes that override equals, but not hashCode.
    *
    * @param className the name of the current class
    */
-  static final HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = new HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 10, "The class '%s' overrides 'operator==', but not 'get hashCode'");
+  static final HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = new HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 11, "The class '%s' overrides 'operator==', but not 'get hashCode'");
 
   /**
    * Type checks of the type `x is! Null` should be done with `x != null`.
    */
-  static final HintCode TYPE_CHECK_IS_NOT_NULL = new HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 11, "Tests for non-null should be done with '!= null'");
+  static final HintCode TYPE_CHECK_IS_NOT_NULL = new HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 12, "Tests for non-null should be done with '!= null'");
 
   /**
    * Type checks of the type `x is Null` should be done with `x == null`.
    */
-  static final HintCode TYPE_CHECK_IS_NULL = new HintCode.con1('TYPE_CHECK_IS_NULL', 12, "Tests for null should be done with '== null'");
+  static final HintCode TYPE_CHECK_IS_NULL = new HintCode.con1('TYPE_CHECK_IS_NULL', 13, "Tests for null should be done with '== null'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_GETTER] or
@@ -512,7 +546,7 @@
    * @see StaticTypeWarningCode#UNDEFINED_GETTER
    * @see StaticWarningCode#UNDEFINED_GETTER
    */
-  static final HintCode UNDEFINED_GETTER = new HintCode.con1('UNDEFINED_GETTER', 13, StaticTypeWarningCode.UNDEFINED_GETTER.message);
+  static final HintCode UNDEFINED_GETTER = new HintCode.con1('UNDEFINED_GETTER', 14, StaticTypeWarningCode.UNDEFINED_GETTER.message);
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_METHOD] would
@@ -522,7 +556,7 @@
    * @param typeName the resolved type name that the method lookup is happening on
    * @see StaticTypeWarningCode#UNDEFINED_METHOD
    */
-  static final HintCode UNDEFINED_METHOD = new HintCode.con1('UNDEFINED_METHOD', 14, StaticTypeWarningCode.UNDEFINED_METHOD.message);
+  static final HintCode UNDEFINED_METHOD = new HintCode.con1('UNDEFINED_METHOD', 15, StaticTypeWarningCode.UNDEFINED_METHOD.message);
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_OPERATOR]
@@ -532,7 +566,7 @@
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    * @see StaticTypeWarningCode#UNDEFINED_OPERATOR
    */
-  static final HintCode UNDEFINED_OPERATOR = new HintCode.con1('UNDEFINED_OPERATOR', 15, StaticTypeWarningCode.UNDEFINED_OPERATOR.message);
+  static final HintCode UNDEFINED_OPERATOR = new HintCode.con1('UNDEFINED_OPERATOR', 16, StaticTypeWarningCode.UNDEFINED_OPERATOR.message);
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_SETTER] or
@@ -544,31 +578,33 @@
    * @see StaticTypeWarningCode#UNDEFINED_SETTER
    * @see StaticWarningCode#UNDEFINED_SETTER
    */
-  static final HintCode UNDEFINED_SETTER = new HintCode.con1('UNDEFINED_SETTER', 16, StaticTypeWarningCode.UNDEFINED_SETTER.message);
+  static final HintCode UNDEFINED_SETTER = new HintCode.con1('UNDEFINED_SETTER', 17, StaticTypeWarningCode.UNDEFINED_SETTER.message);
 
   /**
    * Unnecessary cast.
    */
-  static final HintCode UNNECESSARY_CAST = new HintCode.con1('UNNECESSARY_CAST', 17, "Unnecessary cast");
+  static final HintCode UNNECESSARY_CAST = new HintCode.con1('UNNECESSARY_CAST', 18, "Unnecessary cast");
 
   /**
    * Unnecessary type checks, the result is always true.
    */
-  static final HintCode UNNECESSARY_TYPE_CHECK_FALSE = new HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 18, "Unnecessary type check, the result is always false");
+  static final HintCode UNNECESSARY_TYPE_CHECK_FALSE = new HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 19, "Unnecessary type check, the result is always false");
 
   /**
    * Unnecessary type checks, the result is always false.
    */
-  static final HintCode UNNECESSARY_TYPE_CHECK_TRUE = new HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 19, "Unnecessary type check, the result is always true");
+  static final HintCode UNNECESSARY_TYPE_CHECK_TRUE = new HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 20, "Unnecessary type check, the result is always true");
 
   /**
    * Unused imports are imports which are never not used.
    */
-  static final HintCode UNUSED_IMPORT = new HintCode.con1('UNUSED_IMPORT', 20, "Unused import");
+  static final HintCode UNUSED_IMPORT = new HintCode.con1('UNUSED_IMPORT', 21, "Unused import");
+
   static final List<HintCode> values = [
       DEAD_CODE,
       DEAD_CODE_CATCH_FOLLOWING_CATCH,
       DEAD_CODE_ON_CATCH_SUBTYPE,
+      DEPRECATED_MEMBER_USE,
       DUPLICATE_IMPORT,
       DIVISION_OPTIMIZATION,
       IS_DOUBLE,
@@ -618,11 +654,16 @@
     this._message = message;
     this.correction3 = correction;
   }
+
   String get correction => correction3;
+
   ErrorSeverity get errorSeverity => ErrorType.HINT.severity;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.HINT;
 }
+
 /**
  * The interface `ErrorCode` defines the behavior common to objects representing error codes
  * associated with [AnalysisError].
@@ -634,7 +675,6 @@
  * @coverage dart.engine.error
  */
 abstract class ErrorCode {
-
   /**
    * Return the template used to create the correction to be displayed for this error, or
    * `null` if there is no correction information for this error. The correction should
@@ -666,13 +706,13 @@
    */
   ErrorType get type;
 }
+
 /**
  * Instances of the enumeration `ErrorType` represent the type of an [ErrorCode].
  *
  * @coverage dart.engine.error
  */
 class ErrorType extends Enum<ErrorType> {
-
   /**
    * Task (todo) comments in user code.
    */
@@ -712,6 +752,7 @@
    * Syntactic errors are errors produced as a result of input that does not conform to the grammar.
    */
   static final ErrorType SYNTACTIC_ERROR = new ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
+
   static final List<ErrorType> values = [
       TODO,
       HINT,
@@ -734,8 +775,10 @@
   ErrorType(String name, int ordinal, ErrorSeverity severity) : super(name, ordinal) {
     this.severity = severity;
   }
+
   String get displayName => name.toLowerCase().replaceAll('_', ' ');
 }
+
 /**
  * The enumeration `CompileTimeErrorCode` defines the error codes used for compile time
  * errors. The convention for this class is for the name of the error code to indicate the problem
@@ -745,11 +788,10 @@
  * @coverage dart.engine.error
  */
 class CompileTimeErrorCode extends Enum<CompileTimeErrorCode> implements ErrorCode {
-
   /**
    * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
    * <i>L</i> and <i>N</i> is introduced into the export namespace of <i>L</i> by more than one
-   * export.
+   * export, unless each all exports refer to same declaration for the name N.
    *
    * @param ambiguousElementName the name of the ambiguous element
    * @param firstLibraryName the name of the first library that the type is found
@@ -1910,6 +1952,7 @@
    * exactly one required formal parameter <i>p</i>.
    */
   static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 139, "Setters should declare exactly one required parameter");
+
   static final List<CompileTimeErrorCode> values = [
       AMBIGUOUS_EXPORT,
       ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
@@ -2082,11 +2125,16 @@
     this._message = message;
     this.correction2 = correction;
   }
+
   String get correction => correction2;
+
   ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
 }
+
 /**
  * The enumeration `PubSuggestionCode` defines the suggestions used for reporting deviations
  * from pub best practices. The convention for this class is for the name of the bad practice to
@@ -2094,7 +2142,6 @@
  * what is wrong and, when appropriate, how the situation can be corrected.
  */
 class PubSuggestionCode extends Enum<PubSuggestionCode> implements ErrorCode {
-
   /**
    * It is a bad practice for a source file in a package "lib" directory hierarchy to traverse
    * outside that directory hierarchy. For example, a source file in the "lib" directory should not
@@ -2117,6 +2164,7 @@
    * source file should not contain a directive such as `import 'package:foo/../some.dart'`.
    */
   static final PubSuggestionCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = new PubSuggestionCode.con1('PACKAGE_IMPORT_CONTAINS_DOT_DOT', 2, "A package import should not contain '..'");
+
   static final List<PubSuggestionCode> values = [
       FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
       FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
@@ -2152,11 +2200,16 @@
     this._message = message;
     this.correction5 = correction;
   }
+
   String get correction => correction5;
+
   ErrorSeverity get errorSeverity => ErrorType.PUB_SUGGESTION.severity;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.PUB_SUGGESTION;
 }
+
 /**
  * The enumeration `StaticWarningCode` defines the error codes used for static warnings. The
  * convention for this class is for the name of the error code to indicate the problem that caused
@@ -2166,7 +2219,6 @@
  * @coverage dart.engine.error
  */
 class StaticWarningCode extends Enum<StaticWarningCode> implements ErrorCode {
-
   /**
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
    * into the top level scope <i>L</i> by more than one import then:
@@ -2271,37 +2323,43 @@
   static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 9, "Superclass '%s' declares static member with the same name");
 
   /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
+   * named <i>n</i> and has a setter named <i>n=</i>.
+   */
+  static final StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method %s and has a setter with the same name from '%s'");
+
+  /**
    * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
    * <i>v=</i> and an accessible static member named <i>v=</i> or <i>v</i> is declared in a
    * superclass of <i>C</i>.
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 10, "Superclass '%s' declares static member with the same name");
+  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 11, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
    * has a non-static setter named <i>v=</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 11, "Class '%s' declares non-static setter with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 12, "Class '%s' declares non-static setter with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
    * also has a non-static member named <i>v</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 12, "Class '%s' declares non-static member with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 13, "Class '%s' declares non-static member with the same name");
 
   /**
    * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
    * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
    * abstract class but <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 13, "Abstract classes cannot be created with a 'const' expression");
+  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 14, "Abstract classes cannot be created with a 'const' expression");
 
   /**
    * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
    */
-  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 14, "Keys in a map cannot be equal");
+  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 15, "Keys in a map cannot be equal");
 
   /**
    * 14.2 Exports: It is a static warning to export two different libraries with the same name.
@@ -2310,7 +2368,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the exported libraries
    */
-  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 15, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 16, "The exported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2320,13 +2378,13 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
    */
-  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 16, "%d positional arguments expected, but %d found");
+  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 17, "%d positional arguments expected, but %d found");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
    * its point of declaration is also initialized in a constructor.
    */
-  static final StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 17, "Values cannot be set in the constructor if they are final, and have already been set");
+  static final StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 18, "Values cannot be set in the constructor if they are final, and have already been set");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
@@ -2334,7 +2392,7 @@
    *
    * @param name the name of the field in question
    */
-  static final StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 18, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+  static final StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 19, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
 
   /**
    * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
@@ -2351,7 +2409,7 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 19, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 20, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -2360,7 +2418,7 @@
    * @param parameterType the name of the type of the field formal parameter
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 20, "The parameter type '%s' is incompatable with the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 21, "The parameter type '%s' is incompatable with the field type '%s'");
 
   /**
    * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
@@ -2377,13 +2435,13 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 21, "The final variable '%s' must be initialized");
+  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 22, "The final variable '%s' must be initialized");
 
   /**
    * 15.5 Function Types: It is a static warning if a concrete class implements Function and does
    * not have a concrete method named call().
    */
-  static final StaticWarningCode FUNCTION_WITHOUT_CALL = new StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 22, "Concrete classes that implement Function must implement the method call()");
+  static final StaticWarningCode FUNCTION_WITHOUT_CALL = new StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 23, "Concrete classes that implement Function must implement the method call()");
 
   /**
    * 14.1 Imports: It is a static warning to import two different libraries with the same name.
@@ -2392,7 +2450,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the imported libraries
    */
-  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 23, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 24, "The imported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
@@ -2404,7 +2462,7 @@
    * not all of the <i>m<sub>i</sub></i> are setters, none of the <i>m<sub>i</sub></i> are
    * inherited, and a static warning is issued.
    */
-  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 24, "'%s' is inherited as a getter and also a method");
+  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 25, "'%s' is inherited as a getter and also a method");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
@@ -2414,7 +2472,7 @@
    * @param memberName the name of the member with the name conflict
    * @param superclassName the name of the enclosing class that has the static member
    */
-  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 25, "'%s' collides with a static member in the superclass '%s'");
+  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 26, "'%s' collides with a static member in the superclass '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -2426,7 +2484,7 @@
    * @param className the name of the class where the overridden getter is declared
    * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 26, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
+  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 27, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2437,7 +2495,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 27, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 28, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2449,7 +2507,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 28, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2460,7 +2518,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2472,7 +2530,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 30, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 31, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2480,7 +2538,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 31, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 32, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2488,7 +2546,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 32, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 33, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2498,7 +2556,7 @@
    * @param paramCount the number of named parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 33, "Missing the named parameter '%s' to match the overridden method from '%s'");
+  static final StaticWarningCode INVALID_OVERRIDE_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 34, "Missing the named parameter '%s' to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2507,7 +2565,7 @@
    * @param paramCount the number of positional parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 34, "Must have at least %d parameters to match the overridden method from '%s'");
+  static final StaticWarningCode INVALID_OVERRIDE_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 35, "Must have at least %d parameters to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2517,7 +2575,7 @@
    * @param paramCount the number of required parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_REQUIRED = new StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 35, "Must have %d required parameters or less to match the overridden method from '%s'");
+  static final StaticWarningCode INVALID_OVERRIDE_REQUIRED = new StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 36, "Must have %d required parameters or less to match the overridden method from '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -2529,7 +2587,7 @@
    * @param className the name of the class where the overridden setter is declared
    * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 36, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 37, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -2545,7 +2603,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 final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 37, "The element type '%s' cannot be assigned to the list type '%s'");
+  static final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 38, "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> :
@@ -2561,7 +2619,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 final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 38, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 39, "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> :
@@ -2577,33 +2635,33 @@
    * 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 final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 39, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 40, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
+  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 41, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 41, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
+  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 42, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
 
   /**
    * 13.12 Return: It is a static warning if a function contains both one or more return statements
    * of the form <i>return;</i> and one or more return statements of the form <i>return e;</i>.
    */
-  static final StaticWarningCode MIXED_RETURN_TYPES = new StaticWarningCode.con1('MIXED_RETURN_TYPES', 42, "Methods and functions cannot use return both with and without values");
+  static final StaticWarningCode MIXED_RETURN_TYPES = new StaticWarningCode.con1('MIXED_RETURN_TYPES', 43, "Methods and functions cannot use return both with and without values");
 
   /**
    * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
    * <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 43, "Abstract classes cannot be created with a 'new' expression");
+  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 44, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
@@ -2614,7 +2672,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 44, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 45, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
@@ -2622,7 +2680,7 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode.con1('NEW_WITH_NON_TYPE', 45, "The name '%s' is not a class");
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode.con1('NEW_WITH_NON_TYPE', 46, "The name '%s' is not a class");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2633,7 +2691,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 46, "The class '%s' does not have a constructor '%s'");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 47, "The class '%s' does not have a constructor '%s'");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2644,7 +2702,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 47, "The class '%s' does not have a default constructor");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 48, "The class '%s' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2664,7 +2722,7 @@
    * @param memberName the name of the fourth member
    * @param additionalCount the number of additional missing members that aren't listed
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 48, "Missing inherited members: '%s', '%s', '%s', '%s' and %d more");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 49, "Missing inherited members: '%s', '%s', '%s', '%s' and %d more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2683,7 +2741,7 @@
    * @param memberName the name of the third member
    * @param memberName the name of the fourth member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 49, "Missing inherited members: '%s', '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 50, "Missing inherited members: '%s', '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2699,7 +2757,7 @@
    *
    * @param memberName the name of the member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 50, "Missing inherited member '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 51, "Missing inherited member '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2717,7 +2775,7 @@
    * @param memberName the name of the second member
    * @param memberName the name of the third member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 51, "Missing inherited members: '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 52, "Missing inherited members: '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2734,7 +2792,7 @@
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 52, "Missing inherited members: '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 53, "Missing inherited members: '%s' and '%s'");
 
   /**
    * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
@@ -2744,18 +2802,18 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 53, "The name '%s' is not a type and cannot be used in an on-catch clause");
+  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 54, "The name '%s' is not a type and cannot be used in an on-catch clause");
 
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
    * explicitly declared and not void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 54, "The return type of the operator []= must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 55, "The return type of the operator []= must be 'void'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 55, "The return type of the setter must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 56, "The return type of the setter must be 'void'");
 
   /**
    * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
@@ -2769,7 +2827,7 @@
    *
    * @param nonTypeName the name that is not a type
    */
-  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode.con1('NOT_A_TYPE', 56, "%s is not a type");
+  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode.con1('NOT_A_TYPE', 57, "%s is not a type");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2779,7 +2837,7 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #EXTRA_POSITIONAL_ARGUMENTS
    */
-  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 57, "%d required argument(s) expected, but %d found");
+  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 58, "%d required argument(s) expected, but %d found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -2788,7 +2846,7 @@
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 58, "Expected this library to be part of '%s', not '%s'");
+  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 59, "Expected this library to be part of '%s', not '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2797,7 +2855,7 @@
    * @param redirectedName the name of the redirected constructor
    * @param redirectingName the name of the redirecting constructor
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 59, "The redirected constructor '%s' has incompatible parameters with '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 60, "The redirected constructor '%s' has incompatible parameters with '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2806,21 +2864,21 @@
    * @param redirectedName the name of the redirected constructor return type
    * @param redirectingName the name of the redirecting constructor return type
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 60, "The return type '%s' of the redirected constructor is not assignable to '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 61, "The return type '%s' of the redirected constructor is not assignable to '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 61, "The constructor '%s' could not be found in '%s'");
+  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 62, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 62, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 63, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 13.11 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
@@ -2830,27 +2888,27 @@
    * * The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 63, "Missing return value after 'return'");
+  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 64, "Missing return value after 'return'");
 
   /**
-   * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
+   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
    * or getter <i>m</i>.
    *
    * @param memberName the name of the instance member
    */
-  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 64, "Instance member '%s' cannot be accessed using static access");
+  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 65, "Instance member '%s' cannot be accessed using static access");
 
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 65, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 66, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
 
   /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 66, "The name '%s' is not a type and cannot be used in an 'is' expression");
+  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 67, "The name '%s' is not a type and cannot be used in an 'is' expression");
 
   /**
    * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
@@ -2859,22 +2917,22 @@
    * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
    * is then interpreted as dynamic by the static type checker and the runtime.
    */
-  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 67, "Static members cannot reference type parameters");
+  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 68, "Static members cannot reference type parameters");
 
   /**
-   * 12.15.3 Static Invocation: A static method invocation <i>i</i> has the form
+   * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
    * <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a static warning if <i>C</i> does not denote a
    * class in the current scope.
    *
    * @param undefinedClassName the name of the undefined class
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode.con1('UNDEFINED_CLASS', 68, "Undefined class '%s'");
+  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode.con1('UNDEFINED_CLASS', 69, "Undefined class '%s'");
 
   /**
    * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 69, "Undefined class 'boolean'; did you mean 'bool'?");
+  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 70, "Undefined class 'boolean'; did you mean 'bool'?");
 
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
@@ -2884,7 +2942,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode.con1('UNDEFINED_GETTER', 70, "There is no such getter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode.con1('UNDEFINED_GETTER', 71, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -2894,7 +2952,7 @@
    *
    * @param name the name of the identifier
    */
-  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 71, "Undefined name '%s'");
+  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 72, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -2903,7 +2961,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 72, "The named parameter '%s' is not defined");
+  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 73, "The named parameter '%s' is not defined");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
@@ -2918,16 +2976,17 @@
    * @param setterName the name of the getter
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode.con1('UNDEFINED_SETTER', 73, "There is no such setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode.con1('UNDEFINED_SETTER', 74, "There is no such setter '%s' in '%s'");
 
   /**
-   * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
+   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
    * or getter <i>m</i>.
    *
    * @param methodName the name of the method
    * @param enclosingType the name of the enclosing type where the method is being looked for
    */
-  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 74, "There is no such static method '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 75, "There is no such static method, getter or setter '%s' in '%s'");
+
   static final List<StaticWarningCode> values = [
       AMBIGUOUS_IMPORT,
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
@@ -2939,6 +2998,7 @@
       CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
       CONFLICTING_DART_IMPORT,
       CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
+      CONFLICTING_INSTANCE_METHOD_SETTER,
       CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
       CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
       CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
@@ -3035,11 +3095,16 @@
     this._message = message;
     this.correction7 = correction;
   }
+
   String get correction => correction7;
+
   ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.STATIC_WARNING;
 }
+
 /**
  * The interface `AnalysisErrorListener` defines the behavior of objects that listen for
  * [AnalysisError] being produced by the analysis engine.
@@ -3047,7 +3112,6 @@
  * @coverage dart.engine.error
  */
 abstract class AnalysisErrorListener {
-
   /**
    * An error listener that ignores errors that are reported to it.
    */
@@ -3060,10 +3124,12 @@
    */
   void onError(AnalysisError error);
 }
+
 class AnalysisErrorListener_6 implements AnalysisErrorListener {
   void onError(AnalysisError event) {
   }
 }
+
 /**
  * The enumeration `HtmlWarningCode` defines the error codes used for warnings in HTML files.
  * The convention for this class is for the name of the error code to indicate the problem that
@@ -3073,7 +3139,6 @@
  * @coverage dart.engine.error
  */
 class HtmlWarningCode extends Enum<HtmlWarningCode> implements ErrorCode {
-
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag is not a
    * valid URI.
@@ -3089,6 +3154,7 @@
    * @param uri the URI pointing to a non-existent file
    */
   static final HtmlWarningCode URI_DOES_NOT_EXIST = new HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
+
   static final List<HtmlWarningCode> values = [INVALID_URI, URI_DOES_NOT_EXIST];
 
   /**
@@ -3121,11 +3187,16 @@
     this._message = message;
     this.correction4 = correction;
   }
+
   String get correction => correction4;
+
   ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.STATIC_WARNING;
 }
+
 /**
  * The enumeration `StaticTypeWarningCode` defines the error codes used for static type
  * warnings. The convention for this class is for the name of the error code to indicate the problem
@@ -3135,7 +3206,6 @@
  * @coverage dart.engine.error
  */
 class StaticTypeWarningCode extends Enum<StaticTypeWarningCode> implements ErrorCode {
-
   /**
    * 12.7 Lists: A fresh instance (7.6.1) <i>a</i>, of size <i>n</i>, whose class implements the
    * built-in class <i>List&lt;E></i> is allocated.
@@ -3394,6 +3464,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    */
   static final StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 21, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+
   static final List<StaticTypeWarningCode> values = [
       EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
       EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
@@ -3448,8 +3519,12 @@
     this._message = message;
     this.correction6 = correction;
   }
+
   String get correction => correction6;
+
   ErrorSeverity get errorSeverity => ErrorType.STATIC_TYPE_WARNING.severity;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index f5286bc..e55e7da 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -1,12 +1,15 @@
 // 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 engine.html;
+
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'source.dart';
 import 'element.dart' show HtmlElementImpl;
 import 'engine.dart' show AnalysisEngine;
+
 /**
  * Instances of the class `Token` represent a token that was scanned from the input. Each
  * token knows which token follows it, acting as the head of a linked list of tokens.
@@ -14,7 +17,6 @@
  * @coverage dart.engine.html
  */
 class Token {
-
   /**
    * The offset from the beginning of the file to the first character in the token.
    */
@@ -98,23 +100,26 @@
     token.previous = this;
     return token;
   }
+
   String toString() => lexeme;
 }
+
 /**
  * Instances of `HtmlParseResult` hold the result of parsing an HTML file.
  *
  * @coverage dart.engine.html
  */
 class HtmlParseResult extends HtmlScanResult {
-
   /**
    * The unit containing the parsed information (not `null`).
    */
   HtmlUnit htmlUnit;
+
   HtmlParseResult(int modificationTime, Token token, List<int> lineStarts, HtmlUnit unit) : super(modificationTime, token, lineStarts) {
     this.htmlUnit = unit;
   }
 }
+
 /**
  * Instances of the class `RecursiveXmlVisitor` implement an XML visitor that will recursively
  * visit all of the nodes in an XML structure. For example, using an instance of this class to visit
@@ -132,22 +137,24 @@
     node.visitChildren(this);
     return null;
   }
+
   R visitXmlAttributeNode(XmlAttributeNode node) {
     node.visitChildren(this);
     return null;
   }
+
   R visitXmlTagNode(XmlTagNode node) {
     node.visitChildren(this);
     return null;
   }
 }
+
 /**
  * The abstract class `XmlNode` defines behavior common to all XML/HTML nodes.
  *
  * @coverage dart.engine.html
  */
 abstract class XmlNode {
-
   /**
    * The parent of the node, or `null` if the node is the root of an AST structure.
    */
@@ -222,6 +229,7 @@
    * @return the parent of this node, or `null` if none
    */
   XmlNode get parent => _parent;
+
   String toString() {
     PrintStringWriter writer = new PrintStringWriter();
     accept(new ToSourceVisitor(writer));
@@ -272,9 +280,9 @@
    */
   void appendIdentifier(JavaStringBuilder builder, XmlNode node) {
     if (node is XmlTagNode) {
-      builder.append(((node as XmlTagNode)).tag.lexeme);
+      builder.append((node as XmlTagNode).tag.lexeme);
     } else if (node is XmlAttributeNode) {
-      builder.append(((node as XmlAttributeNode)).name.lexeme);
+      builder.append((node as XmlAttributeNode).name.lexeme);
     } else {
       builder.append("htmlUnit");
     }
@@ -320,6 +328,7 @@
     _parent = newParent;
   }
 }
+
 /**
  * Instances of the class `SimpleXmlVisitor` implement an AST visitor that will do nothing
  * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
@@ -328,9 +337,12 @@
  */
 class SimpleXmlVisitor<R> implements XmlVisitor<R> {
   R visitHtmlUnit(HtmlUnit htmlUnit) => null;
+
   R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode) => null;
+
   R visitXmlTagNode(XmlTagNode xmlTagNode) => null;
 }
+
 /**
  * The abstract class `AbstractScanner` implements a scanner for HTML code. Subclasses are
  * required to implement the interface used to access the characters being scanned.
@@ -444,19 +456,25 @@
   void recordStartOfLine() {
     _lineStarts.add(offset);
   }
+
   void appendEofToken() {
     Token eofToken = new Token.con1(TokenType.EOF, offset);
     eofToken.setNext(eofToken);
     _tail = _tail.setNext(eofToken);
   }
+
   Token emit(Token token) {
     _tail.setNext(token);
     _tail = token;
     return token;
   }
+
   Token emit2(TokenType type, int start) => emit(new Token.con1(type, start));
+
   Token emit3(TokenType type, int start, int count) => emit(new Token.con2(type, start, getString(start, count)));
+
   Token firstToken() => _tokens.next;
+
   int recordStartOfLineAndAdvance(int c) {
     if (c == 0xD) {
       c = advance();
@@ -472,6 +490,7 @@
     }
     return c;
   }
+
   void scan() {
     bool inBrackets = false;
     String endPassThrough = null;
@@ -632,13 +651,13 @@
     }
   }
 }
+
 /**
  * Instances of `HtmlScanResult` hold the result of scanning an HTML file.
  *
  * @coverage dart.engine.html
  */
 class HtmlScanResult {
-
   /**
    * The time at which the contents of the source were last set.
    */
@@ -653,12 +672,14 @@
    * The line start information that was produced.
    */
   List<int> lineStarts;
+
   HtmlScanResult(int modificationTime, Token token, List<int> lineStarts) {
     this.modificationTime = modificationTime;
     this.token = token;
     this.lineStarts = lineStarts;
   }
 }
+
 /**
  * Instances of the class `StringScanner` implement a scanner that reads from a string. The
  * scanning logic is in the superclass.
@@ -666,7 +687,6 @@
  * @coverage dart.engine.html
  */
 class StringScanner extends AbstractScanner {
-
   /**
    * The string from which characters will be read.
    */
@@ -693,10 +713,13 @@
     this._stringLength = string.length;
     this._charOffset = -1;
   }
+
   int get offset => _charOffset;
+
   void set offset(int offset) {
     _charOffset = offset;
   }
+
   int advance() {
     if (++_charOffset < _stringLength) {
       return _string.codeUnitAt(_charOffset);
@@ -704,7 +727,9 @@
     _charOffset = _stringLength;
     return -1;
   }
+
   String getString(int start, int endDelta) => _string.substring(start, _charOffset + 1 + endDelta);
+
   int peek() {
     if (_charOffset + 1 < _stringLength) {
       return _string.codeUnitAt(_charOffset + 1);
@@ -712,6 +737,7 @@
     return -1;
   }
 }
+
 /**
  * Instances of the class `CharBufferScanner` implement a scanner that reads from a character
  * buffer. The scanning logic is in the superclass.
@@ -719,7 +745,6 @@
  * @coverage dart.engine.html
  */
 class CharBufferScanner extends AbstractScanner {
-
   /**
    * The buffer from which characters will be read.
    */
@@ -746,7 +771,9 @@
     this._bufferLength = buffer.length();
     this._charOffset = -1;
   }
+
   int get offset => _charOffset;
+
   int advance() {
     if (++_charOffset < _bufferLength) {
       return _buffer.charAt(_charOffset);
@@ -754,7 +781,9 @@
     _charOffset = _bufferLength;
     return -1;
   }
+
   String getString(int start, int endDelta) => _buffer.subSequence(start, _charOffset + 1 + endDelta).toString();
+
   int peek() {
     if (_charOffset + 1 < _bufferLength) {
       return _buffer.charAt(_charOffset + 1);
@@ -762,6 +791,7 @@
     return -1;
   }
 }
+
 /**
  * Instances of the class `ToSourceVisitor` write a source representation of a visited XML
  * node (and all of it's children) to a writer.
@@ -769,7 +799,6 @@
  * @coverage dart.engine.html
  */
 class ToSourceVisitor implements XmlVisitor<Object> {
-
   /**
    * The writer to which the source is to be written.
    */
@@ -784,12 +813,14 @@
   ToSourceVisitor(PrintWriter writer) {
     this._writer = writer;
   }
+
   Object visitHtmlUnit(HtmlUnit node) {
     for (XmlTagNode child in node.tagNodes) {
       visit(child);
     }
     return null;
   }
+
   Object visitXmlAttributeNode(XmlAttributeNode node) {
     String name = node.name.lexeme;
     Token value = node.value;
@@ -806,6 +837,7 @@
     }
     return null;
   }
+
   Object visitXmlTagNode(XmlTagNode node) {
     _writer.print("<");
     String tagName = node.tag.lexeme;
@@ -837,6 +869,7 @@
     }
   }
 }
+
 /**
  * The enumeration `TokenType` defines the types of tokens that can be returned by the
  * scanner.
@@ -844,22 +877,33 @@
  * @coverage dart.engine.html
  */
 class TokenType extends Enum<TokenType> {
-
   /**
    * The type of the token that marks the end of the input.
    */
   static final TokenType EOF = new TokenType_EOF('EOF', 0, "");
+
   static final TokenType EQ = new TokenType('EQ', 1, "=");
+
   static final TokenType GT = new TokenType('GT', 2, ">");
+
   static final TokenType LT_SLASH = new TokenType('LT_SLASH', 3, "</");
+
   static final TokenType LT = new TokenType('LT', 4, "<");
+
   static final TokenType SLASH_GT = new TokenType('SLASH_GT', 5, "/>");
+
   static final TokenType COMMENT = new TokenType('COMMENT', 6, null);
+
   static final TokenType DECLARATION = new TokenType('DECLARATION', 7, null);
+
   static final TokenType DIRECTIVE = new TokenType('DIRECTIVE', 8, null);
+
   static final TokenType STRING = new TokenType('STRING', 9, null);
+
   static final TokenType TAG = new TokenType('TAG', 10, null);
+
   static final TokenType TEXT = new TokenType('TEXT', 11, null);
+
   static final List<TokenType> values = [
       EOF,
       EQ,
@@ -879,14 +923,18 @@
    * lexeme for this type of token.
    */
   String lexeme;
+
   TokenType(String name, int ordinal, String lexeme) : super(name, ordinal) {
     this.lexeme = lexeme;
   }
 }
+
 class TokenType_EOF extends TokenType {
   TokenType_EOF(String name, int ordinal, String arg0) : super(name, ordinal, arg0);
+
   String toString() => "-eof-";
 }
+
 /**
  * Instances of `XmlAttributeNode` represent name/value pairs owned by an [XmlTagNode].
  *
@@ -894,7 +942,9 @@
  */
 class XmlAttributeNode extends XmlNode {
   Token name;
+
   Token equals;
+
   Token value;
 
   /**
@@ -910,8 +960,11 @@
     this.equals = equals;
     this.value = value;
   }
+
   accept(XmlVisitor visitor) => visitor.visitXmlAttributeNode(this);
+
   Token get beginToken => name;
+
   Token get endToken => value;
 
   /**
@@ -942,9 +995,11 @@
     }
     return text;
   }
+
   void visitChildren(XmlVisitor visitor) {
   }
 }
+
 /**
  * The interface `XmlVisitor` defines the behavior of objects that can be used to visit an
  * [XmlNode] structure.
@@ -953,9 +1008,12 @@
  */
 abstract class XmlVisitor<R> {
   R visitHtmlUnit(HtmlUnit htmlUnit);
+
   R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode);
+
   R visitXmlTagNode(XmlTagNode xmlTagNode);
 }
+
 /**
  * Instances of `HtmlScanner` receive and scan HTML content from a [Source].<br/>
  * For example, the following code scans HTML source and returns the result:
@@ -999,12 +1057,14 @@
   HtmlScanner(Source source) {
     this._source = source;
   }
+
   void accept(CharBuffer contents, int modificationTime) {
     this._modificationTime = modificationTime;
     _scanner = new CharBufferScanner(_source, contents);
     _scanner.passThroughElements = _SCRIPT_TAG;
     _token = _scanner.tokenize();
   }
+
   void accept2(String contents, int modificationTime) {
     this._modificationTime = modificationTime;
     _scanner = new StringScanner(_source, contents);
@@ -1019,6 +1079,7 @@
    */
   HtmlScanResult get result => new HtmlScanResult(_modificationTime, _token, _scanner.lineStarts);
 }
+
 /**
  * Instances of the class `XmlParser` are used to parse tokens into a AST structure comprised
  * of [XmlNode]s.
@@ -1026,7 +1087,6 @@
  * @coverage dart.engine.html
  */
 class XmlParser {
-
   /**
    * The source being parsed.
    */
@@ -1241,6 +1301,7 @@
   void reportUnexpectedToken() {
   }
 }
+
 /**
  * Instances of `XmlTagNode` represent XML or HTML elements such as `` and
  * `<body foo="bar"> ... </body>`.
@@ -1248,7 +1309,6 @@
  * @coverage dart.engine.html
  */
 class XmlTagNode extends XmlNode {
-
   /**
    * Constant representing empty list of attributes.
    */
@@ -1346,6 +1406,7 @@
     this.closingTag = closingTag;
     this.nodeEnd = nodeEnd;
   }
+
   accept(XmlVisitor visitor) => visitor.visitXmlTagNode(this);
 
   /**
@@ -1375,6 +1436,7 @@
     XmlAttributeNode attribute = getAttribute(name);
     return attribute != null ? attribute.text : null;
   }
+
   Token get beginToken => nodeStart;
 
   /**
@@ -1401,6 +1463,7 @@
     }
     return buffer.toString();
   }
+
   Token get endToken {
     if (nodeEnd != null) {
       return nodeEnd;
@@ -1422,6 +1485,7 @@
     }
     return tag;
   }
+
   void visitChildren(XmlVisitor visitor) {
     for (XmlAttributeNode node in attributes) {
       node.accept(visitor);
@@ -1441,6 +1505,7 @@
     return becomeParentOf(children);
   }
 }
+
 /**
  * Instances of the class `HtmlParser` are used to parse tokens into a AST structure comprised
  * of [XmlNode]s.
@@ -1481,15 +1546,16 @@
     source.getContents(scanner);
     return parse(scanner.result);
   }
+
   bool isSelfClosing(Token tag) => SELF_CLOSING.contains(tag.lexeme);
 }
+
 /**
  * Instances of the class `HtmlUnit` represent the contents of an HTML file.
  *
  * @coverage dart.engine.html
  */
 class HtmlUnit extends XmlNode {
-
   /**
    * The first token in the token stream that was parsed to form this HTML unit.
    */
@@ -1524,9 +1590,13 @@
     this.tagNodes = becomeParentOf(tagNodes);
     this._endToken = endToken;
   }
+
   accept(XmlVisitor visitor) => visitor.visitHtmlUnit(this);
+
   Token get beginToken => _beginToken;
+
   Token get endToken => _endToken;
+
   void visitChildren(XmlVisitor visitor) {
     for (XmlTagNode node in tagNodes) {
       node.accept(visitor);
diff --git a/pkg/analyzer/lib/src/generated/instrumentation.dart b/pkg/analyzer/lib/src/generated/instrumentation.dart
index 278b087..50ddb07 100644
--- a/pkg/analyzer/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer/lib/src/generated/instrumentation.dart
@@ -1,7 +1,10 @@
 // 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 engine.instrumentation;
+
 import 'java_core.dart';
+
 /**
  * The class `Instrumentation` implements support for logging instrumentation information.
  *
@@ -34,17 +37,16 @@
  * @coverage dart.engine.utilities
  */
 class Instrumentation {
-
   /**
    * A builder that will silently ignore all data and logging requests.
    */
-  static final InstrumentationBuilder nullBuilder = new InstrumentationBuilder_16();
+  static final InstrumentationBuilder nullBuilder = new InstrumentationBuilder_17();
 
   /**
    * An instrumentation logger that can be used when no other instrumentation logger has been
    * configured. This logger will silently ignore all data and logging requests.
    */
-  static InstrumentationLogger _NULL_LOGGER = new InstrumentationLogger_17();
+  static InstrumentationLogger _NULL_LOGGER = new InstrumentationLogger_18();
 
   /**
    * The current instrumentation logger.
@@ -89,25 +91,39 @@
     _CURRENT_LOGGER = logger == null ? _NULL_LOGGER : logger;
   }
 }
-class InstrumentationBuilder_16 implements InstrumentationBuilder {
+
+class InstrumentationBuilder_17 implements InstrumentationBuilder {
   InstrumentationBuilder data(String name, bool value) => this;
+
   InstrumentationBuilder data2(String name, int value) => this;
+
   InstrumentationBuilder data3(String name, String value) => this;
+
   InstrumentationBuilder data4(String name, List<String> value) => this;
+
   InstrumentationLevel get instrumentationLevel => InstrumentationLevel.OFF;
+
   void log() {
   }
+
   void log2(int minTimeToLong) {
   }
+
   InstrumentationBuilder metric(String name, bool value) => this;
+
   InstrumentationBuilder metric2(String name, int value) => this;
+
   InstrumentationBuilder metric3(String name, String value) => this;
+
   InstrumentationBuilder metric4(String name, List<String> value) => this;
+
   InstrumentationBuilder record(Exception exception) => this;
 }
-class InstrumentationLogger_17 implements InstrumentationLogger {
+
+class InstrumentationLogger_18 implements InstrumentationLogger {
   InstrumentationBuilder createBuilder(String name) => Instrumentation.nullBuilder;
 }
+
 /**
  * The interface `InstrumentationBuilder` defines the behavior of objects used to collect data
  * about an operation that has occurred and record that data through an instrumentation logger.
@@ -117,7 +133,6 @@
  * @coverage dart.engine.utilities
  */
 abstract class InstrumentationBuilder {
-
   /**
    * Append the given data to the data being collected by this builder. The information is declared
    * to potentially contain data that is either user identifiable or contains user intellectual
@@ -241,6 +256,7 @@
    */
   InstrumentationBuilder record(Exception exception);
 }
+
 /**
  * The instrumentation recording level representing (1) recording [EVERYTHING] recording of
  * all instrumentation data, (2) recording only [METRICS] information, or (3) recording
@@ -249,7 +265,6 @@
  * @coverage dart.engine.utilities
  */
 class InstrumentationLevel extends Enum<InstrumentationLevel> {
-
   /** Recording all instrumented information */
   static final InstrumentationLevel EVERYTHING = new InstrumentationLevel('EVERYTHING', 0);
 
@@ -258,7 +273,9 @@
 
   /** Nothing recorded */
   static final InstrumentationLevel OFF = new InstrumentationLevel('OFF', 2);
+
   static final List<InstrumentationLevel> values = [EVERYTHING, METRICS, OFF];
+
   static InstrumentationLevel fromString(String str) {
     if (str == "EVERYTHING") {
       return InstrumentationLevel.EVERYTHING;
@@ -271,8 +288,10 @@
     }
     throw new IllegalArgumentException("Unrecognised InstrumentationLevel");
   }
+
   InstrumentationLevel(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * The interface `InstrumentationLogger` defines the behavior of objects that are used to log
  * instrumentation data.
@@ -282,7 +301,6 @@
  * @coverage dart.engine.utilities
  */
 abstract class InstrumentationLogger {
-
   /**
    * Create a builder that can collect the data associated with an operation identified by the given
    * name.
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 10a1a2c..465cf56 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1,6 +1,8 @@
 // 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 engine.parser;
+
 import 'dart:collection';
 import 'java_core.dart';
 import 'instrumentation.dart';
@@ -11,6 +13,7 @@
 import 'utilities_dart.dart';
 import 'engine.dart' show AnalysisEngine;
 import 'utilities_collection.dart' show TokenMap;
+
 /**
  * Instances of the class `CommentAndMetadata` implement a simple data-holder for a method
  * that needs to return multiple values.
@@ -18,7 +21,6 @@
  * @coverage dart.engine.parser
  */
 class CommentAndMetadata {
-
   /**
    * The documentation comment that was parsed, or `null` if none was given.
    */
@@ -40,6 +42,7 @@
     this.metadata = metadata;
   }
 }
+
 /**
  * Instances of the class `FinalConstVarOrType` implement a simple data-holder for a method
  * that needs to return multiple values.
@@ -47,7 +50,6 @@
  * @coverage dart.engine.parser
  */
 class FinalConstVarOrType {
-
   /**
    * The 'final', 'const' or 'var' keyword, or `null` if none was given.
    */
@@ -69,6 +71,7 @@
     this.type = type;
   }
 }
+
 /**
  * Instances of the class `Modifiers` implement a simple data-holder for a method that needs
  * to return multiple values.
@@ -76,7 +79,6 @@
  * @coverage dart.engine.parser
  */
 class Modifiers {
-
   /**
    * The token representing the keyword 'abstract', or `null` if the keyword was not found.
    */
@@ -111,6 +113,7 @@
    * The token representing the keyword 'var', or `null` if the keyword was not found.
    */
   Token varKeyword;
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     bool needsSpace = appendKeyword(builder, false, abstractKeyword);
@@ -143,6 +146,7 @@
     return needsSpace;
   }
 }
+
 /**
  * Instances of the class `IncrementalParseDispatcher` implement a dispatcher that will invoke
  * the right parse method when re-parsing a specified child of the visited node. All of the methods
@@ -151,7 +155,6 @@
  * some reason.
  */
 class IncrementalParseDispatcher implements ASTVisitor<ASTNode> {
-
   /**
    * The parser used to parse the replacement for the node.
    */
@@ -172,12 +175,14 @@
     this._parser = parser;
     this._oldNode = oldNode;
   }
+
   ASTNode visitAdjacentStrings(AdjacentStrings node) {
     if (node.strings.contains(_oldNode)) {
       return _parser.parseStringLiteral();
     }
     return notAChild(node);
   }
+
   ASTNode visitAnnotation(Annotation node) {
     if (identical(_oldNode, node.name)) {
       throw new InsufficientContextException();
@@ -188,18 +193,21 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     if (identical(_oldNode, node.identifier)) {
       return _parser.parseSimpleIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitArgumentList(ArgumentList node) {
     if (node.arguments.contains(_oldNode)) {
       return _parser.parseArgument();
     }
     return notAChild(node);
   }
+
   ASTNode visitAsExpression(AsExpression node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseBitwiseOrExpression();
@@ -208,12 +216,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitAssertStatement(AssertStatement node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseExpression2();
     }
     return notAChild(node);
   }
+
   ASTNode visitAssignmentExpression(AssignmentExpression node) {
     if (identical(_oldNode, node.leftHandSide)) {
       throw new InsufficientContextException();
@@ -225,6 +235,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitBinaryExpression(BinaryExpression node) {
     if (identical(_oldNode, node.leftOperand)) {
       throw new InsufficientContextException();
@@ -233,25 +244,30 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitBlock(Block node) {
     if (node.statements.contains(_oldNode)) {
       return _parser.parseStatement2();
     }
     return notAChild(node);
   }
+
   ASTNode visitBlockFunctionBody(BlockFunctionBody node) {
     if (identical(_oldNode, node.block)) {
       return _parser.parseBlock();
     }
     return notAChild(node);
   }
+
   ASTNode visitBooleanLiteral(BooleanLiteral node) => notAChild(node);
+
   ASTNode visitBreakStatement(BreakStatement node) {
     if (identical(_oldNode, node.label)) {
       return _parser.parseSimpleIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitCascadeExpression(CascadeExpression node) {
     if (identical(_oldNode, node.target)) {
       return _parser.parseConditionalExpression();
@@ -260,6 +276,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitCatchClause(CatchClause node) {
     if (identical(_oldNode, node.exceptionType)) {
       return _parser.parseTypeName();
@@ -272,6 +289,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitClassDeclaration(ClassDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -292,6 +310,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitClassTypeAlias(ClassTypeAlias node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -310,18 +329,22 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitComment(Comment node) {
     throw new InsufficientContextException();
   }
+
   ASTNode visitCommentReference(CommentReference node) {
     if (identical(_oldNode, node.identifier)) {
       return _parser.parsePrefixedIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitCompilationUnit(CompilationUnit node) {
     throw new InsufficientContextException();
   }
+
   ASTNode visitConditionalExpression(ConditionalExpression node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseLogicalOrExpression();
@@ -332,6 +355,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitConstructorDeclaration(ConstructorDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -352,6 +376,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     if (identical(_oldNode, node.fieldName)) {
       return _parser.parseSimpleIdentifier();
@@ -360,6 +385,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitConstructorName(ConstructorName node) {
     if (identical(_oldNode, node.type)) {
       return _parser.parseTypeName();
@@ -368,12 +394,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitContinueStatement(ContinueStatement node) {
     if (identical(_oldNode, node.label)) {
       return _parser.parseSimpleIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitDeclaredIdentifier(DeclaredIdentifier node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -386,6 +414,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitDefaultFormalParameter(DefaultFormalParameter node) {
     if (identical(_oldNode, node.parameter)) {
       return _parser.parseNormalFormalParameter();
@@ -394,6 +423,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitDoStatement(DoStatement node) {
     if (identical(_oldNode, node.body)) {
       return _parser.parseStatement2();
@@ -402,9 +432,13 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitDoubleLiteral(DoubleLiteral node) => notAChild(node);
+
   ASTNode visitEmptyFunctionBody(EmptyFunctionBody node) => notAChild(node);
+
   ASTNode visitEmptyStatement(EmptyStatement node) => notAChild(node);
+
   ASTNode visitExportDirective(ExportDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -417,24 +451,28 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitExpressionFunctionBody(ExpressionFunctionBody node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
     return notAChild(node);
   }
+
   ASTNode visitExpressionStatement(ExpressionStatement node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
     return notAChild(node);
   }
+
   ASTNode visitExtendsClause(ExtendsClause node) {
     if (identical(_oldNode, node.superclass)) {
       return _parser.parseTypeName();
     }
     return notAChild(node);
   }
+
   ASTNode visitFieldDeclaration(FieldDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -445,6 +483,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitFieldFormalParameter(FieldFormalParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -459,6 +498,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitForEachStatement(ForEachStatement node) {
     if (identical(_oldNode, node.loopVariable)) {
       throw new InsufficientContextException();
@@ -469,9 +509,11 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitFormalParameterList(FormalParameterList node) {
     throw new InsufficientContextException();
   }
+
   ASTNode visitForStatement(ForStatement node) {
     if (identical(_oldNode, node.variables)) {
       throw new InsufficientContextException();
@@ -486,6 +528,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitFunctionDeclaration(FunctionDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -500,12 +543,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     if (identical(_oldNode, node.functionDeclaration)) {
       throw new InsufficientContextException();
     }
     return notAChild(node);
   }
+
   ASTNode visitFunctionExpression(FunctionExpression node) {
     if (identical(_oldNode, node.parameters)) {
       return _parser.parseFormalParameterList();
@@ -514,6 +559,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     if (identical(_oldNode, node.function)) {
       throw new InsufficientContextException();
@@ -522,6 +568,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitFunctionTypeAlias(FunctionTypeAlias node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -538,6 +585,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -552,12 +600,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitHideCombinator(HideCombinator node) {
     if (node.hiddenNames.contains(_oldNode)) {
       return _parser.parseSimpleIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitIfStatement(IfStatement node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseExpression2();
@@ -568,12 +618,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitImplementsClause(ImplementsClause node) {
     if (node.interfaces.contains(node)) {
       return _parser.parseTypeName();
     }
     return notAChild(node);
   }
+
   ASTNode visitImportDirective(ImportDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -588,6 +640,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitIndexExpression(IndexExpression node) {
     if (identical(_oldNode, node.target)) {
       throw new InsufficientContextException();
@@ -596,6 +649,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (identical(_oldNode, node.constructorName)) {
       return _parser.parseConstructorName();
@@ -604,7 +658,9 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitIntegerLiteral(IntegerLiteral node) => notAChild(node);
+
   ASTNode visitInterpolationExpression(InterpolationExpression node) {
     if (identical(_oldNode, node.expression)) {
       if (node.leftBracket == null) {
@@ -614,9 +670,11 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitInterpolationString(InterpolationString node) {
     throw new InsufficientContextException();
   }
+
   ASTNode visitIsExpression(IsExpression node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseBitwiseOrExpression();
@@ -625,12 +683,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitLabel(Label node) {
     if (identical(_oldNode, node.label)) {
       return _parser.parseSimpleIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitLabeledStatement(LabeledStatement node) {
     if (node.labels.contains(_oldNode)) {
       return _parser.parseLabel();
@@ -639,6 +699,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitLibraryDirective(LibraryDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -649,12 +710,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitLibraryIdentifier(LibraryIdentifier node) {
     if (node.components.contains(_oldNode)) {
       return _parser.parseSimpleIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitListLiteral(ListLiteral node) {
     if (identical(_oldNode, node.typeArguments)) {
       return _parser.parseTypeArgumentList();
@@ -663,6 +726,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitMapLiteral(MapLiteral node) {
     if (identical(_oldNode, node.typeArguments)) {
       return _parser.parseTypeArgumentList();
@@ -671,6 +735,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitMapLiteralEntry(MapLiteralEntry node) {
     if (identical(_oldNode, node.key)) {
       return _parser.parseExpression2();
@@ -679,6 +744,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitMethodDeclaration(MethodDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -696,6 +762,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitMethodInvocation(MethodInvocation node) {
     if (identical(_oldNode, node.target)) {
       throw new IncrementalParseException();
@@ -706,6 +773,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitNamedExpression(NamedExpression node) {
     if (identical(_oldNode, node.name)) {
       return _parser.parseLabel();
@@ -714,25 +782,30 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitNativeClause(NativeClause node) {
     if (identical(_oldNode, node.name)) {
       return _parser.parseStringLiteral();
     }
     return notAChild(node);
   }
+
   ASTNode visitNativeFunctionBody(NativeFunctionBody node) {
     if (identical(_oldNode, node.stringLiteral)) {
       return _parser.parseStringLiteral();
     }
     return notAChild(node);
   }
+
   ASTNode visitNullLiteral(NullLiteral node) => notAChild(node);
+
   ASTNode visitParenthesizedExpression(ParenthesizedExpression node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
     return notAChild(node);
   }
+
   ASTNode visitPartDirective(PartDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -743,6 +816,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitPartOfDirective(PartOfDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -753,12 +827,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitPostfixExpression(PostfixExpression node) {
     if (identical(_oldNode, node.operand)) {
       throw new InsufficientContextException();
     }
     return notAChild(node);
   }
+
   ASTNode visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (identical(_oldNode, node.prefix)) {
       return _parser.parseSimpleIdentifier();
@@ -767,12 +843,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitPrefixExpression(PrefixExpression node) {
     if (identical(_oldNode, node.operand)) {
       throw new InsufficientContextException();
     }
     return notAChild(node);
   }
+
   ASTNode visitPropertyAccess(PropertyAccess node) {
     if (identical(_oldNode, node.target)) {
       throw new InsufficientContextException();
@@ -781,6 +859,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     if (identical(_oldNode, node.constructorName)) {
       return _parser.parseSimpleIdentifier();
@@ -789,20 +868,25 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitRethrowExpression(RethrowExpression node) => notAChild(node);
+
   ASTNode visitReturnStatement(ReturnStatement node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
     return notAChild(node);
   }
+
   ASTNode visitScriptTag(ScriptTag node) => notAChild(node);
+
   ASTNode visitShowCombinator(ShowCombinator node) {
     if (node.shownNames.contains(_oldNode)) {
       return _parser.parseSimpleIdentifier();
     }
     return notAChild(node);
   }
+
   ASTNode visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -815,14 +899,18 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitSimpleIdentifier(SimpleIdentifier node) => notAChild(node);
+
   ASTNode visitSimpleStringLiteral(SimpleStringLiteral node) => notAChild(node);
+
   ASTNode visitStringInterpolation(StringInterpolation node) {
     if (node.elements.contains(_oldNode)) {
       throw new InsufficientContextException();
     }
     return notAChild(node);
   }
+
   ASTNode visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     if (identical(_oldNode, node.constructorName)) {
       return _parser.parseSimpleIdentifier();
@@ -831,7 +919,9 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitSuperExpression(SuperExpression node) => notAChild(node);
+
   ASTNode visitSwitchCase(SwitchCase node) {
     if (node.labels.contains(_oldNode)) {
       return _parser.parseLabel();
@@ -842,6 +932,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitSwitchDefault(SwitchDefault node) {
     if (node.labels.contains(_oldNode)) {
       return _parser.parseLabel();
@@ -850,6 +941,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitSwitchStatement(SwitchStatement node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
@@ -858,8 +950,11 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitSymbolLiteral(SymbolLiteral node) => notAChild(node);
+
   ASTNode visitThisExpression(ThisExpression node) => notAChild(node);
+
   ASTNode visitThrowExpression(ThrowExpression node) {
     if (identical(_oldNode, node.expression)) {
       if (isCascadeAllowed2(node)) {
@@ -869,6 +964,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -879,6 +975,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitTryStatement(TryStatement node) {
     if (identical(_oldNode, node.body)) {
       return _parser.parseBlock();
@@ -889,12 +986,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitTypeArgumentList(TypeArgumentList node) {
     if (node.arguments.contains(_oldNode)) {
       return _parser.parseTypeName();
     }
     return notAChild(node);
   }
+
   ASTNode visitTypeName(TypeName node) {
     if (identical(_oldNode, node.name)) {
       return _parser.parsePrefixedIdentifier();
@@ -903,6 +1002,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitTypeParameter(TypeParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -915,12 +1015,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitTypeParameterList(TypeParameterList node) {
     if (node.typeParameters.contains(node)) {
       return _parser.parseTypeParameter();
     }
     return notAChild(node);
   }
+
   ASTNode visitVariableDeclaration(VariableDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -933,6 +1035,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitVariableDeclarationList(VariableDeclarationList node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -943,12 +1046,14 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     if (identical(_oldNode, node.variables)) {
       throw new InsufficientContextException();
     }
     return notAChild(node);
   }
+
   ASTNode visitWhileStatement(WhileStatement node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseExpression2();
@@ -957,6 +1062,7 @@
     }
     return notAChild(node);
   }
+
   ASTNode visitWithClause(WithClause node) {
     if (node.mixinTypes.contains(node)) {
       return _parser.parseTypeName();
@@ -995,12 +1101,12 @@
     throw new IncrementalParseException.con1("Internal error: the visited node (a ${visitedNode.runtimeType.toString()}) was not the parent of the node to be replaced (a ${_oldNode.runtimeType.toString()})");
   }
 }
+
 /**
  * Instances of the class `IncrementalParseException` represent an exception that occurred
  * while attempting to parse a replacement for a specified node in an existing AST structure.
  */
 class IncrementalParseException extends RuntimeException {
-
   /**
    * Initialize a newly created exception to have no message and to be its own cause.
    */
@@ -1020,12 +1126,12 @@
    */
   IncrementalParseException.con2(Exception cause) : super(cause: cause);
 }
+
 /**
  * Instances of the class `IncrementalParser` re-parse a single AST structure within a larger
  * AST structure.
  */
 class IncrementalParser {
-
   /**
    * The source being parsed.
    */
@@ -1146,13 +1252,13 @@
     return null;
   }
 }
+
 /**
  * Instances of the class `InsufficientContextException` represent a situation in which an AST
  * node cannot be re-parsed because there is not enough context to know how to re-parse the node.
  * Clients can attempt to re-parse the parent of the node.
  */
 class InsufficientContextException extends IncrementalParseException {
-
   /**
    * Initialize a newly created exception to have no message and to be its own cause.
    */
@@ -1172,13 +1278,13 @@
    */
   InsufficientContextException.con2(Exception cause) : super.con2(cause);
 }
+
 /**
  * Instances of the class `Parser` are used to parse tokens into an AST structure.
  *
  * @coverage dart.engine.parser
  */
 class Parser {
-
   /**
    * The source being parsed.
    */
@@ -1203,10 +1309,15 @@
    * A flag indicating whether the parser is currently in a switch statement.
    */
   bool _inSwitch = false;
+
   static String _HIDE = "hide";
+
   static String _OF = "of";
+
   static String _ON = "on";
+
   static String _NATIVE = "native";
+
   static String _SHOW = "show";
 
   /**
@@ -1367,7 +1478,7 @@
       arguments.add(argument);
       if (foundNamedArgument) {
         if (!generatedError && argument is! NamedExpression) {
-          reportError8(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
+          reportError9(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
           generatedError = true;
         }
       } else if (argument is NamedExpression) {
@@ -1423,7 +1534,7 @@
         statements.add(statement);
       }
       if (identical(_currentToken, statementStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError10(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       statementStart = _currentToken;
@@ -1476,7 +1587,7 @@
           validateModifiersForOperator(modifiers);
           return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
         }
-        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        reportError10(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
     } else if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
@@ -1493,7 +1604,7 @@
         validateModifiersForOperator(modifiers);
         return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
       }
-      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      reportError10(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.PERIOD) && matchesIdentifier2(peek2(2)) && matches4(peek2(3), TokenType.OPEN_PAREN)) {
       return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
@@ -1508,7 +1619,7 @@
       return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, parameters);
     } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
       if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
-        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        reportError9(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
       return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
     }
@@ -1530,7 +1641,7 @@
         validateModifiersForOperator(modifiers);
         return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
       }
-      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      reportError10(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
       SimpleIdentifier methodName = parseSimpleIdentifier();
@@ -1583,18 +1694,18 @@
     Token memberStart = _currentToken;
     while (!matches5(TokenType.EOF)) {
       CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-      if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
+      if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT) && !matches4(peek(), TokenType.OPEN_PAREN)) {
         Directive directive = parseDirective(commentAndMetadata);
         if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
-          reportError8(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
+          reportError9(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
           directiveFoundAfterDeclaration = true;
         }
         if (directive is LibraryDirective) {
           if (libraryDirectiveFound) {
-            reportError8(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
+            reportError9(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
           } else {
             if (directives.length > 0) {
-              reportError8(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
+              reportError9(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
             }
             libraryDirectiveFound = true;
           }
@@ -1602,28 +1713,28 @@
           partDirectiveFound = true;
         } else if (partDirectiveFound) {
           if (directive is ExportDirective) {
-            reportError9(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
+            reportError10(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, (directive as NamespaceDirective).keyword, []);
           } else if (directive is ImportDirective) {
-            reportError9(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
+            reportError10(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, (directive as NamespaceDirective).keyword, []);
           }
         }
         if (directive is PartOfDirective) {
           if (partOfDirectiveFound) {
-            reportError8(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
+            reportError9(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
           } else {
             for (Directive precedingDirective in directives) {
-              reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, precedingDirective.keyword, []);
+              reportError10(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, precedingDirective.keyword, []);
             }
             partOfDirectiveFound = true;
           }
         } else {
           if (partOfDirectiveFound) {
-            reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
+            reportError10(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
           }
         }
         directives.add(directive);
       } else if (matches5(TokenType.SEMICOLON)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError10(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       } else {
         CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
@@ -1632,7 +1743,7 @@
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError10(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
         while (!matches5(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
           advance();
@@ -1818,9 +1929,9 @@
         firstParameter = false;
       } else if (!optional(TokenType.COMMA)) {
         if (getEndToken(leftParenthesis) != null) {
-          reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+          reportError9(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
         } else {
-          reportError9(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
+          reportError10(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
           break;
         }
       }
@@ -1828,11 +1939,11 @@
       if (matches5(TokenType.OPEN_SQUARE_BRACKET)) {
         wasOptionalParameter = true;
         if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
-          reportError8(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
+          reportError9(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
           reportedMuliplePositionalGroups = true;
         }
         if (leftCurlyBracket != null && !reportedMixedGroups) {
-          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportError9(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftSquareBracket = andAdvance;
@@ -1841,11 +1952,11 @@
       } else if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
         wasOptionalParameter = true;
         if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
-          reportError8(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
+          reportError9(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
           reportedMulipleNamedGroups = true;
         }
         if (leftSquareBracket != null && !reportedMixedGroups) {
-          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportError9(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftCurlyBracket = andAdvance;
@@ -1863,11 +1974,11 @@
         currentParameters = normalParameters;
         if (leftSquareBracket == null) {
           if (leftCurlyBracket != null) {
-            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            reportError9(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
             rightCurlyBracket = rightSquareBracket;
             rightSquareBracket = null;
           } else {
-            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
+            reportError9(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
           }
         }
         kind = ParameterKind.REQUIRED;
@@ -1876,11 +1987,11 @@
         currentParameters = normalParameters;
         if (leftCurlyBracket == null) {
           if (leftSquareBracket != null) {
-            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            reportError9(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
             rightSquareBracket = rightCurlyBracket;
             rightCurlyBracket = null;
           } else {
-            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
+            reportError9(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
           }
         }
         kind = ParameterKind.REQUIRED;
@@ -1888,10 +1999,10 @@
     } while (!matches5(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
     Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
     if (leftSquareBracket != null && rightSquareBracket == null) {
-      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+      reportError9(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
     }
     if (leftCurlyBracket != null && rightCurlyBracket == null) {
-      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+      reportError9(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
     }
     if (leftSquareBracket == null) {
       leftSquareBracket = leftCurlyBracket;
@@ -2047,7 +2158,7 @@
       FormalParameterList parameters = parseFormalParameterList();
       if (thisKeyword == null) {
         if (holder.keyword != null) {
-          reportError9(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
+          reportError10(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
         }
         return new FunctionTypedFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.type, identifier, parameters);
       } else {
@@ -2057,9 +2168,9 @@
     TypeName type = holder.type;
     if (type != null) {
       if (matches3(type.name.beginToken, Keyword.VOID)) {
-        reportError9(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
+        reportError10(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
       } else if (holder.keyword != null && matches3(holder.keyword, Keyword.VAR)) {
-        reportError9(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
+        reportError10(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
       }
     }
     if (thisKeyword != null) {
@@ -2121,7 +2232,7 @@
     if (matchesIdentifier()) {
       return new SimpleIdentifier.full(andAdvance);
     }
-    reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
+    reportError9(ParserErrorCode.MISSING_IDENTIFIER, []);
     return createSyntheticIdentifier();
   }
 
@@ -2169,7 +2280,7 @@
       }
     }
     if (strings.length < 1) {
-      reportError8(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
+      reportError9(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
       return createSyntheticStringLiteral();
     } else if (strings.length == 1) {
       return strings[0];
@@ -2215,13 +2326,13 @@
   TypeName parseTypeName() {
     Identifier typeName;
     if (matches(Keyword.VAR)) {
-      reportError8(ParserErrorCode.VAR_AS_TYPE_NAME, []);
+      reportError9(ParserErrorCode.VAR_AS_TYPE_NAME, []);
       typeName = new SimpleIdentifier.full(andAdvance);
     } else if (matchesIdentifier()) {
       typeName = parsePrefixedIdentifier();
     } else {
       typeName = createSyntheticIdentifier();
-      reportError8(ParserErrorCode.EXPECTED_TYPE_NAME, []);
+      reportError9(ParserErrorCode.EXPECTED_TYPE_NAME, []);
     }
     TypeArgumentList typeArguments = null;
     if (matches5(TokenType.LT)) {
@@ -2291,6 +2402,7 @@
     }
     return new WithClause.full(with2, types);
   }
+
   void set currentToken(Token currentToken) {
     this._currentToken = currentToken;
   }
@@ -2315,7 +2427,7 @@
    */
   void appendScalarValue(JavaStringBuilder builder, String escapeSequence, int scalarValue, int startIndex, int endIndex) {
     if (scalarValue < 0 || scalarValue > Character.MAX_CODE_POINT || (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) {
-      reportError8(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
+      reportError9(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
       return;
     }
     if (scalarValue < Character.MAX_VALUE) {
@@ -2458,7 +2570,7 @@
    */
   void ensureAssignable(Expression expression) {
     if (expression != null && !expression.isAssignable) {
-      reportError8(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
+      reportError9(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
     }
   }
 
@@ -2473,7 +2585,7 @@
     if (matches(keyword)) {
       return andAdvance;
     }
-    reportError8(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
+    reportError9(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
     return _currentToken;
   }
 
@@ -2489,9 +2601,9 @@
       return andAdvance;
     }
     if (identical(type, TokenType.SEMICOLON)) {
-      reportError9(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
+      reportError10(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
     } else {
-      reportError8(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
+      reportError9(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
     }
     return _currentToken;
   }
@@ -2514,6 +2626,7 @@
     }
     return null;
   }
+
   void gatherTodoComments(Token token) {
     while (token != null && token.type != TokenType.EOF) {
       Token commentToken = token.precedingComments;
@@ -2590,7 +2703,7 @@
    */
   Token getEndToken(Token beginToken) {
     if (beginToken is BeginToken) {
-      return ((beginToken as BeginToken)).endToken;
+      return (beginToken as BeginToken).endToken;
     }
     return null;
   }
@@ -2757,14 +2870,17 @@
    * @return `true` if the given token appears to be the beginning of an operator declaration
    */
   bool isOperator(Token startToken) {
-    if (startToken.isOperator) {
-      Token token = startToken.next;
-      while (token.isOperator) {
-        token = token.next;
-      }
-      return matches4(token, TokenType.OPEN_PAREN);
+    if (!startToken.isOperator) {
+      return false;
     }
-    return false;
+    if (identical(startToken.type, TokenType.EQ)) {
+      return false;
+    }
+    Token token = startToken.next;
+    while (token.isOperator) {
+      token = token.next;
+    }
+    return matches4(token, TokenType.OPEN_PAREN);
   }
 
   /**
@@ -2778,7 +2894,7 @@
       token = token.next.next;
     }
     if (identical(token.type, TokenType.KEYWORD)) {
-      Keyword keyword = ((token as KeywordToken)).keyword;
+      Keyword keyword = (token as KeywordToken).keyword;
       return identical(keyword, Keyword.CASE) || identical(keyword, Keyword.DEFAULT);
     }
     return false;
@@ -2850,7 +2966,7 @@
    * @param keyword the keyword that is being tested for
    * @return `true` if the given token matches the given keyword
    */
-  bool matches3(Token token, Keyword keyword) => identical(token.type, TokenType.KEYWORD) && identical(((token as KeywordToken)).keyword, keyword);
+  bool matches3(Token token, Keyword keyword) => identical(token.type, TokenType.KEYWORD) && identical((token as KeywordToken).keyword, keyword);
 
   /**
    * Return `true` if the given token has the given type.
@@ -2941,7 +3057,7 @@
    *
    * @return `true` if the given token is a valid identifier
    */
-  bool matchesIdentifier2(Token token) => matches4(token, TokenType.IDENTIFIER) || (matches4(token, TokenType.KEYWORD) && ((token as KeywordToken)).keyword.isPseudoKeyword);
+  bool matchesIdentifier2(Token token) => matches4(token, TokenType.IDENTIFIER) || (matches4(token, TokenType.KEYWORD) && (token as KeywordToken).keyword.isPseudoKeyword);
 
   /**
    * If the current token has the given type, then advance to the next token and return `true`
@@ -2996,7 +3112,7 @@
   ArgumentDefinitionTest parseArgumentDefinitionTest() {
     Token question = expect2(TokenType.QUESTION);
     SimpleIdentifier identifier = parseSimpleIdentifier();
-    reportError9(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
+    reportError10(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
     return new ArgumentDefinitionTest.full(question, identifier);
   }
 
@@ -3103,7 +3219,7 @@
       return new PropertyAccess.full(prefix, period, parseSimpleIdentifier());
     } else {
       if (!optional) {
-        reportError8(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
+        reportError9(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
       }
       return prefix;
     }
@@ -3176,7 +3292,7 @@
       label = parseSimpleIdentifier();
     }
     if (!_inLoop && !_inSwitch && label == null) {
-      reportError9(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
+      reportError10(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
     }
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new BreakStatement.full(breakKeyword, label, semicolon);
@@ -3212,7 +3328,7 @@
       expression = new IndexExpression.forCascade_full(period, leftBracket, index, rightBracket);
       period = null;
     } else {
-      reportError9(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
+      reportError10(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
       functionName = createSyntheticIdentifier();
     }
     if (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
@@ -3298,29 +3414,29 @@
         if (extendsClause == null) {
           extendsClause = parseExtendsClause();
           if (withClause != null) {
-            reportError9(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
+            reportError10(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
           } else if (implementsClause != null) {
-            reportError9(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
+            reportError10(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
           }
         } else {
-          reportError9(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
+          reportError10(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
           parseExtendsClause();
         }
       } else if (matches(Keyword.WITH)) {
         if (withClause == null) {
           withClause = parseWithClause();
           if (implementsClause != null) {
-            reportError9(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
+            reportError10(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
           }
         } else {
-          reportError9(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
+          reportError10(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
           parseWithClause();
         }
       } else if (matches(Keyword.IMPLEMENTS)) {
         if (implementsClause == null) {
           implementsClause = parseImplementsClause();
         } else {
-          reportError9(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
+          reportError10(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
           parseImplementsClause();
         }
       } else {
@@ -3328,7 +3444,7 @@
       }
     }
     if (withClause != null && extendsClause == null) {
-      reportError9(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
+      reportError10(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
     }
     NativeClause nativeClause = null;
     if (matches2(_NATIVE) && matches4(peek(), TokenType.STRING)) {
@@ -3344,7 +3460,7 @@
     } else {
       leftBracket = createSyntheticToken2(TokenType.OPEN_CURLY_BRACKET);
       rightBracket = createSyntheticToken2(TokenType.CLOSE_CURLY_BRACKET);
-      reportError8(ParserErrorCode.MISSING_CLASS_BODY, []);
+      reportError9(ParserErrorCode.MISSING_CLASS_BODY, []);
     }
     ClassDeclaration classDeclaration = new ClassDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, abstractKeyword, keyword, name, typeParameters, extendsClause, withClause, implementsClause, leftBracket, members, rightBracket);
     classDeclaration.nativeClause = nativeClause;
@@ -3369,7 +3485,7 @@
     Token memberStart = _currentToken;
     while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && (closingBracket != null || (!matches(Keyword.CLASS) && !matches(Keyword.TYPEDEF)))) {
       if (matches5(TokenType.SEMICOLON)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError10(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       } else {
         ClassMember member = parseClassMember(className);
@@ -3378,7 +3494,7 @@
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError10(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       memberStart = _currentToken;
@@ -3426,12 +3542,12 @@
       semicolon = andAdvance;
     } else {
       if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
-        reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
+        reportError9(ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
         Token leftBracket = andAdvance;
         parseClassMembers(className.name, getEndToken(leftBracket));
         expect2(TokenType.CLOSE_CURLY_BRACKET);
       } else {
-        reportError9(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
+        reportError10(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
       }
       semicolon = createSyntheticToken2(TokenType.SEMICOLON);
     }
@@ -3508,7 +3624,7 @@
     }
     try {
       List<bool> errorFound = [false];
-      AnalysisErrorListener listener = new AnalysisErrorListener_15(errorFound);
+      AnalysisErrorListener listener = new AnalysisErrorListener_16(errorFound);
       Scanner scanner = new Scanner(null, new SubSequenceReader(new CharSequence(referenceSource), sourceOffset), listener);
       scanner.setSourceStart(1, 1);
       Token firstToken = scanner.tokenize();
@@ -3616,7 +3732,7 @@
     Modifiers modifiers = parseModifiers();
     if (matches(Keyword.CLASS)) {
       return parseClassDeclaration(commentAndMetadata, validateModifiersForClass(modifiers));
-    } else if (matches(Keyword.TYPEDEF) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
+    } else if (matches(Keyword.TYPEDEF) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT) && !matches4(peek(), TokenType.OPEN_PAREN)) {
       validateModifiersForTypedef(modifiers);
       return parseTypeAlias(commentAndMetadata);
     }
@@ -3626,7 +3742,7 @@
         validateModifiersForTopLevelFunction(modifiers);
         return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
       } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-        reportError9(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+        reportError10(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
         return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
       } else if (matchesIdentifier() && matchesAny(peek(), [
           TokenType.OPEN_PAREN,
@@ -3641,24 +3757,24 @@
             return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), null), expect2(TokenType.SEMICOLON));
           }
         }
-        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        reportError10(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
     } else if ((matches(Keyword.GET) || matches(Keyword.SET)) && matchesIdentifier2(peek())) {
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
     } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      reportError9(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      reportError10(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
       return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
     } else if (!matchesIdentifier()) {
-      reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+      reportError10(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
     } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
       if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
-        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        reportError9(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
       return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), null), expect2(TokenType.SEMICOLON));
     }
@@ -3667,12 +3783,12 @@
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
     } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      reportError9(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      reportError10(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
       return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
     } else if (matches5(TokenType.AT)) {
       return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), returnType), expect2(TokenType.SEMICOLON));
     } else if (!matchesIdentifier()) {
-      reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+      reportError10(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       Token semicolon;
       if (matches5(TokenType.SEMICOLON)) {
         semicolon = andAdvance;
@@ -3716,6 +3832,7 @@
     }
     return parseInstanceCreationExpression(keyword);
   }
+
   ConstructorDeclaration parseConstructor(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, SimpleIdentifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters) {
     bool bodyAllowed = externalKeyword == null;
     Token separator = null;
@@ -3753,10 +3870,10 @@
     } else {
       body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
       if (constKeyword != null && factoryKeyword != null) {
-        reportError9(ParserErrorCode.CONST_FACTORY, factoryKeyword, []);
+        reportError10(ParserErrorCode.CONST_FACTORY, factoryKeyword, []);
       } else if (body is EmptyFunctionBody) {
         if (factoryKeyword != null && externalKeyword == null) {
-          reportError9(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword, []);
+          reportError10(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword, []);
         }
       } else {
         if (constKeyword != null) {
@@ -3817,14 +3934,14 @@
   Statement parseContinueStatement() {
     Token continueKeyword = expect(Keyword.CONTINUE);
     if (!_inLoop && !_inSwitch) {
-      reportError9(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
+      reportError10(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
     }
     SimpleIdentifier label = null;
     if (matchesIdentifier()) {
       label = parseSimpleIdentifier();
     }
     if (_inSwitch && !_inLoop && label == null) {
-      reportError9(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
+      reportError10(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
     }
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ContinueStatement.full(continueKeyword, label, semicolon);
@@ -4031,7 +4148,7 @@
       if (isTypedIdentifier(_currentToken)) {
         type = parseReturnType();
       } else if (!optional) {
-        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        reportError9(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
     }
     return new FinalConstVarOrType(keyword, type);
@@ -4059,7 +4176,7 @@
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.NAMED)) {
-        reportError9(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
+        reportError10(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
         reportError(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
@@ -4068,7 +4185,7 @@
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.POSITIONAL)) {
-        reportError9(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
+        reportError10(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
         reportError(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
@@ -4122,15 +4239,15 @@
           DeclaredIdentifier loopVariable = null;
           SimpleIdentifier identifier = null;
           if (variableList == null) {
-            reportError8(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
+            reportError9(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
           } else {
             NodeList<VariableDeclaration> variables = variableList.variables;
             if (variables.length > 1) {
-              reportError8(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables.length.toString()]);
+              reportError9(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables.length.toString()]);
             }
             VariableDeclaration variable = variables[0];
             if (variable.initializer != null) {
-              reportError8(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
+              reportError9(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
             }
             Token keyword = variableList.keyword;
             TypeName type = variableList.type;
@@ -4197,7 +4314,7 @@
     try {
       if (matches5(TokenType.SEMICOLON)) {
         if (!mayBeEmpty) {
-          reportError8(emptyErrorCode, []);
+          reportError9(emptyErrorCode, []);
         }
         return new EmptyFunctionBody.full(andAdvance);
       } else if (matches5(TokenType.FUNCTION)) {
@@ -4218,7 +4335,7 @@
         }
         return new NativeFunctionBody.full(nativeToken, stringLiteral, expect2(TokenType.SEMICOLON));
       } else {
-        reportError8(emptyErrorCode, []);
+        reportError9(emptyErrorCode, []);
         return new EmptyFunctionBody.full(createSyntheticToken2(TokenType.SEMICOLON));
       }
     } finally {
@@ -4259,10 +4376,10 @@
         parameters = parseFormalParameterList();
         validateFormalParameterList(parameters);
       } else {
-        reportError8(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
+        reportError9(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
       }
     } else if (matches5(TokenType.OPEN_PAREN)) {
-      reportError8(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+      reportError9(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
       parseFormalParameterList();
     }
     FunctionBody body;
@@ -4307,10 +4424,10 @@
     FunctionDeclaration declaration = parseFunctionDeclaration(commentAndMetadata, null, returnType);
     Token propertyKeyword = declaration.propertyKeyword;
     if (propertyKeyword != null) {
-      if (identical(((propertyKeyword as KeywordToken)).keyword, Keyword.GET)) {
-        reportError9(ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword, []);
+      if (identical((propertyKeyword as KeywordToken).keyword, Keyword.GET)) {
+        reportError10(ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword, []);
       } else {
-        reportError9(ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword, []);
+        reportError10(ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword, []);
       }
     }
     return new FunctionDeclarationStatement.full(declaration);
@@ -4342,12 +4459,12 @@
       typeParameters = parseTypeParameterList();
     }
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.EOF)) {
-      reportError8(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+      reportError9(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
       FormalParameterList parameters = new FormalParameterList.full(createSyntheticToken2(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken2(TokenType.CLOSE_PAREN));
       Token semicolon = expect2(TokenType.SEMICOLON);
       return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
     } else if (!matches5(TokenType.OPEN_PAREN)) {
-      reportError8(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+      reportError9(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
       return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, new FormalParameterList.full(createSyntheticToken2(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken2(TokenType.CLOSE_PAREN)), createSyntheticToken2(TokenType.SEMICOLON));
     }
     FormalParameterList parameters = parseFormalParameterList();
@@ -4379,13 +4496,13 @@
     Token propertyKeyword = expect(Keyword.GET);
     SimpleIdentifier name = parseSimpleIdentifier();
     if (matches5(TokenType.OPEN_PAREN) && matches4(peek(), TokenType.CLOSE_PAREN)) {
-      reportError8(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+      reportError9(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
       advance();
       advance();
     }
     FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError8(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
+      reportError9(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, null, body);
   }
@@ -4543,7 +4660,7 @@
       StringLiteral string = parseStringLiteral();
       reportError(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string, []);
     } else {
-      reportError9(missingNameError, missingNameToken, []);
+      reportError10(missingNameError, missingNameToken, []);
     }
     List<SimpleIdentifier> components = new List<SimpleIdentifier>();
     components.add(createSyntheticIdentifier());
@@ -4614,7 +4731,7 @@
     } else if (matches5(TokenType.OPEN_SQUARE_BRACKET) || matches5(TokenType.INDEX)) {
       return parseListLiteral(modifier, typeArguments);
     }
-    reportError8(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
+    reportError9(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
     return new ListLiteral.full(modifier, typeArguments, createSyntheticToken2(TokenType.OPEN_SQUARE_BRACKET), null, createSyntheticToken2(TokenType.CLOSE_SQUARE_BRACKET));
   }
 
@@ -4740,51 +4857,54 @@
     Modifiers modifiers = new Modifiers();
     bool progress = true;
     while (progress) {
-      if (matches(Keyword.ABSTRACT) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
+      if (matches4(peek(), TokenType.PERIOD) || matches4(peek(), TokenType.LT) || matches4(peek(), TokenType.OPEN_PAREN)) {
+        return modifiers;
+      }
+      if (matches(Keyword.ABSTRACT)) {
         if (modifiers.abstractKeyword != null) {
-          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError9(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.abstractKeyword = andAdvance;
         }
       } else if (matches(Keyword.CONST)) {
         if (modifiers.constKeyword != null) {
-          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError9(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.constKeyword = andAdvance;
         }
       } else if (matches(Keyword.EXTERNAL) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.externalKeyword != null) {
-          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError9(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.externalKeyword = andAdvance;
         }
       } else if (matches(Keyword.FACTORY) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.factoryKeyword != null) {
-          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError9(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.factoryKeyword = andAdvance;
         }
       } else if (matches(Keyword.FINAL)) {
         if (modifiers.finalKeyword != null) {
-          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError9(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.finalKeyword = andAdvance;
         }
       } else if (matches(Keyword.STATIC) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.staticKeyword != null) {
-          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError9(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.staticKeyword = andAdvance;
         }
       } else if (matches(Keyword.VAR)) {
         if (modifiers.varKeyword != null) {
-          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError9(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.varKeyword = andAdvance;
@@ -4882,8 +5002,8 @@
         }
       }
       return parseBlock();
-    } else if (matches5(TokenType.KEYWORD) && !((_currentToken as KeywordToken)).keyword.isPseudoKeyword) {
-      Keyword keyword = ((_currentToken as KeywordToken)).keyword;
+    } else if (matches5(TokenType.KEYWORD) && !(_currentToken as KeywordToken).keyword.isPseudoKeyword) {
+      Keyword keyword = (_currentToken as KeywordToken).keyword;
       if (identical(keyword, Keyword.ASSERT)) {
         return parseAssertStatement();
       } else if (identical(keyword, Keyword.BREAK)) {
@@ -4926,7 +5046,7 @@
           } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
             return parseVariableDeclarationStatement2(commentAndMetadata, null, returnType);
           }
-          reportError8(ParserErrorCode.MISSING_STATEMENT, []);
+          reportError9(ParserErrorCode.MISSING_STATEMENT, []);
           return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
         }
       } else if (identical(keyword, Keyword.CONST)) {
@@ -4948,7 +5068,7 @@
       } else if (identical(keyword, Keyword.NEW) || identical(keyword, Keyword.TRUE) || identical(keyword, Keyword.FALSE) || identical(keyword, Keyword.NULL) || identical(keyword, Keyword.SUPER) || identical(keyword, Keyword.THIS)) {
         return new ExpressionStatement.full(parseExpression2(), expect2(TokenType.SEMICOLON));
       } else {
-        reportError8(ParserErrorCode.MISSING_STATEMENT, []);
+        reportError9(ParserErrorCode.MISSING_STATEMENT, []);
         return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
       }
     } else if (matches5(TokenType.SEMICOLON)) {
@@ -4958,7 +5078,7 @@
     } else if (isFunctionDeclaration()) {
       return parseFunctionDeclarationStatement();
     } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-      reportError8(ParserErrorCode.MISSING_STATEMENT, []);
+      reportError9(ParserErrorCode.MISSING_STATEMENT, []);
       return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
     } else {
       return new ExpressionStatement.full(parseExpression2(), expect2(TokenType.SEMICOLON));
@@ -4988,17 +5108,17 @@
     if (matches(Keyword.OPERATOR)) {
       operatorKeyword = andAdvance;
     } else {
-      reportError9(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
+      reportError10(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
       operatorKeyword = createSyntheticToken(Keyword.OPERATOR);
     }
     if (!_currentToken.isUserDefinableOperator) {
-      reportError8(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
+      reportError9(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
     }
     SimpleIdentifier name = new SimpleIdentifier.full(andAdvance);
     if (matches5(TokenType.EQ)) {
       Token previous = _currentToken.previous;
       if ((matches4(previous, TokenType.EQ_EQ) || matches4(previous, TokenType.BANG_EQ)) && _currentToken.offset == previous.offset + 2) {
-        reportError8(ParserErrorCode.INVALID_OPERATOR, ["${previous.lexeme}${_currentToken.lexeme}"]);
+        reportError9(ParserErrorCode.INVALID_OPERATOR, ["${previous.lexeme}${_currentToken.lexeme}"]);
         advance();
       }
     }
@@ -5006,7 +5126,7 @@
     validateFormalParameterList(parameters);
     FunctionBody body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError8(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
+      reportError9(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, null, returnType, null, operatorKeyword, name, parameters, body);
   }
@@ -5091,7 +5211,7 @@
       return operand;
     }
     if (operand is Literal || operand is FunctionExpressionInvocation) {
-      reportError8(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
+      reportError9(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
     }
     Token operator = andAdvance;
     return new PostfixExpression.full(operand, operator);
@@ -5184,13 +5304,13 @@
     } else if (matches5(TokenType.QUESTION)) {
       return parseArgumentDefinitionTest();
     } else if (matches(Keyword.VOID)) {
-      reportError8(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+      reportError9(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
       advance();
       return parsePrimaryExpression();
     } else if (matches5(TokenType.HASH)) {
       return parseSymbolLiteral();
     } else {
-      reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
+      reportError9(ParserErrorCode.MISSING_IDENTIFIER, []);
       return createSyntheticIdentifier();
     }
   }
@@ -5311,7 +5431,7 @@
     validateFormalParameterList(parameters);
     FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError8(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
+      reportError9(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, parameters, body);
   }
@@ -5357,7 +5477,7 @@
     while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && !isSwitchMember()) {
       statements.add(parseStatement2());
       if (identical(_currentToken, statementStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError10(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       statementStart = _currentToken;
@@ -5455,7 +5575,7 @@
           SimpleIdentifier identifier = parseSimpleIdentifier();
           String label = identifier.token.lexeme;
           if (definedLabels.contains(label)) {
-            reportError9(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
+            reportError10(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
           } else {
             javaSetAdd(definedLabels, label);
           }
@@ -5468,17 +5588,17 @@
           Token colon = expect2(TokenType.COLON);
           members.add(new SwitchCase.full(labels, caseKeyword, caseExpression, colon, parseStatements2()));
           if (defaultKeyword != null) {
-            reportError9(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
+            reportError10(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
           }
         } else if (matches(Keyword.DEFAULT)) {
           if (defaultKeyword != null) {
-            reportError9(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, peek(), []);
+            reportError10(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, peek(), []);
           }
           defaultKeyword = andAdvance;
           Token colon = expect2(TokenType.COLON);
           members.add(new SwitchDefault.full(labels, defaultKeyword, colon, parseStatements2()));
         } else {
-          reportError8(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
+          reportError9(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
           while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && !matches(Keyword.CASE) && !matches(Keyword.DEFAULT)) {
             advance();
           }
@@ -5511,7 +5631,7 @@
         if (matchesIdentifier()) {
           components.add(andAdvance);
         } else {
-          reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
+          reportError9(ParserErrorCode.MISSING_IDENTIFIER, []);
           components.add(createSyntheticToken2(TokenType.IDENTIFIER));
           break;
         }
@@ -5519,7 +5639,7 @@
     } else if (_currentToken.isOperator) {
       components.add(andAdvance);
     } else {
-      reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
+      reportError9(ParserErrorCode.MISSING_IDENTIFIER, []);
       components.add(createSyntheticToken2(TokenType.IDENTIFIER));
     }
     return new SymbolLiteral.full(poundSign, new List.from(components));
@@ -5538,7 +5658,7 @@
   Expression parseThrowExpression() {
     Token keyword = expect(Keyword.THROW);
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.CLOSE_PAREN)) {
-      reportError9(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      reportError10(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
       return new ThrowExpression.full(keyword, createSyntheticIdentifier());
     }
     Expression expression = parseExpression2();
@@ -5558,7 +5678,7 @@
   Expression parseThrowExpressionWithoutCascade() {
     Token keyword = expect(Keyword.THROW);
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.CLOSE_PAREN)) {
-      reportError9(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      reportError10(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
       return new ThrowExpression.full(keyword, createSyntheticIdentifier());
     }
     Expression expression = parseExpressionWithoutCascade();
@@ -5622,7 +5742,7 @@
       finallyClause = parseBlock();
     } else {
       if (catchClauses.isEmpty) {
-        reportError8(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
+        reportError9(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
       }
     }
     return new TryStatement.full(tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
@@ -5663,12 +5783,12 @@
         next = skipTypeParameterList(next);
         if (next != null && matches4(next, TokenType.EQ)) {
           TypeAlias typeAlias = parseClassTypeAlias(commentAndMetadata, keyword);
-          reportError9(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
+          reportError10(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
           return typeAlias;
         }
       } else if (matches4(next, TokenType.EQ)) {
         TypeAlias typeAlias = parseClassTypeAlias(commentAndMetadata, keyword);
-        reportError9(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
+        reportError10(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
         return typeAlias;
       }
     }
@@ -5714,13 +5834,13 @@
           operator.previous.setNext(firstOperator);
           return new PrefixExpression.full(firstOperator, new PrefixExpression.full(secondOperator, new SuperExpression.full(andAdvance)));
         } else {
-          reportError8(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
+          reportError9(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
           return new PrefixExpression.full(operator, new SuperExpression.full(andAdvance));
         }
       }
       return new PrefixExpression.full(operator, parseAssignableExpression(false));
     } else if (matches5(TokenType.PLUS)) {
-      reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
+      reportError9(ParserErrorCode.MISSING_IDENTIFIER, []);
       return createSyntheticIdentifier();
     }
     return parsePostfixExpression();
@@ -5781,7 +5901,7 @@
    */
   VariableDeclarationList parseVariableDeclarationList2(CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
     if (type != null && keyword != null && matches3(keyword, Keyword.VAR)) {
-      reportError9(ParserErrorCode.VAR_AND_TYPE, keyword, []);
+      reportError10(ParserErrorCode.VAR_AND_TYPE, keyword, []);
     }
     List<VariableDeclaration> variables = new List<VariableDeclaration>();
     variables.add(parseVariableDeclaration());
@@ -5896,8 +6016,8 @@
    * @param errorCode the error code of the error to be reported
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError8(ParserErrorCode errorCode, List<Object> arguments) {
-    reportError9(errorCode, _currentToken, arguments);
+  void reportError9(ParserErrorCode errorCode, List<Object> arguments) {
+    reportError10(errorCode, _currentToken, arguments);
   }
 
   /**
@@ -5907,7 +6027,7 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError9(ParserErrorCode errorCode, Token token, List<Object> arguments) {
+  void reportError10(ParserErrorCode errorCode, Token token, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
   }
 
@@ -5945,8 +6065,12 @@
   Token skipFinalConstVarOrType(Token startToken) {
     if (matches3(startToken, Keyword.FINAL) || matches3(startToken, Keyword.CONST)) {
       Token next = startToken.next;
-      if (matchesIdentifier2(next.next) || matches4(next.next, TokenType.LT) || matches3(next.next, Keyword.THIS)) {
-        return skipTypeName(next);
+      if (matchesIdentifier2(next)) {
+        Token next2 = next.next;
+        if (matchesIdentifier2(next2) || matches4(next2, TokenType.LT) || matches4(next2, TokenType.PERIOD)) {
+          return skipTypeName(next);
+        }
+        return next;
       }
     } else if (matches3(startToken, Keyword.VAR)) {
       return startToken.next;
@@ -6037,7 +6161,7 @@
     if (startToken is! BeginToken) {
       return null;
     }
-    Token closeParen = ((startToken as BeginToken)).endToken;
+    Token closeParen = (startToken as BeginToken).endToken;
     if (closeParen == null) {
       return null;
     }
@@ -6111,7 +6235,7 @@
    * @return the token following the simple identifier that was parsed
    */
   Token skipSimpleIdentifier(Token startToken) {
-    if (matches4(startToken, TokenType.IDENTIFIER) || (matches4(startToken, TokenType.KEYWORD) && ((startToken as KeywordToken)).keyword.isPseudoKeyword)) {
+    if (matches4(startToken, TokenType.IDENTIFIER) || (matches4(startToken, TokenType.KEYWORD) && (startToken as KeywordToken).keyword.isPseudoKeyword)) {
       return startToken.next;
     }
     return null;
@@ -6359,13 +6483,13 @@
       builder.appendChar(0xB);
     } else if (currentChar == 0x78) {
       if (currentIndex + 2 >= length) {
-        reportError8(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        reportError9(ParserErrorCode.INVALID_HEX_ESCAPE, []);
         return length;
       }
       int firstDigit = lexeme.codeUnitAt(currentIndex + 1);
       int secondDigit = lexeme.codeUnitAt(currentIndex + 2);
       if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit)) {
-        reportError8(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        reportError9(ParserErrorCode.INVALID_HEX_ESCAPE, []);
       } else {
         builder.appendChar(((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) as int);
       }
@@ -6373,14 +6497,14 @@
     } else if (currentChar == 0x75) {
       currentIndex++;
       if (currentIndex >= length) {
-        reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+        reportError9(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         return length;
       }
       currentChar = lexeme.codeUnitAt(currentIndex);
       if (currentChar == 0x7B) {
         currentIndex++;
         if (currentIndex >= length) {
-          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError9(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length;
         }
         currentChar = lexeme.codeUnitAt(currentIndex);
@@ -6388,7 +6512,7 @@
         int value = 0;
         while (currentChar != 0x7D) {
           if (!isHexDigit(currentChar)) {
-            reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            reportError9(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             currentIndex++;
             while (currentIndex < length && lexeme.codeUnitAt(currentIndex) != 0x7D) {
               currentIndex++;
@@ -6399,19 +6523,19 @@
           value = (value << 4) + Character.digit(currentChar, 16);
           currentIndex++;
           if (currentIndex >= length) {
-            reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            reportError9(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             return length;
           }
           currentChar = lexeme.codeUnitAt(currentIndex);
         }
         if (digitCount < 1 || digitCount > 6) {
-          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError9(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         }
         appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), value, index, currentIndex);
         return currentIndex + 1;
       } else {
         if (currentIndex + 3 >= length) {
-          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError9(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length;
         }
         int firstDigit = currentChar;
@@ -6419,7 +6543,7 @@
         int thirdDigit = lexeme.codeUnitAt(currentIndex + 2);
         int fourthDigit = lexeme.codeUnitAt(currentIndex + 3);
         if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit) || !isHexDigit(thirdDigit) || !isHexDigit(fourthDigit)) {
-          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError9(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         } else {
           appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), (((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) << 4) + Character.digit(thirdDigit, 16)) << 4) + Character.digit(fourthDigit, 16), index, currentIndex + 3);
         }
@@ -6439,7 +6563,7 @@
   void validateFormalParameterList(FormalParameterList parameterList) {
     for (FormalParameter parameter in parameterList.parameters) {
       if (parameter is FieldFormalParameter) {
-        reportError(ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, ((parameter as FieldFormalParameter)).identifier, []);
+        reportError(ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, (parameter as FieldFormalParameter).identifier, []);
       }
     }
   }
@@ -6453,16 +6577,16 @@
   Token validateModifiersForClass(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.constKeyword != null) {
-      reportError9(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      reportError10(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError9(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
+      reportError10(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError9(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      reportError10(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError9(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
+      reportError10(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
     }
     return modifiers.abstractKeyword;
   }
@@ -6476,25 +6600,25 @@
    */
   Token validateModifiersForConstructor(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError9(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError9(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
+      reportError10(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError9(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
+      reportError10(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError9(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError10(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword = modifiers.externalKeyword;
     Token constKeyword = modifiers.constKeyword;
     Token factoryKeyword = modifiers.factoryKeyword;
     if (externalKeyword != null && constKeyword != null && constKeyword.offset < externalKeyword.offset) {
-      reportError9(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword, []);
+      reportError10(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword, []);
     }
     if (externalKeyword != null && factoryKeyword != null && factoryKeyword.offset < externalKeyword.offset) {
-      reportError9(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword, []);
+      reportError10(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword, []);
     }
     return constKeyword;
   }
@@ -6508,13 +6632,13 @@
    */
   Token validateModifiersForField(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError9(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError9(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      reportError10(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError9(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError10(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     Token staticKeyword = modifiers.staticKeyword;
     Token constKeyword = modifiers.constKeyword;
@@ -6522,23 +6646,23 @@
     Token varKeyword = modifiers.varKeyword;
     if (constKeyword != null) {
       if (finalKeyword != null) {
-        reportError9(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
+        reportError10(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
       }
       if (varKeyword != null) {
-        reportError9(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
+        reportError10(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
       }
       if (staticKeyword != null && constKeyword.offset < staticKeyword.offset) {
-        reportError9(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword, []);
+        reportError10(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword, []);
       }
     } else if (finalKeyword != null) {
       if (varKeyword != null) {
-        reportError9(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
+        reportError10(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
       }
       if (staticKeyword != null && finalKeyword.offset < staticKeyword.offset) {
-        reportError9(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword, []);
+        reportError10(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword, []);
       }
     } else if (varKeyword != null && staticKeyword != null && varKeyword.offset < staticKeyword.offset) {
-      reportError9(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword, []);
+      reportError10(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword, []);
     }
     return lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
   }
@@ -6550,7 +6674,7 @@
    */
   void validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null || modifiers.constKeyword != null || modifiers.externalKeyword != null || modifiers.factoryKeyword != null || modifiers.finalKeyword != null || modifiers.staticKeyword != null || modifiers.varKeyword != null) {
-      reportError8(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER, []);
+      reportError9(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER, []);
     }
   }
 
@@ -6561,24 +6685,24 @@
    */
   void validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError9(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError9(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      reportError10(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError9(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError10(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError9(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      reportError10(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError9(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError10(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword = modifiers.externalKeyword;
     Token staticKeyword = modifiers.staticKeyword;
     if (externalKeyword != null && staticKeyword != null && staticKeyword.offset < externalKeyword.offset) {
-      reportError9(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword, []);
+      reportError10(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword, []);
     }
   }
 
@@ -6589,22 +6713,22 @@
    */
   void validateModifiersForOperator(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError9(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError9(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      reportError10(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError9(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError10(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError9(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      reportError10(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError9(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
+      reportError10(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError9(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError10(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
 
@@ -6615,10 +6739,10 @@
    */
   void validateModifiersForTopLevelDeclaration(Modifiers modifiers) {
     if (modifiers.factoryKeyword != null) {
-      reportError9(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
+      reportError10(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError9(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
+      reportError10(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
     }
   }
 
@@ -6630,16 +6754,16 @@
   void validateModifiersForTopLevelFunction(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError8(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
+      reportError9(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError9(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      reportError10(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError9(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      reportError10(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError9(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError10(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
 
@@ -6653,24 +6777,24 @@
   Token validateModifiersForTopLevelVariable(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError8(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
+      reportError9(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError9(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      reportError10(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     Token constKeyword = modifiers.constKeyword;
     Token finalKeyword = modifiers.finalKeyword;
     Token varKeyword = modifiers.varKeyword;
     if (constKeyword != null) {
       if (finalKeyword != null) {
-        reportError9(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
+        reportError10(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
       }
       if (varKeyword != null) {
-        reportError9(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
+        reportError10(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
       }
     } else if (finalKeyword != null) {
       if (varKeyword != null) {
-        reportError9(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
+        reportError10(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
       }
     }
     return lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
@@ -6685,27 +6809,27 @@
   void validateModifiersForTypedef(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError9(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
+      reportError10(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError9(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
+      reportError10(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError9(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
+      reportError10(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError9(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
+      reportError10(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError9(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
+      reportError10(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
     }
   }
 }
+
 /**
  * Instances of the class `SyntheticKeywordToken` implement a synthetic keyword token.
  */
 class Parser_SyntheticKeywordToken extends KeywordToken {
-
   /**
    * Initialize a newly created token to represent the given keyword.
    *
@@ -6713,16 +6837,22 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    */
   Parser_SyntheticKeywordToken(Keyword keyword, int offset) : super(keyword, offset);
+
   Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
+
   int get length => 0;
 }
-class AnalysisErrorListener_15 implements AnalysisErrorListener {
+
+class AnalysisErrorListener_16 implements AnalysisErrorListener {
   List<bool> errorFound;
-  AnalysisErrorListener_15(this.errorFound);
+
+  AnalysisErrorListener_16(this.errorFound);
+
   void onError(AnalysisError error) {
     errorFound[0] = true;
   }
 }
+
 /**
  * The enumeration `ParserErrorCode` defines the error codes used for errors detected by the
  * parser. The convention for this class is for the name of the error code to indicate the problem
@@ -6733,137 +6863,269 @@
  */
 class ParserErrorCode extends Enum<ParserErrorCode> implements ErrorCode {
   static final ParserErrorCode ABSTRACT_CLASS_MEMBER = new ParserErrorCode.con3('ABSTRACT_CLASS_MEMBER', 0, "Members of classes cannot be declared to be 'abstract'");
+
   static final ParserErrorCode ABSTRACT_STATIC_METHOD = new ParserErrorCode.con3('ABSTRACT_STATIC_METHOD', 1, "Static methods cannot be declared to be 'abstract'");
+
   static final ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = new ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_FUNCTION', 2, "Top-level functions cannot be declared to be 'abstract'");
+
   static final ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = new ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_VARIABLE', 3, "Top-level variables cannot be declared to be 'abstract'");
+
   static final ParserErrorCode ABSTRACT_TYPEDEF = new ParserErrorCode.con3('ABSTRACT_TYPEDEF', 4, "Type aliases cannot be declared to be 'abstract'");
+
   static final ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_ASSIGNMENT', 5, "Assert cannot be called on an assignment");
+
   static final ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_CASCADE', 6, "Assert cannot be called on cascade");
+
   static final ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_THROW', 7, "Assert cannot be called on throws");
+
   static final ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_RETHROW', 8, "Assert cannot be called on rethrows");
+
   static final ParserErrorCode BREAK_OUTSIDE_OF_LOOP = new ParserErrorCode.con3('BREAK_OUTSIDE_OF_LOOP', 9, "A break statement cannot be used outside of a loop or switch statement");
+
   static final ParserErrorCode CONST_AND_FINAL = new ParserErrorCode.con3('CONST_AND_FINAL', 10, "Members cannot be declared to be both 'const' and 'final'");
+
   static final ParserErrorCode CONST_AND_VAR = new ParserErrorCode.con3('CONST_AND_VAR', 11, "Members cannot be declared to be both 'const' and 'var'");
+
   static final ParserErrorCode CONST_CLASS = new ParserErrorCode.con3('CONST_CLASS', 12, "Classes cannot be declared to be 'const'");
+
   static final ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con3('CONST_CONSTRUCTOR_WITH_BODY', 13, "'const' constructors cannot have a body");
+
   static final ParserErrorCode CONST_FACTORY = new ParserErrorCode.con3('CONST_FACTORY', 14, "Only redirecting factory constructors can be declared to be 'const'");
+
   static final ParserErrorCode CONST_METHOD = new ParserErrorCode.con3('CONST_METHOD', 15, "Getters, setters and methods cannot be declared to be 'const'");
+
   static final ParserErrorCode CONST_TYPEDEF = new ParserErrorCode.con3('CONST_TYPEDEF', 16, "Type aliases cannot be declared to be 'const'");
+
   static final ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = new ParserErrorCode.con3('CONSTRUCTOR_WITH_RETURN_TYPE', 17, "Constructors cannot have a return type");
+
   static final ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = new ParserErrorCode.con3('CONTINUE_OUTSIDE_OF_LOOP', 18, "A continue statement cannot be used outside of a loop or switch statement");
+
   static final ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = new ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 19, "A continue statement in a switch statement must have a label as a target");
+
   static final ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = new ParserErrorCode.con3('DEPRECATED_ARGUMENT_DEFINITION_TEST', 20, "The argument definition test ('?' operator) has been deprecated");
+
   static final ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = new ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 21, "The 'typedef' mixin application was replaced with 'class'");
+
   static final ParserErrorCode DIRECTIVE_AFTER_DECLARATION = new ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 22, "Directives must appear before any declarations");
+
   static final ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = new ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 23, "The label %s was already used in this switch statement");
+
   static final ParserErrorCode DUPLICATED_MODIFIER = new ParserErrorCode.con3('DUPLICATED_MODIFIER', 24, "The modifier '%s' was already specified.");
+
   static final ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = new ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 25, "Equality expression cannot be operand of another equality expression.");
+
   static final ParserErrorCode EXPECTED_CASE_OR_DEFAULT = new ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 26, "Expected 'case' or 'default'");
+
   static final ParserErrorCode EXPECTED_CLASS_MEMBER = new ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 27, "Expected a class member");
+
   static final ParserErrorCode EXPECTED_EXECUTABLE = new ParserErrorCode.con3('EXPECTED_EXECUTABLE', 28, "Expected a method, getter, setter or operator declaration");
+
   static final ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = new ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 29, "Expected a list or map literal");
+
   static final ParserErrorCode EXPECTED_STRING_LITERAL = new ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 30, "Expected a string literal");
+
   static final ParserErrorCode EXPECTED_TOKEN = new ParserErrorCode.con3('EXPECTED_TOKEN', 31, "Expected to find '%s'");
+
   static final ParserErrorCode EXPECTED_TYPE_NAME = new ParserErrorCode.con3('EXPECTED_TYPE_NAME', 32, "Expected a type name");
+
   static final ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 33, "Export directives must preceed part directives");
+
   static final ParserErrorCode EXTERNAL_AFTER_CONST = new ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 34, "The modifier 'external' should be before the modifier 'const'");
+
   static final ParserErrorCode EXTERNAL_AFTER_FACTORY = new ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 35, "The modifier 'external' should be before the modifier 'factory'");
+
   static final ParserErrorCode EXTERNAL_AFTER_STATIC = new ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 36, "The modifier 'external' should be before the modifier 'static'");
+
   static final ParserErrorCode EXTERNAL_CLASS = new ParserErrorCode.con3('EXTERNAL_CLASS', 37, "Classes cannot be declared to be 'external'");
+
   static final ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 38, "External constructors cannot have a body");
+
   static final ParserErrorCode EXTERNAL_FIELD = new ParserErrorCode.con3('EXTERNAL_FIELD', 39, "Fields cannot be declared to be 'external'");
+
   static final ParserErrorCode EXTERNAL_GETTER_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 40, "External getters cannot have a body");
+
   static final ParserErrorCode EXTERNAL_METHOD_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 41, "External methods cannot have a body");
+
   static final ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 42, "External operators cannot have a body");
+
   static final ParserErrorCode EXTERNAL_SETTER_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 43, "External setters cannot have a body");
+
   static final ParserErrorCode EXTERNAL_TYPEDEF = new ParserErrorCode.con3('EXTERNAL_TYPEDEF', 44, "Type aliases cannot be declared to be 'external'");
+
   static final ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = new ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 45, "Top-level declarations cannot be declared to be 'factory'");
+
   static final ParserErrorCode FACTORY_WITHOUT_BODY = new ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 46, "A non-redirecting 'factory' constructor must have a body");
+
   static final ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Field initializers can only be used in a constructor");
+
   static final ParserErrorCode FINAL_AND_VAR = new ParserErrorCode.con3('FINAL_AND_VAR', 48, "Members cannot be declared to be both 'final' and 'var'");
+
   static final ParserErrorCode FINAL_CLASS = new ParserErrorCode.con3('FINAL_CLASS', 49, "Classes cannot be declared to be 'final'");
+
   static final ParserErrorCode FINAL_CONSTRUCTOR = new ParserErrorCode.con3('FINAL_CONSTRUCTOR', 50, "A constructor cannot be declared to be 'final'");
+
   static final ParserErrorCode FINAL_METHOD = new ParserErrorCode.con3('FINAL_METHOD', 51, "Getters, setters and methods cannot be declared to be 'final'");
+
   static final ParserErrorCode FINAL_TYPEDEF = new ParserErrorCode.con3('FINAL_TYPEDEF', 52, "Type aliases cannot be declared to be 'final'");
+
   static final ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = new ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 53, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+
   static final ParserErrorCode GETTER_IN_FUNCTION = new ParserErrorCode.con3('GETTER_IN_FUNCTION', 54, "Getters cannot be defined within methods or functions");
+
   static final ParserErrorCode GETTER_WITH_PARAMETERS = new ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 55, "Getter should be declared without a parameter list");
+
   static final ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = new ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 56, "Illegal assignment to non-assignable expression");
+
   static final ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = new ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 57, "The extends clause must be before the implements clause");
+
   static final ParserErrorCode IMPLEMENTS_BEFORE_WITH = new ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 58, "The with clause must be before the implements clause");
+
   static final ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 59, "Import directives must preceed part directives");
+
   static final ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 60, "The loop variable in a for-each loop cannot be initialized");
+
   static final ParserErrorCode INVALID_CODE_POINT = new ParserErrorCode.con3('INVALID_CODE_POINT', 61, "The escape sequence '%s' is not a valid code point");
+
   static final ParserErrorCode INVALID_COMMENT_REFERENCE = new 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 final ParserErrorCode INVALID_HEX_ESCAPE = new ParserErrorCode.con3('INVALID_HEX_ESCAPE', 63, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+
   static final ParserErrorCode INVALID_OPERATOR = new ParserErrorCode.con3('INVALID_OPERATOR', 64, "The string '%s' is not a valid operator");
+
   static final ParserErrorCode INVALID_OPERATOR_FOR_SUPER = new ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 65, "The operator '%s' cannot be used with 'super'");
+
   static final ParserErrorCode INVALID_UNICODE_ESCAPE = new 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 final ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = new ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 67, "The library directive must appear before all other directives");
+
   static final ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = new ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 68, "Local function declarations cannot specify any modifier");
+
   static final ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = new ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 69, "Missing selector such as \".<identifier>\" or \"[0]\"");
+
   static final ParserErrorCode MISSING_CATCH_OR_FINALLY = new ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 70, "A try statement must have either a catch or finally clause");
+
   static final ParserErrorCode MISSING_CLASS_BODY = new ParserErrorCode.con3('MISSING_CLASS_BODY', 71, "A class definition must have a body, even if it is empty");
+
   static final ParserErrorCode MISSING_CLOSING_PARENTHESIS = new ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 72, "The closing parenthesis is missing");
+
   static final ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = new ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 73, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+
   static final ParserErrorCode MISSING_EXPRESSION_IN_THROW = new ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 74, "Throw expressions must compute the object to be thrown");
+
   static final ParserErrorCode MISSING_FUNCTION_BODY = new ParserErrorCode.con3('MISSING_FUNCTION_BODY', 75, "A function body must be provided");
+
   static final ParserErrorCode MISSING_FUNCTION_PARAMETERS = new ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 76, "Functions must have an explicit list of parameters");
+
   static final ParserErrorCode MISSING_IDENTIFIER = new ParserErrorCode.con3('MISSING_IDENTIFIER', 77, "Expected an identifier");
+
   static final ParserErrorCode MISSING_KEYWORD_OPERATOR = new ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 78, "Operator declarations must be preceeded by the keyword 'operator'");
+
   static final ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = new ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 79, "Library directives must include a library name");
+
   static final ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = new ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 80, "Library directives must include a library name");
+
   static final ParserErrorCode MISSING_STATEMENT = new ParserErrorCode.con3('MISSING_STATEMENT', 81, "Expected a statement");
+
   static final ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 82, "There is no '%s' to close the parameter group");
+
   static final ParserErrorCode MISSING_TYPEDEF_PARAMETERS = new ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 83, "Type aliases for functions must have an explicit list of parameters");
+
   static final ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 84, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
+
   static final ParserErrorCode MIXED_PARAMETER_GROUPS = new ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 85, "Cannot have both positional and named parameters in a single parameter list");
+
   static final ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = new ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 86, "Each class definition can have at most one extends clause");
+
   static final ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = new ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 87, "Each class definition can have at most one implements clause");
+
   static final ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = new ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 88, "Only one library directive may be declared in a file");
+
   static final ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = new ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 89, "Cannot have multiple groups of named parameters in a single parameter list");
+
   static final ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = new ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 90, "Only one part-of directive may be declared in a file");
+
   static final ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = new ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 91, "Cannot have multiple groups of positional parameters in a single parameter list");
+
   static final ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = new ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 92, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
+
   static final ParserErrorCode MULTIPLE_WITH_CLAUSES = new ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 93, "Each class definition can have at most one with clause");
+
   static final ParserErrorCode NAMED_FUNCTION_EXPRESSION = new ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 94, "Function expressions cannot be named");
+
   static final ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 95, "Named parameters must be enclosed in curly braces ('{' and '}')");
+
   static final ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = new ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 96, "Native clause can only be used in the SDK and code that is loaded through native extensions");
+
   static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 97, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+
   static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 98, "Only constructors can be declared to be a 'factory'");
+
   static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 99, "The name of a library must be an identifier");
+
   static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 100, "The part-of directive must be the only directive in a part");
+
   static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 101, "The operator '%s' is not user definable");
+
   static final ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = new ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 102, "Normal parameters must occur before optional parameters");
+
   static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 103, "Positional arguments must occur before named arguments");
+
   static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 104, "Positional parameters must be enclosed in square brackets ('[' and ']')");
+
   static final ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = new ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 105, "Only factory constructor can specify '=' redirection.");
+
   static final ParserErrorCode SETTER_IN_FUNCTION = new ParserErrorCode.con3('SETTER_IN_FUNCTION', 106, "Setters cannot be defined within methods or functions");
+
   static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con3('STATIC_AFTER_CONST', 107, "The modifier 'static' should be before the modifier 'const'");
+
   static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con3('STATIC_AFTER_FINAL', 108, "The modifier 'static' should be before the modifier 'final'");
+
   static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con3('STATIC_AFTER_VAR', 109, "The modifier 'static' should be before the modifier 'var'");
+
   static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con3('STATIC_CONSTRUCTOR', 110, "Constructors cannot be static");
+
   static final ParserErrorCode STATIC_GETTER_WITHOUT_BODY = new ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 111, "A 'static' getter must have a body");
+
   static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con3('STATIC_OPERATOR', 112, "Operators cannot be static");
+
   static final ParserErrorCode STATIC_SETTER_WITHOUT_BODY = new ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 113, "A 'static' setter must have a body");
+
   static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 114, "Top-level declarations cannot be declared to be 'static'");
+
   static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 115, "The 'default' case should be the last case in a switch statement");
+
   static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 116, "The 'default' case can only be declared once");
+
   static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 117, "Operators must be declared within a class");
+
   static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 118, "There is no '%s' to open a parameter group");
+
   static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con3('UNEXPECTED_TOKEN', 119, "Unexpected token '%s'");
+
   static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 120, "The extends clause must be before the with clause");
+
   static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 121, "The with clause cannot be used without an extends clause");
+
   static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 122, "The default value of a named parameter should be preceeded by ':'");
+
   static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 123, "The default value of a positional parameter should be preceeded by '='");
+
   static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 124, "Expected '%s' to close parameter group");
+
   static final ParserErrorCode VAR_AND_TYPE = new ParserErrorCode.con3('VAR_AND_TYPE', 125, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
+
   static final ParserErrorCode VAR_AS_TYPE_NAME = new ParserErrorCode.con3('VAR_AS_TYPE_NAME', 126, "The keyword 'var' cannot be used as a type name");
+
   static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con3('VAR_CLASS', 127, "Classes cannot be declared to be 'var'");
+
   static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con3('VAR_RETURN_TYPE', 128, "The return type cannot be 'var'");
+
   static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con3('VAR_TYPEDEF', 129, "Type aliases cannot be declared to be 'var'");
+
   static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con3('VOID_PARAMETER', 130, "Parameters cannot have a type of 'void'");
+
   static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con3('VOID_VARIABLE', 131, "Variables cannot have a type of 'void'");
+
   static final List<ParserErrorCode> values = [
       ABSTRACT_CLASS_MEMBER,
       ABSTRACT_STATIC_METHOD,
@@ -7044,18 +7306,22 @@
    * @param message the message template used to create the message to be displayed for the error
    */
   ParserErrorCode.con3(String name, int ordinal, String message) : this.con1(name, ordinal, ErrorSeverity.ERROR, message);
+
   String get correction => correction8;
+
   ErrorSeverity get errorSeverity => _severity;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 }
+
 /**
  * Instances of the class `ResolutionCopier` copies resolution information from one AST
  * structure to another as long as the structures of the corresponding children of a pair of nodes
  * are the same.
  */
 class ResolutionCopier implements ASTVisitor<bool> {
-
   /**
    * Copy resolution data from one node to another.
    *
@@ -7072,10 +7338,12 @@
    * beginning of each visit method (until [isEqual] is invoked).
    */
   ASTNode _toNode;
+
   bool visitAdjacentStrings(AdjacentStrings node) {
     AdjacentStrings toNode = this._toNode as AdjacentStrings;
     return isEqual2(node.strings, toNode.strings);
   }
+
   bool visitAnnotation(Annotation node) {
     Annotation toNode = this._toNode as Annotation;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.atSign, toNode.atSign), isEqual(node.name, toNode.name)), isEqual3(node.period, toNode.period)), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.arguments, toNode.arguments))) {
@@ -7084,6 +7352,7 @@
     }
     return false;
   }
+
   bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     ArgumentDefinitionTest toNode = this._toNode as ArgumentDefinitionTest;
     if (javaBooleanAnd(isEqual3(node.question, toNode.question), isEqual(node.identifier, toNode.identifier))) {
@@ -7093,10 +7362,12 @@
     }
     return false;
   }
+
   bool visitArgumentList(ArgumentList node) {
     ArgumentList toNode = this._toNode as ArgumentList;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftParenthesis, toNode.leftParenthesis), isEqual2(node.arguments, toNode.arguments)), isEqual3(node.rightParenthesis, toNode.rightParenthesis));
   }
+
   bool visitAsExpression(AsExpression node) {
     AsExpression toNode = this._toNode as AsExpression;
     if (javaBooleanAnd(javaBooleanAnd(isEqual(node.expression, toNode.expression), isEqual3(node.asOperator, toNode.asOperator)), isEqual(node.type, toNode.type))) {
@@ -7106,10 +7377,12 @@
     }
     return false;
   }
+
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement toNode = this._toNode as AssertStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression toNode = this._toNode as AssignmentExpression;
     if (javaBooleanAnd(javaBooleanAnd(isEqual(node.leftHandSide, toNode.leftHandSide), isEqual3(node.operator, toNode.operator)), isEqual(node.rightHandSide, toNode.rightHandSide))) {
@@ -7121,6 +7394,7 @@
     }
     return false;
   }
+
   bool visitBinaryExpression(BinaryExpression node) {
     BinaryExpression toNode = this._toNode as BinaryExpression;
     if (javaBooleanAnd(javaBooleanAnd(isEqual(node.leftOperand, toNode.leftOperand), isEqual3(node.operator, toNode.operator)), isEqual(node.rightOperand, toNode.rightOperand))) {
@@ -7132,14 +7406,17 @@
     }
     return false;
   }
+
   bool visitBlock(Block node) {
     Block toNode = this._toNode as Block;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual2(node.statements, toNode.statements)), isEqual3(node.rightBracket, toNode.rightBracket));
   }
+
   bool visitBlockFunctionBody(BlockFunctionBody node) {
     BlockFunctionBody toNode = this._toNode as BlockFunctionBody;
     return isEqual(node.block, toNode.block);
   }
+
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral toNode = this._toNode as BooleanLiteral;
     if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
@@ -7149,10 +7426,12 @@
     }
     return false;
   }
+
   bool visitBreakStatement(BreakStatement node) {
     BreakStatement toNode = this._toNode as BreakStatement;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.label, toNode.label)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitCascadeExpression(CascadeExpression node) {
     CascadeExpression toNode = this._toNode as CascadeExpression;
     if (javaBooleanAnd(isEqual(node.target, toNode.target), isEqual2(node.cascadeSections, toNode.cascadeSections))) {
@@ -7162,26 +7441,32 @@
     }
     return false;
   }
+
   bool visitCatchClause(CatchClause node) {
     CatchClause toNode = this._toNode as CatchClause;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.onKeyword, toNode.onKeyword), isEqual(node.exceptionType, toNode.exceptionType)), isEqual3(node.catchKeyword, toNode.catchKeyword)), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.exceptionParameter, toNode.exceptionParameter)), isEqual3(node.comma, toNode.comma)), isEqual(node.stackTraceParameter, toNode.stackTraceParameter)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
   }
+
   bool visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration toNode = this._toNode as ClassDeclaration;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.abstractKeyword, toNode.abstractKeyword)), isEqual3(node.classKeyword, toNode.classKeyword)), isEqual(node.name, toNode.name)), isEqual(node.typeParameters, toNode.typeParameters)), isEqual(node.extendsClause, toNode.extendsClause)), isEqual(node.withClause, toNode.withClause)), isEqual(node.implementsClause, toNode.implementsClause)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.members, toNode.members)), isEqual3(node.rightBracket, toNode.rightBracket));
   }
+
   bool visitClassTypeAlias(ClassTypeAlias node) {
     ClassTypeAlias toNode = this._toNode as ClassTypeAlias;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.name, toNode.name)), isEqual(node.typeParameters, toNode.typeParameters)), isEqual3(node.equals, toNode.equals)), isEqual3(node.abstractKeyword, toNode.abstractKeyword)), isEqual(node.superclass, toNode.superclass)), isEqual(node.withClause, toNode.withClause)), isEqual(node.implementsClause, toNode.implementsClause)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitComment(Comment node) {
     Comment toNode = this._toNode as Comment;
     return isEqual2(node.references, toNode.references);
   }
+
   bool visitCommentReference(CommentReference node) {
     CommentReference toNode = this._toNode as CommentReference;
     return javaBooleanAnd(isEqual3(node.newKeyword, toNode.newKeyword), isEqual(node.identifier, toNode.identifier));
   }
+
   bool visitCompilationUnit(CompilationUnit node) {
     CompilationUnit toNode = this._toNode as CompilationUnit;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.beginToken, toNode.beginToken), isEqual(node.scriptTag, toNode.scriptTag)), isEqual2(node.directives, toNode.directives)), isEqual2(node.declarations, toNode.declarations)), isEqual3(node.endToken, toNode.endToken))) {
@@ -7190,6 +7475,7 @@
     }
     return false;
   }
+
   bool visitConditionalExpression(ConditionalExpression node) {
     ConditionalExpression toNode = this._toNode as ConditionalExpression;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.condition, toNode.condition), isEqual3(node.question, toNode.question)), isEqual(node.thenExpression, toNode.thenExpression)), isEqual3(node.colon, toNode.colon)), isEqual(node.elseExpression, toNode.elseExpression))) {
@@ -7199,6 +7485,7 @@
     }
     return false;
   }
+
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.externalKeyword, toNode.externalKeyword)), isEqual3(node.constKeyword, toNode.constKeyword)), isEqual3(node.factoryKeyword, toNode.factoryKeyword)), isEqual(node.returnType, toNode.returnType)), isEqual3(node.period, toNode.period)), isEqual(node.name, toNode.name)), isEqual(node.parameters, toNode.parameters)), isEqual3(node.separator, toNode.separator)), isEqual2(node.initializers, toNode.initializers)), isEqual(node.redirectedConstructor, toNode.redirectedConstructor)), isEqual(node.body, toNode.body))) {
@@ -7207,10 +7494,12 @@
     }
     return false;
   }
+
   bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     ConstructorFieldInitializer toNode = this._toNode as ConstructorFieldInitializer;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.period, toNode.period)), isEqual(node.fieldName, toNode.fieldName)), isEqual3(node.equals, toNode.equals)), isEqual(node.expression, toNode.expression));
   }
+
   bool visitConstructorName(ConstructorName node) {
     ConstructorName toNode = this._toNode as ConstructorName;
     if (javaBooleanAnd(javaBooleanAnd(isEqual(node.type, toNode.type), isEqual3(node.period, toNode.period)), isEqual(node.name, toNode.name))) {
@@ -7219,22 +7508,27 @@
     }
     return false;
   }
+
   bool visitContinueStatement(ContinueStatement node) {
     ContinueStatement toNode = this._toNode as ContinueStatement;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.label, toNode.label)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitDeclaredIdentifier(DeclaredIdentifier node) {
     DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual(node.identifier, toNode.identifier));
   }
+
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.parameter, toNode.parameter), identical(node.kind, toNode.kind)), isEqual3(node.separator, toNode.separator)), isEqual(node.defaultValue, toNode.defaultValue));
   }
+
   bool visitDoStatement(DoStatement node) {
     DoStatement toNode = this._toNode as DoStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.doKeyword, toNode.doKeyword), isEqual(node.body, toNode.body)), isEqual3(node.whileKeyword, toNode.whileKeyword)), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitDoubleLiteral(DoubleLiteral node) {
     DoubleLiteral toNode = this._toNode as DoubleLiteral;
     if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), node.value == toNode.value)) {
@@ -7244,14 +7538,17 @@
     }
     return false;
   }
+
   bool visitEmptyFunctionBody(EmptyFunctionBody node) {
     EmptyFunctionBody toNode = this._toNode as EmptyFunctionBody;
     return isEqual3(node.semicolon, toNode.semicolon);
   }
+
   bool visitEmptyStatement(EmptyStatement node) {
     EmptyStatement toNode = this._toNode as EmptyStatement;
     return isEqual3(node.semicolon, toNode.semicolon);
   }
+
   bool visitExportDirective(ExportDirective node) {
     ExportDirective toNode = this._toNode as ExportDirective;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.uri, toNode.uri)), isEqual2(node.combinators, toNode.combinators)), isEqual3(node.semicolon, toNode.semicolon))) {
@@ -7260,46 +7557,57 @@
     }
     return false;
   }
+
   bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
     ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.functionDefinition, toNode.functionDefinition), isEqual(node.expression, toNode.expression)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitExpressionStatement(ExpressionStatement node) {
     ExpressionStatement toNode = this._toNode as ExpressionStatement;
     return javaBooleanAnd(isEqual(node.expression, toNode.expression), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitExtendsClause(ExtendsClause node) {
     ExtendsClause toNode = this._toNode as ExtendsClause;
     return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.superclass, toNode.superclass));
   }
+
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration toNode = this._toNode as FieldDeclaration;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.staticKeyword, toNode.staticKeyword)), isEqual(node.fields, toNode.fields)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitFieldFormalParameter(FieldFormalParameter node) {
     FieldFormalParameter toNode = this._toNode as FieldFormalParameter;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual3(node.thisToken, toNode.thisToken)), isEqual3(node.period, toNode.period)), isEqual(node.identifier, toNode.identifier));
   }
+
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement toNode = this._toNode as ForEachStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.forKeyword, toNode.forKeyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.loopVariable, toNode.loopVariable)), isEqual3(node.inKeyword, toNode.inKeyword)), isEqual(node.iterator, toNode.iterator)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
   }
+
   bool visitFormalParameterList(FormalParameterList node) {
     FormalParameterList toNode = this._toNode as FormalParameterList;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftParenthesis, toNode.leftParenthesis), isEqual2(node.parameters, toNode.parameters)), isEqual3(node.leftDelimiter, toNode.leftDelimiter)), isEqual3(node.rightDelimiter, toNode.rightDelimiter)), isEqual3(node.rightParenthesis, toNode.rightParenthesis));
   }
+
   bool visitForStatement(ForStatement node) {
     ForStatement toNode = this._toNode as ForStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.forKeyword, toNode.forKeyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.variables, toNode.variables)), isEqual(node.initialization, toNode.initialization)), isEqual3(node.leftSeparator, toNode.leftSeparator)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightSeparator, toNode.rightSeparator)), isEqual2(node.updaters, toNode.updaters)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
   }
+
   bool visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.externalKeyword, toNode.externalKeyword)), isEqual(node.returnType, toNode.returnType)), isEqual3(node.propertyKeyword, toNode.propertyKeyword)), isEqual(node.name, toNode.name)), isEqual(node.functionExpression, toNode.functionExpression));
   }
+
   bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     FunctionDeclarationStatement toNode = this._toNode as FunctionDeclarationStatement;
     return isEqual(node.functionDeclaration, toNode.functionDeclaration);
   }
+
   bool visitFunctionExpression(FunctionExpression node) {
     FunctionExpression toNode = this._toNode as FunctionExpression;
     if (javaBooleanAnd(isEqual(node.parameters, toNode.parameters), isEqual(node.body, toNode.body))) {
@@ -7310,6 +7618,7 @@
     }
     return false;
   }
+
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     FunctionExpressionInvocation toNode = this._toNode as FunctionExpressionInvocation;
     if (javaBooleanAnd(isEqual(node.function, toNode.function), isEqual(node.argumentList, toNode.argumentList))) {
@@ -7321,26 +7630,32 @@
     }
     return false;
   }
+
   bool visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAlias toNode = this._toNode as FunctionTypeAlias;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.returnType, toNode.returnType)), isEqual(node.name, toNode.name)), isEqual(node.typeParameters, toNode.typeParameters)), isEqual(node.parameters, toNode.parameters)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     FunctionTypedFormalParameter toNode = this._toNode as FunctionTypedFormalParameter;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.returnType, toNode.returnType)), isEqual(node.identifier, toNode.identifier)), isEqual(node.parameters, toNode.parameters));
   }
+
   bool visitHideCombinator(HideCombinator node) {
     HideCombinator toNode = this._toNode as HideCombinator;
     return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual2(node.hiddenNames, toNode.hiddenNames));
   }
+
   bool visitIfStatement(IfStatement node) {
     IfStatement toNode = this._toNode as IfStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.ifKeyword, toNode.ifKeyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.thenStatement, toNode.thenStatement)), isEqual3(node.elseKeyword, toNode.elseKeyword)), isEqual(node.elseStatement, toNode.elseStatement));
   }
+
   bool visitImplementsClause(ImplementsClause node) {
     ImplementsClause toNode = this._toNode as ImplementsClause;
     return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual2(node.interfaces, toNode.interfaces));
   }
+
   bool visitImportDirective(ImportDirective node) {
     ImportDirective toNode = this._toNode as ImportDirective;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.uri, toNode.uri)), isEqual3(node.asToken, toNode.asToken)), isEqual(node.prefix, toNode.prefix)), isEqual2(node.combinators, toNode.combinators)), isEqual3(node.semicolon, toNode.semicolon))) {
@@ -7349,6 +7664,7 @@
     }
     return false;
   }
+
   bool visitIndexExpression(IndexExpression node) {
     IndexExpression toNode = this._toNode as IndexExpression;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.target, toNode.target), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual(node.index, toNode.index)), isEqual3(node.rightBracket, toNode.rightBracket))) {
@@ -7361,6 +7677,7 @@
     }
     return false;
   }
+
   bool visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression toNode = this._toNode as InstanceCreationExpression;
     if (javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.argumentList, toNode.argumentList))) {
@@ -7371,6 +7688,7 @@
     }
     return false;
   }
+
   bool visitIntegerLiteral(IntegerLiteral node) {
     IntegerLiteral toNode = this._toNode as IntegerLiteral;
     if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
@@ -7380,14 +7698,17 @@
     }
     return false;
   }
+
   bool visitInterpolationExpression(InterpolationExpression node) {
     InterpolationExpression toNode = this._toNode as InterpolationExpression;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual(node.expression, toNode.expression)), isEqual3(node.rightBracket, toNode.rightBracket));
   }
+
   bool visitInterpolationString(InterpolationString node) {
     InterpolationString toNode = this._toNode as InterpolationString;
     return javaBooleanAnd(isEqual3(node.contents, toNode.contents), node.value == toNode.value);
   }
+
   bool visitIsExpression(IsExpression node) {
     IsExpression toNode = this._toNode as IsExpression;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.expression, toNode.expression), isEqual3(node.isOperator, toNode.isOperator)), isEqual3(node.notOperator, toNode.notOperator)), isEqual(node.type, toNode.type))) {
@@ -7397,18 +7718,22 @@
     }
     return false;
   }
+
   bool visitLabel(Label node) {
     Label toNode = this._toNode as Label;
     return javaBooleanAnd(isEqual(node.label, toNode.label), isEqual3(node.colon, toNode.colon));
   }
+
   bool visitLabeledStatement(LabeledStatement node) {
     LabeledStatement toNode = this._toNode as LabeledStatement;
     return javaBooleanAnd(isEqual2(node.labels, toNode.labels), isEqual(node.statement, toNode.statement));
   }
+
   bool visitLibraryDirective(LibraryDirective node) {
     LibraryDirective toNode = this._toNode as LibraryDirective;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.libraryToken, toNode.libraryToken)), isEqual(node.name, toNode.name)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitLibraryIdentifier(LibraryIdentifier node) {
     LibraryIdentifier toNode = this._toNode as LibraryIdentifier;
     if (isEqual2(node.components, toNode.components)) {
@@ -7418,6 +7743,7 @@
     }
     return false;
   }
+
   bool visitListLiteral(ListLiteral node) {
     ListLiteral toNode = this._toNode as ListLiteral;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.constKeyword, toNode.constKeyword), isEqual(node.typeArguments, toNode.typeArguments)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.elements, toNode.elements)), isEqual3(node.rightBracket, toNode.rightBracket))) {
@@ -7427,6 +7753,7 @@
     }
     return false;
   }
+
   bool visitMapLiteral(MapLiteral node) {
     MapLiteral toNode = this._toNode as MapLiteral;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.constKeyword, toNode.constKeyword), isEqual(node.typeArguments, toNode.typeArguments)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.entries, toNode.entries)), isEqual3(node.rightBracket, toNode.rightBracket))) {
@@ -7436,14 +7763,17 @@
     }
     return false;
   }
+
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
     return javaBooleanAnd(javaBooleanAnd(isEqual(node.key, toNode.key), isEqual3(node.separator, toNode.separator)), isEqual(node.value, toNode.value));
   }
+
   bool visitMethodDeclaration(MethodDeclaration node) {
     MethodDeclaration toNode = this._toNode as MethodDeclaration;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.externalKeyword, toNode.externalKeyword)), isEqual3(node.modifierKeyword, toNode.modifierKeyword)), isEqual(node.returnType, toNode.returnType)), isEqual3(node.propertyKeyword, toNode.propertyKeyword)), isEqual3(node.propertyKeyword, toNode.propertyKeyword)), isEqual(node.name, toNode.name)), isEqual(node.parameters, toNode.parameters)), isEqual(node.body, toNode.body));
   }
+
   bool visitMethodInvocation(MethodInvocation node) {
     MethodInvocation toNode = this._toNode as MethodInvocation;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.target, toNode.target), isEqual3(node.period, toNode.period)), isEqual(node.methodName, toNode.methodName)), isEqual(node.argumentList, toNode.argumentList))) {
@@ -7453,6 +7783,7 @@
     }
     return false;
   }
+
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression toNode = this._toNode as NamedExpression;
     if (javaBooleanAnd(isEqual(node.name, toNode.name), isEqual(node.expression, toNode.expression))) {
@@ -7462,14 +7793,17 @@
     }
     return false;
   }
+
   bool visitNativeClause(NativeClause node) {
     NativeClause toNode = this._toNode as NativeClause;
     return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.name, toNode.name));
   }
+
   bool visitNativeFunctionBody(NativeFunctionBody node) {
     NativeFunctionBody toNode = this._toNode as NativeFunctionBody;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.nativeToken, toNode.nativeToken), isEqual(node.stringLiteral, toNode.stringLiteral)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitNullLiteral(NullLiteral node) {
     NullLiteral toNode = this._toNode as NullLiteral;
     if (isEqual3(node.literal, toNode.literal)) {
@@ -7479,6 +7813,7 @@
     }
     return false;
   }
+
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
     if (javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftParenthesis, toNode.leftParenthesis), isEqual(node.expression, toNode.expression)), isEqual3(node.rightParenthesis, toNode.rightParenthesis))) {
@@ -7488,6 +7823,7 @@
     }
     return false;
   }
+
   bool visitPartDirective(PartDirective node) {
     PartDirective toNode = this._toNode as PartDirective;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.partToken, toNode.partToken)), isEqual(node.uri, toNode.uri)), isEqual3(node.semicolon, toNode.semicolon))) {
@@ -7496,6 +7832,7 @@
     }
     return false;
   }
+
   bool visitPartOfDirective(PartOfDirective node) {
     PartOfDirective toNode = this._toNode as PartOfDirective;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.partToken, toNode.partToken)), isEqual3(node.ofToken, toNode.ofToken)), isEqual(node.libraryName, toNode.libraryName)), isEqual3(node.semicolon, toNode.semicolon))) {
@@ -7504,6 +7841,7 @@
     }
     return false;
   }
+
   bool visitPostfixExpression(PostfixExpression node) {
     PostfixExpression toNode = this._toNode as PostfixExpression;
     if (javaBooleanAnd(isEqual(node.operand, toNode.operand), isEqual3(node.operator, toNode.operator))) {
@@ -7515,6 +7853,7 @@
     }
     return false;
   }
+
   bool visitPrefixedIdentifier(PrefixedIdentifier node) {
     PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
     if (javaBooleanAnd(javaBooleanAnd(isEqual(node.prefix, toNode.prefix), isEqual3(node.period, toNode.period)), isEqual(node.identifier, toNode.identifier))) {
@@ -7524,6 +7863,7 @@
     }
     return false;
   }
+
   bool visitPrefixExpression(PrefixExpression node) {
     PrefixExpression toNode = this._toNode as PrefixExpression;
     if (javaBooleanAnd(isEqual3(node.operator, toNode.operator), isEqual(node.operand, toNode.operand))) {
@@ -7535,6 +7875,7 @@
     }
     return false;
   }
+
   bool visitPropertyAccess(PropertyAccess node) {
     PropertyAccess toNode = this._toNode as PropertyAccess;
     if (javaBooleanAnd(javaBooleanAnd(isEqual(node.target, toNode.target), isEqual3(node.operator, toNode.operator)), isEqual(node.propertyName, toNode.propertyName))) {
@@ -7544,6 +7885,7 @@
     }
     return false;
   }
+
   bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation toNode = this._toNode as RedirectingConstructorInvocation;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.period, toNode.period)), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.argumentList, toNode.argumentList))) {
@@ -7552,6 +7894,7 @@
     }
     return false;
   }
+
   bool visitRethrowExpression(RethrowExpression node) {
     RethrowExpression toNode = this._toNode as RethrowExpression;
     if (isEqual3(node.keyword, toNode.keyword)) {
@@ -7561,22 +7904,27 @@
     }
     return false;
   }
+
   bool visitReturnStatement(ReturnStatement node) {
     ReturnStatement toNode = this._toNode as ReturnStatement;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.expression, toNode.expression)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitScriptTag(ScriptTag node) {
     ScriptTag toNode = this._toNode as ScriptTag;
     return isEqual3(node.scriptTag, toNode.scriptTag);
   }
+
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator toNode = this._toNode as ShowCombinator;
     return javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual2(node.shownNames, toNode.shownNames));
   }
+
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual(node.identifier, toNode.identifier));
   }
+
   bool visitSimpleIdentifier(SimpleIdentifier node) {
     SimpleIdentifier toNode = this._toNode as SimpleIdentifier;
     if (isEqual3(node.token, toNode.token)) {
@@ -7589,6 +7937,7 @@
     }
     return false;
   }
+
   bool visitSimpleStringLiteral(SimpleStringLiteral node) {
     SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
     if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
@@ -7598,6 +7947,7 @@
     }
     return false;
   }
+
   bool visitStringInterpolation(StringInterpolation node) {
     StringInterpolation toNode = this._toNode as StringInterpolation;
     if (isEqual2(node.elements, toNode.elements)) {
@@ -7607,6 +7957,7 @@
     }
     return false;
   }
+
   bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SuperConstructorInvocation toNode = this._toNode as SuperConstructorInvocation;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.period, toNode.period)), isEqual(node.constructorName, toNode.constructorName)), isEqual(node.argumentList, toNode.argumentList))) {
@@ -7615,6 +7966,7 @@
     }
     return false;
   }
+
   bool visitSuperExpression(SuperExpression node) {
     SuperExpression toNode = this._toNode as SuperExpression;
     if (isEqual3(node.keyword, toNode.keyword)) {
@@ -7624,18 +7976,22 @@
     }
     return false;
   }
+
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase toNode = this._toNode as SwitchCase;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual2(node.labels, toNode.labels), isEqual3(node.keyword, toNode.keyword)), isEqual(node.expression, toNode.expression)), isEqual3(node.colon, toNode.colon)), isEqual2(node.statements, toNode.statements));
   }
+
   bool visitSwitchDefault(SwitchDefault node) {
     SwitchDefault toNode = this._toNode as SwitchDefault;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual2(node.labels, toNode.labels), isEqual3(node.keyword, toNode.keyword)), isEqual3(node.colon, toNode.colon)), isEqual2(node.statements, toNode.statements));
   }
+
   bool visitSwitchStatement(SwitchStatement node) {
     SwitchStatement toNode = this._toNode as SwitchStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.expression, toNode.expression)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual3(node.leftBracket, toNode.leftBracket)), isEqual2(node.members, toNode.members)), isEqual3(node.rightBracket, toNode.rightBracket));
   }
+
   bool visitSymbolLiteral(SymbolLiteral node) {
     SymbolLiteral toNode = this._toNode as SymbolLiteral;
     if (javaBooleanAnd(isEqual3(node.poundSign, toNode.poundSign), isEqual4(node.components, toNode.components))) {
@@ -7645,6 +8001,7 @@
     }
     return false;
   }
+
   bool visitThisExpression(ThisExpression node) {
     ThisExpression toNode = this._toNode as ThisExpression;
     if (isEqual3(node.keyword, toNode.keyword)) {
@@ -7654,6 +8011,7 @@
     }
     return false;
   }
+
   bool visitThrowExpression(ThrowExpression node) {
     ThrowExpression toNode = this._toNode as ThrowExpression;
     if (javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.expression, toNode.expression))) {
@@ -7663,18 +8021,22 @@
     }
     return false;
   }
+
   bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     TopLevelVariableDeclaration toNode = this._toNode as TopLevelVariableDeclaration;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.variables, toNode.variables)), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitTryStatement(TryStatement node) {
     TryStatement toNode = this._toNode as TryStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.tryKeyword, toNode.tryKeyword), isEqual(node.body, toNode.body)), isEqual2(node.catchClauses, toNode.catchClauses)), isEqual3(node.finallyKeyword, toNode.finallyKeyword)), isEqual(node.finallyBlock, toNode.finallyBlock));
   }
+
   bool visitTypeArgumentList(TypeArgumentList node) {
     TypeArgumentList toNode = this._toNode as TypeArgumentList;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual2(node.arguments, toNode.arguments)), isEqual3(node.rightBracket, toNode.rightBracket));
   }
+
   bool visitTypeName(TypeName node) {
     TypeName toNode = this._toNode as TypeName;
     if (javaBooleanAnd(isEqual(node.name, toNode.name), isEqual(node.typeArguments, toNode.typeArguments))) {
@@ -7683,30 +8045,37 @@
     }
     return false;
   }
+
   bool visitTypeParameter(TypeParameter node) {
     TypeParameter toNode = this._toNode as TypeParameter;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.name, toNode.name)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.bound, toNode.bound));
   }
+
   bool visitTypeParameterList(TypeParameterList node) {
     TypeParameterList toNode = this._toNode as TypeParameterList;
     return javaBooleanAnd(javaBooleanAnd(isEqual3(node.leftBracket, toNode.leftBracket), isEqual2(node.typeParameters, toNode.typeParameters)), isEqual3(node.rightBracket, toNode.rightBracket));
   }
+
   bool visitVariableDeclaration(VariableDeclaration node) {
     VariableDeclaration toNode = this._toNode as VariableDeclaration;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual(node.name, toNode.name)), isEqual3(node.equals, toNode.equals)), isEqual(node.initializer, toNode.initializer));
   }
+
   bool visitVariableDeclarationList(VariableDeclarationList node) {
     VariableDeclarationList toNode = this._toNode as VariableDeclarationList;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual(node.documentationComment, toNode.documentationComment), isEqual2(node.metadata, toNode.metadata)), isEqual3(node.keyword, toNode.keyword)), isEqual(node.type, toNode.type)), isEqual2(node.variables, toNode.variables));
   }
+
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     VariableDeclarationStatement toNode = this._toNode as VariableDeclarationStatement;
     return javaBooleanAnd(isEqual(node.variables, toNode.variables), isEqual3(node.semicolon, toNode.semicolon));
   }
+
   bool visitWhileStatement(WhileStatement node) {
     WhileStatement toNode = this._toNode as WhileStatement;
     return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual3(node.leftParenthesis, toNode.leftParenthesis)), isEqual(node.condition, toNode.condition)), isEqual3(node.rightParenthesis, toNode.rightParenthesis)), isEqual(node.body, toNode.body));
   }
+
   bool visitWithClause(WithClause node) {
     WithClause toNode = this._toNode as WithClause;
     return javaBooleanAnd(isEqual3(node.withKeyword, toNode.withKeyword), isEqual2(node.mixinTypes, toNode.mixinTypes));
@@ -7731,13 +8100,13 @@
       return fromNode.accept(this);
     }
     if (toNode is PrefixedIdentifier) {
-      SimpleIdentifier prefix = ((toNode as PrefixedIdentifier)).prefix;
+      SimpleIdentifier prefix = (toNode as PrefixedIdentifier).prefix;
       if (fromNode.runtimeType == prefix.runtimeType) {
         this._toNode = prefix;
         return fromNode.accept(this);
       }
     } else if (toNode is PropertyAccess) {
-      Expression target = ((toNode as PropertyAccess)).target;
+      Expression target = (toNode as PropertyAccess).target;
       if (fromNode.runtimeType == target.runtimeType) {
         this._toNode = target;
         return fromNode.accept(this);
@@ -7812,17 +8181,19 @@
     return true;
   }
 }
+
 /**
  * Instances of the class {link ToFormattedSourceVisitor} write a source representation of a visited
  * AST node (and all of it's children) to a writer.
  */
 class ToFormattedSourceVisitor implements ASTVisitor<Object> {
-
   /**
    * The writer to which the source is to be written.
    */
   PrintWriter _writer;
+
   int _indentLevel = 0;
+
   String _indentString = "";
 
   /**
@@ -7834,10 +8205,12 @@
   ToFormattedSourceVisitor(PrintWriter writer) {
     this._writer = writer;
   }
+
   Object visitAdjacentStrings(AdjacentStrings node) {
     visitList5(node.strings, " ");
     return null;
   }
+
   Object visitAnnotation(Annotation node) {
     _writer.print('@');
     visit(node.name);
@@ -7845,29 +8218,34 @@
     visit(node.arguments);
     return null;
   }
+
   Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     _writer.print('?');
     visit(node.identifier);
     return null;
   }
+
   Object visitArgumentList(ArgumentList node) {
     _writer.print('(');
     visitList5(node.arguments, ", ");
     _writer.print(')');
     return null;
   }
+
   Object visitAsExpression(AsExpression node) {
     visit(node.expression);
     _writer.print(" as ");
     visit(node.type);
     return null;
   }
+
   Object visitAssertStatement(AssertStatement node) {
     _writer.print("assert(");
     visit(node.condition);
     _writer.print(");");
     return null;
   }
+
   Object visitAssignmentExpression(AssignmentExpression node) {
     visit(node.leftHandSide);
     _writer.print(' ');
@@ -7876,6 +8254,7 @@
     visit(node.rightHandSide);
     return null;
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     visit(node.leftOperand);
     _writer.print(' ');
@@ -7884,36 +8263,42 @@
     visit(node.rightOperand);
     return null;
   }
+
   Object visitBlock(Block node) {
     _writer.print('{');
     {
       indentInc();
-      visitList5(node.statements, "\n");
+      visitList7("\n", node.statements, "\n");
       indentDec();
     }
     nl2();
     _writer.print('}');
     return null;
   }
+
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     visit(node.block);
     return null;
   }
+
   Object visitBooleanLiteral(BooleanLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitBreakStatement(BreakStatement node) {
     _writer.print("break");
     visit7(" ", node.label);
     _writer.print(";");
     return null;
   }
+
   Object visitCascadeExpression(CascadeExpression node) {
     visit(node.target);
     visitList(node.cascadeSections);
     return null;
   }
+
   Object visitCatchClause(CatchClause node) {
     visit7("on ", node.exceptionType);
     if (node.catchKeyword != null) {
@@ -7930,6 +8315,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     visit(node.documentationComment);
     visit8(node.abstractKeyword, " ");
@@ -7942,13 +8328,14 @@
     _writer.print(" {");
     {
       indentInc();
-      visitList5(node.members, "\n");
+      visitList7("\n", node.members, "\n\n");
       indentDec();
     }
     nl2();
     _writer.print("}");
     return null;
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     _writer.print("typedef ");
     visit(node.name);
@@ -7963,6 +8350,7 @@
     _writer.print(";");
     return null;
   }
+
   Object visitComment(Comment node) {
     Token token = node.beginToken;
     while (token != null) {
@@ -7970,9 +8358,6 @@
       for (String line in StringUtils.split(token.lexeme, "\n")) {
         if (firstLine) {
           firstLine = false;
-          if (node.isDocumentation) {
-            nl2();
-          }
         } else {
           line = " ${line.trim()}";
           line = StringUtils.replace(line, "/*", "/ *");
@@ -7986,17 +8371,21 @@
     }
     return null;
   }
+
   Object visitCommentReference(CommentReference node) => null;
+
   Object visitCompilationUnit(CompilationUnit node) {
     ScriptTag scriptTag = node.scriptTag;
     NodeList<Directive> directives = node.directives;
     visit(scriptTag);
     String prefix = scriptTag == null ? "" : " ";
     visitList7(prefix, directives, "\n");
-    prefix = scriptTag == null && directives.isEmpty ? "" : "\n\n";
-    visitList7(prefix, node.declarations, "\n");
+    nl();
+    prefix = scriptTag == null && directives.isEmpty ? "" : "\n";
+    visitList7(prefix, node.declarations, "\n\n");
     return null;
   }
+
   Object visitConditionalExpression(ConditionalExpression node) {
     visit(node.condition);
     _writer.print(" ? ");
@@ -8005,6 +8394,7 @@
     visit(node.elseExpression);
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     visit(node.documentationComment);
     visit8(node.externalKeyword, " ");
@@ -8021,6 +8411,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     visit8(node.keyword, ".");
     visit(node.fieldName);
@@ -8028,23 +8419,27 @@
     visit(node.expression);
     return null;
   }
+
   Object visitConstructorName(ConstructorName node) {
     visit(node.type);
     visit7(".", node.name);
     return null;
   }
+
   Object visitContinueStatement(ContinueStatement node) {
     _writer.print("continue");
     visit7(" ", node.label);
     _writer.print(";");
     return null;
   }
+
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     visit8(node.keyword, " ");
     visit6(node.type, " ");
     visit(node.identifier);
     return null;
   }
+
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     visit(node.parameter);
     if (node.separator != null) {
@@ -8054,6 +8449,7 @@
     }
     return null;
   }
+
   Object visitDoStatement(DoStatement node) {
     _writer.print("do ");
     visit(node.body);
@@ -8062,18 +8458,22 @@
     _writer.print(");");
     return null;
   }
+
   Object visitDoubleLiteral(DoubleLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitEmptyFunctionBody(EmptyFunctionBody node) {
     _writer.print(';');
     return null;
   }
+
   Object visitEmptyStatement(EmptyStatement node) {
     _writer.print(';');
     return null;
   }
+
   Object visitExportDirective(ExportDirective node) {
     _writer.print("export ");
     visit(node.uri);
@@ -8081,6 +8481,7 @@
     _writer.print(';');
     return null;
   }
+
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _writer.print("=> ");
     visit(node.expression);
@@ -8089,16 +8490,19 @@
     }
     return null;
   }
+
   Object visitExpressionStatement(ExpressionStatement node) {
     visit(node.expression);
     _writer.print(';');
     return null;
   }
+
   Object visitExtendsClause(ExtendsClause node) {
     _writer.print("extends ");
     visit(node.superclass);
     return null;
   }
+
   Object visitFieldDeclaration(FieldDeclaration node) {
     visit(node.documentationComment);
     visit8(node.staticKeyword, " ");
@@ -8106,6 +8510,7 @@
     _writer.print(";");
     return null;
   }
+
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     visit8(node.keyword, " ");
     visit6(node.type, " ");
@@ -8114,6 +8519,7 @@
     visit(node.parameters);
     return null;
   }
+
   Object visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     _writer.print("for (");
@@ -8128,6 +8534,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitFormalParameterList(FormalParameterList node) {
     String groupEnd = null;
     _writer.print('(');
@@ -8155,6 +8562,7 @@
     _writer.print(')');
     return null;
   }
+
   Object visitForStatement(ForStatement node) {
     Expression initialization = node.initialization;
     _writer.print("for (");
@@ -8171,6 +8579,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     visit6(node.returnType, " ");
     visit8(node.propertyKeyword, " ");
@@ -8178,22 +8587,26 @@
     visit(node.functionExpression);
     return null;
   }
+
   Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     visit(node.functionDeclaration);
     _writer.print(';');
     return null;
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     visit(node.parameters);
     _writer.print(' ');
     visit(node.body);
     return null;
   }
+
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     visit(node.function);
     visit(node.argumentList);
     return null;
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     _writer.print("typedef ");
     visit6(node.returnType, " ");
@@ -8203,17 +8616,20 @@
     _writer.print(";");
     return null;
   }
+
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     visit6(node.returnType, " ");
     visit(node.identifier);
     visit(node.parameters);
     return null;
   }
+
   Object visitHideCombinator(HideCombinator node) {
     _writer.print("hide ");
     visitList5(node.hiddenNames, ", ");
     return null;
   }
+
   Object visitIfStatement(IfStatement node) {
     _writer.print("if (");
     visit(node.condition);
@@ -8222,11 +8638,13 @@
     visit7(" else ", node.elseStatement);
     return null;
   }
+
   Object visitImplementsClause(ImplementsClause node) {
     _writer.print("implements ");
     visitList5(node.interfaces, ", ");
     return null;
   }
+
   Object visitImportDirective(ImportDirective node) {
     _writer.print("import ");
     visit(node.uri);
@@ -8235,6 +8653,7 @@
     _writer.print(';');
     return null;
   }
+
   Object visitIndexExpression(IndexExpression node) {
     if (node.isCascaded) {
       _writer.print("..");
@@ -8246,16 +8665,19 @@
     _writer.print(']');
     return null;
   }
+
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     visit8(node.keyword, " ");
     visit(node.constructorName);
     visit(node.argumentList);
     return null;
   }
+
   Object visitIntegerLiteral(IntegerLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitInterpolationExpression(InterpolationExpression node) {
     if (node.rightBracket != null) {
       _writer.print("\${");
@@ -8267,10 +8689,12 @@
     }
     return null;
   }
+
   Object visitInterpolationString(InterpolationString node) {
     _writer.print(node.contents.lexeme);
     return null;
   }
+
   Object visitIsExpression(IsExpression node) {
     visit(node.expression);
     if (node.notOperator == null) {
@@ -8281,16 +8705,19 @@
     visit(node.type);
     return null;
   }
+
   Object visitLabel(Label node) {
     visit(node.label);
     _writer.print(":");
     return null;
   }
+
   Object visitLabeledStatement(LabeledStatement node) {
     visitList6(node.labels, " ", " ");
     visit(node.statement);
     return null;
   }
+
   Object visitLibraryDirective(LibraryDirective node) {
     _writer.print("library ");
     visit(node.name);
@@ -8298,10 +8725,12 @@
     nl();
     return null;
   }
+
   Object visitLibraryIdentifier(LibraryIdentifier node) {
     _writer.print(node.name);
     return null;
   }
+
   Object visitListLiteral(ListLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
@@ -8323,6 +8752,7 @@
     _writer.print("]");
     return null;
   }
+
   Object visitMapLiteral(MapLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
@@ -8334,12 +8764,14 @@
     _writer.print("}");
     return null;
   }
+
   Object visitMapLiteralEntry(MapLiteralEntry node) {
     visit(node.key);
     _writer.print(" : ");
     visit(node.value);
     return null;
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     visit(node.documentationComment);
     visit8(node.externalKeyword, " ");
@@ -8357,6 +8789,7 @@
     visit(node.body);
     return null;
   }
+
   Object visitMethodInvocation(MethodInvocation node) {
     if (node.isCascaded) {
       _writer.print("..");
@@ -8367,60 +8800,71 @@
     visit(node.argumentList);
     return null;
   }
+
   Object visitNamedExpression(NamedExpression node) {
     visit(node.name);
     visit7(" ", node.expression);
     return null;
   }
+
   Object visitNativeClause(NativeClause node) {
     _writer.print("native ");
     visit(node.name);
     return null;
   }
+
   Object visitNativeFunctionBody(NativeFunctionBody node) {
     _writer.print("native ");
     visit(node.stringLiteral);
     _writer.print(';');
     return null;
   }
+
   Object visitNullLiteral(NullLiteral node) {
     _writer.print("null");
     return null;
   }
+
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     _writer.print('(');
     visit(node.expression);
     _writer.print(')');
     return null;
   }
+
   Object visitPartDirective(PartDirective node) {
     _writer.print("part ");
     visit(node.uri);
     _writer.print(';');
     return null;
   }
+
   Object visitPartOfDirective(PartOfDirective node) {
     _writer.print("part of ");
     visit(node.libraryName);
     _writer.print(';');
     return null;
   }
+
   Object visitPostfixExpression(PostfixExpression node) {
     visit(node.operand);
     _writer.print(node.operator.lexeme);
     return null;
   }
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     visit(node.prefix);
     _writer.print('.');
     visit(node.identifier);
     return null;
   }
+
   Object visitPrefixExpression(PrefixExpression node) {
     _writer.print(node.operator.lexeme);
     visit(node.operand);
     return null;
   }
+
   Object visitPropertyAccess(PropertyAccess node) {
     if (node.isCascaded) {
       _writer.print("..");
@@ -8430,16 +8874,19 @@
     visit(node.propertyName);
     return null;
   }
+
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     _writer.print("this");
     visit7(".", node.constructorName);
     visit(node.argumentList);
     return null;
   }
+
   Object visitRethrowExpression(RethrowExpression node) {
     _writer.print("rethrow");
     return null;
   }
+
   Object visitReturnStatement(ReturnStatement node) {
     Expression expression = node.expression;
     if (expression == null) {
@@ -8451,43 +8898,52 @@
     }
     return null;
   }
+
   Object visitScriptTag(ScriptTag node) {
     _writer.print(node.scriptTag.lexeme);
     return null;
   }
+
   Object visitShowCombinator(ShowCombinator node) {
     _writer.print("show ");
     visitList5(node.shownNames, ", ");
     return null;
   }
+
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     visit8(node.keyword, " ");
     visit6(node.type, " ");
     visit(node.identifier);
     return null;
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     _writer.print(node.token.lexeme);
     return null;
   }
+
   Object visitSimpleStringLiteral(SimpleStringLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
+
   Object visitStringInterpolation(StringInterpolation node) {
     visitList(node.elements);
     return null;
   }
+
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _writer.print("super");
     visit7(".", node.constructorName);
     visit(node.argumentList);
     return null;
   }
+
   Object visitSuperExpression(SuperExpression node) {
     _writer.print("super");
     return null;
   }
+
   Object visitSwitchCase(SwitchCase node) {
     visitList6(node.labels, " ", " ");
     _writer.print("case ");
@@ -8500,6 +8956,7 @@
     }
     return null;
   }
+
   Object visitSwitchDefault(SwitchDefault node) {
     visitList6(node.labels, " ", " ");
     _writer.print("default: ");
@@ -8510,6 +8967,7 @@
     }
     return null;
   }
+
   Object visitSwitchStatement(SwitchStatement node) {
     _writer.print("switch (");
     visit(node.expression);
@@ -8523,24 +8981,29 @@
     _writer.print('}');
     return null;
   }
+
   Object visitSymbolLiteral(SymbolLiteral node) {
     _writer.print("#");
-    visitList8(node.components, ".");
+    visitList9(node.components, ".");
     return null;
   }
+
   Object visitThisExpression(ThisExpression node) {
     _writer.print("this");
     return null;
   }
+
   Object visitThrowExpression(ThrowExpression node) {
     _writer.print("throw ");
     visit(node.expression);
     return null;
   }
+
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     visit6(node.variables, ";");
     return null;
   }
+
   Object visitTryStatement(TryStatement node) {
     _writer.print("try ");
     visit(node.body);
@@ -8548,44 +9011,52 @@
     visit7(" finally ", node.finallyBlock);
     return null;
   }
+
   Object visitTypeArgumentList(TypeArgumentList node) {
     _writer.print('<');
     visitList5(node.arguments, ", ");
     _writer.print('>');
     return null;
   }
+
   Object visitTypeName(TypeName node) {
     visit(node.name);
     visit(node.typeArguments);
     return null;
   }
+
   Object visitTypeParameter(TypeParameter node) {
     visit(node.name);
     visit7(" extends ", node.bound);
     return null;
   }
+
   Object visitTypeParameterList(TypeParameterList node) {
     _writer.print('<');
     visitList5(node.typeParameters, ", ");
     _writer.print('>');
     return null;
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     visit(node.name);
     visit7(" = ", node.initializer);
     return null;
   }
+
   Object visitVariableDeclarationList(VariableDeclarationList node) {
     visit8(node.keyword, " ");
     visit6(node.type, " ");
     visitList5(node.variables, ", ");
     return null;
   }
+
   Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     visit(node.variables);
     _writer.print(";");
     return null;
   }
+
   Object visitWhileStatement(WhileStatement node) {
     _writer.print("while (");
     visit(node.condition);
@@ -8593,25 +9064,31 @@
     visit(node.body);
     return null;
   }
+
   Object visitWithClause(WithClause node) {
     _writer.print("with ");
     visitList5(node.mixinTypes, ", ");
     return null;
   }
+
   void indent() {
     _writer.print(_indentString);
   }
+
   void indentDec() {
     _indentLevel -= 2;
     _indentString = StringUtils.repeat(" ", _indentLevel);
   }
+
   void indentInc() {
     _indentLevel += 2;
     _indentString = StringUtils.repeat(" ", _indentLevel);
   }
+
   void nl() {
     _writer.print("\n");
   }
+
   void nl2() {
     nl();
     indent();
@@ -8685,18 +9162,7 @@
    * @param separator the separator to be printed between adjacent nodes
    */
   void visitList5(NodeList<ASTNode> nodes, String separator) {
-    if (nodes != null) {
-      int size = nodes.length;
-      for (int i = 0; i < size; i++) {
-        if ("\n" == separator) {
-          _writer.print("\n");
-          indent();
-        } else if (i > 0) {
-          _writer.print(separator);
-        }
-        nodes[i].accept(this);
-      }
-    }
+    visitList8("", nodes, separator, "");
   }
 
   /**
@@ -8707,18 +9173,7 @@
    * @param suffix the suffix to be printed if the list is not empty
    */
   void visitList6(NodeList<ASTNode> nodes, String separator, String suffix) {
-    if (nodes != null) {
-      int size = nodes.length;
-      if (size > 0) {
-        for (int i = 0; i < size; i++) {
-          if (i > 0) {
-            _writer.print(separator);
-          }
-          nodes[i].accept(this);
-        }
-        _writer.print(suffix);
-      }
-    }
+    visitList8("", nodes, separator, suffix);
   }
 
   /**
@@ -8729,16 +9184,36 @@
    * @param separator the separator to be printed between adjacent nodes
    */
   void visitList7(String prefix, NodeList<ASTNode> nodes, String separator) {
+    visitList8(prefix, nodes, separator, "");
+  }
+
+  /**
+   * Print a list of nodes, separated by the given separator.
+   *
+   * @param prefix the prefix to be printed if the list is not empty
+   * @param nodes the nodes to be printed
+   * @param separator the separator to be printed between adjacent nodes
+   * @param suffix the suffix to be printed if the list is not empty
+   */
+  void visitList8(String prefix, NodeList<ASTNode> nodes, String separator, String suffix) {
     if (nodes != null) {
       int size = nodes.length;
-      if (size > 0) {
+      if (size != 0) {
         _writer.print(prefix);
+        if (prefix.endsWith("\n")) {
+          indent();
+        }
+        bool newLineSeparator = separator.endsWith("\n");
         for (int i = 0; i < size; i++) {
           if (i > 0) {
             _writer.print(separator);
+            if (newLineSeparator) {
+              indent();
+            }
           }
           nodes[i].accept(this);
         }
+        _writer.print(suffix);
       }
     }
   }
@@ -8749,7 +9224,7 @@
    * @param tokens the tokens to be printed
    * @param separator the separator to be printed between adjacent tokens
    */
-  void visitList8(List<Token> tokens, String separator) {
+  void visitList9(List<Token> tokens, String separator) {
     int size = tokens.length;
     for (int i = 0; i < size; i++) {
       if ("\n" == separator) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index ed27b38..a329dae 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1,6 +1,8 @@
 // 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 engine.resolver;
+
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -17,6 +19,7 @@
 import 'html.dart' as ht;
 import 'engine.dart';
 import 'constant.dart';
+
 /**
  * Instances of the class `CompilationUnitBuilder` build an element model for a single
  * compilation unit.
@@ -24,7 +27,6 @@
  * @coverage dart.engine.resolver
  */
 class CompilationUnitBuilder {
-
   /**
    * Build the compilation unit element for the given source.
    *
@@ -56,6 +58,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `ElementBuilder` traverse an AST structure and build the element
  * model representing the AST structure.
@@ -63,7 +66,6 @@
  * @coverage dart.engine.resolver
  */
 class ElementBuilder extends RecursiveASTVisitor<Object> {
-
   /**
    * The element holder associated with the element that is currently being built.
    */
@@ -99,6 +101,7 @@
   ElementBuilder(ElementHolder initialHolder) {
     _currentHolder = initialHolder;
   }
+
   Object visitBlock(Block node) {
     bool wasInField = _inFieldContext;
     _inFieldContext = false;
@@ -109,6 +112,7 @@
     }
     return null;
   }
+
   Object visitCatchClause(CatchClause node) {
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
@@ -124,6 +128,7 @@
     }
     return super.visitCatchClause(node);
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     ElementHolder holder = new ElementHolder();
     _isValidMixin = true;
@@ -156,6 +161,7 @@
     holder.validate();
     return null;
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ElementHolder holder = new ElementHolder();
     _functionTypesToFix = new List<FunctionTypeImpl>();
@@ -180,6 +186,7 @@
     holder.validate();
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     _isValidMixin = false;
     ElementHolder holder = new ElementHolder();
@@ -213,6 +220,7 @@
     holder.validate();
     return null;
   }
+
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     SimpleIdentifier variableName = node.identifier;
     sc.Token keyword = node.keyword;
@@ -227,6 +235,7 @@
     variableName.staticElement = element;
     return super.visitDeclaredIdentifier(node);
   }
+
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     ElementHolder holder = new ElementHolder();
     visit(holder, node.defaultValue);
@@ -257,6 +266,7 @@
     holder.validate();
     return null;
   }
+
   Object visitFieldDeclaration(FieldDeclaration node) {
     bool wasInField = _inFieldContext;
     _inFieldContext = true;
@@ -267,6 +277,7 @@
     }
     return null;
   }
+
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -279,10 +290,11 @@
     }
     ElementHolder holder = new ElementHolder();
     visitChildren(holder, node);
-    ((node.element as ParameterElementImpl)).parameters = holder.parameters;
+    (node.element as ParameterElementImpl).parameters = holder.parameters;
     holder.validate();
     return null;
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression expression = node.functionExpression;
     if (expression != null) {
@@ -358,6 +370,7 @@
     }
     return null;
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     ElementHolder holder = new ElementHolder();
     bool wasInFunction = _inFunction;
@@ -390,6 +403,7 @@
     holder.validate();
     return null;
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     ElementHolder holder = new ElementHolder();
     visitChildren(holder, node);
@@ -407,6 +421,7 @@
     holder.validate();
     return null;
   }
+
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -418,10 +433,11 @@
     }
     ElementHolder holder = new ElementHolder();
     visitChildren(holder, node);
-    ((node.element as ParameterElementImpl)).parameters = holder.parameters;
+    (node.element as ParameterElementImpl).parameters = holder.parameters;
     holder.validate();
     return null;
   }
+
   Object visitLabeledStatement(LabeledStatement node) {
     bool onSwitchStatement = node.statement is SwitchStatement;
     for (Label label in node.labels) {
@@ -432,6 +448,7 @@
     }
     return super.visitLabeledStatement(node);
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     ElementHolder holder = new ElementHolder();
     bool wasInFunction = _inFunction;
@@ -500,6 +517,7 @@
     holder.validate();
     return null;
   }
+
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -513,10 +531,12 @@
     }
     return super.visitSimpleFormalParameter(node);
   }
+
   Object visitSuperExpression(SuperExpression node) {
     _isValidMixin = false;
     return super.visitSuperExpression(node);
   }
+
   Object visitSwitchCase(SwitchCase node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
@@ -526,6 +546,7 @@
     }
     return super.visitSwitchCase(node);
   }
+
   Object visitSwitchDefault(SwitchDefault node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
@@ -535,6 +556,7 @@
     }
     return super.visitSwitchDefault(node);
   }
+
   Object visitTypeParameter(TypeParameter node) {
     SimpleIdentifier parameterName = node.name;
     TypeParameterElementImpl typeParameter = new TypeParameterElementImpl(parameterName);
@@ -544,8 +566,9 @@
     parameterName.staticElement = typeParameter;
     return super.visitTypeParameter(node);
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
-    sc.Token keyword = ((node.parent as VariableDeclarationList)).keyword;
+    sc.Token keyword = (node.parent as VariableDeclarationList).keyword;
     bool isConst = matches(keyword, sc.Keyword.CONST);
     bool isFinal = matches(keyword, sc.Keyword.FINAL);
     bool hasInitializer = node.initializer != null;
@@ -610,7 +633,7 @@
     if (element is PropertyInducingElementImpl) {
       PropertyInducingElementImpl variable = element as PropertyInducingElementImpl;
       if (_inFieldContext) {
-        ((variable as FieldElementImpl)).static = matches(((node.parent.parent as FieldDeclaration)).staticKeyword, sc.Keyword.STATIC);
+        (variable as FieldElementImpl).static = matches((node.parent.parent as FieldDeclaration).staticKeyword, sc.Keyword.STATIC);
       }
       PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
       getter.getter = true;
@@ -678,11 +701,11 @@
     ASTNode parent = node.parent;
     while (parent != null) {
       if (parent is ConstructorDeclaration) {
-        return ((parent as ConstructorDeclaration)).body;
+        return (parent as ConstructorDeclaration).body;
       } else if (parent is FunctionExpression) {
-        return ((parent as FunctionExpression)).body;
+        return (parent as FunctionExpression).body;
       } else if (parent is MethodDeclaration) {
-        return ((parent as MethodDeclaration)).body;
+        return (parent as MethodDeclaration).body;
       }
       parent = parent.parent;
     }
@@ -696,7 +719,7 @@
    * @param keyword the keyword being tested for
    * @return `true` if the given token is a token for the given keyword
    */
-  bool matches(sc.Token token, sc.Keyword keyword) => token != null && identical(token.type, sc.TokenType.KEYWORD) && identical(((token as sc.KeywordToken)).keyword, keyword);
+  bool matches(sc.Token token, sc.Keyword keyword) => token != null && identical(token.type, sc.TokenType.KEYWORD) && identical((token as sc.KeywordToken).keyword, keyword);
 
   /**
    * Sets the visible source range for formal parameter.
@@ -744,6 +767,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `ElementHolder` hold on to elements created while traversing an AST
  * structure so that they can be accessed when creating their enclosing element.
@@ -752,89 +776,113 @@
  */
 class ElementHolder {
   List<PropertyAccessorElement> _accessors;
+
   List<ConstructorElement> _constructors;
+
   List<FieldElement> _fields;
+
   List<FunctionElement> _functions;
+
   List<LabelElement> _labels;
+
   List<VariableElement> _localVariables;
+
   List<MethodElement> _methods;
+
   List<ParameterElement> _parameters;
+
   List<TopLevelVariableElement> _topLevelVariables;
+
   List<ClassElement> _types;
+
   List<FunctionTypeAliasElement> _typeAliases;
+
   List<TypeParameterElement> _typeParameters;
+
   void addAccessor(PropertyAccessorElement element) {
     if (_accessors == null) {
       _accessors = new List<PropertyAccessorElement>();
     }
     _accessors.add(element);
   }
+
   void addConstructor(ConstructorElement element) {
     if (_constructors == null) {
       _constructors = new List<ConstructorElement>();
     }
     _constructors.add(element);
   }
+
   void addField(FieldElement element) {
     if (_fields == null) {
       _fields = new List<FieldElement>();
     }
     _fields.add(element);
   }
+
   void addFunction(FunctionElement element) {
     if (_functions == null) {
       _functions = new List<FunctionElement>();
     }
     _functions.add(element);
   }
+
   void addLabel(LabelElement element) {
     if (_labels == null) {
       _labels = new List<LabelElement>();
     }
     _labels.add(element);
   }
+
   void addLocalVariable(LocalVariableElement element) {
     if (_localVariables == null) {
       _localVariables = new List<VariableElement>();
     }
     _localVariables.add(element);
   }
+
   void addMethod(MethodElement element) {
     if (_methods == null) {
       _methods = new List<MethodElement>();
     }
     _methods.add(element);
   }
+
   void addParameter(ParameterElement element) {
     if (_parameters == null) {
       _parameters = new List<ParameterElement>();
     }
     _parameters.add(element);
   }
+
   void addTopLevelVariable(TopLevelVariableElement element) {
     if (_topLevelVariables == null) {
       _topLevelVariables = new List<TopLevelVariableElement>();
     }
     _topLevelVariables.add(element);
   }
+
   void addType(ClassElement element) {
     if (_types == null) {
       _types = new List<ClassElement>();
     }
     _types.add(element);
   }
+
   void addTypeAlias(FunctionTypeAliasElement element) {
     if (_typeAliases == null) {
       _typeAliases = new List<FunctionTypeAliasElement>();
     }
     _typeAliases.add(element);
   }
+
   void addTypeParameter(TypeParameterElement element) {
     if (_typeParameters == null) {
       _typeParameters = new List<TypeParameterElement>();
     }
     _typeParameters.add(element);
   }
+
   List<PropertyAccessorElement> get accessors {
     if (_accessors == null) {
       return PropertyAccessorElementImpl.EMPTY_ARRAY;
@@ -843,6 +891,7 @@
     _accessors = null;
     return result;
   }
+
   List<ConstructorElement> get constructors {
     if (_constructors == null) {
       return ConstructorElementImpl.EMPTY_ARRAY;
@@ -851,6 +900,7 @@
     _constructors = null;
     return result;
   }
+
   FieldElement getField(String fieldName) {
     if (_fields == null) {
       return null;
@@ -862,6 +912,7 @@
     }
     return null;
   }
+
   List<FieldElement> get fields {
     if (_fields == null) {
       return FieldElementImpl.EMPTY_ARRAY;
@@ -870,6 +921,7 @@
     _fields = null;
     return result;
   }
+
   List<FunctionElement> get functions {
     if (_functions == null) {
       return FunctionElementImpl.EMPTY_ARRAY;
@@ -878,6 +930,7 @@
     _functions = null;
     return result;
   }
+
   List<LabelElement> get labels {
     if (_labels == null) {
       return LabelElementImpl.EMPTY_ARRAY;
@@ -886,6 +939,7 @@
     _labels = null;
     return result;
   }
+
   List<LocalVariableElement> get localVariables {
     if (_localVariables == null) {
       return LocalVariableElementImpl.EMPTY_ARRAY;
@@ -894,6 +948,7 @@
     _localVariables = null;
     return result;
   }
+
   List<MethodElement> get methods {
     if (_methods == null) {
       return MethodElementImpl.EMPTY_ARRAY;
@@ -902,6 +957,7 @@
     _methods = null;
     return result;
   }
+
   List<ParameterElement> get parameters {
     if (_parameters == null) {
       return ParameterElementImpl.EMPTY_ARRAY;
@@ -910,6 +966,7 @@
     _parameters = null;
     return result;
   }
+
   TopLevelVariableElement getTopLevelVariable(String variableName) {
     if (_topLevelVariables == null) {
       return null;
@@ -921,6 +978,7 @@
     }
     return null;
   }
+
   List<TopLevelVariableElement> get topLevelVariables {
     if (_topLevelVariables == null) {
       return TopLevelVariableElementImpl.EMPTY_ARRAY;
@@ -929,6 +987,7 @@
     _topLevelVariables = null;
     return result;
   }
+
   List<FunctionTypeAliasElement> get typeAliases {
     if (_typeAliases == null) {
       return FunctionTypeAliasElementImpl.EMPTY_ARRAY;
@@ -937,6 +996,7 @@
     _typeAliases = null;
     return result;
   }
+
   List<TypeParameterElement> get typeParameters {
     if (_typeParameters == null) {
       return TypeParameterElementImpl.EMPTY_ARRAY;
@@ -945,6 +1005,7 @@
     _typeParameters = null;
     return result;
   }
+
   List<ClassElement> get types {
     if (_types == null) {
       return ClassElementImpl.EMPTY_ARRAY;
@@ -953,6 +1014,7 @@
     _types = null;
     return result;
   }
+
   void validate() {
     JavaStringBuilder builder = new JavaStringBuilder();
     if (_accessors != null) {
@@ -1041,14 +1103,19 @@
     }
   }
 }
+
 /**
  * Instances of the class `HtmlUnitBuilder` build an element model for a single HTML unit.
  */
 class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
   static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\"";
+
   static String _APPLICATION_DART_IN_SINGLE_QUOTES = "'application/dart'";
+
   static String _SCRIPT = "script";
+
   static String _SRC = "src";
+
   static String _TYPE = "type";
 
   /**
@@ -1131,6 +1198,7 @@
     unit.element = result;
     return result;
   }
+
   Object visitHtmlUnit(ht.HtmlUnit node) {
     _parentNodes = new List<ht.XmlTagNode>();
     _scripts = new List<HtmlScriptElement>();
@@ -1143,7 +1211,9 @@
     }
     return null;
   }
+
   Object visitXmlAttributeNode(ht.XmlAttributeNode node) => null;
+
   Object visitXmlTagNode(ht.XmlTagNode node) {
     if (_parentNodes.contains(node)) {
       JavaStringBuilder builder = new JavaStringBuilder();
@@ -1287,6 +1357,7 @@
     reportError(errorCode, offset, length, arguments);
   }
 }
+
 /**
  * Instances of the class `BestPracticesVerifier` traverse an AST structure looking for
  * violations of Dart best practices.
@@ -1295,10 +1366,15 @@
  */
 class BestPracticesVerifier extends RecursiveASTVisitor<Object> {
   static String _GETTER = "getter";
+
   static String _HASHCODE_GETTER_NAME = "hashCode";
+
   static String _METHOD = "method";
+
   static String _NULL_TYPE_NAME = "Null";
+
   static String _SETTER = "setter";
+
   static String _TO_INT_METHOD_NAME = "toInt";
 
   /**
@@ -1338,14 +1414,26 @@
   BestPracticesVerifier(ErrorReporter errorReporter) {
     this._errorReporter = errorReporter;
   }
+
   Object visitAsExpression(AsExpression node) {
     checkForUnnecessaryCast(node);
     return super.visitAsExpression(node);
   }
+
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    if (operatorType != sc.TokenType.EQ) {
+      checkForDeprecatedMemberUse(node.bestElement, node);
+    }
+    return super.visitAssignmentExpression(node);
+  }
+
   Object visitBinaryExpression(BinaryExpression node) {
     checkForDivisionOptimizationHint(node);
+    checkForDeprecatedMemberUse(node.bestElement, node);
     return super.visitBinaryExpression(node);
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerClass = _enclosingClass;
     try {
@@ -1355,15 +1443,62 @@
       _enclosingClass = outerClass;
     }
   }
+
+  Object visitExportDirective(ExportDirective node) {
+    checkForDeprecatedMemberUse(node.uriElement, node);
+    return super.visitExportDirective(node);
+  }
+
+  Object visitImportDirective(ImportDirective node) {
+    checkForDeprecatedMemberUse(node.uriElement, node);
+    return super.visitImportDirective(node);
+  }
+
+  Object visitIndexExpression(IndexExpression node) {
+    checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitIndexExpression(node);
+  }
+
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitInstanceCreationExpression(node);
+  }
+
   Object visitIsExpression(IsExpression node) {
     checkAllTypeChecks(node);
     return super.visitIsExpression(node);
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     checkForOverridingPrivateMember(node);
     return super.visitMethodDeclaration(node);
   }
 
+  Object visitPostfixExpression(PostfixExpression node) {
+    checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitPostfixExpression(node);
+  }
+
+  Object visitPrefixExpression(PrefixExpression node) {
+    checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitPrefixExpression(node);
+  }
+
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitRedirectingConstructorInvocation(node);
+  }
+
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    checkForDeprecatedMemberUse2(node);
+    return super.visitSimpleIdentifier(node);
+  }
+
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitSuperConstructorInvocation(node);
+  }
+
   /**
    * Check for the passed is expression for the unnecessary type check hint codes as well as null
    * checks expressed using an is expression.
@@ -1415,6 +1550,52 @@
   }
 
   /**
+   * Given some [Element], look at the associated metadata and report the use of the member if
+   * it is declared as deprecated.
+   *
+   * @param element some element to check for deprecated use of
+   * @param node the node use for the location of the error
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#DEPRECATED_MEMBER_USE
+   */
+  bool checkForDeprecatedMemberUse(Element element, ASTNode node) {
+    if (element != null && element.isDeprecated) {
+      String displayName = element.displayName;
+      if (element is ConstructorElement) {
+        ConstructorElement constructorElement = element as ConstructorElement;
+        displayName = constructorElement.enclosingElement.displayName;
+        if (!constructorElement.displayName.isEmpty) {
+          displayName = "${displayName}.${constructorElement.displayName}";
+        }
+      }
+      _errorReporter.reportError2(HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
+   * if the node is not in a declaration context.
+   *
+   * Also, if the identifier is a constructor name in a constructor invocation, then calls to the
+   * deprecated constructor will be caught by
+   * [visitInstanceCreationExpression] and
+   * [visitSuperConstructorInvocation], and can be ignored by
+   * this visit method.
+   *
+   * @param identifier some simple identifier to check for deprecated use of
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#DEPRECATED_MEMBER_USE
+   */
+  bool checkForDeprecatedMemberUse2(SimpleIdentifier identifier) {
+    if (identifier.inDeclarationContext() || (identifier.parent is ConstructorName && identical(identifier, (identifier.parent as ConstructorName).name)) || (identifier.parent is SuperConstructorInvocation && identical(identifier, (identifier.parent as SuperConstructorInvocation).constructorName))) {
+      return false;
+    }
+    return checkForDeprecatedMemberUse(identifier.bestElement, identifier);
+  }
+
+  /**
    * Check for the passed binary expression for the [HintCode#DIVISION_OPTIMIZATION].
    *
    * @param node the binary expression to check
@@ -1508,7 +1689,7 @@
             }
           }
           if (overriddenAccessor != null) {
-            String memberType = ((executableElement as PropertyAccessorElement)).isGetter ? _GETTER : _SETTER;
+            String memberType = (executableElement as PropertyAccessorElement).isGetter ? _GETTER : _SETTER;
             _errorReporter.reportError2(HintCode.OVERRIDDING_PRIVATE_MEMBER, node.name, [
                 memberType,
                 executableElement.displayName,
@@ -1551,6 +1732,7 @@
     return false;
   }
 }
+
 /**
  * Instances of the class `Dart2JSVerifier` traverse an AST structure looking for hints for
  * code that will be compiled to JS, such as [HintCode#IS_DOUBLE].
@@ -1558,7 +1740,6 @@
  * @coverage dart.engine.resolver
  */
 class Dart2JSVerifier extends RecursiveASTVisitor<Object> {
-
   /**
    * The error reporter by which errors will be reported.
    */
@@ -1577,6 +1758,7 @@
   Dart2JSVerifier(ErrorReporter errorReporter) {
     this._errorReporter = errorReporter;
   }
+
   Object visitIsExpression(IsExpression node) {
     checkForIsDoubleHints(node);
     return super.visitIsExpression(node);
@@ -1612,6 +1794,7 @@
     return false;
   }
 }
+
 /**
  * Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
  * [HintCode#DEAD_CODE].
@@ -1619,7 +1802,6 @@
  * @coverage dart.engine.resolver
  */
 class DeadCodeVerifier extends RecursiveASTVisitor<Object> {
-
   /**
    * The error reporter by which errors will be reported.
    */
@@ -1633,6 +1815,7 @@
   DeadCodeVerifier(ErrorReporter errorReporter) {
     this._errorReporter = errorReporter;
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     sc.Token operator = node.operator;
     bool isAmpAmp = identical(operator.type, sc.TokenType.AMPERSAND_AMPERSAND);
@@ -1674,12 +1857,13 @@
         Statement lastStatement = statements[size - 1];
         int offset = nextStatement.offset;
         int length = lastStatement.end - offset;
-        _errorReporter.reportError3(HintCode.DEAD_CODE, offset, length, []);
+        _errorReporter.reportError4(HintCode.DEAD_CODE, offset, length, []);
         return null;
       }
     }
     return null;
   }
+
   Object visitConditionalExpression(ConditionalExpression node) {
     Expression conditionExpression = node.condition;
     safelyVisit(conditionExpression);
@@ -1699,6 +1883,7 @@
     }
     return super.visitConditionalExpression(node);
   }
+
   Object visitIfStatement(IfStatement node) {
     Expression conditionExpression = node.condition;
     safelyVisit(conditionExpression);
@@ -1721,6 +1906,7 @@
     }
     return super.visitIfStatement(node);
   }
+
   Object visitTryStatement(TryStatement node) {
     safelyVisit(node.body);
     safelyVisit(node.finallyBlock);
@@ -1740,7 +1926,7 @@
               CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
               int offset = nextCatchClause.offset;
               int length = lastCatchClause.end - offset;
-              _errorReporter.reportError3(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+              _errorReporter.reportError4(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
               return null;
             }
           }
@@ -1749,7 +1935,7 @@
               CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
               int offset = catchClause.offset;
               int length = lastCatchClause.end - offset;
-              _errorReporter.reportError3(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
+              _errorReporter.reportError4(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
               return null;
             }
           }
@@ -1763,13 +1949,14 @@
           CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
           int offset = nextCatchClause.offset;
           int length = lastCatchClause.end - offset;
-          _errorReporter.reportError3(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+          _errorReporter.reportError4(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
           return null;
         }
       }
     }
     return null;
   }
+
   Object visitWhileStatement(WhileStatement node) {
     Expression conditionExpression = node.condition;
     safelyVisit(conditionExpression);
@@ -1798,7 +1985,7 @@
    */
   ValidResult getConstantBooleanValue(Expression expression) {
     if (expression is BooleanLiteral) {
-      if (((expression as BooleanLiteral)).value) {
+      if ((expression as BooleanLiteral).value) {
         return ValidResult.RESULT_TRUE;
       } else {
         return ValidResult.RESULT_FALSE;
@@ -1841,6 +2028,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `HintGenerator` traverse a library's worth of dart code at a time to
  * generate hints over the set of sources.
@@ -1850,10 +2038,15 @@
  */
 class HintGenerator {
   List<CompilationUnit> _compilationUnits;
+
   AnalysisContext _context;
+
   AnalysisErrorListener _errorListener;
+
   ImportsVerifier _importsVerifier;
+
   bool _enableDart2JSHints = false;
+
   HintGenerator(List<CompilationUnit> compilationUnits, AnalysisContext context, AnalysisErrorListener errorListener) {
     this._compilationUnits = compilationUnits;
     this._context = context;
@@ -1862,6 +2055,7 @@
     _importsVerifier = new ImportsVerifier(library);
     _enableDart2JSHints = context.analysisOptions.dart2jsHint;
   }
+
   void generateForLibrary() {
     TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.hints.start();
     try {
@@ -1884,6 +2078,7 @@
       timeCounter.stop();
     }
   }
+
   void generateForCompilationUnit(CompilationUnit unit, Source source) {
     ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
     _importsVerifier.visitCompilationUnit(unit);
@@ -1894,6 +2089,7 @@
     new BestPracticesVerifier(errorReporter).visitCompilationUnit(unit);
   }
 }
+
 /**
  * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the
  * source code verifying that all of the imports are used, otherwise a
@@ -1906,7 +2102,6 @@
  * @coverage dart.engine.resolver
  */
 class ImportsVerifier extends RecursiveASTVisitor<Object> {
-
   /**
    * This is set to `true` if the current compilation unit which is being visited is the
    * defining compilation unit for the library, its value can be set with
@@ -2012,6 +2207,7 @@
       errorReporter.reportError2(HintCode.UNUSED_IMPORT, unusedImport.uri, []);
     }
   }
+
   Object visitCompilationUnit(CompilationUnit node) {
     if (_inDefiningCompilationUnit) {
       NodeList<Directive> directives = node.directives;
@@ -2058,18 +2254,22 @@
     }
     return super.visitCompilationUnit(node);
   }
+
   Object visitExportDirective(ExportDirective node) {
     visitMetadata(node.metadata);
     return null;
   }
+
   Object visitImportDirective(ImportDirective node) {
     visitMetadata(node.metadata);
     return null;
   }
+
   Object visitLibraryDirective(LibraryDirective node) {
     visitMetadata(node.metadata);
     return null;
   }
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixIdentifier = node.prefix;
     Element element = prefixIdentifier.staticElement;
@@ -2079,7 +2279,9 @@
     }
     return visitIdentifier(element, prefixIdentifier.name);
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node.staticElement, node.name);
+
   void set inDefiningCompilationUnit(bool inDefiningCompilationUnit) {
     this._inDefiningCompilationUnit = inDefiningCompilationUnit;
   }
@@ -2133,6 +2335,7 @@
     }
     importList.add(importDirective);
   }
+
   Object visitIdentifier(Element element, String name) {
     if (element == null) {
       return null;
@@ -2186,6 +2389,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
  * pub best practices.
@@ -2202,10 +2406,12 @@
    * The error reporter by which errors will be reported.
    */
   ErrorReporter _errorReporter;
+
   PubVerifier(AnalysisContext context, ErrorReporter errorReporter) {
     this._context = context;
     this._errorReporter = errorReporter;
   }
+
   Object visitImportDirective(ImportDirective directive) {
     return null;
   }
@@ -2270,6 +2476,7 @@
     }
     return false;
   }
+
   bool checkForFileImportOutsideLibReferencesFileInside2(StringLiteral uriLiteral, String path, int pathIndex) {
     Source source = getSource(uriLiteral);
     String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
@@ -2338,12 +2545,12 @@
     return null;
   }
 }
-/**
- * Instances of the class `DeclarationResolver` are used to resolve declarations in an AST
- * structure to already built elements.
- */
-class DeclarationResolver extends RecursiveASTVisitor<Object> {
 
+/**
+ * Instances of the class `DeclarationMatcher` determine whether the element model defined by
+ * a given AST structure matches an existing element model.
+ */
+class DeclarationMatcher extends RecursiveASTVisitor<Object> {
   /**
    * The compilation unit containing the AST nodes being visited.
    */
@@ -2374,49 +2581,88 @@
   ParameterElement _enclosingParameter;
 
   /**
-   * Resolve the declarations within the given compilation unit to the elements rooted at the given
-   * element.
-   *
-   * @param unit the compilation unit to be resolved
-   * @param element the root of the element model used to resolve the AST nodes
+   * A set containing all of the elements in the element model that were defined by the old AST node
+   * corresponding to the AST node being visited.
    */
-  void resolve(CompilationUnit unit, CompilationUnitElement element) {
-    _enclosingUnit = element;
-    unit.element = element;
-    unit.accept(this);
+  Set<Element> _allElements = new Set<Element>();
+
+  /**
+   * A set containing all of the elements in the element model that were defined by the old AST node
+   * corresponding to the AST node being visited that have not already been matched to nodes in the
+   * AST structure being visited.
+   */
+  Set<Element> _unmatchedElements = new Set<Element>();
+
+  /**
+   * Return `true` if the declarations within the given AST structure define an element model
+   * that is equivalent to the corresponding elements rooted at the given element.
+   *
+   * @param node the AST structure being compared to the element model
+   * @param element the root of the element model being compared to the AST structure
+   * @return `true` if the AST structure defines the same elements as those in the given
+   *         element model
+   */
+  bool matches(ASTNode node, Element element) {
+    captureEnclosingElements(element);
+    gatherElements(element);
+    try {
+      node.accept(this);
+    } on DeclarationMatcher_DeclarationMismatchException catch (exception) {
+      return false;
+    }
+    return _unmatchedElements.isEmpty;
   }
+
   Object visitCatchClause(CatchClause node) {
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
       List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
-      find3(localVariables, exceptionParameter);
+      LocalVariableElement exceptionElement = find3(localVariables, exceptionParameter);
+      processElement(exceptionElement);
       SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
       if (stackTraceParameter != null) {
-        find3(localVariables, stackTraceParameter);
+        LocalVariableElement stackTraceElement = find3(localVariables, stackTraceParameter);
+        processElement(stackTraceElement);
       }
     }
     return super.visitCatchClause(node);
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerClass = _enclosingClass;
     try {
       SimpleIdentifier className = node.name;
       _enclosingClass = find3(_enclosingUnit.types, className);
+      processElement(_enclosingClass);
+      if (!hasConstructor(node)) {
+        ConstructorElement constructor = _enclosingClass.unnamedConstructor;
+        if (constructor.isSynthetic) {
+          processElement(constructor);
+        }
+      }
       return super.visitClassDeclaration(node);
     } finally {
       _enclosingClass = outerClass;
     }
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ClassElement outerClass = _enclosingClass;
     try {
       SimpleIdentifier className = node.name;
       _enclosingClass = find3(_enclosingUnit.types, className);
+      processElement(_enclosingClass);
       return super.visitClassTypeAlias(node);
     } finally {
       _enclosingClass = outerClass;
     }
   }
+
+  Object visitCompilationUnit(CompilationUnit node) {
+    processElement(_enclosingUnit);
+    return super.visitCompilationUnit(node);
+  }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -2425,19 +2671,21 @@
         _enclosingExecutable = _enclosingClass.unnamedConstructor;
       } else {
         _enclosingExecutable = _enclosingClass.getNamedConstructor(constructorName.name);
-        constructorName.staticElement = _enclosingExecutable;
       }
-      node.element = _enclosingExecutable as ConstructorElement;
+      processElement(_enclosingExecutable);
       return super.visitConstructorDeclaration(node);
     } finally {
       _enclosingExecutable = outerExecutable;
     }
   }
+
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     SimpleIdentifier variableName = node.identifier;
-    find3(_enclosingExecutable.localVariables, variableName);
+    LocalVariableElement element = find3(_enclosingExecutable.localVariables, variableName);
+    processElement(element);
     return super.visitDeclaredIdentifier(node);
   }
+
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     SimpleIdentifier parameterName = node.parameter.identifier;
     ParameterElement element = getElementForParameter(node, parameterName);
@@ -2453,24 +2701,28 @@
       } finally {
         _enclosingExecutable = outerExecutable;
       }
+      processElement(_enclosingExecutable);
     }
     ParameterElement outerParameter = _enclosingParameter;
     try {
       _enclosingParameter = element;
+      processElement(_enclosingParameter);
       return super.visitDefaultFormalParameter(node);
     } finally {
       _enclosingParameter = outerParameter;
     }
   }
+
   Object visitExportDirective(ExportDirective node) {
     String uri = getStringValue(node.uri);
     if (uri != null) {
       LibraryElement library = _enclosingUnit.library;
       ExportElement exportElement = find5(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
-      node.element = exportElement;
+      processElement(exportElement);
     }
     return super.visitExportDirective(node);
   }
+
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -2478,6 +2730,7 @@
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
+        processElement(_enclosingParameter);
         return super.visitFieldFormalParameter(node);
       } finally {
         _enclosingParameter = outerParameter;
@@ -2486,6 +2739,7 @@
       return super.visitFieldFormalParameter(node);
     }
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -2499,41 +2753,45 @@
         }
       } else {
         PropertyAccessorElement accessor = find3(_enclosingUnit.accessors, functionName);
-        if (identical(((property as sc.KeywordToken)).keyword, sc.Keyword.SET)) {
+        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
-          functionName.staticElement = accessor;
         }
         _enclosingExecutable = accessor;
       }
-      node.functionExpression.element = _enclosingExecutable;
+      processElement(_enclosingExecutable);
       return super.visitFunctionDeclaration(node);
     } finally {
       _enclosingExecutable = outerExecutable;
     }
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
       FunctionElement element = find2(_enclosingExecutable.functions, node.beginToken.offset);
-      node.element = element;
+      processElement(element);
     }
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
       _enclosingExecutable = node.element;
+      processElement(_enclosingExecutable);
       return super.visitFunctionExpression(node);
     } finally {
       _enclosingExecutable = outerExecutable;
     }
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAliasElement outerAlias = _enclosingAlias;
     try {
       SimpleIdentifier aliasName = node.name;
       _enclosingAlias = find3(_enclosingUnit.functionTypeAliases, aliasName);
+      processElement(_enclosingAlias);
       return super.visitFunctionTypeAlias(node);
     } finally {
       _enclosingAlias = outerAlias;
     }
   }
+
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -2541,6 +2799,7 @@
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
+        processElement(_enclosingParameter);
         return super.visitFunctionTypedFormalParameter(node);
       } finally {
         _enclosingParameter = outerParameter;
@@ -2549,26 +2808,26 @@
       return super.visitFunctionTypedFormalParameter(node);
     }
   }
+
   Object visitImportDirective(ImportDirective node) {
     String uri = getStringValue(node.uri);
     if (uri != null) {
       LibraryElement library = _enclosingUnit.library;
       ImportElement importElement = find6(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
-      node.element = importElement;
+      processElement(importElement);
     }
     return super.visitImportDirective(node);
   }
+
   Object visitLabeledStatement(LabeledStatement node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      find3(_enclosingExecutable.labels, labelName);
+      LabelElement element = find3(_enclosingExecutable.labels, labelName);
+      processElement(element);
     }
     return super.visitLabeledStatement(node);
   }
-  Object visitLibraryDirective(LibraryDirective node) {
-    node.element = _enclosingUnit.library;
-    return super.visitLibraryDirective(node);
-  }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -2583,29 +2842,29 @@
         methodName.staticElement = _enclosingExecutable;
       } else {
         PropertyAccessorElement accessor = find3(_enclosingClass.accessors, methodName);
-        if (identical(((property as sc.KeywordToken)).keyword, sc.Keyword.SET)) {
+        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
           methodName.staticElement = accessor;
         }
         _enclosingExecutable = accessor;
       }
+      processElement(_enclosingExecutable);
       return super.visitMethodDeclaration(node);
     } finally {
       _enclosingExecutable = outerExecutable;
     }
   }
+
   Object visitPartDirective(PartDirective node) {
     String uri = getStringValue(node.uri);
     if (uri != null) {
       Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
-      node.element = find(_enclosingUnit.library.parts, partSource);
+      CompilationUnitElement element = find(_enclosingUnit.library.parts, partSource);
+      processElement(element);
     }
     return super.visitPartDirective(node);
   }
-  Object visitPartOfDirective(PartOfDirective node) {
-    node.element = _enclosingUnit.library;
-    return super.visitPartOfDirective(node);
-  }
+
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -2613,6 +2872,7 @@
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
+        processElement(_enclosingParameter);
         return super.visitSimpleFormalParameter(node);
       } finally {
         _enclosingParameter = outerParameter;
@@ -2621,29 +2881,37 @@
     }
     return super.visitSimpleFormalParameter(node);
   }
+
   Object visitSwitchCase(SwitchCase node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      find3(_enclosingExecutable.labels, labelName);
+      LabelElement element = find3(_enclosingExecutable.labels, labelName);
+      processElement(element);
     }
     return super.visitSwitchCase(node);
   }
+
   Object visitSwitchDefault(SwitchDefault node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      find3(_enclosingExecutable.labels, labelName);
+      LabelElement element = find3(_enclosingExecutable.labels, labelName);
+      processElement(element);
     }
     return super.visitSwitchDefault(node);
   }
+
   Object visitTypeParameter(TypeParameter node) {
     SimpleIdentifier parameterName = node.name;
+    TypeParameterElement element = null;
     if (_enclosingClass != null) {
-      find3(_enclosingClass.typeParameters, parameterName);
+      element = find3(_enclosingClass.typeParameters, parameterName);
     } else if (_enclosingAlias != null) {
-      find3(_enclosingAlias.typeParameters, parameterName);
+      element = find3(_enclosingAlias.typeParameters, parameterName);
     }
+    processElement(element);
     return super.visitTypeParameter(node);
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     VariableElement element = null;
     SimpleIdentifier variableName = node.name;
@@ -2664,6 +2932,8 @@
         } else {
           _enclosingExecutable = element.initializer;
         }
+        processElement(element);
+        processElement(_enclosingExecutable);
         return super.visitVariableDeclaration(node);
       } finally {
         _enclosingExecutable = outerExecutable;
@@ -2672,6 +2942,48 @@
     return super.visitVariableDeclaration(node);
   }
 
+  void processElement(Element element) {
+    if (element == null) {
+      throw new DeclarationMatcher_DeclarationMismatchException();
+    }
+    if (!_allElements.contains(element)) {
+      throw new DeclarationMatcher_DeclarationMismatchException();
+    }
+    _unmatchedElements.remove(element);
+  }
+
+  /**
+   * Given that the comparison is to begin with the given element, capture the enclosing elements
+   * that might be used while performing the comparison.
+   *
+   * @param element the element corresponding to the AST structure to be compared
+   */
+  void captureEnclosingElements(Element element) {
+    Element parent = element is CompilationUnitElement ? element : element.enclosingElement;
+    while (parent != null) {
+      if (parent is CompilationUnitElement) {
+        _enclosingUnit = parent as CompilationUnitElement;
+      } else if (parent is ClassElement) {
+        if (_enclosingClass == null) {
+          _enclosingClass = parent as ClassElement;
+        }
+      } else if (parent is FunctionTypeAliasElement) {
+        if (_enclosingAlias == null) {
+          _enclosingAlias = parent as FunctionTypeAliasElement;
+        }
+      } else if (parent is ExecutableElement) {
+        if (_enclosingExecutable == null) {
+          _enclosingExecutable = parent as ExecutableElement;
+        }
+      } else if (parent is ParameterElement) {
+        if (_enclosingParameter == null) {
+          _enclosingParameter = parent as ParameterElement;
+        }
+      }
+      parent = parent.enclosingElement;
+    }
+  }
+
   /**
    * Return the element for the part with the given source, or `null` if there is no element
    * for the given source.
@@ -2707,11 +3019,7 @@
    * @param identifier the name node in the declaration of the element to be returned
    * @return the element created for the declaration with the given name
    */
-  Element find3(List<Element> elements, SimpleIdentifier identifier) {
-    Element element = find4(elements, identifier.name, identifier.offset);
-    identifier.staticElement = element;
-    return element;
-  }
+  Element find3(List<Element> elements, SimpleIdentifier identifier) => find4(elements, identifier.name, identifier.offset);
 
   /**
    * Return the element in the given array of elements that was created for the declaration with the
@@ -2777,6 +3085,10 @@
     return null;
   }
 
+  void gatherElements(Element element) {
+    element.accept(new GeneralizingElementVisitor_7(this));
+  }
+
   /**
    * Search the most closely enclosing list of parameters for a parameter with the given name.
    *
@@ -2795,7 +3107,539 @@
     if (parameters == null && _enclosingAlias != null) {
       parameters = _enclosingAlias.parameters;
     }
-    ParameterElement element = parameters == null ? null : find3(parameters, parameterName);
+    return parameters == null ? null : find3(parameters, parameterName);
+  }
+
+  /**
+   * Return the value of the given string literal, or `null` if the string is not a constant
+   * string without any string interpolation.
+   *
+   * @param literal the string literal whose value is to be returned
+   * @return the value of the given string literal
+   */
+  String getStringValue(StringLiteral literal) {
+    if (literal is StringInterpolation) {
+      return null;
+    }
+    return literal.stringValue;
+  }
+
+  /**
+   * Return `true` if the given class defines at least one constructor.
+   *
+   * @param node the class being tested
+   * @return `true` if the class defines at least one constructor
+   */
+  bool hasConstructor(ClassDeclaration node) {
+    for (ClassMember member in node.members) {
+      if (member is ConstructorDeclaration) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `DeclarationMismatchException` represent an exception that is
+ * thrown when the element model defined by a given AST structure does not match an existing
+ * element model.
+ */
+class DeclarationMatcher_DeclarationMismatchException extends RuntimeException {
+}
+
+class GeneralizingElementVisitor_7 extends GeneralizingElementVisitor<Object> {
+  final DeclarationMatcher DeclarationMatcher_this;
+
+  GeneralizingElementVisitor_7(this.DeclarationMatcher_this) : super();
+
+  Object visitElement(Element element) {
+    javaSetAdd(DeclarationMatcher_this._allElements, element);
+    javaSetAdd(DeclarationMatcher_this._unmatchedElements, element);
+    return super.visitElement(element);
+  }
+}
+
+/**
+ * Instances of the class `DeclarationResolver` are used to resolve declarations in an AST
+ * structure to already built elements.
+ */
+class DeclarationResolver extends RecursiveASTVisitor<Object> {
+  /**
+   * The compilation unit containing the AST nodes being visited.
+   */
+  CompilationUnitElement _enclosingUnit;
+
+  /**
+   * The function type alias containing the AST nodes being visited, or `null` if we are not
+   * in the scope of a function type alias.
+   */
+  FunctionTypeAliasElement _enclosingAlias;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The method or function containing the AST nodes being visited, or `null` if we are not in
+   * the scope of a method or function.
+   */
+  ExecutableElement _enclosingExecutable;
+
+  /**
+   * The parameter containing the AST nodes being visited, or `null` if we are not in the
+   * scope of a parameter.
+   */
+  ParameterElement _enclosingParameter;
+
+  /**
+   * Resolve the declarations within the given compilation unit to the elements rooted at the given
+   * element.
+   *
+   * @param unit the compilation unit to be resolved
+   * @param element the root of the element model used to resolve the AST nodes
+   */
+  void resolve(CompilationUnit unit, CompilationUnitElement element) {
+    _enclosingUnit = element;
+    unit.element = element;
+    unit.accept(this);
+  }
+
+  Object visitCatchClause(CatchClause node) {
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
+      find8(localVariables, exceptionParameter);
+      SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+      if (stackTraceParameter != null) {
+        find8(localVariables, stackTraceParameter);
+      }
+    }
+    return super.visitCatchClause(node);
+  }
+
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = find8(_enclosingUnit.types, className);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = find8(_enclosingUnit.types, className);
+      return super.visitClassTypeAlias(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier constructorName = node.name;
+      if (constructorName == null) {
+        _enclosingExecutable = _enclosingClass.unnamedConstructor;
+      } else {
+        _enclosingExecutable = _enclosingClass.getNamedConstructor(constructorName.name);
+        constructorName.staticElement = _enclosingExecutable;
+      }
+      node.element = _enclosingExecutable as ConstructorElement;
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    SimpleIdentifier variableName = node.identifier;
+    find8(_enclosingExecutable.localVariables, variableName);
+    return super.visitDeclaredIdentifier(node);
+  }
+
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    SimpleIdentifier parameterName = node.parameter.identifier;
+    ParameterElement element = getElementForParameter(node, parameterName);
+    Expression defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        defaultValue.accept(this);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+    }
+    ParameterElement outerParameter = _enclosingParameter;
+    try {
+      _enclosingParameter = element;
+      return super.visitDefaultFormalParameter(node);
+    } finally {
+      _enclosingParameter = outerParameter;
+    }
+  }
+
+  Object visitExportDirective(ExportDirective node) {
+    String uri = getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ExportElement exportElement = find10(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
+      node.element = exportElement;
+    }
+    return super.visitExportDirective(node);
+  }
+
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitFieldFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFieldFormalParameter(node);
+    }
+  }
+
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier functionName = node.name;
+      sc.Token property = node.propertyKeyword;
+      if (property == null) {
+        if (_enclosingExecutable != null) {
+          _enclosingExecutable = find8(_enclosingExecutable.functions, functionName);
+        } else {
+          _enclosingExecutable = find8(_enclosingUnit.functions, functionName);
+        }
+      } else {
+        PropertyAccessorElement accessor = find8(_enclosingUnit.accessors, functionName);
+        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
+          accessor = accessor.variable.setter;
+          functionName.staticElement = accessor;
+        }
+        _enclosingExecutable = accessor;
+      }
+      node.functionExpression.element = _enclosingExecutable;
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      FunctionElement element = find7(_enclosingExecutable.functions, node.beginToken.offset);
+      node.element = element;
+    }
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      _enclosingExecutable = node.element;
+      return super.visitFunctionExpression(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAliasElement outerAlias = _enclosingAlias;
+    try {
+      SimpleIdentifier aliasName = node.name;
+      _enclosingAlias = find8(_enclosingUnit.functionTypeAliases, aliasName);
+      return super.visitFunctionTypeAlias(node);
+    } finally {
+      _enclosingAlias = outerAlias;
+    }
+  }
+
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitFunctionTypedFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFunctionTypedFormalParameter(node);
+    }
+  }
+
+  Object visitImportDirective(ImportDirective node) {
+    String uri = getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ImportElement importElement = find11(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
+      node.element = importElement;
+    }
+    return super.visitImportDirective(node);
+  }
+
+  Object visitLabeledStatement(LabeledStatement node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      find8(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitLabeledStatement(node);
+  }
+
+  Object visitLibraryDirective(LibraryDirective node) {
+    node.element = _enclosingUnit.library;
+    return super.visitLibraryDirective(node);
+  }
+
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      sc.Token property = node.propertyKeyword;
+      SimpleIdentifier methodName = node.name;
+      String nameOfMethod = methodName.name;
+      if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
+        nameOfMethod = "unary-";
+      }
+      if (property == null) {
+        _enclosingExecutable = find9(_enclosingClass.methods, nameOfMethod, methodName.offset);
+        methodName.staticElement = _enclosingExecutable;
+      } else {
+        PropertyAccessorElement accessor = find8(_enclosingClass.accessors, methodName);
+        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
+          accessor = accessor.variable.setter;
+          methodName.staticElement = accessor;
+        }
+        _enclosingExecutable = accessor;
+      }
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  Object visitPartDirective(PartDirective node) {
+    String uri = getStringValue(node.uri);
+    if (uri != null) {
+      Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
+      node.element = find(_enclosingUnit.library.parts, partSource);
+    }
+    return super.visitPartDirective(node);
+  }
+
+  Object visitPartOfDirective(PartOfDirective node) {
+    node.element = _enclosingUnit.library;
+    return super.visitPartOfDirective(node);
+  }
+
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitSimpleFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+    }
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  Object visitSwitchCase(SwitchCase node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      find8(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitSwitchCase(node);
+  }
+
+  Object visitSwitchDefault(SwitchDefault node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      find8(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitSwitchDefault(node);
+  }
+
+  Object visitTypeParameter(TypeParameter node) {
+    SimpleIdentifier parameterName = node.name;
+    if (_enclosingClass != null) {
+      find8(_enclosingClass.typeParameters, parameterName);
+    } else if (_enclosingAlias != null) {
+      find8(_enclosingAlias.typeParameters, parameterName);
+    }
+    return super.visitTypeParameter(node);
+  }
+
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    VariableElement element = null;
+    SimpleIdentifier variableName = node.name;
+    if (_enclosingExecutable != null) {
+      element = find8(_enclosingExecutable.localVariables, variableName);
+    }
+    if (element == null && _enclosingClass != null) {
+      element = find8(_enclosingClass.fields, variableName);
+    }
+    if (element == null && _enclosingUnit != null) {
+      element = find8(_enclosingUnit.topLevelVariables, variableName);
+    }
+    Expression initializer = node.initializer;
+    if (initializer != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        return super.visitVariableDeclaration(node);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+    }
+    return super.visitVariableDeclaration(node);
+  }
+
+  /**
+   * Return the element for the part with the given source, or `null` if there is no element
+   * for the given source.
+   *
+   * @param parts the elements for the parts
+   * @param partSource the source for the part whose element is to be returned
+   * @return the element for the part with the given source
+   */
+  CompilationUnitElement find(List<CompilationUnitElement> parts, Source partSource) {
+    for (CompilationUnitElement part in parts) {
+      if (part.source == partSource) {
+        return part;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration at the
+   * given offset. This method should only be used when there is no name
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param offset the offset of the name of the element to be returned
+   * @return the element at the given offset
+   */
+  Element find7(List<Element> elements, int offset) => find9(elements, "", offset);
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param identifier the name node in the declaration of the element to be returned
+   * @return the element created for the declaration with the given name
+   */
+  Element find8(List<Element> elements, SimpleIdentifier identifier) {
+    Element element = find9(elements, identifier.name, identifier.offset);
+    identifier.staticElement = element;
+    return element;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name at the given offset.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param name the name of the element to be returned
+   * @param offset the offset of the name of the element to be returned
+   * @return the element with the given name and offset
+   */
+  Element find9(List<Element> elements, String name, int offset) {
+    for (Element element in elements) {
+      if (element.displayName == name && element.nameOffset == offset) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the export element from the given array whose library has the given source, or
+   * `null` if there is no such export.
+   *
+   * @param exports the export elements being searched
+   * @param source the source of the library associated with the export element to being searched
+   *          for
+   * @return the export element whose library has the given source
+   */
+  ExportElement find10(List<ExportElement> exports, Source source) {
+    for (ExportElement export in exports) {
+      if (export.exportedLibrary.source == source) {
+        return export;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the import element from the given array whose library has the given source and that has
+   * the given prefix, or `null` if there is no such import.
+   *
+   * @param imports the import elements being searched
+   * @param source the source of the library associated with the import element to being searched
+   *          for
+   * @param prefix the prefix with which the library was imported
+   * @return the import element whose library has the given source and prefix
+   */
+  ImportElement find11(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
+    for (ImportElement element in imports) {
+      if (element.importedLibrary.source == source) {
+        PrefixElement prefixElement = element.prefix;
+        if (prefix == null) {
+          if (prefixElement == null) {
+            return element;
+          }
+        } else {
+          if (prefixElement != null && prefix.name == prefixElement.displayName) {
+            return element;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Search the most closely enclosing list of parameters for a parameter with the given name.
+   *
+   * @param node the node defining the parameter with the given name
+   * @param parameterName the name of the parameter being searched for
+   * @return the element representing the parameter with that name
+   */
+  ParameterElement getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
+    List<ParameterElement> parameters = null;
+    if (_enclosingParameter != null) {
+      parameters = _enclosingParameter.parameters;
+    }
+    if (parameters == null && _enclosingExecutable != null) {
+      parameters = _enclosingExecutable.parameters;
+    }
+    if (parameters == null && _enclosingAlias != null) {
+      parameters = _enclosingAlias.parameters;
+    }
+    ParameterElement element = parameters == null ? null : find8(parameters, parameterName);
     if (element == null) {
       PrintStringWriter writer = new PrintStringWriter();
       writer.println("Invalid state found in the Analysis Engine:");
@@ -2826,6 +3670,7 @@
     return literal.stringValue;
   }
 }
+
 /**
  * Instances of the class `ElementResolver` are used by instances of [ResolverVisitor]
  * to resolve references within the AST structure to the elements being referenced. The requirements
@@ -2881,6 +3726,23 @@
  * @coverage dart.engine.resolver
  */
 class ElementResolver extends SimpleASTVisitor<Object> {
+  /**
+   * Checks if the given expression is the reference to the type, if it is then the
+   * [ClassElement] is returned, otherwise `null` is returned.
+   *
+   * @param expr the expression to evaluate
+   * @return the [ClassElement] if the given expression is the reference to the type, and
+   *         `null` otherwise
+   */
+  static ClassElementImpl getTypeReference(Expression expr) {
+    if (expr is Identifier) {
+      Identifier identifier = expr as Identifier;
+      if (identifier.staticElement is ClassElementImpl) {
+        return identifier.staticElement as ClassElementImpl;
+      }
+    }
+    return null;
+  }
 
   /**
    * @return `true` if the given identifier is the return type of a constructor declaration.
@@ -3002,6 +3864,7 @@
     _subtypeManager = new SubtypeManager();
     _promoteManager = resolver.promoteManager;
   }
+
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
@@ -3033,6 +3896,7 @@
     }
     return null;
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     sc.Token operator = node.operator;
     if (operator.isUserDefinableOperator) {
@@ -3062,22 +3926,26 @@
     }
     return null;
   }
+
   Object visitBreakStatement(BreakStatement node) {
     SimpleIdentifier labelNode = node.label;
     LabelElementImpl labelElement = lookupLabel(node, labelNode);
     if (labelElement != null && labelElement.isOnSwitchMember) {
-      _resolver.reportError5(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
+      _resolver.reportError6(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
     }
     return null;
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitCommentReference(CommentReference node) {
     Identifier identifier = node.identifier;
     if (identifier is SimpleIdentifier) {
@@ -3096,7 +3964,7 @@
         simpleIdentifier.staticElement = element;
         if (node.newKeyword != null) {
           if (element is ClassElement) {
-            ConstructorElement constructor = ((element as ClassElement)).unnamedConstructor;
+            ConstructorElement constructor = (element as ClassElement).unnamedConstructor;
             if (constructor == null) {
             } else {
               simpleIdentifier.staticElement = constructor;
@@ -3126,11 +3994,11 @@
         name.staticElement = element;
         if (node.newKeyword == null) {
           if (element is ClassElement) {
-            Element memberElement = lookupGetterOrMethod(((element as ClassElement)).type, name.name);
+            Element memberElement = lookupGetterOrMethod((element as ClassElement).type, name.name);
             if (memberElement == null) {
-              memberElement = ((element as ClassElement)).getNamedConstructor(name.name);
+              memberElement = (element as ClassElement).getNamedConstructor(name.name);
               if (memberElement == null) {
-                memberElement = lookUpSetter(prefix, ((element as ClassElement)).type, name.name);
+                memberElement = lookUpSetter(prefix, (element as ClassElement).type, name.name);
               }
             }
             if (memberElement == null) {
@@ -3141,7 +4009,7 @@
           }
         } else {
           if (element is ClassElement) {
-            ConstructorElement constructor = ((element as ClassElement)).getNamedConstructor(name.name);
+            ConstructorElement constructor = (element as ClassElement).getNamedConstructor(name.name);
             if (constructor == null) {
             } else {
               name.staticElement = constructor;
@@ -3153,6 +4021,7 @@
     }
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ConstructorElement element = node.element;
@@ -3165,7 +4034,7 @@
       }
       for (ConstructorInitializer initializer in node.initializers) {
         if (initializer is RedirectingConstructorInvocation) {
-          ConstructorElement redirectedElement = ((initializer as RedirectingConstructorInvocation)).staticElement;
+          ConstructorElement redirectedElement = (initializer as RedirectingConstructorInvocation).staticElement;
           constructorElement.redirectedConstructor = redirectedElement;
         }
       }
@@ -3173,18 +4042,20 @@
     }
     return null;
   }
+
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     SimpleIdentifier fieldName = node.fieldName;
     ClassElement enclosingClass = _resolver.enclosingClass;
-    FieldElement fieldElement = ((enclosingClass as ClassElementImpl)).getField(fieldName.name);
+    FieldElement fieldElement = (enclosingClass as ClassElementImpl).getField(fieldName.name);
     fieldName.staticElement = fieldElement;
     if (fieldElement == null || fieldElement.isSynthetic) {
-      _resolver.reportError5(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+      _resolver.reportError6(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
     } else if (fieldElement.isStatic) {
-      _resolver.reportError5(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
+      _resolver.reportError6(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
     }
     return null;
   }
+
   Object visitConstructorName(ConstructorName node) {
     Type2 type = node.type.type;
     if (type != null && type.isDynamic) {
@@ -3192,7 +4063,7 @@
     } else if (type is! InterfaceType) {
       ASTNode parent = node.parent;
       if (parent is InstanceCreationExpression) {
-        if (((parent as InstanceCreationExpression)).isConst) {
+        if ((parent as InstanceCreationExpression).isConst) {
         } else {
         }
       } else {
@@ -3211,33 +4082,37 @@
     node.staticElement = constructor;
     return null;
   }
+
   Object visitContinueStatement(ContinueStatement node) {
     SimpleIdentifier labelNode = node.label;
     LabelElementImpl labelElement = lookupLabel(node, labelNode);
     if (labelElement != null && labelElement.isOnSwitchStatement) {
-      _resolver.reportError5(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
+      _resolver.reportError6(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
     }
     return null;
   }
+
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitExportDirective(ExportDirective node) {
     Element element = node.element;
     if (element is ExportElement) {
-      resolveCombinators(((element as ExportElement)).exportedLibrary, node.combinators);
+      resolveCombinators((element as ExportElement).exportedLibrary, node.combinators);
       setMetadata(element, node);
     }
     return null;
   }
+
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     String fieldName = node.identifier.name;
     ClassElement classElement = _resolver.enclosingClass;
     if (classElement != null) {
-      FieldElement fieldElement = ((classElement as ClassElementImpl)).getField(fieldName);
+      FieldElement fieldElement = (classElement as ClassElementImpl).getField(fieldName);
       if (fieldElement == null) {
-        _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+        _resolver.reportError6(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
       } else {
         ParameterElement parameterElement = node.element;
         if (parameterElement is FieldFormalParameterElementImpl) {
@@ -3249,27 +4124,29 @@
             fieldFormal.type = fieldType;
           }
           if (fieldElement.isSynthetic) {
-            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+            _resolver.reportError6(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
           } else if (fieldElement.isStatic) {
-            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
+            _resolver.reportError6(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
           } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-            _resolver.reportError5(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
+            _resolver.reportError6(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
           }
         } else {
           if (fieldElement.isSynthetic) {
-            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+            _resolver.reportError6(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
           } else if (fieldElement.isStatic) {
-            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
+            _resolver.reportError6(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
           }
         }
       }
     }
     return super.visitFieldFormalParameter(node);
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     Expression expression = node.function;
     if (expression is FunctionExpression) {
@@ -3283,10 +4160,12 @@
     }
     return null;
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitImportDirective(ImportDirective node) {
     SimpleIdentifier prefixNode = node.prefix;
     if (prefixNode != null) {
@@ -3308,6 +4187,7 @@
     }
     return null;
   }
+
   Object visitIndexExpression(IndexExpression node) {
     Expression target = node.realTarget;
     Type2 staticType = getStaticType(target);
@@ -3342,6 +4222,7 @@
     }
     return null;
   }
+
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorElement invokedConstructor = node.constructorName.staticElement;
     node.staticElement = invokedConstructor;
@@ -3352,14 +4233,17 @@
     }
     return null;
   }
+
   Object visitLibraryDirective(LibraryDirective node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier methodName = node.methodName;
     Expression target = node.realTarget;
@@ -3373,8 +4257,13 @@
       propagatedElement = null;
     } else {
       Type2 staticType = getStaticType(target);
-      staticElement = resolveInvokedElement(target, staticType, methodName);
-      propagatedElement = resolveInvokedElement(target, getPropagatedType(target), methodName);
+      ClassElementImpl typeReference = getTypeReference(target);
+      if (typeReference != null) {
+        staticElement = propagatedElement = resolveElement(typeReference, methodName.name);
+      } else {
+        staticElement = resolveInvokedElement(target, staticType, methodName);
+        propagatedElement = resolveInvokedElement(target, getPropagatedType(target), methodName);
+      }
     }
     staticElement = convertSetterToGetter(staticElement);
     propagatedElement = convertSetterToGetter(propagatedElement);
@@ -3425,9 +4314,9 @@
       return null;
     }
     if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
-      _resolver.reportError5(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
+      _resolver.reportError6(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
     } else if (identical(errorCode, CompileTimeErrorCode.UNDEFINED_FUNCTION)) {
-      _resolver.reportError5(CompileTimeErrorCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
+      _resolver.reportError6(CompileTimeErrorCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
     } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
       String targetTypeName;
       if (target == null) {
@@ -3455,18 +4344,21 @@
     } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
       Type2 targetType = getStaticType(target);
       String targetTypeName = targetType == null ? null : targetType.name;
-      _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
+      _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
     }
     return null;
   }
+
   Object visitPartDirective(PartDirective node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitPartOfDirective(PartOfDirective node) {
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
     String methodName = getPostfixOperator(node);
@@ -3491,6 +4383,7 @@
     }
     return null;
   }
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     SimpleIdentifier identifier = node.identifier;
@@ -3502,18 +4395,18 @@
       }
       if (element == null) {
         if (identifier.inSetterContext()) {
-          _resolver.reportError5(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, prefixElement.name]);
+          _resolver.reportError6(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, prefixElement.name]);
         } else if (node.parent is Annotation) {
           Annotation annotation = node.parent as Annotation;
-          _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+          _resolver.reportError6(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
           return null;
         } else {
-          _resolver.reportError5(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
+          _resolver.reportError6(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
         }
         return null;
       }
       if (element is PropertyAccessorElement && identifier.inSetterContext()) {
-        PropertyInducingElement variable = ((element as PropertyAccessorElement)).variable;
+        PropertyInducingElement variable = (element as PropertyAccessorElement).variable;
         if (variable != null) {
           PropertyAccessorElement setter = variable.setter;
           if (setter != null) {
@@ -3524,18 +4417,19 @@
       identifier.staticElement = element;
       if (node.parent is Annotation) {
         Annotation annotation = node.parent as Annotation;
-        resolveAnnotationElement(annotation, element, null);
+        resolveAnnotationElement(annotation);
         return null;
       }
       return null;
     }
     if (node.parent is Annotation) {
       Annotation annotation = node.parent as Annotation;
-      resolveAnnotationElement(annotation, prefixElement, identifier);
+      resolveAnnotationElement(annotation);
     }
     resolvePropertyAccess(prefix, identifier);
     return null;
   }
+
   Object visitPrefixExpression(PrefixExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
@@ -3564,6 +4458,7 @@
     }
     return null;
   }
+
   Object visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
     if (target is SuperExpression && !isSuperInValidContext(target as SuperExpression)) {
@@ -3573,6 +4468,7 @@
     resolvePropertyAccess(target, propertyName);
     return null;
   }
+
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (enclosingClass == null) {
@@ -3599,6 +4495,7 @@
     }
     return null;
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.staticElement != null) {
       return null;
@@ -3611,16 +4508,16 @@
     Element element = resolveSimpleIdentifier(node);
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (isFactoryConstructorReturnType(node) && element != enclosingClass) {
-      _resolver.reportError5(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
+      _resolver.reportError6(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
     } else if (isConstructorReturnType(node) && element != enclosingClass) {
-      _resolver.reportError5(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+      _resolver.reportError6(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
       element = null;
     } else if (element == null || (element is PrefixElement && !isValidAsPrefix(node))) {
       if (isConstructorReturnType(node)) {
-        _resolver.reportError5(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+        _resolver.reportError6(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
       } else if (node.parent is Annotation) {
         Annotation annotation = node.parent as Annotation;
-        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+        _resolver.reportError6(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
       } else {
         _resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
       }
@@ -3633,10 +4530,11 @@
     }
     if (node.parent is Annotation) {
       Annotation annotation = node.parent as Annotation;
-      resolveAnnotationElement(annotation, element, null);
+      resolveAnnotationElement(annotation);
     }
     return null;
   }
+
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (enclosingClass == null) {
@@ -3651,14 +4549,14 @@
     ConstructorElement element = superType.lookUpConstructor(superName, _definingLibrary);
     if (element == null) {
       if (name != null) {
-        _resolver.reportError5(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [superType.displayName, name]);
+        _resolver.reportError6(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [superType.displayName, name]);
       } else {
-        _resolver.reportError5(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node, [superType.displayName]);
+        _resolver.reportError6(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node, [superType.displayName]);
       }
       return null;
     } else {
       if (element.isFactory) {
-        _resolver.reportError5(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
+        _resolver.reportError6(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
       }
     }
     if (name != null) {
@@ -3672,12 +4570,14 @@
     }
     return null;
   }
+
   Object visitSuperExpression(SuperExpression node) {
     if (!isSuperInValidContext(node)) {
-      _resolver.reportError5(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
+      _resolver.reportError6(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
     }
     return super.visitSuperExpression(node);
   }
+
   Object visitTypeParameter(TypeParameter node) {
     TypeName bound = node.bound;
     if (bound != null) {
@@ -3689,6 +4589,7 @@
     setMetadata(node.element, node);
     return null;
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     setMetadata(node.element, node);
     return null;
@@ -3724,7 +4625,7 @@
       element = null;
     }
     if (element is PropertyAccessorElement) {
-      FunctionType getterType = ((element as PropertyAccessorElement)).type;
+      FunctionType getterType = (element as PropertyAccessorElement).type;
       if (getterType != null) {
         Type2 returnType = getterType.returnType;
         if (!isExecutableType(returnType)) {
@@ -3737,7 +4638,7 @@
       return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
     } else {
       if (element is PropertyInducingElement) {
-        PropertyAccessorElement getter = ((element as PropertyInducingElement)).getter;
+        PropertyAccessorElement getter = (element as PropertyInducingElement).getter;
         FunctionType getterType = getter.type;
         if (getterType != null) {
           Type2 returnType = getterType.returnType;
@@ -3746,7 +4647,7 @@
           }
         }
       } else if (element is VariableElement) {
-        Type2 variableType = ((element as VariableElement)).type;
+        Type2 variableType = (element as VariableElement).type;
         if (!isExecutableType(variableType)) {
           return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
         }
@@ -3827,16 +4728,16 @@
    */
   List<ParameterElement> computeCorrespondingParameters(ArgumentList argumentList, Element element) {
     if (element is PropertyAccessorElement) {
-      FunctionType getterType = ((element as PropertyAccessorElement)).type;
+      FunctionType getterType = (element as PropertyAccessorElement).type;
       if (getterType != null) {
         Type2 getterReturnType = getterType.returnType;
         if (getterReturnType is InterfaceType) {
-          MethodElement callMethod = ((getterReturnType as InterfaceType)).lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+          MethodElement callMethod = (getterReturnType as InterfaceType).lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
           if (callMethod != null) {
             return resolveArgumentsToParameters(false, argumentList, callMethod);
           }
         } else if (getterReturnType is FunctionType) {
-          Element functionElement = ((getterReturnType as FunctionType)).element;
+          Element functionElement = (getterReturnType as FunctionType).element;
           if (functionElement is ExecutableElement) {
             return resolveArgumentsToParameters(false, argumentList, functionElement as ExecutableElement);
           }
@@ -3852,7 +4753,7 @@
         List<ParameterElement> parameters = functionType.parameters;
         return resolveArgumentsToParameters2(false, argumentList, parameters);
       } else if (type is InterfaceType) {
-        MethodElement callMethod = ((type as InterfaceType)).lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
+        MethodElement callMethod = (type as InterfaceType).lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
         if (callMethod != null) {
           List<ParameterElement> parameters = callMethod.parameters;
           return resolveArgumentsToParameters2(false, argumentList, parameters);
@@ -3871,7 +4772,7 @@
    */
   Element convertSetterToGetter(Element element) {
     if (element is PropertyAccessorElement) {
-      return ((element as PropertyAccessorElement)).variable.getter;
+      return (element as PropertyAccessorElement).variable.getter;
     }
     return element;
   }
@@ -3973,7 +4874,7 @@
     if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction || type.isObject) {
       return true;
     } else if (type is InterfaceType) {
-      ClassElement classElement = ((type as InterfaceType)).element;
+      ClassElement classElement = (type as InterfaceType).element;
       MethodElement methodElement = classElement.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
       return methodElement != null;
     }
@@ -3986,7 +4887,7 @@
   bool get isInConstConstructor {
     ExecutableElement function = _resolver.enclosingFunction;
     if (function is ConstructorElement) {
-      return ((function as ConstructorElement)).isConst;
+      return (function as ConstructorElement).isConst;
     }
     return false;
   }
@@ -3999,9 +4900,9 @@
    */
   bool isStatic(Element element) {
     if (element is ExecutableElement) {
-      return ((element as ExecutableElement)).isStatic;
+      return (element as ExecutableElement).isStatic;
     } else if (element is PropertyInducingElement) {
-      return ((element as PropertyInducingElement)).isStatic;
+      return (element as PropertyInducingElement).isStatic;
     }
     return false;
   }
@@ -4019,11 +4920,11 @@
   bool isValidAsPrefix(SimpleIdentifier node) {
     ASTNode parent = node.parent;
     if (parent is ImportDirective) {
-      return identical(((parent as ImportDirective)).prefix, node);
+      return identical((parent as ImportDirective).prefix, node);
     } else if (parent is PrefixedIdentifier) {
       return true;
     } else if (parent is MethodInvocation) {
-      return identical(((parent as MethodInvocation)).target, node);
+      return identical((parent as MethodInvocation).target, node);
     }
     return false;
   }
@@ -4191,11 +5092,11 @@
       }
     } else {
       if (labelScope == null) {
-        _resolver.reportError5(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+        _resolver.reportError6(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
       } else {
         labelElement = labelScope.lookup(labelNode) as LabelElementImpl;
         if (labelElement == null) {
-          _resolver.reportError5(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+          _resolver.reportError6(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
         } else {
           labelNode.staticElement = labelElement;
         }
@@ -4204,7 +5105,7 @@
     if (labelElement != null) {
       ExecutableElement labelContainer = labelElement.getAncestor(ExecutableElement);
       if (labelContainer != _resolver.enclosingFunction) {
-        _resolver.reportError5(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNode, [labelNode.name]);
+        _resolver.reportError6(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNode, [labelNode.name]);
         labelElement = null;
       }
     }
@@ -4415,6 +5316,7 @@
     AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to it's corresponding operator");
     return operator;
   }
+
   void resolveAnnotationConstructorInvocationArguments(Annotation annotation, ConstructorElement constructor) {
     ArgumentList argumentList = annotation.arguments;
     if (argumentList == null) {
@@ -4427,51 +5329,94 @@
   }
 
   /**
-   * Validates that the given [Element] is the constant variable; or resolves it as a
-   * constructor invocation.
+   * Continues resolution of the given [Annotation].
    *
    * @param annotation the [Annotation] to resolve
-   * @param element the current known [Element] of the annotation, or [ClassElement]
-   * @param nameNode the name of the invoked constructor, may be `null` if unnamed constructor
-   *          or not a constructor invocation
    */
-  void resolveAnnotationElement(Annotation annotation, Element element, SimpleIdentifier nameNode) {
-    if (element is PropertyAccessorElement) {
-      PropertyAccessorElement accessorElement = element as PropertyAccessorElement;
-      if (!accessorElement.isSynthetic) {
-        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+  void resolveAnnotationElement(Annotation annotation) {
+    SimpleIdentifier nameNode1;
+    SimpleIdentifier nameNode2;
+    {
+      Identifier annName = annotation.name;
+      if (annName is PrefixedIdentifier) {
+        PrefixedIdentifier prefixed = annName as PrefixedIdentifier;
+        nameNode1 = prefixed.prefix;
+        nameNode2 = prefixed.identifier;
+      } else {
+        nameNode1 = annName as SimpleIdentifier;
+        nameNode2 = null;
+      }
+    }
+    SimpleIdentifier nameNode3 = annotation.constructorName;
+    ConstructorElement constructor = null;
+    if (nameNode1 != null && nameNode2 == null && nameNode3 == null) {
+      Element element1 = nameNode1.staticElement;
+      if (element1 is PropertyAccessorElement) {
+        resolveAnnotationElementGetter(annotation, element1 as PropertyAccessorElement);
         return;
       }
-      VariableElement variableElement = accessorElement.variable;
-      if (!variableElement.isConst) {
-        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1 as ClassElement;
+        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(null, _definingLibrary);
       }
-      return;
     }
-    if (element is ClassElement) {
-      if (nameNode == null) {
-        nameNode = annotation.constructorName;
+    if (nameNode1 != null && nameNode2 != null && nameNode3 == null) {
+      Element element1 = nameNode1.staticElement;
+      Element element2 = nameNode2.staticElement;
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1 as ClassElement;
+        element2 = classElement.lookUpGetter(nameNode2.name, _definingLibrary);
       }
-      String name = nameNode != null ? nameNode.name : null;
-      ConstructorElement constructor;
-      {
-        InterfaceType interfaceType = new InterfaceTypeImpl.con1(element as ClassElement);
-        constructor = interfaceType.lookUpConstructor(name, _definingLibrary);
-      }
-      if (constructor == null) {
-        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+      if (element2 is PropertyAccessorElement) {
+        nameNode2.staticElement = element2;
+        annotation.element = element2;
+        resolveAnnotationElementGetter(annotation, element2 as PropertyAccessorElement);
         return;
       }
-      annotation.element = constructor;
-      if (nameNode != null) {
-        nameNode.staticElement = constructor;
+      if (element2 is ClassElement) {
+        ClassElement classElement = element2 as ClassElement;
+        constructor = classElement.unnamedConstructor;
       }
-      resolveAnnotationConstructorInvocationArguments(annotation, constructor);
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1 as ClassElement;
+        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(nameNode2.name, _definingLibrary);
+        nameNode2.staticElement = constructor;
+      }
+    }
+    if (nameNode1 != null && nameNode2 != null && nameNode3 != null) {
+      Element element2 = nameNode2.staticElement;
+      if (element2 is ClassElement) {
+        ClassElement classElement = element2 as ClassElement;
+        String name3 = nameNode3.name;
+        PropertyAccessorElement getter = classElement.lookUpGetter(name3, _definingLibrary);
+        if (getter != null) {
+          nameNode3.staticElement = getter;
+          annotation.element = element2;
+          resolveAnnotationElementGetter(annotation, getter);
+          return;
+        }
+        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(name3, _definingLibrary);
+        nameNode3.staticElement = constructor;
+      }
+    }
+    if (constructor == null) {
+      _resolver.reportError6(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
       return;
     }
-    if (element != null) {
-      _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+    annotation.element = constructor;
+    resolveAnnotationConstructorInvocationArguments(annotation, constructor);
+  }
+
+  void resolveAnnotationElementGetter(Annotation annotation, PropertyAccessorElement accessorElement) {
+    if (!accessorElement.isSynthetic) {
+      _resolver.reportError6(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+      return;
     }
+    VariableElement variableElement = accessorElement.variable;
+    if (!variableElement.isConst) {
+      _resolver.reportError6(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+    }
+    return;
   }
 
   /**
@@ -4530,18 +5475,18 @@
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
-        SimpleIdentifier nameNode = ((argument as NamedExpression)).name.label;
+        SimpleIdentifier nameNode = (argument as NamedExpression).name.label;
         String name = nameNode.name;
         ParameterElement element = namedParameters[name];
         if (element == null) {
           ErrorCode errorCode = (reportError ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER) as ErrorCode;
-          _resolver.reportError5(errorCode, nameNode, [name]);
+          _resolver.reportError6(errorCode, nameNode, [name]);
         } else {
           resolvedParameters[i] = element;
           nameNode.staticElement = element;
         }
         if (!javaSetAdd(usedNames, name)) {
-          _resolver.reportError5(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
+          _resolver.reportError6(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
         }
       } else {
         positionalArgumentCount++;
@@ -4552,10 +5497,10 @@
     }
     if (positionalArgumentCount < requiredParameters.length) {
       ErrorCode errorCode = (reportError ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS) as ErrorCode;
-      _resolver.reportError5(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
+      _resolver.reportError6(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
     } else if (positionalArgumentCount > unnamedParameterCount) {
       ErrorCode errorCode = (reportError ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS) as ErrorCode;
-      _resolver.reportError5(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
+      _resolver.reportError6(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
     }
     return resolvedParameters;
   }
@@ -4574,9 +5519,9 @@
     for (Combinator combinator in combinators) {
       NodeList<SimpleIdentifier> names;
       if (combinator is HideCombinator) {
-        names = ((combinator as HideCombinator)).hiddenNames;
+        names = (combinator as HideCombinator).hiddenNames;
       } else {
-        names = ((combinator as ShowCombinator)).shownNames;
+        names = (combinator as ShowCombinator).shownNames;
       }
       for (SimpleIdentifier name in names) {
         Element element = namespace.get(name.name);
@@ -4588,6 +5533,29 @@
   }
 
   /**
+   * Given an invocation of the form 'C.x()' where 'C' is a class, find and return the element 'x'
+   * in 'C'.
+   *
+   * @param classElement the class element
+   * @param memberName the member name
+   */
+  Element resolveElement(ClassElementImpl classElement, String memberName) {
+    Element element = null;
+    String methodNameStr = memberName;
+    element = classElement.getMethod(methodNameStr);
+    if (element == null) {
+      element = classElement.getSetter(memberName);
+      if (element == null) {
+        element = classElement.getGetter(memberName);
+      }
+    }
+    if (element != null && element.isAccessibleIn(_definingLibrary)) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
    * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the element being invoked.
    * If the returned element is a method, then the method will be invoked. If the returned element
    * is a getter, the getter will be invoked without arguments and the result of that invocation
@@ -4607,9 +5575,9 @@
       }
       return element;
     } else if (target is SimpleIdentifier) {
-      Element targetElement = ((target as SimpleIdentifier)).staticElement;
+      Element targetElement = (target as SimpleIdentifier).staticElement;
       if (targetElement is PrefixElement) {
-        String name = "${((target as SimpleIdentifier)).name}.${methodName}";
+        String name = "${(target as SimpleIdentifier).name}.${methodName}";
         Identifier functionName = new ElementResolver_SyntheticIdentifier(name);
         Element element = _resolver.nameScope.lookup(functionName, _definingLibrary);
         if (element != null) {
@@ -4666,9 +5634,19 @@
     }
     return memberElement;
   }
+
   void resolvePropertyAccess(Expression target, SimpleIdentifier propertyName) {
     Type2 staticType = getStaticType(target);
-    ExecutableElement staticElement = resolveProperty(target, staticType, propertyName);
+    Type2 propagatedType = getPropagatedType(target);
+    Element staticElement = null;
+    Element propagatedElement = null;
+    ClassElementImpl typeReference = getTypeReference(target);
+    if (typeReference != null) {
+      staticElement = propagatedElement = resolveElement(typeReference, propertyName.name);
+    } else {
+      staticElement = resolveProperty(target, staticType, propertyName);
+      propagatedElement = resolveProperty(target, propagatedType, propertyName);
+    }
     if (target.parent.parent is Annotation) {
       if (staticElement != null) {
         propertyName.staticElement = staticElement;
@@ -4676,8 +5654,6 @@
       return;
     }
     propertyName.staticElement = staticElement;
-    Type2 propagatedType = getPropagatedType(target);
-    ExecutableElement propagatedElement = resolveProperty(target, propagatedType, propertyName);
     propertyName.propagatedElement = propagatedElement;
     bool shouldReportMissingMember_static = shouldReportMissingMember(staticType, staticElement) && (_strictMode || shouldReportMissingMember(propagatedType, propagatedElement));
     bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints ? shouldReportMissingMember(propagatedType, propagatedElement) : false;
@@ -4730,7 +5706,7 @@
   Element resolveSimpleIdentifier(SimpleIdentifier node) {
     Element element = _resolver.nameScope.lookup(node, _definingLibrary);
     if (element is PropertyAccessorElement && node.inSetterContext()) {
-      PropertyInducingElement variable = ((element as PropertyAccessorElement)).variable;
+      PropertyInducingElement variable = (element as PropertyAccessorElement).variable;
       if (variable != null) {
         PropertyAccessorElement setter = variable.setter;
         if (setter == null) {
@@ -4772,7 +5748,7 @@
    */
   Type2 resolveTypeParameter(Type2 type) {
     if (type is TypeParameterType) {
-      Type2 bound = ((type as TypeParameterType)).element.bound;
+      Type2 bound = (type as TypeParameterType).element.bound;
       if (bound == null) {
         return _resolver.typeProvider.objectType;
       }
@@ -4816,7 +5792,7 @@
       }
     }
     if (!annotationList.isEmpty) {
-      ((element as ElementImpl)).metadata = new List.from(annotationList);
+      (element as ElementImpl).metadata = new List.from(annotationList);
     }
   }
 
@@ -4828,13 +5804,14 @@
    * @param member the result of the look-up
    * @return `true` if we should report an error
    */
-  bool shouldReportMissingMember(Type2 type, ExecutableElement member) {
+  bool shouldReportMissingMember(Type2 type, Element member) {
     if (member != null || type == null || type.isDynamic || type.isBottom) {
       return false;
     }
     return true;
   }
 }
+
 /**
  * Instances of the class `SyntheticIdentifier` implement an identifier that can be used to
  * look up names in the lexical scope when there is no identifier in the AST structure. There is
@@ -4842,7 +5819,6 @@
  * an invocation of a top-level function imported with a prefix.
  */
 class ElementResolver_SyntheticIdentifier extends Identifier {
-
   /**
    * The name of the synthetic identifier.
    */
@@ -4856,16 +5832,169 @@
   ElementResolver_SyntheticIdentifier(String name) {
     this._name = name;
   }
+
   accept(ASTVisitor visitor) => null;
+
   sc.Token get beginToken => null;
+
   Element get bestElement => null;
+
   sc.Token get endToken => null;
+
   String get name => _name;
+
   Element get propagatedElement => null;
+
   Element get staticElement => null;
+
   void visitChildren(ASTVisitor visitor) {
   }
 }
+
+/**
+ * Instances of the class `IncrementalResolver` resolve the smallest portion of an AST
+ * structure that we currently know how to resolve.
+ */
+class IncrementalResolver {
+  /**
+   * The element for the library containing the compilation unit being visited.
+   */
+  LibraryElement _definingLibrary;
+
+  /**
+   * The source representing the compilation unit being visited.
+   */
+  Source _source;
+
+  /**
+   * The object used to access the types from the core library.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * The error listener that will be informed of any errors that are found during resolution.
+   */
+  AnalysisErrorListener _errorListener;
+
+  /**
+   * Initialize a newly created incremental resolver to resolve a node in the given source in the
+   * given library, reporting errors to the given error listener.
+   *
+   * @param definingLibrary the element for the library containing the compilation unit being
+   *          visited
+   * @param source the source representing the compilation unit being visited
+   * @param typeProvider the object used to access the types from the core library
+   * @param errorListener the error listener that will be informed of any errors that are found
+   *          during resolution
+   */
+  IncrementalResolver(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+    this._definingLibrary = definingLibrary;
+    this._source = source;
+    this._typeProvider = typeProvider;
+    this._errorListener = errorListener;
+  }
+
+  /**
+   * Resolve the given node, reporting any errors or warnings to the given listener.
+   *
+   * @param node the root of the AST structure to be resolved
+   * @throws AnalysisException if the node could not be resolved
+   */
+  void resolve(ASTNode node) {
+    ASTNode rootNode = findResolutionRoot(node);
+    Scope scope = ScopeBuilder.scopeFor(rootNode, _errorListener);
+    if (elementModelChanged(rootNode.parent)) {
+      throw new AnalysisException.con1("Cannot resolve node: element model changed");
+    }
+    resolveTypes(node, scope);
+    resolveVariables(node, scope);
+    resolveReferences(node, scope);
+  }
+
+  /**
+   * Return `true` if the given node can be resolved independently of any other nodes.
+   *
+   * <b>Note:</b> This method needs to be kept in sync with [ScopeBuilder#scopeForAstNode].
+   *
+   * @param node the node being tested
+   * @return `true` if the given node can be resolved independently of any other nodes
+   */
+  bool canBeResolved(ASTNode node) => node is ClassDeclaration || node is ClassTypeAlias || node is CompilationUnit || node is ConstructorDeclaration || node is FunctionDeclaration || node is FunctionTypeAlias || node is MethodDeclaration;
+
+  /**
+   * Return `true` if the portion of the element model defined by the given node has changed.
+   *
+   * @param node the node defining the portion of the element model being tested
+   * @return `true` if the element model defined by the given node has changed
+   * @throws AnalysisException if the correctness of the element model cannot be determined
+   */
+  bool elementModelChanged(ASTNode node) {
+    Element element = getElement(node);
+    if (element == null) {
+      throw new AnalysisException.con1("Cannot resolve node: a ${node.runtimeType.toString()} does not define an element");
+    }
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    return !matcher.matches(node, element);
+  }
+
+  /**
+   * Starting at the given node, find the smallest AST node that can be resolved independently of
+   * any other nodes. Return the node that was found.
+   *
+   * @param node the node at which the search is to begin
+   * @return the smallest AST node that can be resolved independently of any other nodes
+   * @throws AnalysisException if there is no such node
+   */
+  ASTNode findResolutionRoot(ASTNode node) {
+    ASTNode result = node;
+    ASTNode parent = result.parent;
+    while (parent != null && !canBeResolved(parent)) {
+      result = parent;
+      parent = result.parent;
+    }
+    if (parent == null) {
+      throw new AnalysisException.con1("Cannot resolve node: no resolvable node");
+    }
+    return result;
+  }
+
+  /**
+   * Return the element defined by the given node, or `null` if the node does not define an
+   * element.
+   *
+   * @param node the node defining the element to be returned
+   * @return the element defined by the given node
+   */
+  Element getElement(ASTNode node) {
+    if (node is Declaration) {
+      return (node as Declaration).element;
+    } else if (node is CompilationUnit) {
+      return (node as CompilationUnit).element;
+    }
+    return null;
+  }
+
+  void resolveReferences(ASTNode node, Scope scope) {
+    ResolverVisitor visitor = new ResolverVisitor.con3(_definingLibrary, _source, _typeProvider, scope, _errorListener);
+    node.accept(visitor);
+    for (ProxyConditionalAnalysisError conditionalCode in visitor.proxyConditionalAnalysisErrors) {
+      if (conditionalCode.shouldIncludeErrorCode()) {
+        visitor.reportError(conditionalCode.analysisError);
+      }
+    }
+  }
+
+  void resolveTypes(ASTNode node, Scope scope) {
+    TypeResolverVisitor visitor = new TypeResolverVisitor.con3(_definingLibrary, _source, _typeProvider, scope, _errorListener);
+    node.accept(visitor);
+  }
+
+  void resolveVariables(ASTNode node, Scope scope) {
+    VariableResolverVisitor visitor = new VariableResolverVisitor.con2(_definingLibrary, _source, _typeProvider, scope, _errorListener);
+    node.accept(visitor);
+  }
+}
+
 /**
  * Instances of the class `InheritanceManager` manage the knowledge of where class members
  * (methods, getters & setters) are inherited from.
@@ -4873,7 +6002,6 @@
  * @coverage dart.engine.resolver
  */
 class InheritanceManager {
-
   /**
    * The [LibraryElement] that is managed by this manager.
    */
@@ -5234,7 +6362,7 @@
         for (ExecutableElement executableElement in set) {
           if (executableElement is PropertyAccessorElement) {
             allMethods = false;
-            if (((executableElement as PropertyAccessorElement)).isSetter) {
+            if ((executableElement as PropertyAccessorElement).isSetter) {
               allGetters = false;
             } else {
               allSetters = false;
@@ -5374,6 +6502,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `Library` represent the data about a single library during the
  * resolution of some (possibly different) library. They are not intended to be used except during
@@ -5382,7 +6511,6 @@
  * @coverage dart.engine.resolver
  */
 class Library {
-
   /**
    * The analysis context in which this library is being analyzed.
    */
@@ -5658,15 +6786,16 @@
       _inheritanceManager.libraryElement = libraryElement;
     }
   }
+
   String toString() => librarySource.shortName;
 }
+
 /**
  * Instances of the class `LibraryElementBuilder` build an element model for a single library.
  *
  * @coverage dart.engine.resolver
  */
 class LibraryElementBuilder {
-
   /**
    * The analysis context in which the element model will be built.
    */
@@ -5713,7 +6842,7 @@
     for (Directive directive in directives) {
       if (directive is LibraryDirective) {
         if (libraryNameNode == null) {
-          libraryNameNode = ((directive as LibraryDirective)).name;
+          libraryNameNode = (directive as LibraryDirective).name;
           directivesToResolve.add(directive);
         }
       } else if (directive is PartDirective) {
@@ -5813,7 +6942,7 @@
       for (Directive directive in partUnit.directives) {
         if (directive is PartOfDirective) {
           directivesToResolve.add(directive);
-          LibraryIdentifier libraryName = ((directive as PartOfDirective)).libraryName;
+          LibraryIdentifier libraryName = (directive as PartOfDirective).libraryName;
           if (libraryName != null) {
             return libraryName.name;
           }
@@ -5843,11 +6972,12 @@
       if (getter != null) {
         PropertyInducingElementImpl variable = getter.variable as PropertyInducingElementImpl;
         variable.setter = setter;
-        ((setter as PropertyAccessorElementImpl)).variable = variable;
+        (setter as PropertyAccessorElementImpl).variable = variable;
       }
     }
   }
 }
+
 /**
  * Instances of the class `LibraryResolver` are used to resolve one or more mutually dependent
  * libraries within a single context.
@@ -5855,7 +6985,6 @@
  * @coverage dart.engine.resolver
  */
 class LibraryResolver {
-
   /**
    * The analysis context in which the libraries are being analyzed.
    */
@@ -6071,13 +7200,13 @@
     for (Combinator combinator in directive.combinators) {
       if (combinator is HideCombinator) {
         HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
-        hide.hiddenNames = getIdentifiers(((combinator as HideCombinator)).hiddenNames);
+        hide.hiddenNames = getIdentifiers((combinator as HideCombinator).hiddenNames);
         combinators.add(hide);
       } else {
         ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
         show.offset = combinator.offset;
         show.end = combinator.end;
-        show.shownNames = getIdentifiers(((combinator as ShowCombinator)).shownNames);
+        show.shownNames = getIdentifiers((combinator as ShowCombinator).shownNames);
         combinators.add(show);
       }
     }
@@ -6115,7 +7244,7 @@
               if (importedLibraryElement != null) {
                 importElement.importedLibrary = importedLibraryElement;
               }
-              SimpleIdentifier prefixNode = ((directive as ImportDirective)).prefix;
+              SimpleIdentifier prefixNode = (directive as ImportDirective).prefix;
               if (prefixNode != null) {
                 importElement.prefixOffset = prefixNode.offset;
                 String prefixName = prefixNode.name;
@@ -6458,7 +7587,7 @@
     try {
       for (Source source in library.compilationUnitSources) {
         CompilationUnit ast = library.getAST(source);
-        ast.accept(new VariableResolverVisitor(library, source, _typeProvider));
+        ast.accept(new VariableResolverVisitor.con1(library, source, _typeProvider));
         ResolverVisitor visitor = new ResolverVisitor.con1(library, source, _typeProvider);
         ast.accept(visitor);
         for (ProxyConditionalAnalysisError conditionalCode in visitor.proxyConditionalAnalysisErrors) {
@@ -6493,12 +7622,12 @@
     return analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
   }
 }
+
 /**
  * This class is used to replace uses of `HashMap<String, ExecutableElement>` which are not as
  * performant as this class.
  */
 class MemberMap {
-
   /**
    * The current size of this map.
    */
@@ -6646,6 +7775,7 @@
     _values = new List<ExecutableElement>(initialCapacity);
   }
 }
+
 /**
  * This class is a wrapper for an [AnalysisError] which can also be queried after resolution
  * to find out if the error should actually be reported. In this case, these errors are conditional
@@ -6656,18 +7786,12 @@
  * instead of multiple lists of *ConditionalErrorCodes.
  */
 class ProxyConditionalAnalysisError {
-
   /**
-   * The name of the proxy annotation, from the meta pub package.
+   * The name of the proxy annotation, from dart:core.
    */
   static String _PROXY_ANNOTATION_NAME = "proxy";
 
   /**
-   * The name of the meta library name, from the meta pub package.
-   */
-  static String _META_LIBRARY_NAME = "meta";
-
-  /**
    * Return `true` if the given element represents a class that has the proxy annotation.
    *
    * @param element the class being tested
@@ -6681,7 +7805,7 @@
         Element elementAnnotation = annotation.element;
         if (elementAnnotation != null) {
           LibraryElement lib = elementAnnotation.library;
-          if (elementAnnotation.name == _PROXY_ANNOTATION_NAME && lib != null && lib.name == _META_LIBRARY_NAME) {
+          if (lib != null && lib.isDartCore && elementAnnotation.name == _PROXY_ANNOTATION_NAME) {
             return true;
           }
         }
@@ -6720,6 +7844,7 @@
    */
   bool shouldIncludeErrorCode() => !classHasProxyAnnotation(_enclosingElement);
 }
+
 /**
  * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
  * compilation unit.
@@ -6727,7 +7852,6 @@
  * @coverage dart.engine.resolver
  */
 class ResolverVisitor extends ScopedVisitor {
-
   /**
    * The manager for the inheritance mappings.
    */
@@ -6798,16 +7922,35 @@
     this._elementResolver = new ElementResolver(this);
     this._typeAnalyzer = new StaticTypeAnalyzer(this);
   }
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in an AST node.
+   *
+   * @param definingLibrary the element for the library containing the node being visited
+   * @param source the source representing the compilation unit containing the node being visited
+   * @param typeProvider the object used to access the types from the core library
+   * @param nameScope the scope used to resolve identifiers in the node that will first be visited
+   * @param errorListener the error listener that will be informed of any errors that are found
+   *          during resolution
+   */
+  ResolverVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : super.con3(definingLibrary, source, typeProvider, nameScope, errorListener) {
+    this._inheritanceManager = new InheritanceManager(definingLibrary);
+    this._elementResolver = new ElementResolver(this);
+    this._typeAnalyzer = new StaticTypeAnalyzer(this);
+  }
+
   Object visitAsExpression(AsExpression node) {
     super.visitAsExpression(node);
     override(node.expression, node.type.type);
     return null;
   }
+
   Object visitAssertStatement(AssertStatement node) {
     super.visitAssertStatement(node);
     propagateTrueState(node.condition);
     return null;
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     sc.TokenType operatorType = node.operator.type;
     Expression leftOperand = node.leftOperand;
@@ -6822,7 +7965,7 @@
           promoteTypes(leftOperand);
           clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
           clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
-          clearTypePromotionsIfAccessedInScopeAndProtentiallyMutated(rightOperand);
+          clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(rightOperand);
           rightOperand.accept(this);
         } finally {
           overrideManager.exitScope();
@@ -6848,6 +7991,7 @@
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     try {
       overrideManager.enterScope();
@@ -6857,11 +8001,13 @@
     }
     return null;
   }
+
   Object visitBreakStatement(BreakStatement node) {
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerType = enclosingClass;
     try {
@@ -6874,11 +8020,13 @@
     }
     return null;
   }
+
   Object visitCommentReference(CommentReference node) {
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitCompilationUnit(CompilationUnit node) {
     try {
       overrideManager.enterScope();
@@ -6903,6 +8051,7 @@
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitConditionalExpression(ConditionalExpression node) {
     Expression condition = node.condition;
     safelyVisit(condition);
@@ -6914,7 +8063,7 @@
         propagateTrueState(condition);
         promoteTypes(condition);
         clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
-        clearTypePromotionsIfAccessedInScopeAndProtentiallyMutated(thenExpression);
+        clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenExpression);
         thenExpression.accept(this);
       } finally {
         overrideManager.exitScope();
@@ -6944,6 +8093,7 @@
     }
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = enclosingFunction;
     try {
@@ -6954,22 +8104,26 @@
     }
     return null;
   }
+
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     safelyVisit(node.expression);
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitConstructorName(ConstructorName node) {
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitContinueStatement(ContinueStatement node) {
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitDoStatement(DoStatement node) {
     try {
       overrideManager.enterScope();
@@ -6979,6 +8133,7 @@
     }
     return null;
   }
+
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     try {
       overrideManager.enterScope();
@@ -6988,6 +8143,7 @@
     }
     return null;
   }
+
   Object visitFieldDeclaration(FieldDeclaration node) {
     try {
       overrideManager.enterScope();
@@ -6999,6 +8155,7 @@
     }
     return null;
   }
+
   Object visitForEachStatement(ForEachStatement node) {
     try {
       overrideManager.enterScope();
@@ -7008,6 +8165,7 @@
     }
     return null;
   }
+
   Object visitForStatement(ForStatement node) {
     try {
       overrideManager.enterScope();
@@ -7017,6 +8175,7 @@
     }
     return null;
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = enclosingFunction;
     try {
@@ -7028,6 +8187,7 @@
     }
     return null;
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     ExecutableElement outerFunction = enclosingFunction;
     try {
@@ -7040,6 +8200,7 @@
     }
     return null;
   }
+
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     safelyVisit(node.function);
     node.accept(_elementResolver);
@@ -7048,7 +8209,9 @@
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitHideCombinator(HideCombinator node) => null;
+
   Object visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
@@ -7061,7 +8224,7 @@
         propagateTrueState(condition);
         promoteTypes(condition);
         clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
-        clearTypePromotionsIfAccessedInScopeAndProtentiallyMutated(thenStatement);
+        clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenStatement);
         visitStatementInScope(thenStatement);
       } finally {
         thenOverrides = overrideManager.captureLocalOverrides();
@@ -7098,8 +8261,11 @@
     }
     return null;
   }
+
   Object visitLabel(Label node) => null;
+
   Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerFunction = enclosingFunction;
     try {
@@ -7110,6 +8276,7 @@
     }
     return null;
   }
+
   Object visitMethodInvocation(MethodInvocation node) {
     safelyVisit(node.target);
     node.accept(_elementResolver);
@@ -7118,37 +8285,44 @@
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitNode(ASTNode node) {
     node.visitChildren(this);
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     safelyVisit(node.prefix);
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitPropertyAccess(PropertyAccess node) {
     safelyVisit(node.target);
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     safelyVisit(node.argumentList);
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitShowCombinator(ShowCombinator node) => null;
+
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     safelyVisit(node.argumentList);
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
     return null;
   }
+
   Object visitSwitchCase(SwitchCase node) {
     try {
       overrideManager.enterScope();
@@ -7158,6 +8332,7 @@
     }
     return null;
   }
+
   Object visitSwitchDefault(SwitchDefault node) {
     try {
       overrideManager.enterScope();
@@ -7167,6 +8342,7 @@
     }
     return null;
   }
+
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     try {
       overrideManager.enterScope();
@@ -7178,7 +8354,9 @@
     }
     return null;
   }
+
   Object visitTypeName(TypeName node) => null;
+
   Object visitWhileStatement(WhileStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
@@ -7207,11 +8385,11 @@
   VariableElement getOverridablePropagatedElement(Expression expression) {
     Element element = null;
     if (expression is SimpleIdentifier) {
-      element = ((expression as SimpleIdentifier)).propagatedElement;
+      element = (expression as SimpleIdentifier).propagatedElement;
     } else if (expression is PrefixedIdentifier) {
-      element = ((expression as PrefixedIdentifier)).propagatedElement;
+      element = (expression as PrefixedIdentifier).propagatedElement;
     } else if (expression is PropertyAccess) {
-      element = ((expression as PropertyAccess)).propertyName.propagatedElement;
+      element = (expression as PropertyAccess).propertyName.propagatedElement;
     }
     if (element is VariableElement) {
       return element as VariableElement;
@@ -7229,11 +8407,11 @@
   VariableElement getOverridableStaticElement(Expression expression) {
     Element element = null;
     if (expression is SimpleIdentifier) {
-      element = ((expression as SimpleIdentifier)).staticElement;
+      element = (expression as SimpleIdentifier).staticElement;
     } else if (expression is PrefixedIdentifier) {
-      element = ((expression as PrefixedIdentifier)).staticElement;
+      element = (expression as PrefixedIdentifier).staticElement;
     } else if (expression is PropertyAccess) {
-      element = ((expression as PropertyAccess)).propertyName.staticElement;
+      element = (expression as PropertyAccess).propertyName.staticElement;
     }
     if (element is VariableElement) {
       return element as VariableElement;
@@ -7249,6 +8427,9 @@
    * @return the element associated with the given expression
    */
   VariableElement getPromotionStaticElement(Expression expression) {
+    while (expression is ParenthesizedExpression) {
+      expression = (expression as ParenthesizedExpression).expression;
+    }
     if (expression is! SimpleIdentifier) {
       return null;
     }
@@ -7312,35 +8493,6 @@
   }
 
   /**
-   * If it is appropriate to do so, promotes the current type of the static element associated with
-   * the given expression with the given type. Generally speaking, it is appropriate if the given
-   * type is more specific than the current type.
-   *
-   * @param expression the expression used to access the static element whose types might be
-   *          promoted
-   * @param potentialType the potential type of the elements
-   */
-  void promote(Expression expression, Type2 potentialType) {
-    VariableElement element = getPromotionStaticElement(expression);
-    if (element != null) {
-      if (((element as VariableElementImpl)).isPotentiallyMutatedInClosure) {
-        return;
-      }
-      Type2 type = expression.staticType;
-      if (type == null || type.isDynamic) {
-        return;
-      }
-      if (potentialType == null || potentialType.isDynamic) {
-        return;
-      }
-      if (!potentialType.isMoreSpecificThan(type)) {
-        return;
-      }
-      promoteManager.setType(element, potentialType);
-    }
-  }
-
-  /**
    * Report a conditional analysis error with the given error code and arguments.
    *
    * @param enclosingElement the enclosing element
@@ -7376,6 +8528,7 @@
   void reportErrorProxyConditionalAnalysisError3(Element enclosingElement, ErrorCode errorCode, sc.Token token, List<Object> arguments) {
     proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, token.offset, token.length, errorCode, arguments)));
   }
+
   void visitForEachStatementInScope(ForEachStatement node) {
     Expression iterator = node.iterator;
     safelyVisit(iterator);
@@ -7410,6 +8563,7 @@
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
   }
+
   void visitForStatementInScope(ForStatement node) {
     safelyVisit(node.variables);
     safelyVisit(node.initialization);
@@ -7431,9 +8585,9 @@
    * If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i> then the variable
    * <i>v</i> is not potentially mutated anywhere in the scope of <i>v</i>.
    */
-  void clearTypePromotionsIfAccessedInScopeAndProtentiallyMutated(ASTNode target) {
+  void clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(ASTNode target) {
     for (Element element in promoteManager.promotedElements) {
-      if (((element as VariableElementImpl)).isPotentiallyMutatedInScope) {
+      if ((element as VariableElementImpl).isPotentiallyMutatedInScope) {
         if (isVariableAccessedInClosure(element, target)) {
           promoteManager.setType(element, null);
         }
@@ -7466,9 +8620,9 @@
     Type2 bestType = overrideManager.getType(element);
     if (bestType == null) {
       if (element is LocalVariableElement) {
-        bestType = ((element as LocalVariableElement)).type;
+        bestType = (element as LocalVariableElement).type;
       } else if (element is ParameterElement) {
-        bestType = ((element as ParameterElement)).type;
+        bestType = (element as ParameterElement).type;
       }
     }
     return bestType;
@@ -7554,7 +8708,7 @@
    */
   bool isAbruptTermination(Expression expression) {
     while (expression is ParenthesizedExpression) {
-      expression = ((expression as ParenthesizedExpression)).expression;
+      expression = (expression as ParenthesizedExpression).expression;
     }
     return expression is ThrowExpression || expression is RethrowExpression;
   }
@@ -7570,9 +8724,9 @@
     if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) {
       return true;
     } else if (statement is ExpressionStatement) {
-      return isAbruptTermination(((statement as ExpressionStatement)).expression);
+      return isAbruptTermination((statement as ExpressionStatement).expression);
     } else if (statement is Block) {
-      NodeList<Statement> statements = ((statement as Block)).statements;
+      NodeList<Statement> statements = (statement as Block).statements;
       int size = statements.length;
       if (size == 0) {
         return false;
@@ -7593,7 +8747,7 @@
    */
   bool isVariableAccessedInClosure(Element variable, ASTNode target) {
     List<bool> result = [false];
-    target.accept(new RecursiveASTVisitor_7(result, variable));
+    target.accept(new RecursiveASTVisitor_8(result, variable));
     return result[0];
   }
 
@@ -7607,11 +8761,43 @@
    */
   bool isVariablePotentiallyMutatedIn(Element variable, ASTNode target) {
     List<bool> result = [false];
-    target.accept(new RecursiveASTVisitor_8(result, variable));
+    target.accept(new RecursiveASTVisitor_9(result, variable));
     return result[0];
   }
 
   /**
+   * If it is appropriate to do so, promotes the current type of the static element associated with
+   * the given expression with the given type. Generally speaking, it is appropriate if the given
+   * type is more specific than the current type.
+   *
+   * @param expression the expression used to access the static element whose types might be
+   *          promoted
+   * @param potentialType the potential type of the elements
+   */
+  void promote(Expression expression, Type2 potentialType) {
+    VariableElement element = getPromotionStaticElement(expression);
+    if (element != null) {
+      if ((element as VariableElementImpl).isPotentiallyMutatedInClosure) {
+        return;
+      }
+      Type2 type = promoteManager.getType(element);
+      if (type == null) {
+        type = expression.staticType;
+      }
+      if (type == null || type.isDynamic) {
+        return;
+      }
+      if (potentialType == null || potentialType.isDynamic) {
+        return;
+      }
+      if (!potentialType.isMoreSpecificThan(type)) {
+        return;
+      }
+      promoteManager.setType(element, potentialType);
+    }
+  }
+
+  /**
    * Promotes type information using given condition.
    */
   void promoteTypes(Expression condition) {
@@ -7630,7 +8816,7 @@
         promote(is2.expression, is2.type.type);
       }
     } else if (condition is ParenthesizedExpression) {
-      promoteTypes(((condition as ParenthesizedExpression)).expression);
+      promoteTypes((condition as ParenthesizedExpression).expression);
     }
   }
 
@@ -7658,7 +8844,7 @@
         propagateTrueState(prefix.operand);
       }
     } else if (condition is ParenthesizedExpression) {
-      propagateFalseState(((condition as ParenthesizedExpression)).expression);
+      propagateFalseState((condition as ParenthesizedExpression).expression);
     }
   }
 
@@ -7695,7 +8881,7 @@
         propagateFalseState(prefix.operand);
       }
     } else if (condition is ParenthesizedExpression) {
-      propagateTrueState(((condition as ParenthesizedExpression)).expression);
+      propagateTrueState((condition as ParenthesizedExpression).expression);
     }
   }
 
@@ -7710,22 +8896,37 @@
       expression.propagatedType = type;
     }
   }
+
   get elementResolver_J2DAccessor => _elementResolver;
+
   set elementResolver_J2DAccessor(__v) => _elementResolver = __v;
+
   get labelScope_J2DAccessor => labelScope;
+
   set labelScope_J2DAccessor(__v) => labelScope = __v;
+
   get nameScope_J2DAccessor => nameScope;
+
   set nameScope_J2DAccessor(__v) => nameScope = __v;
+
   get typeAnalyzer_J2DAccessor => _typeAnalyzer;
+
   set typeAnalyzer_J2DAccessor(__v) => _typeAnalyzer = __v;
+
   get enclosingClass_J2DAccessor => enclosingClass;
+
   set enclosingClass_J2DAccessor(__v) => enclosingClass = __v;
 }
-class RecursiveASTVisitor_7 extends RecursiveASTVisitor<Object> {
+
+class RecursiveASTVisitor_8 extends RecursiveASTVisitor<Object> {
   List<bool> result;
+
   Element variable;
-  RecursiveASTVisitor_7(this.result, this.variable) : super();
+
+  RecursiveASTVisitor_8(this.result, this.variable) : super();
+
   bool _inClosure = false;
+
   Object visitFunctionExpression(FunctionExpression node) {
     bool inClosure = this._inClosure;
     try {
@@ -7735,6 +8936,7 @@
       this._inClosure = inClosure;
     }
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (result[0]) {
       return null;
@@ -7745,10 +8947,14 @@
     return null;
   }
 }
-class RecursiveASTVisitor_8 extends RecursiveASTVisitor<Object> {
+
+class RecursiveASTVisitor_9 extends RecursiveASTVisitor<Object> {
   List<bool> result;
+
   Element variable;
-  RecursiveASTVisitor_8(this.result, this.variable) : super();
+
+  RecursiveASTVisitor_9(this.result, this.variable) : super();
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (result[0]) {
       return null;
@@ -7761,6 +8967,7 @@
     return null;
   }
 }
+
 /**
  * The abstract class `ScopedVisitor` maintains name and label scopes as an AST structure is
  * being visited.
@@ -7768,7 +8975,6 @@
  * @coverage dart.engine.resolver
  */
 abstract class ScopedVisitor extends UnifyingASTVisitor<Object> {
-
   /**
    * The element for the library containing the compilation unit being visited.
    */
@@ -7835,6 +9041,25 @@
   }
 
   /**
+   * Initialize a newly created visitor to resolve the nodes in a compilation unit.
+   *
+   * @param definingLibrary the element for the library containing the compilation unit being
+   *          visited
+   * @param source the source representing the compilation unit being visited
+   * @param typeProvider the object used to access the types from the core library
+   * @param nameScope the scope used to resolve identifiers in the node that will first be visited
+   * @param errorListener the error listener that will be informed of any errors that are found
+   *          during resolution
+   */
+  ScopedVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
+    this.definingLibrary = definingLibrary;
+    this.source = source;
+    this._errorListener = errorListener;
+    this.nameScope = nameScope;
+    this.typeProvider = typeProvider;
+  }
+
+  /**
    * Report an error with the given analysis error.
    *
    * @param errorCode analysis error
@@ -7842,6 +9067,7 @@
   void reportError(AnalysisError analysisError) {
     _errorListener.onError(analysisError);
   }
+
   Object visitBlock(Block node) {
     Scope outerScope = nameScope;
     try {
@@ -7854,6 +9080,7 @@
     }
     return null;
   }
+
   Object visitCatchClause(CatchClause node) {
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
@@ -7874,6 +9101,7 @@
     }
     return null;
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     Scope outerScope = nameScope;
     try {
@@ -7884,6 +9112,7 @@
     }
     return null;
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     Scope outerScope = nameScope;
     try {
@@ -7894,6 +9123,7 @@
     }
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     Scope outerScope = nameScope;
     try {
@@ -7904,6 +9134,7 @@
     }
     return null;
   }
+
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     VariableElement element = node.element;
     if (element != null) {
@@ -7912,6 +9143,7 @@
     super.visitDeclaredIdentifier(node);
     return null;
   }
+
   Object visitDoStatement(DoStatement node) {
     LabelScope outerLabelScope = labelScope;
     try {
@@ -7923,6 +9155,7 @@
     }
     return null;
   }
+
   Object visitForEachStatement(ForEachStatement node) {
     Scope outerNameScope = nameScope;
     LabelScope outerLabelScope = labelScope;
@@ -7936,16 +9169,18 @@
     }
     return null;
   }
+
   Object visitFormalParameterList(FormalParameterList node) {
     super.visitFormalParameterList(node);
     if (nameScope is FunctionScope) {
-      ((nameScope as FunctionScope)).defineParameters();
+      (nameScope as FunctionScope).defineParameters();
     }
     if (nameScope is FunctionTypeScope) {
-      ((nameScope as FunctionTypeScope)).defineParameters();
+      (nameScope as FunctionTypeScope).defineParameters();
     }
     return null;
   }
+
   Object visitForStatement(ForStatement node) {
     Scope outerNameScope = nameScope;
     LabelScope outerLabelScope = labelScope;
@@ -7959,6 +9194,7 @@
     }
     return null;
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement function = node.element;
     Scope outerScope = nameScope;
@@ -7973,6 +9209,7 @@
     }
     return null;
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       super.visitFunctionExpression(node);
@@ -7991,6 +9228,7 @@
     }
     return null;
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     Scope outerScope = nameScope;
     try {
@@ -8001,12 +9239,14 @@
     }
     return null;
   }
+
   Object visitIfStatement(IfStatement node) {
     safelyVisit(node.condition);
     visitStatementInScope(node.thenStatement);
     visitStatementInScope(node.elseStatement);
     return null;
   }
+
   Object visitLabeledStatement(LabeledStatement node) {
     LabelScope outerScope = addScopesFor(node.labels);
     try {
@@ -8016,6 +9256,7 @@
     }
     return null;
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     Scope outerScope = nameScope;
     try {
@@ -8026,6 +9267,7 @@
     }
     return null;
   }
+
   Object visitSwitchCase(SwitchCase node) {
     node.expression.accept(this);
     Scope outerNameScope = nameScope;
@@ -8037,6 +9279,7 @@
     }
     return null;
   }
+
   Object visitSwitchDefault(SwitchDefault node) {
     Scope outerNameScope = nameScope;
     try {
@@ -8047,6 +9290,7 @@
     }
     return null;
   }
+
   Object visitSwitchStatement(SwitchStatement node) {
     LabelScope outerScope = labelScope;
     try {
@@ -8064,16 +9308,18 @@
     }
     return null;
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
     if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent is! FieldDeclaration) {
       VariableElement element = node.element;
       if (element != null) {
         nameScope.define(element);
       }
     }
-    super.visitVariableDeclaration(node);
     return null;
   }
+
   Object visitWhileStatement(WhileStatement node) {
     LabelScope outerScope = labelScope;
     try {
@@ -8093,7 +9339,7 @@
    * @param node the node specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError5(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
+  void reportError6(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(source, node.offset, node.length, errorCode, arguments));
   }
 
@@ -8105,7 +9351,7 @@
    * @param length the length of the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError6(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void reportError7(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(source, offset, length, errorCode, arguments));
   }
 
@@ -8116,7 +9362,7 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError7(ErrorCode errorCode, sc.Token token, List<Object> arguments) {
+  void reportError8(ErrorCode errorCode, sc.Token token, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(source, token.offset, token.length, errorCode, arguments));
   }
 
@@ -8219,6 +9465,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
  * compute the static type of every expression. Second, they look for any static type errors or
@@ -8231,7 +9478,6 @@
  * @coverage dart.engine.resolver
  */
 class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
-
   /**
    * Create a table mapping HTML tag names to the names of the classes (in 'dart:html') that
    * implement those tags.
@@ -8585,6 +9831,7 @@
     recordStaticType(node, _typeProvider.doubleType);
     return null;
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression function = node.functionExpression;
     ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
@@ -9014,6 +10261,7 @@
     }
     return null;
   }
+
   Object visitNamedExpression(NamedExpression node) {
     Expression expression = node.expression;
     recordStaticType(node, getStaticType(expression));
@@ -9029,6 +10277,7 @@
     recordStaticType(node, _typeProvider.bottomType);
     return null;
   }
+
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     Expression expression = node.expression;
     recordStaticType(node, getStaticType(expression));
@@ -9086,26 +10335,26 @@
     Type2 staticType = _dynamicType;
     if (staticElement is ClassElement) {
       if (isNotTypeLiteral(node)) {
-        staticType = ((staticElement as ClassElement)).type;
+        staticType = (staticElement as ClassElement).type;
       } else {
         staticType = _typeProvider.typeType;
       }
     } else if (staticElement is FunctionTypeAliasElement) {
       if (isNotTypeLiteral(node)) {
-        staticType = ((staticElement as FunctionTypeAliasElement)).type;
+        staticType = (staticElement as FunctionTypeAliasElement).type;
       } else {
         staticType = _typeProvider.typeType;
       }
     } else if (staticElement is MethodElement) {
-      staticType = ((staticElement as MethodElement)).type;
+      staticType = (staticElement as MethodElement).type;
     } else if (staticElement is PropertyAccessorElement) {
       staticType = getType(staticElement as PropertyAccessorElement, node.prefix.staticType);
     } else if (staticElement is ExecutableElement) {
-      staticType = ((staticElement as ExecutableElement)).type;
+      staticType = (staticElement as ExecutableElement).type;
     } else if (staticElement is TypeParameterElement) {
-      staticType = ((staticElement as TypeParameterElement)).type;
+      staticType = (staticElement as TypeParameterElement).type;
     } else if (staticElement is VariableElement) {
-      staticType = ((staticElement as VariableElement)).type;
+      staticType = (staticElement as VariableElement).type;
     }
     recordStaticType(prefixedIdentifier, staticType);
     recordStaticType(node, staticType);
@@ -9113,22 +10362,22 @@
     Type2 propagatedType = null;
     if (propagatedElement is ClassElement) {
       if (isNotTypeLiteral(node)) {
-        propagatedType = ((propagatedElement as ClassElement)).type;
+        propagatedType = (propagatedElement as ClassElement).type;
       } else {
         propagatedType = _typeProvider.typeType;
       }
     } else if (propagatedElement is FunctionTypeAliasElement) {
-      propagatedType = ((propagatedElement as FunctionTypeAliasElement)).type;
+      propagatedType = (propagatedElement as FunctionTypeAliasElement).type;
     } else if (propagatedElement is MethodElement) {
-      propagatedType = ((propagatedElement as MethodElement)).type;
+      propagatedType = (propagatedElement as MethodElement).type;
     } else if (propagatedElement is PropertyAccessorElement) {
       propagatedType = getType(propagatedElement as PropertyAccessorElement, node.prefix.staticType);
     } else if (propagatedElement is ExecutableElement) {
-      propagatedType = ((propagatedElement as ExecutableElement)).type;
+      propagatedType = (propagatedElement as ExecutableElement).type;
     } else if (propagatedElement is TypeParameterElement) {
-      propagatedType = ((propagatedElement as TypeParameterElement)).type;
+      propagatedType = (propagatedElement as TypeParameterElement).type;
     } else if (propagatedElement is VariableElement) {
-      propagatedType = ((propagatedElement as VariableElement)).type;
+      propagatedType = (propagatedElement as VariableElement).type;
     }
     Type2 overriddenType = _overrideManager.getType(propagatedElement);
     if (propagatedType == null || (overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType))) {
@@ -9219,7 +10468,7 @@
     Element element = propertyName.staticElement;
     Type2 staticType = _dynamicType;
     if (element is MethodElement) {
-      staticType = ((element as MethodElement)).type;
+      staticType = (element as MethodElement).type;
     } else if (element is PropertyAccessorElement) {
       staticType = getType(element as PropertyAccessorElement, node.target != null ? getStaticType(node.target) : null);
     } else {
@@ -9289,24 +10538,24 @@
     Type2 staticType = _dynamicType;
     if (element is ClassElement) {
       if (isNotTypeLiteral(node)) {
-        staticType = ((element as ClassElement)).type;
+        staticType = (element as ClassElement).type;
       } else {
         staticType = _typeProvider.typeType;
       }
     } else if (element is FunctionTypeAliasElement) {
       if (isNotTypeLiteral(node)) {
-        staticType = ((element as FunctionTypeAliasElement)).type;
+        staticType = (element as FunctionTypeAliasElement).type;
       } else {
         staticType = _typeProvider.typeType;
       }
     } else if (element is MethodElement) {
-      staticType = ((element as MethodElement)).type;
+      staticType = (element as MethodElement).type;
     } else if (element is PropertyAccessorElement) {
       staticType = getType(element as PropertyAccessorElement, null);
     } else if (element is ExecutableElement) {
-      staticType = ((element as ExecutableElement)).type;
+      staticType = (element as ExecutableElement).type;
     } else if (element is TypeParameterElement) {
-      staticType = ((element as TypeParameterElement)).type;
+      staticType = (element as TypeParameterElement).type;
     } else if (element is VariableElement) {
       VariableElement variable = element as VariableElement;
       staticType = _promoteManager.getStaticType(variable);
@@ -9340,6 +10589,7 @@
     recordStaticType(node, _typeProvider.stringType);
     return null;
   }
+
   Object visitSuperExpression(SuperExpression node) {
     if (_thisType == null) {
       recordStaticType(node, _dynamicType);
@@ -9348,6 +10598,7 @@
     }
     return null;
   }
+
   Object visitSymbolLiteral(SymbolLiteral node) {
     recordStaticType(node, _typeProvider.symbolType);
     return null;
@@ -9374,6 +10625,7 @@
     recordStaticType(node, _typeProvider.bottomType);
     return null;
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     Expression initializer = node.initializer;
     if (initializer != null) {
@@ -9432,7 +10684,7 @@
     }
     if (body is BlockFunctionBody) {
       List<Type2> result = [null];
-      body.accept(new GeneralizingASTVisitor_9(result));
+      body.accept(new GeneralizingASTVisitor_10(result));
       return result[0];
     }
     return null;
@@ -9446,18 +10698,18 @@
    */
   Type2 computeStaticReturnType(Element element) {
     if (element is PropertyAccessorElement) {
-      FunctionType propertyType = ((element as PropertyAccessorElement)).type;
+      FunctionType propertyType = (element as PropertyAccessorElement).type;
       if (propertyType != null) {
         Type2 returnType = propertyType.returnType;
         if (returnType.isDartCoreFunction) {
           return _dynamicType;
         } else if (returnType is InterfaceType) {
-          MethodElement callMethod = ((returnType as InterfaceType)).lookUpMethod(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary);
+          MethodElement callMethod = (returnType as InterfaceType).lookUpMethod(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary);
           if (callMethod != null) {
             return callMethod.type.returnType;
           }
         } else if (returnType is FunctionType) {
-          Type2 innerReturnType = ((returnType as FunctionType)).returnType;
+          Type2 innerReturnType = (returnType as FunctionType).returnType;
           if (innerReturnType != null) {
             return innerReturnType;
           }
@@ -9467,7 +10719,7 @@
         }
       }
     } else if (element is ExecutableElement) {
-      FunctionType type = ((element as ExecutableElement)).type;
+      FunctionType type = (element as ExecutableElement).type;
       if (type != null) {
         return type.returnType;
       }
@@ -9475,7 +10727,7 @@
       VariableElement variable = element as VariableElement;
       Type2 variableType = _promoteManager.getStaticType(variable);
       if (variableType is FunctionType) {
-        return ((variableType as FunctionType)).returnType;
+        return (variableType as FunctionType).returnType;
       }
     }
     return _dynamicType;
@@ -9508,7 +10760,7 @@
   Type2 computeStaticReturnType3(FunctionExpression node) {
     FunctionBody body = node.body;
     if (body is ExpressionFunctionBody) {
-      return getStaticType(((body as ExpressionFunctionBody)).expression);
+      return getStaticType((body as ExpressionFunctionBody).expression);
     }
     return _dynamicType;
   }
@@ -9576,7 +10828,7 @@
     if (arguments.length > 0) {
       Expression argument = arguments[0];
       if (argument is SimpleStringLiteral) {
-        return ((argument as SimpleStringLiteral)).value;
+        return (argument as SimpleStringLiteral).value;
       }
     }
     return null;
@@ -9708,7 +10960,7 @@
    */
   bool isNotTypeLiteral(Identifier node) {
     ASTNode parent = node.parent;
-    return parent is TypeName || (parent is PrefixedIdentifier && (parent.parent is TypeName || identical(((parent as PrefixedIdentifier)).prefix, node))) || (parent is PropertyAccess && identical(((parent as PropertyAccess)).target, node)) || (parent is MethodInvocation && identical(node, ((parent as MethodInvocation)).target));
+    return parent is TypeName || (parent is PrefixedIdentifier && (parent.parent is TypeName || identical((parent as PrefixedIdentifier).prefix, node))) || (parent is PropertyAccess && identical((parent as PropertyAccess).target, node)) || (parent is MethodInvocation && identical(node, (parent as MethodInvocation).target));
   }
 
   /**
@@ -9789,13 +11041,19 @@
     }
     return staticType;
   }
+
   get thisType_J2DAccessor => _thisType;
+
   set thisType_J2DAccessor(__v) => _thisType = __v;
 }
-class GeneralizingASTVisitor_9 extends GeneralizingASTVisitor<Object> {
+
+class GeneralizingASTVisitor_10 extends GeneralizingASTVisitor<Object> {
   List<Type2> result;
-  GeneralizingASTVisitor_9(this.result) : super();
+
+  GeneralizingASTVisitor_10(this.result) : super();
+
   Object visitExpression(Expression node) => null;
+
   Object visitReturnStatement(ReturnStatement node) {
     Type2 type;
     Expression expression = node.expression;
@@ -9812,11 +11070,11 @@
     return null;
   }
 }
+
 /**
  * Instances of this class manage the knowledge of what the set of subtypes are for a given type.
  */
 class SubtypeManager {
-
   /**
    * A map between [ClassElement]s and a set of [ClassElement]s that are subtypes of the
    * key.
@@ -9961,12 +11219,12 @@
     javaSetAdd(subtypes, subtypeElement);
   }
 }
+
 /**
  * Instances of the class `TypeOverrideManager` manage the ability to override the type of an
  * element within a given context.
  */
 class TypeOverrideManager {
-
   /**
    * The current override scope, or `null` if no scope has been entered.
    */
@@ -10055,12 +11313,12 @@
     _currentScope.setType(element, type);
   }
 }
+
 /**
  * Instances of the class `TypeOverrideScope` represent a scope in which the types of
  * elements can be overridden.
  */
 class TypeOverrideManager_TypeOverrideScope {
-
   /**
    * The outer scope in which types might be overridden.
    */
@@ -10132,7 +11390,7 @@
   Type2 getType(Element element) {
     Type2 type = _overridenTypes[element];
     if (type == null && element is PropertyAccessorElement) {
-      type = _overridenTypes[((element as PropertyAccessorElement)).variable];
+      type = _overridenTypes[(element as PropertyAccessorElement).variable];
     }
     if (type != null) {
       return type;
@@ -10152,12 +11410,12 @@
     _overridenTypes[element] = type;
   }
 }
+
 /**
  * Instances of the class `TypePromotionManager` manage the ability to promote types of local
  * variables and formal parameters from their declared types based on control flow.
  */
 class TypePromotionManager {
-
   /**
    * The current promotion scope, or `null` if no scope has been entered.
    */
@@ -10225,12 +11483,12 @@
     _currentScope.setType(element, type);
   }
 }
+
 /**
  * Instances of the class `TypePromoteScope` represent a scope in which the types of
  * elements can be promoted.
  */
 class TypePromotionManager_TypePromoteScope {
-
   /**
    * The outer scope in which types might be promoter.
    */
@@ -10265,7 +11523,7 @@
   Type2 getType(Element element) {
     Type2 type = _promotedTypes[element];
     if (type == null && element is PropertyAccessorElement) {
-      type = _promotedTypes[((element as PropertyAccessorElement)).variable];
+      type = _promotedTypes[(element as PropertyAccessorElement).variable];
     }
     if (type != null) {
       return type;
@@ -10285,6 +11543,7 @@
     _promotedTypes[element] = type;
   }
 }
+
 /**
  * The interface `TypeProvider` defines the behavior of objects that provide access to types
  * defined by the language.
@@ -10292,14 +11551,6 @@
  * @coverage dart.engine.resolver
  */
 abstract class TypeProvider {
-
-  /**
-   * Return the type representing the built-in type 'Null'.
-   *
-   * @return the type representing the built-in type 'null'
-   */
-  InterfaceType get nullType;
-
   /**
    * Return the type representing the built-in type 'bool'.
    *
@@ -10315,6 +11566,13 @@
   Type2 get bottomType;
 
   /**
+   * Return the type representing the built-in type 'Deprecated'.
+   *
+   * @return the type representing the built-in type 'Deprecated'
+   */
+  InterfaceType get deprecatedType;
+
+  /**
    * Return the type representing the built-in type 'double'.
    *
    * @return the type representing the built-in type 'double'
@@ -10357,6 +11615,13 @@
   InterfaceType get mapType;
 
   /**
+   * Return the type representing the built-in type 'Null'.
+   *
+   * @return the type representing the built-in type 'null'
+   */
+  InterfaceType get nullType;
+
+  /**
    * Return the type representing the built-in type 'num'.
    *
    * @return the type representing the built-in type 'num'
@@ -10398,6 +11663,7 @@
    */
   InterfaceType get typeType;
 }
+
 /**
  * Instances of the class `TypeProviderImpl` provide access to types defined by the language
  * by looking for those types in the element model for the core library.
@@ -10405,7 +11671,6 @@
  * @coverage dart.engine.resolver
  */
 class TypeProviderImpl implements TypeProvider {
-
   /**
    * The type representing the built-in type 'bool'.
    */
@@ -10422,6 +11687,11 @@
   InterfaceType _doubleType;
 
   /**
+   * The type representing the built-in type 'Deprecated'.
+   */
+  InterfaceType _deprecatedType;
+
+  /**
    * The type representing the built-in type 'dynamic'.
    */
   Type2 _dynamicType;
@@ -10489,20 +11759,37 @@
   TypeProviderImpl(LibraryElement coreLibrary) {
     initializeFrom(coreLibrary);
   }
+
   InterfaceType get boolType => _boolType;
+
   Type2 get bottomType => _bottomType;
+
+  InterfaceType get deprecatedType => _deprecatedType;
+
   InterfaceType get doubleType => _doubleType;
+
   Type2 get dynamicType => _dynamicType;
+
   InterfaceType get functionType => _functionType;
+
   InterfaceType get intType => _intType;
+
   InterfaceType get listType => _listType;
+
   InterfaceType get mapType => _mapType;
+
   InterfaceType get nullType => _nullType;
+
   InterfaceType get numType => _numType;
+
   InterfaceType get objectType => _objectType;
+
   InterfaceType get stackTraceType => _stackTraceType;
+
   InterfaceType get stringType => _stringType;
+
   InterfaceType get symbolType => _symbolType;
+
   InterfaceType get typeType => _typeType;
 
   /**
@@ -10519,7 +11806,7 @@
       AnalysisEngine.instance.logger.logInformation("No definition of type ${typeName}");
       return null;
     }
-    return ((element as ClassElement)).type;
+    return (element as ClassElement).type;
   }
 
   /**
@@ -10531,6 +11818,7 @@
     Namespace namespace = new NamespaceBuilder().createPublicNamespace(library);
     _boolType = getType(namespace, "bool");
     _bottomType = BottomTypeImpl.instance;
+    _deprecatedType = getType(namespace, "Deprecated");
     _doubleType = getType(namespace, "double");
     _dynamicType = DynamicTypeImpl.instance;
     _functionType = getType(namespace, "Function");
@@ -10546,6 +11834,7 @@
     _typeType = getType(namespace, "Type");
   }
 }
+
 /**
  * Instances of the class `TypeResolverVisitor` are used to resolve the types associated with
  * the elements in the element model. This includes the types of superclasses, mixins, interfaces,
@@ -10555,7 +11844,6 @@
  * @coverage dart.engine.resolver
  */
 class TypeResolverVisitor extends ScopedVisitor {
-
   /**
    * @return `true` if the name of the given [TypeName] is an built-in identifier.
    */
@@ -10570,13 +11858,13 @@
   static bool isTypeAnnotation(TypeName node) {
     ASTNode parent = node.parent;
     if (parent is VariableDeclarationList) {
-      return identical(((parent as VariableDeclarationList)).type, node);
+      return identical((parent as VariableDeclarationList).type, node);
     }
     if (parent is FieldFormalParameter) {
-      return identical(((parent as FieldFormalParameter)).type, node);
+      return identical((parent as FieldFormalParameter).type, node);
     }
     if (parent is SimpleFormalParameter) {
-      return identical(((parent as SimpleFormalParameter)).type, node);
+      return identical((parent as SimpleFormalParameter).type, node);
     }
     return false;
   }
@@ -10615,6 +11903,21 @@
   TypeResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
     _dynamicType = typeProvider.dynamicType;
   }
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in an AST node.
+   *
+   * @param definingLibrary the element for the library containing the node being visited
+   * @param source the source representing the compilation unit containing the node being visited
+   * @param typeProvider the object used to access the types from the core library
+   * @param nameScope the scope used to resolve identifiers in the node that will first be visited
+   * @param errorListener the error listener that will be informed of any errors that are found
+   *          during resolution
+   */
+  TypeResolverVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : super.con3(definingLibrary, source, typeProvider, nameScope, errorListener) {
+    _dynamicType = typeProvider.dynamicType;
+  }
+
   Object visitCatchClause(CatchClause node) {
     super.visitCatchClause(node);
     SimpleIdentifier exception = node.exceptionParameter;
@@ -10629,7 +11932,7 @@
       recordType(exception, exceptionType);
       Element element = exception.staticElement;
       if (element is VariableElementImpl) {
-        ((element as VariableElementImpl)).type = exceptionType;
+        (element as VariableElementImpl).type = exceptionType;
       } else {
       }
     }
@@ -10639,6 +11942,7 @@
     }
     return null;
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     _hasReferenceToSuper = false;
     super.visitClassDeclaration(node);
@@ -10665,6 +11969,7 @@
     resolve(classElement, node.withClause, node.implementsClause);
     return null;
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     super.visitClassTypeAlias(node);
     ClassElementImpl classElement = getClassElement(node.name);
@@ -10679,6 +11984,7 @@
     resolve(classElement, node.withClause, node.implementsClause);
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
@@ -10689,6 +11995,7 @@
     element.type = type;
     return null;
   }
+
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     super.visitDeclaredIdentifier(node);
     Type2 declaredType;
@@ -10702,10 +12009,12 @@
     element.type = declaredType;
     return null;
   }
+
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     super.visitDefaultFormalParameter(node);
     return null;
   }
+
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     super.visitFieldFormalParameter(node);
     Element element = node.identifier.staticElement;
@@ -10728,6 +12037,7 @@
     }
     return null;
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     super.visitFunctionDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
@@ -10740,12 +12050,14 @@
     element.type = type;
     return null;
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     super.visitFunctionTypeAlias(node);
     FunctionTypeAliasElementImpl element = node.element as FunctionTypeAliasElementImpl;
     element.returnType = computeReturnType(node.returnType);
     return null;
   }
+
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     super.visitFunctionTypedFormalParameter(node);
     Element element = node.identifier.staticElement;
@@ -10755,6 +12067,7 @@
     }
     return null;
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
@@ -10779,6 +12092,7 @@
     }
     return null;
   }
+
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     super.visitSimpleFormalParameter(node);
     Type2 declaredType;
@@ -10790,15 +12104,17 @@
     }
     Element element = node.identifier.staticElement;
     if (element is ParameterElement) {
-      ((element as ParameterElementImpl)).type = declaredType;
+      (element as ParameterElementImpl).type = declaredType;
     } else {
     }
     return null;
   }
+
   Object visitSuperExpression(SuperExpression node) {
     _hasReferenceToSuper = true;
     return super.visitSuperExpression(node);
   }
+
   Object visitTypeName(TypeName node) {
     super.visitTypeName(node);
     Identifier typeName = node.name;
@@ -10829,10 +12145,10 @@
           SimpleIdentifier prefix = prefixedIdentifier.prefix;
           element = nameScope.lookup(prefix, definingLibrary);
           if (element is PrefixElement) {
-            if (parent.parent is InstanceCreationExpression && ((parent.parent as InstanceCreationExpression)).isConst) {
-              reportError5(CompileTimeErrorCode.CONST_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
+            if (parent.parent is InstanceCreationExpression && (parent.parent as InstanceCreationExpression).isConst) {
+              reportError6(CompileTimeErrorCode.CONST_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
             } else {
-              reportError5(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
+              reportError6(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
             }
             setElement(prefix, element);
             return null;
@@ -10851,14 +12167,14 @@
       InstanceCreationExpression creation = node.parent.parent as InstanceCreationExpression;
       if (creation.isConst) {
         if (element == null) {
-          reportError5(CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]);
+          reportError6(CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]);
         } else {
-          reportError5(CompileTimeErrorCode.CONST_WITH_NON_TYPE, typeNameSimple, [typeName]);
+          reportError6(CompileTimeErrorCode.CONST_WITH_NON_TYPE, typeNameSimple, [typeName]);
         }
         elementValid = false;
       } else {
         if (element != null) {
-          reportError5(StaticWarningCode.NEW_WITH_NON_TYPE, typeNameSimple, [typeName]);
+          reportError6(StaticWarningCode.NEW_WITH_NON_TYPE, typeNameSimple, [typeName]);
           elementValid = false;
         }
       }
@@ -10867,22 +12183,22 @@
       SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
       RedirectingConstructorKind redirectingConstructorKind;
       if (isBuiltInIdentifier(node) && isTypeAnnotation(node)) {
-        reportError5(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, typeName, [typeName.name]);
+        reportError6(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, typeName, [typeName.name]);
       } else if (typeNameSimple.name == "boolean") {
-        reportError5(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
+        reportError6(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
       } else if (isTypeNameInCatchClause(node)) {
-        reportError5(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
+        reportError6(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
       } else if (isTypeNameInAsExpression(node)) {
-        reportError5(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+        reportError6(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
       } else if (isTypeNameInIsExpression(node)) {
-        reportError5(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
+        reportError6(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
       } else if ((redirectingConstructorKind = getRedirectingConstructorKind(node)) != null) {
         ErrorCode errorCode = (identical(redirectingConstructorKind, RedirectingConstructorKind.CONST) ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
-        reportError5(errorCode, typeName, [typeName.name]);
+        reportError6(errorCode, typeName, [typeName.name]);
       } else if (isTypeNameInTypeArgumentList(node)) {
-        reportError5(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
+        reportError6(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
       } else {
-        reportError5(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
+        reportError6(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
       }
       elementValid = false;
     }
@@ -10899,17 +12215,17 @@
     Type2 type = null;
     if (element is ClassElement) {
       setElement(typeName, element);
-      type = ((element as ClassElement)).type;
+      type = (element as ClassElement).type;
     } else if (element is FunctionTypeAliasElement) {
       setElement(typeName, element);
-      type = ((element as FunctionTypeAliasElement)).type;
+      type = (element as FunctionTypeAliasElement).type;
     } else if (element is TypeParameterElement) {
       setElement(typeName, element);
-      type = ((element as TypeParameterElement)).type;
+      type = (element as TypeParameterElement).type;
       if (argumentList != null) {
       }
     } else if (element is MultiplyDefinedElement) {
-      List<Element> elements = ((element as MultiplyDefinedElement)).conflictingElements;
+      List<Element> elements = (element as MultiplyDefinedElement).conflictingElements;
       type = getType(elements);
       if (type != null) {
         node.type = type;
@@ -10917,16 +12233,16 @@
     } else {
       RedirectingConstructorKind redirectingConstructorKind;
       if (isTypeNameInCatchClause(node)) {
-        reportError5(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
+        reportError6(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
       } else if (isTypeNameInAsExpression(node)) {
-        reportError5(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+        reportError6(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
       } else if (isTypeNameInIsExpression(node)) {
-        reportError5(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
+        reportError6(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
       } else if ((redirectingConstructorKind = getRedirectingConstructorKind(node)) != null) {
         ErrorCode errorCode = (identical(redirectingConstructorKind, RedirectingConstructorKind.CONST) ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
-        reportError5(errorCode, typeName, [typeName.name]);
+        reportError6(errorCode, typeName, [typeName.name]);
       } else if (isTypeNameInTypeArgumentList(node)) {
-        reportError5(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
+        reportError6(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
       } else {
         ASTNode parent = typeName.parent;
         while (parent is TypeName) {
@@ -10934,7 +12250,7 @@
         }
         if (parent is ExtendsClause || parent is ImplementsClause || parent is WithClause || parent is ClassTypeAlias) {
         } else {
-          reportError5(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
+          reportError6(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
         }
       }
       setElement(typeName, this._dynamicType.element);
@@ -10956,7 +12272,7 @@
         }
       }
       if (argumentCount != parameterCount) {
-        reportError5(getInvalidTypeParametersErrorCode(node), node, [typeName.name, parameterCount, argumentCount]);
+        reportError6(getInvalidTypeParametersErrorCode(node), node, [typeName.name, parameterCount, argumentCount]);
       }
       argumentCount = typeArguments.length;
       if (argumentCount < parameterCount) {
@@ -10988,10 +12304,11 @@
     node.type = type;
     return null;
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Type2 declaredType;
-    TypeName typeName = ((node.parent as VariableDeclarationList)).type;
+    TypeName typeName = (node.parent as VariableDeclarationList).type;
     if (typeName == null) {
       declaredType = _dynamicType;
     } else {
@@ -10999,7 +12316,7 @@
     }
     Element element = node.name.staticElement;
     if (element is VariableElement) {
-      ((element as VariableElementImpl)).type = declaredType;
+      (element as VariableElementImpl).type = declaredType;
       if (element is PropertyInducingElement) {
         PropertyInducingElement variableElement = element as PropertyInducingElement;
         PropertyAccessorElementImpl getter = variableElement.getter as PropertyAccessorElementImpl;
@@ -11014,7 +12331,7 @@
         if (setter != null) {
           List<ParameterElement> parameters = setter.parameters;
           if (parameters.length > 0) {
-            ((parameters[0] as ParameterElementImpl)).type = declaredType;
+            (parameters[0] as ParameterElementImpl).type = declaredType;
           }
           setter.returnType = VoidTypeImpl.instance;
           FunctionTypeImpl setterType = new FunctionTypeImpl.con1(setter);
@@ -11093,7 +12410,7 @@
     if (parent is ConstructorName) {
       parent = parent.parent;
       if (parent is InstanceCreationExpression) {
-        if (((parent as InstanceCreationExpression)).isConst) {
+        if ((parent as InstanceCreationExpression).isConst) {
           return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS;
         } else {
           return StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS;
@@ -11142,7 +12459,7 @@
         if (type != null) {
           return null;
         }
-        type = ((element as ClassElement)).type;
+        type = (element as ClassElement).type;
       }
     }
     return type;
@@ -11170,9 +12487,9 @@
    */
   List<Type2> getTypeArguments(Type2 type) {
     if (type is InterfaceType) {
-      return ((type as InterfaceType)).typeArguments;
+      return (type as InterfaceType).typeArguments;
     } else if (type is FunctionType) {
-      return ((type as FunctionType)).typeArguments;
+      return (type as FunctionType).typeArguments;
     }
     return TypeImpl.EMPTY_ARRAY;
   }
@@ -11187,7 +12504,7 @@
     if (typeName is SimpleIdentifier) {
       return typeName as SimpleIdentifier;
     } else {
-      return ((typeName as PrefixedIdentifier)).identifier;
+      return (typeName as PrefixedIdentifier).identifier;
     }
   }
 
@@ -11313,7 +12630,7 @@
             Element element2 = identifier2.staticElement;
             if (element != null && element == element2) {
               detectedRepeatOnIndex[j] = true;
-              reportError5(CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [name2]);
+              reportError6(CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [name2]);
             }
           }
         }
@@ -11337,9 +12654,9 @@
     }
     Identifier name = typeName.name;
     if (name.name == sc.Keyword.DYNAMIC.syntax) {
-      reportError5(dynamicTypeError, name, [name.name]);
+      reportError6(dynamicTypeError, name, [name.name]);
     } else {
-      reportError5(nonTypeError, name, [name.name]);
+      reportError6(nonTypeError, name, [name.name]);
     }
     return null;
   }
@@ -11363,10 +12680,11 @@
     }
     return new List.from(types);
   }
+
   void setElement(Identifier typeName, Element element) {
     if (element != null) {
       if (typeName is SimpleIdentifier) {
-        ((typeName as SimpleIdentifier)).staticElement = element;
+        (typeName as SimpleIdentifier).staticElement = element;
       } else if (typeName is PrefixedIdentifier) {
         PrefixedIdentifier identifier = typeName as PrefixedIdentifier;
         identifier.identifier.staticElement = element;
@@ -11413,15 +12731,20 @@
     element.type = type;
   }
 }
+
 /**
  * Kind of the redirecting constructor.
  */
 class RedirectingConstructorKind extends Enum<RedirectingConstructorKind> {
   static final RedirectingConstructorKind CONST = new RedirectingConstructorKind('CONST', 0);
+
   static final RedirectingConstructorKind NORMAL = new RedirectingConstructorKind('NORMAL', 1);
+
   static final List<RedirectingConstructorKind> values = [CONST, NORMAL];
+
   RedirectingConstructorKind(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * Instances of the class `VariableResolverVisitor` are used to resolve
  * [SimpleIdentifier]s to local variables and formal parameters.
@@ -11429,7 +12752,6 @@
  * @coverage dart.engine.resolver
  */
 class VariableResolverVisitor extends ScopedVisitor {
-
   /**
    * The method or function that we are currently visiting, or `null` if we are not inside a
    * method or function.
@@ -11443,7 +12765,20 @@
    * @param source the source representing the compilation unit being visited
    * @param typeProvider the object used to access the types from the core library
    */
-  VariableResolverVisitor(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider);
+  VariableResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider);
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in an AST node.
+   *
+   * @param definingLibrary the element for the library containing the node being visited
+   * @param source the source representing the compilation unit containing the node being visited
+   * @param typeProvider the object used to access the types from the core library
+   * @param nameScope the scope used to resolve identifiers in the node that will first be visited
+   * @param errorListener the error listener that will be informed of any errors that are found
+   *          during resolution
+   */
+  VariableResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : super.con3(definingLibrary, source, typeProvider, nameScope, errorListener);
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -11453,6 +12788,7 @@
       _enclosingFunction = outerFunction;
     }
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
       ExecutableElement outerFunction = _enclosingFunction;
@@ -11466,18 +12802,19 @@
       return super.visitFunctionExpression(node);
     }
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.staticElement != null) {
       return null;
     }
     ASTNode parent = node.parent;
-    if (parent is PrefixedIdentifier && identical(((parent as PrefixedIdentifier)).identifier, node)) {
+    if (parent is PrefixedIdentifier && identical((parent as PrefixedIdentifier).identifier, node)) {
       return null;
     }
-    if (parent is PropertyAccess && identical(((parent as PropertyAccess)).propertyName, node)) {
+    if (parent is PropertyAccess && identical((parent as PropertyAccess).propertyName, node)) {
       return null;
     }
-    if (parent is MethodInvocation && identical(((parent as MethodInvocation)).methodName, node)) {
+    if (parent is MethodInvocation && identical((parent as MethodInvocation).methodName, node)) {
       return null;
     }
     if (parent is ConstructorName) {
@@ -11513,13 +12850,13 @@
     return null;
   }
 }
+
 /**
  * Instances of the class `ClassScope` implement the scope defined by a class.
  *
  * @coverage dart.engine.resolver
  */
 class ClassScope extends EnclosedScope {
-
   /**
    * Initialize a newly created scope enclosed within another scope.
    *
@@ -11530,6 +12867,7 @@
     defineTypeParameters(typeElement);
     defineMembers(typeElement);
   }
+
   AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
     if (existing is PropertyAccessorElement && duplicate is MethodElement) {
       if (existing.nameOffset < duplicate.nameOffset) {
@@ -11567,6 +12905,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `EnclosedScope` implement a scope that is lexically enclosed in
  * another scope.
@@ -11574,18 +12913,17 @@
  * @coverage dart.engine.resolver
  */
 class EnclosedScope extends Scope {
-
   /**
    * The scope in which this scope is lexically enclosed.
    */
-  Scope enclosingScope;
+  Scope _enclosingScope;
 
   /**
-   * A set of names that will be defined in this scope, but right now are not defined. However
-   * according to the scoping rules these names are hidden, even if they were defined in an outer
+   * A table mapping names that will be defined in this scope, but right now are not initialized.
+   * According to the scoping rules these names are hidden, even if they were defined in an outer
    * scope.
    */
-  Set<String> _hiddenNames = new Set<String>();
+  Map<String, Element> _hiddenElements = new Map<String, Element>();
 
   /**
    * Initialize a newly created scope enclosed within another scope.
@@ -11593,35 +12931,43 @@
    * @param enclosingScope the scope in which this scope is lexically enclosed
    */
   EnclosedScope(Scope enclosingScope) {
-    this.enclosingScope = enclosingScope;
+    this._enclosingScope = enclosingScope;
   }
-  AnalysisErrorListener get errorListener => enclosingScope.errorListener;
+
+  Scope get enclosingScope => _enclosingScope;
+
+  AnalysisErrorListener get errorListener => _enclosingScope.errorListener;
 
   /**
-   * Hides the name of the given element in this scope. If there is already an element with the
-   * given name defined in an outer scope, then it will become unavailable.
+   * Record that given element is declared in this scope, but hasn't been initialized yet, so it is
+   * error to use. If there is already an element with the given name defined in an outer scope,
+   * then it will become unavailable.
    *
-   * @param element the element to be hidden in this scope
+   * @param element the element declared, but not initialized in this scope
    */
   void hide(Element element) {
     if (element != null) {
       String name = element.name;
       if (name != null && !name.isEmpty) {
-        javaSetAdd(_hiddenNames, name);
+        _hiddenElements[name] = element;
       }
     }
   }
+
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element element = localLookup(name, referencingLibrary);
     if (element != null) {
       return element;
     }
-    if (_hiddenNames.contains(name)) {
+    Element hiddenElement = _hiddenElements[name];
+    if (hiddenElement != null) {
       errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
+      return hiddenElement;
     }
-    return enclosingScope.lookup3(identifier, name, referencingLibrary);
+    return _enclosingScope.lookup3(identifier, name, referencingLibrary);
   }
 }
+
 /**
  * Instances of the class `FunctionScope` implement the scope defined by a function.
  *
@@ -11629,6 +12975,7 @@
  */
 class FunctionScope extends EnclosedScope {
   ExecutableElement _functionElement;
+
   bool _parametersDefined = false;
 
   /**
@@ -11663,6 +13010,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `FunctionTypeScope` implement the scope defined by a function type
  * alias.
@@ -11671,6 +13019,7 @@
  */
 class FunctionTypeScope extends EnclosedScope {
   FunctionTypeAliasElement _typeElement;
+
   bool _parametersDefined = false;
 
   /**
@@ -11711,13 +13060,13 @@
     }
   }
 }
+
 /**
  * Instances of the class `LabelScope` represent a scope in which a single label is defined.
  *
  * @coverage dart.engine.resolver
  */
 class LabelScope {
-
   /**
    * The label scope enclosing this label scope.
    */
@@ -11794,6 +13143,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `LibraryImportScope` represent the scope containing all of the names
  * available from imported libraries.
@@ -11801,7 +13151,6 @@
  * @coverage dart.engine.resolver
  */
 class LibraryImportScope extends Scope {
-
   /**
    * The element representing the library in which this scope is enclosed.
    */
@@ -11830,12 +13179,15 @@
     this._errorListener = errorListener;
     createImportedNamespaces(definingLibrary);
   }
+
   void define(Element element) {
     if (!Scope.isPrivateName(element.displayName)) {
       super.define(element);
     }
   }
+
   AnalysisErrorListener get errorListener => _errorListener;
+
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element foundElement = localLookup(name, referencingLibrary);
     if (foundElement != null) {
@@ -11856,7 +13208,7 @@
     }
     if (foundElement is MultiplyDefinedElementImpl) {
       String foundEltName = foundElement.displayName;
-      List<Element> conflictingMembers = ((foundElement as MultiplyDefinedElementImpl)).conflictingElements;
+      List<Element> conflictingMembers = (foundElement as MultiplyDefinedElementImpl).conflictingElements;
       String libName1 = getLibraryName(conflictingMembers[0], "");
       String libName2 = getLibraryName(conflictingMembers[1], "");
       _errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
@@ -11940,6 +13292,7 @@
     return new MultiplyDefinedElementImpl(_definingLibrary.context, remaining);
   }
 }
+
 /**
  * Instances of the class `LibraryScope` implement a scope containing all of the names defined
  * in a given library.
@@ -11947,7 +13300,6 @@
  * @coverage dart.engine.resolver
  */
 class LibraryScope extends EnclosedScope {
-
   /**
    * Initialize a newly created scope representing the names defined in the given library.
    *
@@ -11957,6 +13309,7 @@
   LibraryScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) : super(new LibraryImportScope(definingLibrary, errorListener)) {
     defineTopLevelNames(definingLibrary);
   }
+
   AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
     if (existing is PrefixElement) {
       int offset = duplicate.nameOffset;
@@ -12009,6 +13362,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `Namespace` implement a mapping of identifiers to the elements
  * represented by those identifiers. Namespaces are the building blocks for scopes.
@@ -12016,7 +13370,6 @@
  * @coverage dart.engine.resolver
  */
 class Namespace {
-
   /**
    * A table mapping names that are defined in this namespace to the element representing the thing
    * declared with that name.
@@ -12054,6 +13407,7 @@
    */
   Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
 }
+
 /**
  * Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Namespace
  * builders are thread-safe and re-usable.
@@ -12061,7 +13415,6 @@
  * @coverage dart.engine.resolver
  */
 class NamespaceBuilder {
-
   /**
    * Create a namespace representing the export namespace of the given [ExportElement].
    *
@@ -12187,9 +13540,9 @@
   Map<String, Element> apply(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
     for (NamespaceCombinator combinator in combinators) {
       if (combinator is HideElementCombinator) {
-        hide(definedNames, ((combinator as HideElementCombinator)).hiddenNames);
+        hide(definedNames, (combinator as HideElementCombinator).hiddenNames);
       } else if (combinator is ShowElementCombinator) {
-        definedNames = show(definedNames, ((combinator as ShowElementCombinator)).shownNames);
+        definedNames = show(definedNames, (combinator as ShowElementCombinator).shownNames);
       } else {
         AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${combinator.runtimeType.toString()}");
       }
@@ -12237,7 +13590,7 @@
           addAll(definedNames, exportedNames);
         }
       }
-      addAll2(definedNames, ((library.context as InternalAnalysisContext)).getPublicNamespace(library));
+      addAll2(definedNames, (library.context as InternalAnalysisContext).getPublicNamespace(library));
       return definedNames;
     } finally {
       visitedElements.remove(library);
@@ -12280,6 +13633,7 @@
     return newNames;
   }
 }
+
 /**
  * The abstract class `Scope` defines the behavior common to name scopes used by the resolver
  * to determine which names are visible at any given point in the code.
@@ -12287,7 +13641,6 @@
  * @coverage dart.engine.resolver
  */
 abstract class Scope {
-
   /**
    * The prefix used to mark an identifier as being private to its library.
    */
@@ -12339,6 +13692,13 @@
   }
 
   /**
+   * Return the scope in which this scope is lexically enclosed.
+   *
+   * @return the scope in which this scope is lexically enclosed
+   */
+  Scope get enclosingScope => null;
+
+  /**
    * Return the element with which the given identifier is associated, or `null` if the name
    * is not defined within this scope.
    *
@@ -12447,6 +13807,106 @@
     return element.name;
   }
 }
+
+/**
+ * Instances of the class `ScopeBuilder` build the scope for a given node in an AST structure.
+ * At the moment, this class only handles top-level and class-level declarations.
+ */
+class ScopeBuilder {
+  /**
+   * Return the scope in which the given AST structure should be resolved.
+   *
+   * @param node the root of the AST structure to be resolved
+   * @param errorListener the listener to which analysis errors will be reported
+   * @return the scope in which the given AST structure should be resolved
+   * @throws AnalysisException if the AST structure has not been resolved or is not part of a
+   *           [CompilationUnit]
+   */
+  static Scope scopeFor(ASTNode node, AnalysisErrorListener errorListener) {
+    if (node == null) {
+      throw new AnalysisException.con1("Cannot create scope: node is null");
+    } else if (node is CompilationUnit) {
+      ScopeBuilder builder = new ScopeBuilder(errorListener);
+      return builder.scopeForAstNode(node);
+    }
+    ASTNode parent = node.parent;
+    if (parent == null) {
+      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
+    }
+    ScopeBuilder builder = new ScopeBuilder(errorListener);
+    return builder.scopeForAstNode(parent);
+  }
+
+  /**
+   * The listener to which analysis errors will be reported.
+   */
+  AnalysisErrorListener _errorListener;
+
+  /**
+   * Initialize a newly created scope builder to generate a scope that will report errors to the
+   * given listener.
+   *
+   * @param errorListener the listener to which analysis errors will be reported
+   */
+  ScopeBuilder(AnalysisErrorListener errorListener) {
+    this._errorListener = errorListener;
+  }
+
+  /**
+   * Return the scope in which the given AST structure should be resolved.
+   *
+   * <b>Note:</b> This method needs to be kept in sync with
+   * [IncrementalResolver#canBeResolved].
+   *
+   * @param node the root of the AST structure to be resolved
+   * @return the scope in which the given AST structure should be resolved
+   * @throws AnalysisException if the AST structure has not been resolved or is not part of a
+   *           [CompilationUnit]
+   */
+  Scope scopeForAstNode(ASTNode node) {
+    if (node is CompilationUnit) {
+      return scopeForCompilationUnit(node as CompilationUnit);
+    }
+    ASTNode parent = node.parent;
+    if (parent == null) {
+      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
+    }
+    Scope scope = scopeForAstNode(parent);
+    if (node is ClassDeclaration) {
+      scope = new ClassScope(scope, (node as ClassDeclaration).element);
+    } else if (node is ClassTypeAlias) {
+      scope = new ClassScope(scope, (node as ClassTypeAlias).element);
+    } else if (node is ConstructorDeclaration) {
+      FunctionScope functionScope = new FunctionScope(scope, (node as ConstructorDeclaration).element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    } else if (node is FunctionDeclaration) {
+      FunctionScope functionScope = new FunctionScope(scope, (node as FunctionDeclaration).element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    } else if (node is FunctionTypeAlias) {
+      scope = new FunctionTypeScope(scope, (node as FunctionTypeAlias).element);
+    } else if (node is MethodDeclaration) {
+      FunctionScope functionScope = new FunctionScope(scope, (node as MethodDeclaration).element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    }
+    return scope;
+  }
+
+  Scope scopeForCompilationUnit(CompilationUnit node) {
+    CompilationUnitElement unitElement = node.element;
+    if (unitElement == null) {
+      throw new AnalysisException.con1("Cannot create scope: compilation unit is not resolved");
+    }
+    LibraryElement libraryElement = unitElement.library;
+    if (libraryElement == null) {
+      throw new AnalysisException.con1("Cannot create scope: compilation unit is not part of a library");
+    }
+    return new LibraryScope(libraryElement, _errorListener);
+  }
+}
+
 /**
  * Instances of the class `ConstantVerifier` traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
@@ -12455,7 +13915,6 @@
  * @coverage dart.engine.resolver
  */
 class ConstantVerifier extends RecursiveASTVisitor<Object> {
-
   /**
    * The error reporter by which errors will be reported.
    */
@@ -12493,6 +13952,7 @@
     this._numType = typeProvider.numType;
     this._stringType = typeProvider.stringType;
   }
+
   Object visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
     Element element = node.element;
@@ -12511,6 +13971,7 @@
     }
     return null;
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     if (node.constKeyword != null) {
       validateInitializers(node);
@@ -12518,15 +13979,18 @@
     validateDefaultValues(node.parameters);
     return super.visitConstructorDeclaration(node);
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     super.visitFunctionExpression(node);
     validateDefaultValues(node.parameters);
     return null;
   }
+
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     validateConstantArguments2(node);
     return super.visitInstanceCreationExpression(node);
   }
+
   Object visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
     if (node.constKeyword != null) {
@@ -12536,6 +14000,7 @@
     }
     return null;
   }
+
   Object visitMapLiteral(MapLiteral node) {
     super.visitMapLiteral(node);
     bool isConst = node.constKeyword != null;
@@ -12548,7 +14013,7 @@
         EvaluationResultImpl result = validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
         validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
         if (result is ValidResult) {
-          Object value = ((result as ValidResult)).value;
+          Object value = (result as ValidResult).value;
           if (keys.contains(value)) {
             invalidKeys.add(key);
           } else {
@@ -12558,7 +14023,7 @@
       } else {
         EvaluationResultImpl result = key.accept(new ConstantVisitor());
         if (result is ValidResult) {
-          Object value = ((result as ValidResult)).value;
+          Object value = (result as ValidResult).value;
           if (keys.contains(value)) {
             invalidKeys.add(key);
           } else {
@@ -12576,16 +14041,19 @@
     }
     return null;
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     validateDefaultValues(node.parameters);
     return null;
   }
+
   Object visitSwitchCase(SwitchCase node) {
     super.visitSwitchCase(node);
     validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
     return null;
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
@@ -12611,7 +14079,7 @@
    */
   void reportErrors(EvaluationResultImpl result, ErrorCode errorCode) {
     if (result is ErrorResult) {
-      for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
+      for (ErrorResult_ErrorData data in (result as ErrorResult).errorData) {
         ErrorCode dataErrorCode = data.errorCode;
         if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
           _errorReporter.reportError2(dataErrorCode, data.node, []);
@@ -12644,7 +14112,7 @@
   void validateConstantArguments(ArgumentList argumentList) {
     for (Expression argument in argumentList.arguments) {
       if (argument is NamedExpression) {
-        argument = ((argument as NamedExpression)).expression;
+        argument = (argument as NamedExpression).expression;
       }
       validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
     }
@@ -12698,7 +14166,7 @@
    * @param expression the expression to validate
    */
   void validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
-    EvaluationResultImpl result = expression.accept(new ConstantVisitor_13(this, parameterElements));
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor_14(this, parameterElements));
     reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
   }
 
@@ -12743,10 +14211,14 @@
     }
   }
 }
-class ConstantVisitor_13 extends ConstantVisitor {
+
+class ConstantVisitor_14 extends ConstantVisitor {
   final ConstantVerifier ConstantVerifier_this;
+
   List<ParameterElement> parameterElements;
-  ConstantVisitor_13(this.ConstantVerifier_this, this.parameterElements) : super();
+
+  ConstantVisitor_14(this.ConstantVerifier_this, this.parameterElements) : super();
+
   EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
     Element element = node.staticElement;
     for (ParameterElement parameterElement in parameterElements) {
@@ -12775,6 +14247,7 @@
     return super.visitSimpleIdentifier(node);
   }
 }
+
 /**
  * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver.
@@ -12782,21 +14255,6 @@
  * @coverage dart.engine.resolver
  */
 class ErrorVerifier extends RecursiveASTVisitor<Object> {
-
-  /**
-   * Checks if the given expression is the reference to the type.
-   *
-   * @param expr the expression to evaluate
-   * @return `true` if the given expression is the reference to the type
-   */
-  static bool isTypeReference(Expression expr) {
-    if (expr is Identifier) {
-      Identifier identifier = expr as Identifier;
-      return identifier.staticElement is ClassElement;
-    }
-    return false;
-  }
-
   /**
    * The error reporter by which errors will be reported.
    */
@@ -12960,9 +14418,9 @@
   Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElement>();
 
   /**
-   * A table mapping names to the export elements exported them.
+   * A table mapping names to the exported elements.
    */
-  Map<String, ExportElement> _exportedNames = new Map<String, ExportElement>();
+  Map<String, Element> _exportedElements = new Map<String, Element>();
 
   /**
    * A set of the names of the variable initializers we are visiting now.
@@ -12974,6 +14432,7 @@
    * [CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
    */
   List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
+
   ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, TypeProvider typeProvider, InheritanceManager inheritanceManager) {
     this._errorReporter = errorReporter;
     this._currentLibrary = currentLibrary;
@@ -12998,18 +14457,22 @@
         _boolType,
         typeProvider.stringType];
   }
+
   Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     checkForArgumentDefinitionTestNonParameter(node);
     return super.visitArgumentDefinitionTest(node);
   }
+
   Object visitArgumentList(ArgumentList node) {
     checkForArgumentTypeNotAssignable(node);
     return super.visitArgumentList(node);
   }
+
   Object visitAssertStatement(AssertStatement node) {
     checkForNonBoolExpression(node);
     return super.visitAssertStatement(node);
   }
+
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
@@ -13022,10 +14485,12 @@
     checkForArgumentTypeNotAssignable2(node.rightHandSide);
     return super.visitAssignmentExpression(node);
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     checkForArgumentTypeNotAssignable2(node.rightOperand);
     return super.visitBinaryExpression(node);
   }
+
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     int previousReturnWithCount = _returnWithCount;
     int previousReturnWithoutCount = _returnWithoutCount;
@@ -13040,6 +14505,7 @@
     }
     return null;
   }
+
   Object visitCatchClause(CatchClause node) {
     bool previousIsInCatchClause = _isInCatchClause;
     try {
@@ -13049,6 +14515,7 @@
       _isInCatchClause = previousIsInCatchClause;
     }
   }
+
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerClass = _enclosingClass;
     try {
@@ -13082,6 +14549,7 @@
       checkForFinalNotInitialized(node);
       checkForDuplicateDefinitionInheritance();
       checkForConflictingGetterAndMethod();
+      checkForConflictingInstanceGetterAndSuperclassMember();
       checkImplementsSuperClass(node);
       checkImplementsFunctionWithoutCall(node);
       return super.visitClassDeclaration(node);
@@ -13091,6 +14559,7 @@
       _enclosingClass = outerClass;
     }
   }
+
   Object visitClassTypeAlias(ClassTypeAlias node) {
     checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     checkForAllMixinErrorCodes(node.withClause);
@@ -13104,6 +14573,7 @@
     }
     return super.visitClassTypeAlias(node);
   }
+
   Object visitComment(Comment node) {
     _isInComment = true;
     try {
@@ -13112,10 +14582,12 @@
       _isInComment = false;
     }
   }
+
   Object visitConditionalExpression(ConditionalExpression node) {
     checkForNonBoolCondition(node.condition);
     return super.visitConditionalExpression(node);
   }
+
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -13140,6 +14612,7 @@
       _enclosingFunction = outerFunction;
     }
   }
+
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     _isInConstructorInitializer = true;
     try {
@@ -13149,32 +14622,37 @@
       _isInConstructorInitializer = false;
     }
   }
+
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     checkForInvalidAssignment2(node.identifier, node.defaultValue);
     checkForDefaultValueInFunctionTypedParameter(node);
     return super.visitDefaultFormalParameter(node);
   }
+
   Object visitDoStatement(DoStatement node) {
     checkForNonBoolCondition(node.condition);
     return super.visitDoStatement(node);
   }
+
   Object visitExportDirective(ExportDirective node) {
     checkForAmbiguousExport(node);
     checkForExportDuplicateLibraryName(node);
     checkForExportInternalLibrary(node);
     return super.visitExportDirective(node);
   }
+
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
     Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
     checkForReturnOfInvalidType(node.expression, expectedReturnType);
     return super.visitExpressionFunctionBody(node);
   }
+
   Object visitFieldDeclaration(FieldDeclaration node) {
     if (!node.isStatic) {
       VariableDeclarationList variables = node.fields;
       if (variables.isConst) {
-        _errorReporter.reportError4(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
+        _errorReporter.reportError5(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
       }
     }
     _isInStaticVariableDeclaration = node.isStatic;
@@ -13187,12 +14665,14 @@
       _isInInstanceVariableDeclaration = false;
     }
   }
+
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     checkForConstFormalParameter(node);
     checkForPrivateOptionalParameter(node);
     checkForFieldInitializingFormalRedirectingConstructor(node);
     return super.visitFieldFormalParameter(node);
   }
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -13218,6 +14698,7 @@
       _enclosingFunction = outerFunction;
     }
   }
+
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
       ExecutableElement outerFunction = _enclosingFunction;
@@ -13231,6 +14712,7 @@
       return super.visitFunctionExpression(node);
     }
   }
+
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     Expression functionExpression = node.function;
     Type2 expressionType = functionExpression.staticType;
@@ -13239,12 +14721,14 @@
     }
     return super.visitFunctionExpressionInvocation(node);
   }
+
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     checkForDefaultValueInFunctionTypeAlias(node);
     checkForTypeAliasCannotReferenceItself_function(node);
     return super.visitFunctionTypeAlias(node);
   }
+
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     bool old = _isInFunctionTypedFormalParameter;
     _isInFunctionTypedFormalParameter = true;
@@ -13254,19 +14738,23 @@
       _isInFunctionTypedFormalParameter = old;
     }
   }
+
   Object visitIfStatement(IfStatement node) {
     checkForNonBoolCondition(node.condition);
     return super.visitIfStatement(node);
   }
+
   Object visitImportDirective(ImportDirective node) {
     checkForImportDuplicateLibraryName(node);
     checkForImportInternalLibrary(node);
     return super.visitImportDirective(node);
   }
+
   Object visitIndexExpression(IndexExpression node) {
     checkForArgumentTypeNotAssignable2(node.index);
     return super.visitIndexExpression(node);
   }
+
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     _isInConstInstanceCreation = node.isConst;
     try {
@@ -13289,6 +14777,7 @@
       _isInConstInstanceCreation = false;
     }
   }
+
   Object visitListLiteral(ListLiteral node) {
     if (node.constKeyword != null) {
       TypeArgumentList typeArguments = node.typeArguments;
@@ -13303,6 +14792,7 @@
     checkForListElementTypeNotAssignable(node);
     return super.visitListLiteral(node);
   }
+
   Object visitMapLiteral(MapLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
@@ -13319,6 +14809,7 @@
     checkForConstMapKeyExpressionTypeImplementsEquals2(node);
     return super.visitMapLiteral(node);
   }
+
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement previousFunction = _enclosingFunction;
     try {
@@ -13331,7 +14822,6 @@
       }
       if (node.isSetter || node.isGetter) {
         checkForMismatchedAccessorTypes(node, methodName);
-        checkForConflictingInstanceGetterAndSuperclassMember(node);
       }
       if (node.isGetter) {
         checkForConflictingStaticGetterAndInstanceSetter(node);
@@ -13343,6 +14833,8 @@
         checkForOptionalParameterInOperator(node);
         checkForWrongNumberOfParametersForOperator(node);
         checkForNonVoidReturnTypeForOperator(node);
+      } else {
+        checkForConflictingInstanceMethodSetter(node);
       }
       checkForConcreteClassWithAbstractMember(node);
       checkForAllInvalidOverrideErrorCodes3(node);
@@ -13352,38 +14844,48 @@
       _isInStaticMethod = false;
     }
   }
+
   Object visitMethodInvocation(MethodInvocation node) {
     Expression target = node.realTarget;
     SimpleIdentifier methodName = node.methodName;
-    checkForStaticAccessToInstanceMember(target, methodName);
-    checkForInstanceAccessToStaticMember(target, methodName);
-    if (target == null) {
+    if (target != null) {
+      ClassElement typeReference = ElementResolver.getTypeReference(target);
+      checkForStaticAccessToInstanceMember(typeReference, methodName);
+      checkForInstanceAccessToStaticMember(typeReference, methodName);
+    } else {
       checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
     }
     return super.visitMethodInvocation(node);
   }
+
   Object visitNativeClause(NativeClause node) {
     if (!_isInSystemLibrary) {
       _errorReporter.reportError2(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
     }
     return super.visitNativeClause(node);
   }
+
   Object visitNativeFunctionBody(NativeFunctionBody node) {
     checkForNativeFunctionBodyInNonSDKCode(node);
     return super.visitNativeFunctionBody(node);
   }
+
   Object visitPostfixExpression(PostfixExpression node) {
     checkForAssignmentToFinal2(node.operand);
     checkForIntNotAssignable(node.operand);
     return super.visitPostfixExpression(node);
   }
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (node.parent is! Annotation) {
-      checkForStaticAccessToInstanceMember(node.prefix, node.identifier);
-      checkForInstanceAccessToStaticMember(node.prefix, node.identifier);
+      ClassElement typeReference = ElementResolver.getTypeReference(node.prefix);
+      SimpleIdentifier name = node.identifier;
+      checkForStaticAccessToInstanceMember(typeReference, name);
+      checkForInstanceAccessToStaticMember(typeReference, name);
     }
     return super.visitPrefixedIdentifier(node);
   }
+
   Object visitPrefixExpression(PrefixExpression node) {
     sc.TokenType operatorType = node.operator.type;
     Expression operand = node.operand;
@@ -13395,13 +14897,15 @@
     checkForIntNotAssignable(operand);
     return super.visitPrefixExpression(node);
   }
+
   Object visitPropertyAccess(PropertyAccess node) {
-    Expression target = node.realTarget;
+    ClassElement typeReference = ElementResolver.getTypeReference(node.realTarget);
     SimpleIdentifier propertyName = node.propertyName;
-    checkForStaticAccessToInstanceMember(target, propertyName);
-    checkForInstanceAccessToStaticMember(target, propertyName);
+    checkForStaticAccessToInstanceMember(typeReference, propertyName);
+    checkForInstanceAccessToStaticMember(typeReference, propertyName);
     return super.visitPropertyAccess(node);
   }
+
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     _isInConstructorInitializer = true;
     try {
@@ -13410,10 +14914,12 @@
       _isInConstructorInitializer = false;
     }
   }
+
   Object visitRethrowExpression(RethrowExpression node) {
     checkForRethrowOutsideCatch(node);
     return super.visitRethrowExpression(node);
   }
+
   Object visitReturnStatement(ReturnStatement node) {
     if (node.expression == null) {
       _returnWithoutCount++;
@@ -13423,11 +14929,13 @@
     checkForAllReturnStatementErrorCodes(node);
     return super.visitReturnStatement(node);
   }
+
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     checkForConstFormalParameter(node);
     checkForPrivateOptionalParameter(node);
     return super.visitSimpleFormalParameter(node);
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     checkForImplicitThisReferenceInInitializer(node);
     if (!isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
@@ -13435,6 +14943,7 @@
     }
     return super.visitSimpleIdentifier(node);
   }
+
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _isInConstructorInitializer = true;
     try {
@@ -13443,34 +14952,41 @@
       _isInConstructorInitializer = false;
     }
   }
+
   Object visitSwitchStatement(SwitchStatement node) {
     checkForInconsistentCaseExpressionTypes(node);
     checkForSwitchExpressionNotAssignable(node);
     checkForCaseBlocksNotTerminated(node);
     return super.visitSwitchStatement(node);
   }
+
   Object visitThisExpression(ThisExpression node) {
     checkForInvalidReferenceToThis(node);
     return super.visitThisExpression(node);
   }
+
   Object visitThrowExpression(ThrowExpression node) {
     checkForConstEvalThrowsException(node);
     return super.visitThrowExpression(node);
   }
+
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     checkForFinalNotInitialized2(node.variables);
     return super.visitTopLevelVariableDeclaration(node);
   }
+
   Object visitTypeName(TypeName node) {
     checkForTypeArgumentNotMatchingBounds(node);
     checkForTypeParameterReferencedByStatic(node);
     return super.visitTypeName(node);
   }
+
   Object visitTypeParameter(TypeParameter node) {
     checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
     checkForTypeParameterSupertypeOfItsBound(node);
     return super.visitTypeParameter(node);
   }
+
   Object visitVariableDeclaration(VariableDeclaration node) {
     SimpleIdentifier nameNode = node.name;
     Expression initializerNode = node.initializer;
@@ -13489,11 +15005,14 @@
     }
     return null;
   }
+
   Object visitVariableDeclarationList(VariableDeclarationList node) => super.visitVariableDeclarationList(node);
+
   Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     checkForFinalNotInitialized2(node.variables);
     return super.visitVariableDeclarationStatement(node);
   }
+
   Object visitWhileStatement(WhileStatement node) {
     checkForNonBoolCondition(node.condition);
     return super.visitWhileStatement(node);
@@ -13541,10 +15060,10 @@
     for (FormalParameter formalParameter in formalParameters) {
       FormalParameter parameter = formalParameter;
       if (parameter is DefaultFormalParameter) {
-        parameter = ((parameter as DefaultFormalParameter)).parameter;
+        parameter = (parameter as DefaultFormalParameter).parameter;
       }
       if (parameter is FieldFormalParameter) {
-        FieldElement fieldElement = ((parameter.element as FieldFormalParameterElementImpl)).field;
+        FieldElement fieldElement = (parameter.element as FieldFormalParameterElementImpl).field;
         INIT_STATE state = fieldElementsMap[fieldElement];
         if (identical(state, INIT_STATE.NOT_INIT)) {
           fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
@@ -13923,7 +15442,7 @@
       if (checkForExtendsOrImplementsDisallowedClass(mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
         problemReported = true;
       } else {
-        ClassElement mixinElement = ((mixinType as InterfaceType)).element;
+        ClassElement mixinElement = (mixinType as InterfaceType).element;
         problemReported = javaBooleanOr(problemReported, checkForMixinDeclaresConstructor(mixinName, mixinElement));
         problemReported = javaBooleanOr(problemReported, checkForMixinInheritsNotFromObject(mixinName, mixinElement));
         problemReported = javaBooleanOr(problemReported, checkForMixinReferencesSuper(mixinName, mixinElement));
@@ -13997,7 +15516,7 @@
     FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
     Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
     Expression returnExpression = node.expression;
-    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !((_enclosingFunction as ConstructorElement)).isFactory;
+    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !(_enclosingFunction as ConstructorElement).isFactory;
     if (isGenerativeConstructor) {
       if (returnExpression == null) {
         return false;
@@ -14033,17 +15552,19 @@
       return false;
     }
     Namespace namespace = new NamespaceBuilder().createExportNamespace(exportElement);
-    Set<String> newNames = namespace.definedNames.keys.toSet();
-    for (String name in newNames) {
-      ExportElement prevElement = _exportedNames[name];
-      if (prevElement != null && prevElement != exportElement) {
+    Map<String, Element> definedNames = namespace.definedNames;
+    for (MapEntry<String, Element> definedEntry in getMapEntrySet(definedNames)) {
+      String name = definedEntry.getKey();
+      Element element = definedEntry.getValue();
+      Element prevElement = _exportedElements[name];
+      if (element != null && prevElement != null && prevElement != element) {
         _errorReporter.reportError2(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
             name,
-            prevElement.exportedLibrary.definingCompilationUnit.displayName,
-            exportedLibrary.definingCompilationUnit.displayName]);
+            prevElement.library.definingCompilationUnit.displayName,
+            element.library.definingCompilationUnit.displayName]);
         return true;
       } else {
-        _exportedNames[name] = exportElement;
+        _exportedElements[name] = element;
       }
     }
     return false;
@@ -14180,10 +15701,10 @@
   bool checkForAssignmentToFinal2(Expression expression) {
     Element element = null;
     if (expression is Identifier) {
-      element = ((expression as Identifier)).staticElement;
+      element = (expression as Identifier).staticElement;
     }
     if (expression is PropertyAccess) {
-      element = ((expression as PropertyAccess)).propertyName.staticElement;
+      element = (expression as PropertyAccess).propertyName.staticElement;
     }
     if (element is PropertyAccessorElement) {
       PropertyAccessorElement accessor = element as PropertyAccessorElement;
@@ -14258,13 +15779,13 @@
         return false;
       }
       if (statement is ExpressionStatement) {
-        Expression expression = ((statement as ExpressionStatement)).expression;
+        Expression expression = (statement as ExpressionStatement).expression;
         if (expression is ThrowExpression) {
           return false;
         }
       }
     }
-    _errorReporter.reportError4(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
+    _errorReporter.reportError5(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
     return true;
   }
 
@@ -14302,7 +15823,7 @@
     if (!implementsEqualsWhenNotAllowed(type)) {
       return false;
     }
-    _errorReporter.reportError4(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
+    _errorReporter.reportError5(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
     return true;
   }
 
@@ -14392,7 +15913,7 @@
         continue;
       }
       hasProblem = true;
-      _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
+      _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
           _enclosingClass.displayName,
           inherited.enclosingElement.displayName,
           name]);
@@ -14407,7 +15928,7 @@
         continue;
       }
       hasProblem = true;
-      _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
+      _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
           _enclosingClass.displayName,
           inherited.enclosingElement.displayName,
           name]);
@@ -14416,15 +15937,65 @@
   }
 
   /**
-   * This verifies that the superclass of the enclosing class does not declare accessible static
-   * member with the same name as the passed instance getter/setter method declaration.
+   * This verifies that the superclass of the [enclosingClass] does not declare accessible
+   * static members with the same name as the instance getters/setters declared in
+   * [enclosingClass].
    *
    * @param node the method declaration to evaluate
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
    * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
    */
-  bool checkForConflictingInstanceGetterAndSuperclassMember(MethodDeclaration node) {
+  bool checkForConflictingInstanceGetterAndSuperclassMember() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    bool hasProblem = false;
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (accessor.isStatic) {
+        continue;
+      }
+      String name = accessor.displayName;
+      bool getter = accessor.isGetter;
+      if (accessor.isSetter && accessor.isSynthetic) {
+        continue;
+      }
+      ExecutableElement superElement;
+      superElement = enclosingType.lookUpGetterInSuperclass(name, _currentLibrary);
+      if (superElement == null) {
+        superElement = enclosingType.lookUpSetterInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        superElement = enclosingType.lookUpMethodInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        continue;
+      }
+      if (!superElement.isStatic) {
+        continue;
+      }
+      ClassElement superElementClass = superElement.enclosingElement as ClassElement;
+      InterfaceType superElementType = superElementClass.type;
+      hasProblem = true;
+      if (getter) {
+        _errorReporter.reportError3(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+      } else {
+        _errorReporter.reportError3(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+      }
+    }
+    return hasProblem;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have a setter with the same name as the passed
+   * instance method declaration.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_METHOD_SETTER
+   */
+  bool checkForConflictingInstanceMethodSetter(MethodDeclaration node) {
     if (node.isStatic) {
       return false;
     }
@@ -14436,28 +16007,14 @@
     if (_enclosingClass == null) {
       return false;
     }
-    InterfaceType enclosingType = _enclosingClass.type;
-    ExecutableElement superElement;
-    superElement = enclosingType.lookUpGetterInSuperclass(name, _currentLibrary);
-    if (superElement == null) {
-      superElement = enclosingType.lookUpSetterInSuperclass(name, _currentLibrary);
-    }
-    if (superElement == null) {
-      superElement = enclosingType.lookUpMethodInSuperclass(name, _currentLibrary);
-    }
-    if (superElement == null) {
+    ExecutableElement setter = _inheritanceManager.lookupMember(_enclosingClass, "${name}=");
+    if (setter == null) {
       return false;
     }
-    if (!superElement.isStatic) {
-      return false;
-    }
-    ClassElement superElementClass = superElement.enclosingElement as ClassElement;
-    InterfaceType superElementType = superElementClass.type;
-    if (node.isGetter) {
-      _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
-    } else {
-      _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
-    }
+    _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, nameNode, [
+        _enclosingClass.displayName,
+        name,
+        setter.enclosingElement.displayName]);
     return true;
   }
 
@@ -14549,11 +16106,11 @@
     for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
       String name = typeParameter.name;
       if (_enclosingClass.name == name) {
-        _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
+        _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
         problemReported = true;
       }
       if (_enclosingClass.getMethod(name) != null || _enclosingClass.getGetter(name) != null || _enclosingClass.getSetter(name) != null) {
-        _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
+        _errorReporter.reportError4(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
         problemReported = true;
       }
     }
@@ -14709,7 +16266,7 @@
     if (type.element.isAbstract) {
       ConstructorElement element = node.staticElement;
       if (element != null && !element.isFactory) {
-        if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CONST)) {
+        if (identical((node.keyword as sc.KeywordToken).keyword, sc.Keyword.CONST)) {
           _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
         } else {
           _errorReporter.reportError2(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
@@ -14909,7 +16466,7 @@
     if (inheritedMember.isStatic) {
       return false;
     }
-    _errorReporter.reportError3(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
+    _errorReporter.reportError4(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
     return true;
   }
 
@@ -15031,7 +16588,7 @@
         if (superType == _typeProvider.numType) {
           ASTNode grandParent = typeName.parent.parent;
           if (grandParent is ClassDeclaration) {
-            ClassElement classElement = ((grandParent as ClassDeclaration)).element;
+            ClassElement classElement = (grandParent as ClassDeclaration).element;
             Type2 classType = classElement.type;
             if (classType != null && (classType == _typeProvider.intType || classType == _typeProvider.doubleType)) {
               return false;
@@ -15368,19 +16925,21 @@
   }
 
   /**
-   * This checks that if the given "target" is not a type reference then the "name" is reference to
-   * an instance member.
+   * This checks the given "typeReference" is not a type reference and that then the "name" is
+   * reference to an instance member.
    *
-   * @param target the target of the name access to evaluate
+   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
+   *          or `null`, aka, the class element of 'C' in 'C.x', see
+   *          [getTypeReference]
    * @param name the accessed name to evaluate
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
    */
-  bool checkForInstanceAccessToStaticMember(Expression target, SimpleIdentifier name) {
-    if (target == null) {
+  bool checkForInstanceAccessToStaticMember(ClassElement typeReference, SimpleIdentifier name) {
+    if (_isInComment) {
       return false;
     }
-    if (_isInComment) {
+    if (typeReference != null) {
       return false;
     }
     Element element = name.staticElement;
@@ -15394,9 +16953,6 @@
     if (!executableElement.isStatic) {
       return false;
     }
-    if (isTypeReference(target)) {
-      return false;
-    }
     _errorReporter.reportError2(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [name.name]);
     return true;
   }
@@ -15611,7 +17167,7 @@
     bool problemReported = false;
     for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
       if (className == accessor.name) {
-        _errorReporter.reportError3(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
+        _errorReporter.reportError4(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
         problemReported = true;
       }
     }
@@ -15895,9 +17451,9 @@
       }
       ExecutableElement elt = membersInheritedFromSuperclasses.get(executableElt.name);
       if (elt != null) {
-        if (elt is MethodElement && !((elt as MethodElement)).isAbstract) {
+        if (elt is MethodElement && !(elt as MethodElement).isAbstract) {
           continue;
-        } else if (elt is PropertyAccessorElement && !((elt as PropertyAccessorElement)).isAbstract) {
+        } else if (elt is PropertyAccessorElement && !(elt as PropertyAccessorElement).isAbstract) {
           continue;
         }
       }
@@ -16210,12 +17766,12 @@
           builder.append(separator);
         }
         builder.append(classElt.displayName);
-        _errorReporter.reportError3(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
+        _errorReporter.reportError4(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
         return true;
       } else {
         InterfaceType supertype = classElt.supertype;
         ErrorCode errorCode = (supertype != null && _enclosingClass == supertype.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS) as ErrorCode;
-        _errorReporter.reportError3(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
+        _errorReporter.reportError4(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
         return true;
       }
     }
@@ -16253,7 +17809,7 @@
     ConstructorName redirectedConstructor = node.redirectedConstructor;
     if (redirectedConstructor != null) {
       for (FormalParameter parameter in node.parameters.parameters) {
-        if (parameter is DefaultFormalParameter && ((parameter as DefaultFormalParameter)).defaultValue != null) {
+        if (parameter is DefaultFormalParameter && (parameter as DefaultFormalParameter).defaultValue != null) {
           _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, parameter.identifier, []);
           errorReported = true;
         }
@@ -16399,15 +17955,20 @@
   }
 
   /**
-   * This checks that if the given "target" is the type reference then the "name" is not the
-   * reference to a instance member.
+   * This checks the given "typeReference" and that the "name" is not the reference to an instance
+   * member.
    *
-   * @param target the target of the name access to evaluate
+   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
+   *          or `null`, aka, the class element of 'C' in 'C.x', see
+   *          [getTypeReference]
    * @param name the accessed name to evaluate
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
    */
-  bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name) {
+  bool checkForStaticAccessToInstanceMember(ClassElement typeReference, SimpleIdentifier name) {
+    if (typeReference == null) {
+      return false;
+    }
     Element element = name.staticElement;
     if (element is! ExecutableElement) {
       return false;
@@ -16416,9 +17977,6 @@
     if (memberElement.isStatic) {
       return false;
     }
-    if (!isTypeReference(target)) {
-      return false;
-    }
     _errorReporter.reportError2(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
     return true;
   }
@@ -16508,7 +18066,7 @@
     List<Type2> typeParameters = classElement.type.typeArguments;
     List<TypeParameterElement> boundingElts = classElement.typeParameters;
     NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
-    List<Type2> typeArguments = ((type as InterfaceType)).typeArguments;
+    List<Type2> typeArguments = (type as InterfaceType).typeArguments;
     int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length);
     bool foundError = false;
     for (int i = 0; i < loopThroughIndex; i++) {
@@ -16614,7 +18172,7 @@
           offset = returnType.offset;
           length = (name != null ? name.end : returnType.end) - offset;
         }
-        _errorReporter.reportError3(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
+        _errorReporter.reportError4(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
       }
       return false;
     }
@@ -16639,7 +18197,7 @@
     if (enclosingElement is! ClassElement) {
       return false;
     }
-    if ((element is MethodElement && !((element as MethodElement)).isStatic) || (element is PropertyAccessorElement && !((element as PropertyAccessorElement)).isStatic)) {
+    if ((element is MethodElement && !(element as MethodElement).isStatic) || (element is PropertyAccessorElement && !(element as PropertyAccessorElement).isStatic)) {
       return false;
     }
     if (identical(enclosingElement, _enclosingClass)) {
@@ -16733,7 +18291,7 @@
       return false;
     }
     ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
-    if (callMethod == null || callMethod is! MethodElement || ((callMethod as MethodElement)).isAbstract) {
+    if (callMethod == null || callMethod is! MethodElement || (callMethod as MethodElement).isAbstract) {
       _errorReporter.reportError2(StaticWarningCode.FUNCTION_WITHOUT_CALL, node.name, []);
       return true;
     }
@@ -16818,7 +18376,7 @@
    */
   VariableElement getVariableElement(Expression expression) {
     if (expression is Identifier) {
-      Element element = ((expression as Identifier)).staticElement;
+      Element element = (expression as Identifier).staticElement;
       if (element is VariableElement) {
         return element as VariableElement;
       }
@@ -16839,7 +18397,7 @@
       javaSetAdd(constructors, current);
       current = current.redirectedConstructor;
       if (current is ConstructorMember) {
-        current = ((current as ConstructorMember)).baseElement;
+        current = (current as ConstructorMember).baseElement;
       }
     }
     return false;
@@ -16873,7 +18431,7 @@
           break;
         }
       }
-      current.accept(new GeneralizingElementVisitor_14(target, toCheck));
+      current.accept(new GeneralizingElementVisitor_15(target, toCheck));
       javaSetAdd(checked, current);
     }
   }
@@ -16897,13 +18455,14 @@
     }
     return true;
   }
+
   bool isFunctionType(Type2 type) {
     if (type.isDynamic || type.isBottom) {
       return true;
     } else if (type is FunctionType || type.isDartCoreFunction) {
       return true;
     } else if (type is InterfaceType) {
-      MethodElement callMethod = ((type as InterfaceType)).lookUpMethod(ElementResolver.CALL_METHOD_NAME, _currentLibrary);
+      MethodElement callMethod = (type as InterfaceType).lookUpMethod(ElementResolver.CALL_METHOD_NAME, _currentLibrary);
       return callMethod != null;
     }
     return false;
@@ -16961,10 +18520,10 @@
     if (parent is ConstructorName || parent is MethodInvocation || parent is PropertyAccess || parent is SuperConstructorInvocation) {
       return true;
     }
-    if (parent is PrefixedIdentifier && identical(((parent as PrefixedIdentifier)).identifier, node)) {
+    if (parent is PrefixedIdentifier && identical((parent as PrefixedIdentifier).identifier, node)) {
       return true;
     }
-    if (parent is Annotation && identical(((parent as Annotation)).constructorName, node)) {
+    if (parent is Annotation && identical((parent as Annotation).constructorName, node)) {
       return true;
     }
     if (parent is CommentReference) {
@@ -17058,6 +18617,7 @@
     return false;
   }
 }
+
 /**
  * This enum holds one of four states of a field initialization state through a constructor
  * signature, not initialized, initialized in the field declaration, initialized in the field
@@ -17065,21 +18625,31 @@
  */
 class INIT_STATE extends Enum<INIT_STATE> {
   static final INIT_STATE NOT_INIT = new INIT_STATE('NOT_INIT', 0);
+
   static final INIT_STATE INIT_IN_DECLARATION = new INIT_STATE('INIT_IN_DECLARATION', 1);
+
   static final INIT_STATE INIT_IN_FIELD_FORMAL = new INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
+
   static final INIT_STATE INIT_IN_INITIALIZERS = new INIT_STATE('INIT_IN_INITIALIZERS', 3);
+
   static final List<INIT_STATE> values = [
       NOT_INIT,
       INIT_IN_DECLARATION,
       INIT_IN_FIELD_FORMAL,
       INIT_IN_INITIALIZERS];
+
   INIT_STATE(String name, int ordinal) : super(name, ordinal);
 }
-class GeneralizingElementVisitor_14 extends GeneralizingElementVisitor<Object> {
+
+class GeneralizingElementVisitor_15 extends GeneralizingElementVisitor<Object> {
   Element target;
+
   List<Element> toCheck;
-  GeneralizingElementVisitor_14(this.target, this.toCheck) : super();
+
+  GeneralizingElementVisitor_15(this.target, this.toCheck) : super();
+
   bool _inClass = false;
+
   Object visitClassElement(ClassElement element) {
     addTypeToCheck(element.supertype);
     for (InterfaceType mixin in element.mixins) {
@@ -17092,6 +18662,7 @@
       _inClass = false;
     }
   }
+
   Object visitExecutableElement(ExecutableElement element) {
     if (element.isSynthetic) {
       return null;
@@ -17099,22 +18670,27 @@
     addTypeToCheck(element.returnType);
     return super.visitExecutableElement(element);
   }
+
   Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
     addTypeToCheck(element.returnType);
     return super.visitFunctionTypeAliasElement(element);
   }
+
   Object visitParameterElement(ParameterElement element) {
     addTypeToCheck(element.type);
     return super.visitParameterElement(element);
   }
+
   Object visitTypeParameterElement(TypeParameterElement element) {
     addTypeToCheck(element.bound);
     return super.visitTypeParameterElement(element);
   }
+
   Object visitVariableElement(VariableElement element) {
     addTypeToCheck(element.type);
     return super.visitVariableElement(element);
   }
+
   void addTypeToCheck(Type2 type) {
     if (type == null) {
       return;
@@ -17132,6 +18708,7 @@
     }
   }
 }
+
 /**
  * The enumeration `ResolverErrorCode` defines the error codes used for errors detected by the
  * resolver. The convention for this class is for the name of the error code to indicate the problem
@@ -17142,8 +18719,11 @@
  */
 class ResolverErrorCode extends Enum<ResolverErrorCode> implements ErrorCode {
   static final ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = new ResolverErrorCode.con1('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
+
   static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCode.con1('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
+
   static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new ResolverErrorCode.con1('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
+
   static final List<ResolverErrorCode> values = [
       BREAK_LABEL_ON_SWITCH_MEMBER,
       CONTINUE_LABEL_ON_SWITCH,
@@ -17188,8 +18768,12 @@
     this._message = message;
     this.correction9 = correction;
   }
+
   String get correction => correction9;
+
   ErrorSeverity get errorSeverity => _type.severity;
+
   String get message => _message;
+
   ErrorType get type => _type;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 3e93f73..ff0a29a 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -1,6 +1,8 @@
 // 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 engine.scanner;
+
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
@@ -8,6 +10,7 @@
 import 'error.dart';
 import 'instrumentation.dart';
 import 'utilities_collection.dart' show TokenMap;
+
 /**
  * Instances of the abstract class `KeywordState` represent a state in a state machine used to
  * scan keywords.
@@ -15,7 +18,6 @@
  * @coverage dart.engine.parser
  */
 class KeywordState {
-
   /**
    * An empty transition table used by leaf states.
    */
@@ -130,6 +132,7 @@
    */
   KeywordState next(int c) => _table[c - 0x61];
 }
+
 /**
  * The enumeration `ScannerErrorCode` defines the error codes used for errors detected by the
  * scanner.
@@ -138,11 +141,17 @@
  */
 class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
   static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character %x");
+
   static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode.con1('MISSING_DIGIT', 1, "Decimal digit expected");
+
   static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode.con1('MISSING_HEX_DIGIT', 2, "Hexidecimal digit expected");
+
   static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode.con1('MISSING_QUOTE', 3, "Expected quote (' or \")");
+
   static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
+
   static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
+
   static final List<ScannerErrorCode> values = [
       ILLEGAL_CHARACTER,
       MISSING_DIGIT,
@@ -181,18 +190,22 @@
     this._message = message;
     this.correction10 = correction;
   }
+
   String get correction => correction10;
+
   ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
+
   String get message => _message;
+
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 }
+
 /**
  * Instances of the class `SubSequenceReader` implement a [CharacterReader] that reads
  * characters from a character sequence, but adds a delta when reporting the current character
  * offset so that the character sequence can be a subsequence from a larger sequence.
  */
 class SubSequenceReader extends CharSequenceReader {
-
   /**
    * The offset from the beginning of the file to the beginning of the source being scanned.
    */
@@ -208,12 +221,16 @@
   SubSequenceReader(CharSequence sequence, int offsetDelta) : super(sequence) {
     this._offsetDelta = offsetDelta;
   }
+
   int get offset => _offsetDelta + super.offset;
+
   String getString(int start, int endDelta) => super.getString(start - _offsetDelta, endDelta);
+
   void set offset(int offset) {
     super.offset = offset - _offsetDelta;
   }
 }
+
 /**
  * Instances of the class `TokenWithComment` represent a string token that is preceded by
  * comments.
@@ -221,7 +238,6 @@
  * @coverage dart.engine.parser
  */
 class StringTokenWithComment extends StringToken {
-
   /**
    * The first comment in the list of comments that precede this token.
    */
@@ -238,8 +254,11 @@
   StringTokenWithComment(TokenType type, String value, int offset, Token precedingComment) : super(type, value, offset) {
     this._precedingComment = precedingComment;
   }
+
   Token copy() => new StringTokenWithComment(type, lexeme, offset, copyComments(_precedingComment));
+
   Token get precedingComments => _precedingComment;
+
   void applyDelta(int delta) {
     super.applyDelta(delta);
     Token token = _precedingComment;
@@ -249,6 +268,7 @@
     }
   }
 }
+
 /**
  * The enumeration `Keyword` defines the keywords in the Dart programming language.
  *
@@ -256,53 +276,101 @@
  */
 class Keyword extends Enum<Keyword> {
   static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert");
+
   static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break");
+
   static final Keyword CASE = new Keyword.con1('CASE', 2, "case");
+
   static final Keyword CATCH = new Keyword.con1('CATCH', 3, "catch");
+
   static final Keyword CLASS = new Keyword.con1('CLASS', 4, "class");
+
   static final Keyword CONST = new Keyword.con1('CONST', 5, "const");
+
   static final Keyword CONTINUE = new Keyword.con1('CONTINUE', 6, "continue");
+
   static final Keyword DEFAULT = new Keyword.con1('DEFAULT', 7, "default");
+
   static final Keyword DO = new Keyword.con1('DO', 8, "do");
+
   static final Keyword ELSE = new Keyword.con1('ELSE', 9, "else");
+
   static final Keyword ENUM = new Keyword.con1('ENUM', 10, "enum");
+
   static final Keyword EXTENDS = new Keyword.con1('EXTENDS', 11, "extends");
+
   static final Keyword FALSE = new Keyword.con1('FALSE', 12, "false");
+
   static final Keyword FINAL = new Keyword.con1('FINAL', 13, "final");
+
   static final Keyword FINALLY = new Keyword.con1('FINALLY', 14, "finally");
+
   static final Keyword FOR = new Keyword.con1('FOR', 15, "for");
+
   static final Keyword IF = new Keyword.con1('IF', 16, "if");
+
   static final Keyword IN = new Keyword.con1('IN', 17, "in");
+
   static final Keyword IS = new Keyword.con1('IS', 18, "is");
+
   static final Keyword NEW = new Keyword.con1('NEW', 19, "new");
+
   static final Keyword NULL = new Keyword.con1('NULL', 20, "null");
+
   static final Keyword RETHROW = new Keyword.con1('RETHROW', 21, "rethrow");
+
   static final Keyword RETURN = new Keyword.con1('RETURN', 22, "return");
+
   static final Keyword SUPER = new Keyword.con1('SUPER', 23, "super");
+
   static final Keyword SWITCH = new Keyword.con1('SWITCH', 24, "switch");
+
   static final Keyword THIS = new Keyword.con1('THIS', 25, "this");
+
   static final Keyword THROW = new Keyword.con1('THROW', 26, "throw");
+
   static final Keyword TRUE = new Keyword.con1('TRUE', 27, "true");
+
   static final Keyword TRY = new Keyword.con1('TRY', 28, "try");
+
   static final Keyword VAR = new Keyword.con1('VAR', 29, "var");
+
   static final Keyword VOID = new Keyword.con1('VOID', 30, "void");
+
   static final Keyword WHILE = new Keyword.con1('WHILE', 31, "while");
+
   static final Keyword WITH = new Keyword.con1('WITH', 32, "with");
+
   static final Keyword ABSTRACT = new Keyword.con2('ABSTRACT', 33, "abstract", true);
+
   static final Keyword AS = new Keyword.con2('AS', 34, "as", true);
+
   static final Keyword DYNAMIC = new Keyword.con2('DYNAMIC', 35, "dynamic", true);
+
   static final Keyword EXPORT = new Keyword.con2('EXPORT', 36, "export", true);
+
   static final Keyword EXTERNAL = new Keyword.con2('EXTERNAL', 37, "external", true);
+
   static final Keyword FACTORY = new Keyword.con2('FACTORY', 38, "factory", true);
+
   static final Keyword GET = new Keyword.con2('GET', 39, "get", true);
+
   static final Keyword IMPLEMENTS = new Keyword.con2('IMPLEMENTS', 40, "implements", true);
+
   static final Keyword IMPORT = new Keyword.con2('IMPORT', 41, "import", true);
+
   static final Keyword LIBRARY = new Keyword.con2('LIBRARY', 42, "library", true);
+
   static final Keyword OPERATOR = new Keyword.con2('OPERATOR', 43, "operator", true);
+
   static final Keyword PART = new Keyword.con2('PART', 44, "part", true);
+
   static final Keyword SET = new Keyword.con2('SET', 45, "set", true);
+
   static final Keyword STATIC = new Keyword.con2('STATIC', 46, "static", true);
+
   static final Keyword TYPEDEF = new Keyword.con2('TYPEDEF', 47, "typedef", true);
+
   static final List<Keyword> values = [
       ASSERT,
       BREAK,
@@ -402,12 +470,12 @@
     this.isPseudoKeyword = isPseudoKeyword;
   }
 }
+
 /**
  * Instances of the class `CharSequenceReader` implement a [CharacterReader] that reads
  * characters from a character sequence.
  */
 class CharSequenceReader implements CharacterReader {
-
   /**
    * The sequence from which characters will be read.
    */
@@ -433,24 +501,30 @@
     this._stringLength = sequence.length();
     this._charOffset = -1;
   }
+
   int advance() {
     if (_charOffset + 1 >= _stringLength) {
       return -1;
     }
     return _sequence.charAt(++_charOffset);
   }
+
   int get offset => _charOffset;
+
   String getString(int start, int endDelta) => _sequence.subSequence(start, _charOffset + 1 + endDelta).toString();
+
   int peek() {
     if (_charOffset + 1 >= _sequence.length()) {
       return -1;
     }
     return _sequence.charAt(_charOffset + 1);
   }
+
   void set offset(int offset) {
     _charOffset = offset;
   }
 }
+
 /**
  * Instances of the class `IncrementalScanner` implement a scanner that scans a subset of a
  * string and inserts the resulting tokens into the middle of an existing token stream.
@@ -458,7 +532,6 @@
  * @coverage dart.engine.parser
  */
 class IncrementalScanner extends Scanner {
-
   /**
    * The reader used to access the characters in the source.
    */
@@ -551,6 +624,7 @@
     eof.setNextWithoutSettingPrevious(eof);
     return super.firstToken;
   }
+
   Token copyAndAdvance(Token originalToken, int delta) {
     Token copiedToken = originalToken.copy();
     tokenMap.put(originalToken, copiedToken);
@@ -566,6 +640,7 @@
     return originalToken.next;
   }
 }
+
 /**
  * The class `Scanner` implements a scanner for Dart code.
  *
@@ -578,7 +653,6 @@
  * @coverage dart.engine.parser
  */
 class Scanner {
-
   /**
    * The source being scanned.
    */
@@ -726,6 +800,7 @@
   void appendToken(Token token) {
     tail = tail.setNext(token);
   }
+
   int bigSwitch(int next) {
     beginToken();
     if (next == 0xD) {
@@ -880,6 +955,7 @@
   void recordStartOfLine() {
     _lineStarts.add(_reader.offset);
   }
+
   void appendBeginToken(TokenType type) {
     BeginToken token;
     if (_firstComment == null) {
@@ -893,6 +969,7 @@
     _groupingStack.add(token);
     _stackEnd++;
   }
+
   void appendCommentToken(TokenType type, String value) {
     if (_firstComment == null) {
       _firstComment = new StringToken(type, value, _tokenStart);
@@ -901,6 +978,7 @@
       _lastComment = _lastComment.setNext(new StringToken(type, value, _tokenStart));
     }
   }
+
   void appendEndToken(TokenType type, TokenType beginType) {
     Token token;
     if (_firstComment == null) {
@@ -919,6 +997,7 @@
       }
     }
   }
+
   void appendEofToken() {
     Token eofToken;
     if (_firstComment == null) {
@@ -934,6 +1013,7 @@
       _hasUnmatchedGroups2 = true;
     }
   }
+
   void appendKeywordToken(Keyword keyword) {
     if (_firstComment == null) {
       tail = tail.setNext(new KeywordToken(keyword, _tokenStart));
@@ -943,6 +1023,7 @@
       _lastComment = null;
     }
   }
+
   void appendStringToken(TokenType type, String value) {
     if (_firstComment == null) {
       tail = tail.setNext(new StringToken(type, value, _tokenStart));
@@ -952,6 +1033,7 @@
       _lastComment = null;
     }
   }
+
   void appendStringToken2(TokenType type, String value, int offset) {
     if (_firstComment == null) {
       tail = tail.setNext(new StringToken(type, value, _tokenStart + offset));
@@ -961,6 +1043,7 @@
       _lastComment = null;
     }
   }
+
   void appendToken2(TokenType type) {
     if (_firstComment == null) {
       tail = tail.setNext(new Token(type, _tokenStart));
@@ -970,6 +1053,7 @@
       _lastComment = null;
     }
   }
+
   void appendToken3(TokenType type, int offset) {
     if (_firstComment == null) {
       tail = tail.setNext(new Token(type, offset));
@@ -979,6 +1063,7 @@
       _lastComment = null;
     }
   }
+
   void beginToken() {
     _tokenStart = _reader.offset;
   }
@@ -1011,6 +1096,7 @@
   void reportError(ScannerErrorCode errorCode, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(source, _reader.offset, 1, errorCode, arguments));
   }
+
   int select(int choice, TokenType yesType, TokenType noType) {
     int next = _reader.advance();
     if (next == choice) {
@@ -1021,6 +1107,7 @@
       return next;
     }
   }
+
   int select2(int choice, TokenType yesType, TokenType noType, int offset) {
     int next = _reader.advance();
     if (next == choice) {
@@ -1031,6 +1118,7 @@
       return next;
     }
   }
+
   int tokenizeAmpersand(int next) {
     next = _reader.advance();
     if (next == 0x26) {
@@ -1044,6 +1132,7 @@
       return next;
     }
   }
+
   int tokenizeBar(int next) {
     next = _reader.advance();
     if (next == 0x7C) {
@@ -1057,7 +1146,9 @@
       return next;
     }
   }
+
   int tokenizeCaret(int next) => select(0x3D, TokenType.CARET_EQ, TokenType.CARET);
+
   int tokenizeDotOrNumber(int next) {
     int start = _reader.offset;
     next = _reader.advance();
@@ -1070,6 +1161,7 @@
       return next;
     }
   }
+
   int tokenizeEquals(int next) {
     next = _reader.advance();
     if (next == 0x3D) {
@@ -1082,6 +1174,7 @@
     appendToken2(TokenType.EQ);
     return next;
   }
+
   int tokenizeExclamation(int next) {
     next = _reader.advance();
     if (next == 0x3D) {
@@ -1091,6 +1184,7 @@
     appendToken2(TokenType.BANG);
     return next;
   }
+
   int tokenizeExponent(int next) {
     if (next == 0x2B || next == 0x2D) {
       next = _reader.advance();
@@ -1108,6 +1202,7 @@
       next = _reader.advance();
     }
   }
+
   int tokenizeFractionPart(int next, int start) {
     bool done = false;
     bool hasDigit = false;
@@ -1136,6 +1231,7 @@
     appendStringToken(TokenType.DOUBLE, _reader.getString(start, next < 0 ? 0 : -1));
     return next;
   }
+
   int tokenizeGreaterThan(int next) {
     next = _reader.advance();
     if (0x3D == next) {
@@ -1155,6 +1251,7 @@
       return next;
     }
   }
+
   int tokenizeHex(int next) {
     int start = _reader.offset - 1;
     bool hasDigits = false;
@@ -1171,6 +1268,7 @@
       }
     }
   }
+
   int tokenizeHexOrNumber(int next) {
     int x = _reader.peek();
     if (x == 0x78 || x == 0x58) {
@@ -1179,6 +1277,7 @@
     }
     return tokenizeNumber(next);
   }
+
   int tokenizeIdentifier(int next, int start, bool allowDollar) {
     while ((0x61 <= next && next <= 0x7A) || (0x41 <= next && next <= 0x5A) || (0x30 <= next && next <= 0x39) || next == 0x5F || (next == 0x24 && allowDollar)) {
       next = _reader.advance();
@@ -1186,6 +1285,7 @@
     appendStringToken(TokenType.IDENTIFIER, _reader.getString(start, next < 0 ? 0 : -1));
     return next;
   }
+
   int tokenizeInterpolatedExpression(int next, int start) {
     appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION);
     next = _reader.advance();
@@ -1221,6 +1321,7 @@
     beginToken();
     return next;
   }
+
   int tokenizeInterpolatedIdentifier(int next, int start) {
     appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
     if ((0x41 <= next && next <= 0x5A) || (0x61 <= next && next <= 0x7A) || next == 0x5F) {
@@ -1230,6 +1331,7 @@
     beginToken();
     return next;
   }
+
   int tokenizeKeywordOrIdentifier(int next, bool allowDollar) {
     KeywordState state = KeywordState.KEYWORD_STATE;
     int start = _reader.offset;
@@ -1249,6 +1351,7 @@
       return tokenizeIdentifier(next, start, allowDollar);
     }
   }
+
   int tokenizeLessThan(int next) {
     next = _reader.advance();
     if (0x3D == next) {
@@ -1261,6 +1364,7 @@
       return next;
     }
   }
+
   int tokenizeMinus(int next) {
     next = _reader.advance();
     if (next == 0x2D) {
@@ -1274,6 +1378,7 @@
       return next;
     }
   }
+
   int tokenizeMultiLineComment(int next) {
     int nesting = 1;
     next = _reader.advance();
@@ -1313,6 +1418,7 @@
       }
     }
   }
+
   int tokenizeMultiLineRawString(int quoteChar, int start) {
     int next = _reader.advance();
     outer: while (next != -1) {
@@ -1344,6 +1450,7 @@
     appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
+
   int tokenizeMultiLineString(int quoteChar, int start, bool raw) {
     if (raw) {
       return tokenizeMultiLineRawString(quoteChar, start);
@@ -1402,7 +1509,9 @@
     appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
+
   int tokenizeMultiply(int next) => select(0x3D, TokenType.STAR_EQ, TokenType.STAR);
+
   int tokenizeNumber(int next) {
     int start = _reader.offset;
     while (true) {
@@ -1419,6 +1528,7 @@
       }
     }
   }
+
   int tokenizeOpenSquareBracket(int next) {
     next = _reader.advance();
     if (next == 0x5D) {
@@ -1428,7 +1538,9 @@
       return next;
     }
   }
+
   int tokenizePercent(int next) => select(0x3D, TokenType.PERCENT_EQ, TokenType.PERCENT);
+
   int tokenizePlus(int next) {
     next = _reader.advance();
     if (0x2B == next) {
@@ -1442,6 +1554,7 @@
       return next;
     }
   }
+
   int tokenizeSingleLineComment(int next) {
     while (true) {
       next = _reader.advance();
@@ -1454,6 +1567,7 @@
       }
     }
   }
+
   int tokenizeSingleLineRawString(int next, int quoteChar, int start) {
     next = _reader.advance();
     while (next != -1) {
@@ -1471,6 +1585,7 @@
     appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
+
   int tokenizeSingleLineString(int next, int quoteChar, int start) {
     while (next != quoteChar) {
       if (next == 0x5C) {
@@ -1492,6 +1607,7 @@
     appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
+
   int tokenizeSlashOrComment(int next) {
     next = _reader.advance();
     if (0x2A == next) {
@@ -1506,6 +1622,7 @@
       return next;
     }
   }
+
   int tokenizeString(int next, int start, bool raw) {
     int quoteChar = next;
     next = _reader.advance();
@@ -1524,6 +1641,7 @@
       return tokenizeSingleLineString(next, quoteChar, start);
     }
   }
+
   int tokenizeStringInterpolation(int start) {
     beginToken();
     int next = _reader.advance();
@@ -1533,6 +1651,7 @@
       return tokenizeInterpolatedIdentifier(next, start);
     }
   }
+
   int tokenizeTag(int next) {
     if (_reader.offset == 0) {
       if (_reader.peek() == 0x21) {
@@ -1546,6 +1665,7 @@
     appendToken2(TokenType.HASH);
     return _reader.advance();
   }
+
   int tokenizeTilde(int next) {
     next = _reader.advance();
     if (next == 0x2F) {
@@ -1556,6 +1676,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `StringToken` represent a token whose value is independent of it's
  * type.
@@ -1563,7 +1684,6 @@
  * @coverage dart.engine.parser
  */
 class StringToken extends Token {
-
   /**
    * The lexeme represented by this token.
    */
@@ -1579,10 +1699,14 @@
   StringToken(TokenType type, String value, int offset) : super(type, offset) {
     this._value2 = StringUtilities.intern(value);
   }
+
   Token copy() => new StringToken(type, _value2, offset);
+
   String get lexeme => _value2;
+
   String value() => _value2;
 }
+
 /**
  * Instances of the class `TokenWithComment` represent a normal token that is preceded by
  * comments.
@@ -1590,7 +1714,6 @@
  * @coverage dart.engine.parser
  */
 class TokenWithComment extends Token {
-
   /**
    * The first comment in the list of comments that precede this token.
    */
@@ -1607,9 +1730,12 @@
   TokenWithComment(TokenType type, int offset, Token precedingComment) : super(type, offset) {
     this._precedingComment = precedingComment;
   }
+
   Token copy() => new TokenWithComment(type, offset, _precedingComment);
+
   Token get precedingComments => _precedingComment;
 }
+
 /**
  * Instances of the class `Token` represent a token that was scanned from the input. Each
  * token knows which token follows it, acting as the head of a linked list of tokens.
@@ -1617,7 +1743,6 @@
  * @coverage dart.engine.parser
  */
 class Token {
-
   /**
    * The type of the token.
    */
@@ -1736,6 +1861,7 @@
     next = token;
     return token;
   }
+
   String toString() => lexeme;
 
   /**
@@ -1775,11 +1901,11 @@
     return head;
   }
 }
+
 /**
  * The interface `CharacterReader`
  */
 abstract class CharacterReader {
-
   /**
    * Advance the current position and return the character at the new current position.
    *
@@ -1823,6 +1949,7 @@
    */
   void set offset(int offset);
 }
+
 /**
  * Instances of the class `BeginTokenWithComment` represent a begin token that is preceded by
  * comments.
@@ -1830,7 +1957,6 @@
  * @coverage dart.engine.parser
  */
 class BeginTokenWithComment extends BeginToken {
-
   /**
    * The first comment in the list of comments that precede this token.
    */
@@ -1847,8 +1973,11 @@
   BeginTokenWithComment(TokenType type, int offset, Token precedingComment) : super(type, offset) {
     this._precedingComment = precedingComment;
   }
+
   Token copy() => new BeginTokenWithComment(type, offset, copyComments(_precedingComment));
+
   Token get precedingComments => _precedingComment;
+
   void applyDelta(int delta) {
     super.applyDelta(delta);
     Token token = _precedingComment;
@@ -1858,13 +1987,13 @@
     }
   }
 }
+
 /**
  * Instances of the class `KeywordToken` represent a keyword in the language.
  *
  * @coverage dart.engine.parser
  */
 class KeywordToken extends Token {
-
   /**
    * The keyword being represented by this token.
    */
@@ -1879,10 +2008,14 @@
   KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) {
     this.keyword = keyword;
   }
+
   Token copy() => new KeywordToken(keyword, offset);
+
   String get lexeme => keyword.syntax;
+
   Keyword value() => keyword;
 }
+
 /**
  * Instances of the class `BeginToken` represent the opening half of a grouping pair of
  * tokens. This is used for curly brackets ('{'), parentheses ('('), and square brackets ('[').
@@ -1890,7 +2023,6 @@
  * @coverage dart.engine.parser
  */
 class BeginToken extends Token {
-
   /**
    * The token that corresponds to this token.
    */
@@ -1905,15 +2037,16 @@
   BeginToken(TokenType type, int offset) : super(type, offset) {
     assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, TokenType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION)));
   }
+
   Token copy() => new BeginToken(type, offset);
 }
+
 /**
  * The enumeration `TokenClass` represents classes (or groups) of tokens with a similar use.
  *
  * @coverage dart.engine.parser
  */
 class TokenClass extends Enum<TokenClass> {
-
   /**
    * A value used to indicate that the token type is not part of any specific class of token.
    */
@@ -1993,6 +2126,7 @@
    * A value used to indicate that the token type is a unary operator.
    */
   static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PREFIX_OPERATOR', 15, 14);
+
   static final List<TokenClass> values = [
       NO_CLASS,
       ADDITIVE_OPERATOR,
@@ -2016,11 +2150,14 @@
    * operator.
    */
   int precedence = 0;
+
   TokenClass.con1(String name, int ordinal) : this.con2(name, ordinal, 0);
+
   TokenClass.con2(String name, int ordinal, int precedence) : super(name, ordinal) {
     this.precedence = precedence;
   }
 }
+
 /**
  * Instances of the class `KeywordTokenWithComment` implement a keyword token that is preceded
  * by comments.
@@ -2028,7 +2165,6 @@
  * @coverage dart.engine.parser
  */
 class KeywordTokenWithComment extends KeywordToken {
-
   /**
    * The first comment in the list of comments that precede this token.
    */
@@ -2045,8 +2181,11 @@
   KeywordTokenWithComment(Keyword keyword, int offset, Token precedingComment) : super(keyword, offset) {
     this._precedingComment = precedingComment;
   }
+
   Token copy() => new KeywordTokenWithComment(keyword, offset, copyComments(_precedingComment));
+
   Token get precedingComments => _precedingComment;
+
   void applyDelta(int delta) {
     super.applyDelta(delta);
     Token token = _precedingComment;
@@ -2056,6 +2195,7 @@
     }
   }
 }
+
 /**
  * The enumeration `TokenType` defines the types of tokens that can be returned by the
  * scanner.
@@ -2063,78 +2203,145 @@
  * @coverage dart.engine.parser
  */
 class TokenType extends Enum<TokenType> {
-
   /**
    * The type of the token that marks the end of the input.
    */
   static final TokenType EOF = new TokenType_EOF('EOF', 0, null, "");
+
   static final TokenType DOUBLE = new TokenType.con1('DOUBLE', 1);
+
   static final TokenType HEXADECIMAL = new TokenType.con1('HEXADECIMAL', 2);
+
   static final TokenType IDENTIFIER = new TokenType.con1('IDENTIFIER', 3);
+
   static final TokenType INT = new TokenType.con1('INT', 4);
+
   static final TokenType KEYWORD = new TokenType.con1('KEYWORD', 5);
+
   static final TokenType MULTI_LINE_COMMENT = new TokenType.con1('MULTI_LINE_COMMENT', 6);
+
   static final TokenType SCRIPT_TAG = new TokenType.con1('SCRIPT_TAG', 7);
+
   static final TokenType SINGLE_LINE_COMMENT = new TokenType.con1('SINGLE_LINE_COMMENT', 8);
+
   static final TokenType STRING = new TokenType.con1('STRING', 9);
+
   static final TokenType AMPERSAND = new TokenType.con2('AMPERSAND', 10, TokenClass.BITWISE_AND_OPERATOR, "&");
+
   static final TokenType AMPERSAND_AMPERSAND = new TokenType.con2('AMPERSAND_AMPERSAND', 11, TokenClass.LOGICAL_AND_OPERATOR, "&&");
+
   static final TokenType AMPERSAND_EQ = new TokenType.con2('AMPERSAND_EQ', 12, TokenClass.ASSIGNMENT_OPERATOR, "&=");
+
   static final TokenType AT = new TokenType.con2('AT', 13, null, "@");
+
   static final TokenType BANG = new TokenType.con2('BANG', 14, TokenClass.UNARY_PREFIX_OPERATOR, "!");
+
   static final TokenType BANG_EQ = new TokenType.con2('BANG_EQ', 15, TokenClass.EQUALITY_OPERATOR, "!=");
+
   static final TokenType BAR = new TokenType.con2('BAR', 16, TokenClass.BITWISE_OR_OPERATOR, "|");
+
   static final TokenType BAR_BAR = new TokenType.con2('BAR_BAR', 17, TokenClass.LOGICAL_OR_OPERATOR, "||");
+
   static final TokenType BAR_EQ = new TokenType.con2('BAR_EQ', 18, TokenClass.ASSIGNMENT_OPERATOR, "|=");
+
   static final TokenType COLON = new TokenType.con2('COLON', 19, null, ":");
+
   static final TokenType COMMA = new TokenType.con2('COMMA', 20, null, ",");
+
   static final TokenType CARET = new TokenType.con2('CARET', 21, TokenClass.BITWISE_XOR_OPERATOR, "^");
+
   static final TokenType CARET_EQ = new TokenType.con2('CARET_EQ', 22, TokenClass.ASSIGNMENT_OPERATOR, "^=");
+
   static final TokenType CLOSE_CURLY_BRACKET = new TokenType.con2('CLOSE_CURLY_BRACKET', 23, null, "}");
+
   static final TokenType CLOSE_PAREN = new TokenType.con2('CLOSE_PAREN', 24, null, ")");
+
   static final TokenType CLOSE_SQUARE_BRACKET = new TokenType.con2('CLOSE_SQUARE_BRACKET', 25, null, "]");
+
   static final TokenType EQ = new TokenType.con2('EQ', 26, TokenClass.ASSIGNMENT_OPERATOR, "=");
+
   static final TokenType EQ_EQ = new TokenType.con2('EQ_EQ', 27, TokenClass.EQUALITY_OPERATOR, "==");
+
   static final TokenType FUNCTION = new TokenType.con2('FUNCTION', 28, null, "=>");
+
   static final TokenType GT = new TokenType.con2('GT', 29, TokenClass.RELATIONAL_OPERATOR, ">");
+
   static final TokenType GT_EQ = new TokenType.con2('GT_EQ', 30, TokenClass.RELATIONAL_OPERATOR, ">=");
+
   static final TokenType GT_GT = new TokenType.con2('GT_GT', 31, TokenClass.SHIFT_OPERATOR, ">>");
+
   static final TokenType GT_GT_EQ = new TokenType.con2('GT_GT_EQ', 32, TokenClass.ASSIGNMENT_OPERATOR, ">>=");
+
   static final TokenType HASH = new TokenType.con2('HASH', 33, null, "#");
+
   static final TokenType INDEX = new TokenType.con2('INDEX', 34, TokenClass.UNARY_POSTFIX_OPERATOR, "[]");
+
   static final TokenType INDEX_EQ = new TokenType.con2('INDEX_EQ', 35, TokenClass.UNARY_POSTFIX_OPERATOR, "[]=");
+
   static final TokenType IS = new TokenType.con2('IS', 36, TokenClass.RELATIONAL_OPERATOR, "is");
+
   static final TokenType LT = new TokenType.con2('LT', 37, TokenClass.RELATIONAL_OPERATOR, "<");
+
   static final TokenType LT_EQ = new TokenType.con2('LT_EQ', 38, TokenClass.RELATIONAL_OPERATOR, "<=");
+
   static final TokenType LT_LT = new TokenType.con2('LT_LT', 39, TokenClass.SHIFT_OPERATOR, "<<");
+
   static final TokenType LT_LT_EQ = new TokenType.con2('LT_LT_EQ', 40, TokenClass.ASSIGNMENT_OPERATOR, "<<=");
+
   static final TokenType MINUS = new TokenType.con2('MINUS', 41, TokenClass.ADDITIVE_OPERATOR, "-");
+
   static final TokenType MINUS_EQ = new TokenType.con2('MINUS_EQ', 42, TokenClass.ASSIGNMENT_OPERATOR, "-=");
+
   static final TokenType MINUS_MINUS = new TokenType.con2('MINUS_MINUS', 43, TokenClass.UNARY_PREFIX_OPERATOR, "--");
+
   static final TokenType OPEN_CURLY_BRACKET = new TokenType.con2('OPEN_CURLY_BRACKET', 44, null, "{");
+
   static final TokenType OPEN_PAREN = new TokenType.con2('OPEN_PAREN', 45, TokenClass.UNARY_POSTFIX_OPERATOR, "(");
+
   static final TokenType OPEN_SQUARE_BRACKET = new TokenType.con2('OPEN_SQUARE_BRACKET', 46, TokenClass.UNARY_POSTFIX_OPERATOR, "[");
+
   static final TokenType PERCENT = new TokenType.con2('PERCENT', 47, TokenClass.MULTIPLICATIVE_OPERATOR, "%");
+
   static final TokenType PERCENT_EQ = new TokenType.con2('PERCENT_EQ', 48, TokenClass.ASSIGNMENT_OPERATOR, "%=");
+
   static final TokenType PERIOD = new TokenType.con2('PERIOD', 49, TokenClass.UNARY_POSTFIX_OPERATOR, ".");
+
   static final TokenType PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIOD', 50, TokenClass.CASCADE_OPERATOR, "..");
+
   static final TokenType PLUS = new TokenType.con2('PLUS', 51, TokenClass.ADDITIVE_OPERATOR, "+");
+
   static final TokenType PLUS_EQ = new TokenType.con2('PLUS_EQ', 52, TokenClass.ASSIGNMENT_OPERATOR, "+=");
+
   static final TokenType PLUS_PLUS = new TokenType.con2('PLUS_PLUS', 53, TokenClass.UNARY_PREFIX_OPERATOR, "++");
+
   static final TokenType QUESTION = new TokenType.con2('QUESTION', 54, TokenClass.CONDITIONAL_OPERATOR, "?");
+
   static final TokenType SEMICOLON = new TokenType.con2('SEMICOLON', 55, null, ";");
+
   static final TokenType SLASH = new TokenType.con2('SLASH', 56, TokenClass.MULTIPLICATIVE_OPERATOR, "/");
+
   static final TokenType SLASH_EQ = new TokenType.con2('SLASH_EQ', 57, TokenClass.ASSIGNMENT_OPERATOR, "/=");
+
   static final TokenType STAR = new TokenType.con2('STAR', 58, TokenClass.MULTIPLICATIVE_OPERATOR, "*");
+
   static final TokenType STAR_EQ = new TokenType.con2('STAR_EQ', 59, TokenClass.ASSIGNMENT_OPERATOR, "*=");
+
   static final TokenType STRING_INTERPOLATION_EXPRESSION = new TokenType.con2('STRING_INTERPOLATION_EXPRESSION', 60, null, "\${");
+
   static final TokenType STRING_INTERPOLATION_IDENTIFIER = new TokenType.con2('STRING_INTERPOLATION_IDENTIFIER', 61, null, "\$");
+
   static final TokenType TILDE = new TokenType.con2('TILDE', 62, TokenClass.UNARY_PREFIX_OPERATOR, "~");
+
   static final TokenType TILDE_SLASH = new TokenType.con2('TILDE_SLASH', 63, TokenClass.MULTIPLICATIVE_OPERATOR, "~/");
+
   static final TokenType TILDE_SLASH_EQ = new TokenType.con2('TILDE_SLASH_EQ', 64, TokenClass.ASSIGNMENT_OPERATOR, "~/=");
+
   static final TokenType BACKPING = new TokenType.con2('BACKPING', 65, null, "`");
+
   static final TokenType BACKSLASH = new TokenType.con2('BACKSLASH', 66, null, "\\");
+
   static final TokenType PERIOD_PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIOD_PERIOD', 67, null, "...");
+
   static final List<TokenType> values = [
       EOF,
       DOUBLE,
@@ -2215,7 +2422,9 @@
    * lexeme for this type of token.
    */
   String lexeme;
+
   TokenType.con1(String name, int ordinal) : this.con2(name, ordinal, TokenClass.NO_CLASS, null);
+
   TokenType.con2(String name, int ordinal, TokenClass tokenClass, String lexeme) : super(name, ordinal) {
     this._tokenClass = tokenClass == null ? TokenClass.NO_CLASS : tokenClass;
     this.lexeme = lexeme;
@@ -2319,7 +2528,9 @@
    */
   bool get isUserDefinableOperator => identical(lexeme, "==") || identical(lexeme, "~") || identical(lexeme, "[]") || identical(lexeme, "[]=") || identical(lexeme, "*") || identical(lexeme, "/") || identical(lexeme, "%") || identical(lexeme, "~/") || identical(lexeme, "+") || identical(lexeme, "-") || identical(lexeme, "<<") || identical(lexeme, ">>") || identical(lexeme, ">=") || identical(lexeme, ">") || identical(lexeme, "<=") || identical(lexeme, "<") || identical(lexeme, "&") || identical(lexeme, "^") || identical(lexeme, "|");
 }
+
 class TokenType_EOF extends TokenType {
   TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super.con2(name, ordinal, arg0, arg1);
+
   String toString() => "-eof-";
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 234742f..2329da1 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -1,13 +1,15 @@
 // 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 engine.sdk;
+
 import 'source.dart' show ContentCache, Source, UriKind;
 import 'engine.dart' show AnalysisContext;
+
 /**
  * Represents a single library in the SDK
  */
 abstract class SdkLibrary {
-
   /**
    * Return the name of the category containing the library.
    *
@@ -72,6 +74,7 @@
    */
   bool get isVmLibrary;
 }
+
 /**
  * Instances of the class `SdkLibrary` represent the information known about a single library
  * within the SDK.
@@ -79,7 +82,6 @@
  * @coverage dart.engine.sdk
  */
 class SdkLibraryImpl implements SdkLibrary {
-
   /**
    * The short name of the library. This is the name used after `dart:` in a URI.
    */
@@ -132,12 +134,19 @@
   SdkLibraryImpl(String name) {
     this._shortName = name;
   }
+
   String get category => _category;
+
   String get path => _path;
+
   String get shortName => _shortName;
+
   bool get isDart2JsLibrary => (_platforms & DART2JS_PLATFORM) != 0;
+
   bool get isDocumented => _documented;
+
   bool get isImplementation => _implementation;
+
   bool get isInternal => "Internal" == _category;
 
   /**
@@ -203,6 +212,7 @@
     _platforms |= VM_PLATFORM;
   }
 }
+
 /**
  * Instances of the class `LibraryMap` map Dart library URI's to the [SdkLibraryImpl
  ].
@@ -210,7 +220,6 @@
  * @coverage dart.engine.sdk
  */
 class LibraryMap {
-
   /**
    * A table mapping Dart library URI's to the library.
    */
@@ -255,13 +264,13 @@
    */
   int size() => _libraryMap.length;
 }
+
 /**
  * Instances of the class `DartSdk` represent a Dart SDK installed in a specified location.
  *
  * @coverage dart.engine.sdk
  */
 abstract class DartSdk {
-
   /**
    * The short name of the dart SDK core library.
    */
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index f00131a..c4985f0 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -1,6 +1,8 @@
 // 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 engine.sdk.io;
+
 import 'java_core.dart';
 import 'java_io.dart';
 import 'java_engine_io.dart';
@@ -11,6 +13,7 @@
 import 'parser.dart';
 import 'sdk.dart';
 import 'engine.dart';
+
 /**
  * Instances of the class `DirectoryBasedDartSdk` represent a Dart SDK installed in a
  * specified directory.
@@ -18,7 +21,6 @@
  * @coverage dart.engine.sdk
  */
 class DirectoryBasedDartSdk implements DartSdk {
-
   /**
    * The [AnalysisContext] which is used for all of the sources in this [DartSdk].
    */
@@ -229,7 +231,9 @@
     }
     _analysisContext.applyChanges(changeSet);
   }
+
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) => new FileBasedSource.con2(contentCache, new JavaFile.fromUri(uri), kind);
+
   AnalysisContext get context => _analysisContext;
 
   /**
@@ -302,7 +306,9 @@
     JavaFile file = new JavaFile.relative(new JavaFile.relative(directory, _BIN_DIRECTORY_NAME), pubBinaryName);
     return file.exists() ? file : null;
   }
+
   List<SdkLibrary> get sdkLibraries => _libraryMap.sdkLibraries;
+
   SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri);
 
   /**
@@ -365,6 +371,7 @@
    * @return `true` if the Dartium binary is available
    */
   bool get isDartiumInstalled => dartiumExecutable != null;
+
   Source mapDartUri(String dartUri) {
     SdkLibrary library = getSdkLibrary(dartUri);
     if (library == null) {
@@ -431,6 +438,7 @@
     }
   }
 }
+
 /**
  * Instances of the class `SdkLibrariesReader` read and parse the libraries file
  * (dart-sdk/lib/_internal/libraries.dart) for information about the libraries in an SDK. The
@@ -457,7 +465,6 @@
  * @coverage dart.engine.sdk
  */
 class SdkLibrariesReader {
-
   /**
    * Return the library map read from the given source.
    *
@@ -465,7 +472,7 @@
    */
   LibraryMap readFrom(JavaFile librariesFile, String libraryFileContents) {
     List<bool> foundError = [false];
-    AnalysisErrorListener errorListener = new AnalysisErrorListener_10(foundError);
+    AnalysisErrorListener errorListener = new AnalysisErrorListener_11(foundError);
     Source source = new FileBasedSource.con2(null, librariesFile, UriKind.FILE_URI);
     Scanner scanner = new Scanner(source, new CharSequenceReader(new CharSequence(libraryFileContents)), errorListener);
     Parser parser = new Parser(source, errorListener);
@@ -477,8 +484,8 @@
     return libraryBuilder.librariesMap;
   }
 }
-class SdkLibrariesReader_LibraryBuilder extends RecursiveASTVisitor<Object> {
 
+class SdkLibrariesReader_LibraryBuilder extends RecursiveASTVisitor<Object> {
   /**
    * The prefix added to the name of a library to form the URI used in code to reference the
    * library.
@@ -518,31 +525,32 @@
    * the libraries file.
    */
   final LibraryMap librariesMap = new LibraryMap();
+
   Object visitMapLiteralEntry(MapLiteralEntry node) {
     String libraryName = null;
     Expression key = node.key;
     if (key is SimpleStringLiteral) {
-      libraryName = "${_LIBRARY_PREFIX}${((key as SimpleStringLiteral)).value}";
+      libraryName = "${_LIBRARY_PREFIX}${(key as SimpleStringLiteral).value}";
     }
     Expression value = node.value;
     if (value is InstanceCreationExpression) {
       SdkLibraryImpl library = new SdkLibraryImpl(libraryName);
-      List<Expression> arguments = ((value as InstanceCreationExpression)).argumentList.arguments;
+      List<Expression> arguments = (value as InstanceCreationExpression).argumentList.arguments;
       for (Expression argument in arguments) {
         if (argument is SimpleStringLiteral) {
-          library.path = ((argument as SimpleStringLiteral)).value;
+          library.path = (argument as SimpleStringLiteral).value;
         } else if (argument is NamedExpression) {
-          String name = ((argument as NamedExpression)).name.label.name;
-          Expression expression = ((argument as NamedExpression)).expression;
+          String name = (argument as NamedExpression).name.label.name;
+          Expression expression = (argument as NamedExpression).expression;
           if (name == _CATEGORY) {
-            library.category = ((expression as SimpleStringLiteral)).value;
+            library.category = (expression as SimpleStringLiteral).value;
           } else if (name == _IMPLEMENTATION) {
-            library.implementation = ((expression as BooleanLiteral)).value;
+            library.implementation = (expression as BooleanLiteral).value;
           } else if (name == _DOCUMENTED) {
-            library.documented = ((expression as BooleanLiteral)).value;
+            library.documented = (expression as BooleanLiteral).value;
           } else if (name == _PLATFORMS) {
             if (expression is SimpleIdentifier) {
-              String identifier = ((expression as SimpleIdentifier)).name;
+              String identifier = (expression as SimpleIdentifier).name;
               if (identifier == _VM_PLATFORM) {
                 library.setVmLibrary();
               } else {
@@ -557,10 +565,15 @@
     return null;
   }
 }
-class AnalysisErrorListener_10 implements AnalysisErrorListener {
+
+class AnalysisErrorListener_11 implements AnalysisErrorListener {
   List<bool> foundError;
-  AnalysisErrorListener_10(this.foundError);
+
+  AnalysisErrorListener_11(this.foundError);
+
   void onError(AnalysisError error) {
-    foundError[0] = true;
+    if (error != null && error.errorCode.type != ErrorType.TODO) {
+      foundError[0] = true;
+    }
   }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 4a1546b..7c3206e 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -1,9 +1,12 @@
 // 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 engine.source;
+
 import 'java_core.dart';
 import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext;
+
 /**
  * Instances of the class `SourceFactory` resolve possibly relative URI's against an existing
  * [Source].
@@ -11,7 +14,6 @@
  * @coverage dart.engine.source
  */
 class SourceFactory {
-
   /**
    * The analysis context that this source factory is associated with.
    */
@@ -206,6 +208,7 @@
     }
   }
 }
+
 /**
  * The abstract class `UriResolver` defines the behavior of objects that are used to resolve
  * URI's for a source factory. Subclasses of this class are expected to resolve a single scheme of
@@ -214,7 +217,6 @@
  * @coverage dart.engine.source
  */
 abstract class UriResolver {
-
   /**
    * If this resolver should be used for URI's of the given kind, resolve the given absolute URI.
    * The URI does not need to have the scheme handled by this resolver if the kind matches. Return a
@@ -247,6 +249,7 @@
    */
   Uri restoreAbsolute(Source source) => null;
 }
+
 /**
  * The interface `Source` defines the behavior of objects representing source code that can be
  * compiled.
@@ -254,7 +257,6 @@
  * @coverage dart.engine.source
  */
 abstract class Source {
-
   /**
    * An empty array of sources.
    */
@@ -367,12 +369,12 @@
    */
   Source resolveRelative(Uri relativeUri);
 }
+
 /**
  * The interface `ContentReceiver` defines the behavior of objects that can receive the
  * content of a source.
  */
 abstract class Source_ContentReceiver {
-
   /**
    * Accept the contents of a source represented as a character buffer.
    *
@@ -389,6 +391,7 @@
    */
   void accept2(String contents, int modificationTime);
 }
+
 /**
  * The enumeration `SourceKind` defines the different kinds of sources that are known to the
  * analysis engine.
@@ -396,7 +399,6 @@
  * @coverage dart.engine.source
  */
 class SourceKind extends Enum<SourceKind> {
-
   /**
    * A source containing HTML. The HTML might or might not contain Dart scripts.
    */
@@ -419,9 +421,12 @@
    * does not want to spend the time to identify the kind.
    */
   static final SourceKind UNKNOWN = new SourceKind('UNKNOWN', 3);
+
   static final List<SourceKind> values = [HTML, LIBRARY, PART, UNKNOWN];
+
   SourceKind(String name, int ordinal) : super(name, ordinal);
 }
+
 /**
  * The enumeration `UriKind` defines the different kinds of URI's that are known to the
  * analysis engine. These are used to keep track of the kind of URI associated with a given source.
@@ -429,7 +434,6 @@
  * @coverage dart.engine.source
  */
 class UriKind extends Enum<UriKind> {
-
   /**
    * A 'dart:' URI.
    */
@@ -449,6 +453,7 @@
    * A 'package:' URI.
    */
   static final UriKind PACKAGE_URI = new UriKind('PACKAGE_URI', 3, 0x70);
+
   static final List<UriKind> values = [DART_URI, FILE_URI, PACKAGE_SELF_URI, PACKAGE_URI];
 
   /**
@@ -488,13 +493,13 @@
     this.encoding = encoding;
   }
 }
+
 /**
  * A source range defines an [Element]'s source coordinates relative to its [Source].
  *
  * @coverage dart.engine.utilities
  */
 class SourceRange {
-
   /**
    * The 0-based index of the first character of the source code for this element, relative to the
    * source buffer in which this element is contained.
@@ -545,6 +550,7 @@
     int thisEnd = end;
     return otherRange.contains(thisEnd);
   }
+
   bool operator ==(Object obj) {
     if (obj is! SourceRange) {
       return false;
@@ -573,6 +579,7 @@
    * @return the expanded translated of [SourceRange], with moved start and the same length.
    */
   SourceRange getTranslated(int delta) => new SourceRange(offset + delta, length);
+
   int get hashCode => 31 * offset + length;
 
   /**
@@ -595,6 +602,7 @@
    * @return `true` if this [SourceRange] starts in <code>otherRange</code>.
    */
   bool startsIn(SourceRange otherRange) => otherRange.contains(offset);
+
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("[offset=");
@@ -605,6 +613,7 @@
     return builder.toString();
   }
 }
+
 /**
  * The interface `SourceContainer` is used by clients to define a collection of sources
  *
@@ -616,7 +625,6 @@
  * @coverage dart.engine.source
  */
 abstract class SourceContainer {
-
   /**
    * Determine if the specified source is part of the receiver's collection of sources.
    *
@@ -625,13 +633,13 @@
    */
   bool contains(Source source);
 }
+
 /**
  * Instances of the class `DartUriResolver` resolve `dart` URI's.
  *
  * @coverage dart.engine.source
  */
 class DartUriResolver extends UriResolver {
-
   /**
    * The Dart SDK against which URI's are to be resolved.
    */
@@ -659,12 +667,14 @@
   DartUriResolver(DartSdk sdk) {
     this.dartSdk = sdk;
   }
+
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) {
     if (identical(kind, UriKind.DART_URI)) {
       return dartSdk.fromEncoding(contentCache, kind, uri);
     }
     return null;
   }
+
   Source resolveAbsolute(ContentCache contentCache, Uri uri) {
     if (!isDartUri(uri)) {
       return null;
@@ -672,6 +682,7 @@
     return dartSdk.mapDartUri(uri.toString());
   }
 }
+
 /**
  * Instances of the class `LineInfo` encapsulate information about line and column information
  * within a source file.
@@ -679,7 +690,6 @@
  * @coverage dart.engine.utilities
  */
 class LineInfo {
-
   /**
    * An array containing the offsets of the first character of each line in the source code.
    */
@@ -716,12 +726,12 @@
     return new LineInfo_Location(lineCount, offset - _lineStarts[lineCount - 1] + 1);
   }
 }
+
 /**
  * Instances of the class `Location` represent the location of a character as a line and
  * column pair.
  */
 class LineInfo_Location {
-
   /**
    * The one-based index of the line containing the character.
    */
@@ -744,6 +754,7 @@
     this.columnNumber = columnNumber;
   }
 }
+
 /**
  * Instances of class `ContentCache` hold content used to override the default content of a
  * [Source].
@@ -751,7 +762,6 @@
  * @coverage dart.engine.source
  */
 class ContentCache {
-
   /**
    * A table mapping sources to the contents of those sources. This is used to override the default
    * contents of a source.
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 72ff203..e2ea6be 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -1,18 +1,20 @@
 // 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 engine.source.io;
+
 import 'source.dart';
 import 'java_core.dart';
 import 'java_io.dart';
 import 'engine.dart' show AnalysisContext, AnalysisEngine;
 export 'source.dart';
+
 /**
  * Instances of the class `FileBasedSource` implement a source that represents a file.
  *
  * @coverage dart.engine.source
  */
 class FileBasedSource implements Source {
-
   /**
    * The content cache used to access the contents of this source if they have been overridden from
    * what is on disk or cached.
@@ -54,17 +56,12 @@
     this._contentCache = contentCache;
     this.file = file;
     this._uriKind = uriKind;
-    if (file.getPath().indexOf(':') > 2) {
-      try {
-        throw new IllegalArgumentException("Invalid source path: ${file}");
-      } on IllegalArgumentException catch (e) {
-        AnalysisEngine.instance.logger.logError3(e);
-        throw e;
-      }
-    }
   }
-  bool operator ==(Object object) => object != null && this.runtimeType == object.runtimeType && file == ((object as FileBasedSource)).file;
+
+  bool operator ==(Object object) => object != null && this.runtimeType == object.runtimeType && file == (object as FileBasedSource).file;
+
   bool exists() => _contentCache.getContents(this) != null || (file.exists() && !file.isDirectory());
+
   void getContents(Source_ContentReceiver receiver) {
     String contents = _contentCache.getContents(this);
     if (contents != null) {
@@ -73,13 +70,16 @@
     }
     getContentsFromFile(receiver);
   }
+
   String get encoding {
     if (_encoding == null) {
       _encoding = "${_uriKind.encoding}${file.toURI().toString()}";
     }
     return _encoding;
   }
+
   String get fullName => file.getAbsolutePath();
+
   int get modificationStamp {
     int stamp = _contentCache.getModificationStamp(this);
     if (stamp != null) {
@@ -87,10 +87,15 @@
     }
     return file.lastModified();
   }
+
   String get shortName => file.getName();
+
   UriKind get uriKind => _uriKind;
+
   int get hashCode => file.hashCode;
+
   bool get isInSystemLibrary => identical(_uriKind, UriKind.DART_URI);
+
   Source resolveRelative(Uri containedUri) {
     try {
       Uri resolvedUri = file.toURI().resolveUri(containedUri);
@@ -99,6 +104,7 @@
     }
     return null;
   }
+
   String toString() {
     if (file == null) {
       return "<unknown source>";
@@ -122,6 +128,7 @@
     receiver.accept2(file.readAsStringSync(), file.lastModified());
   }
 }
+
 /**
  * Instances of the class `PackageUriResolver` resolve `package` URI's in the context of
  * an application.
@@ -133,7 +140,6 @@
  * @coverage dart.engine.source
  */
 class PackageUriResolver extends UriResolver {
-
   /**
    * The package directories that `package` URI's are assumed to be relative to.
    */
@@ -170,12 +176,14 @@
     }
     this._packagesDirectories = packagesDirectories;
   }
+
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) {
     if (identical(kind, UriKind.PACKAGE_SELF_URI) || identical(kind, UriKind.PACKAGE_URI)) {
       return new FileBasedSource.con2(contentCache, new JavaFile.fromUri(uri), kind);
     }
     return null;
   }
+
   Source resolveAbsolute(ContentCache contentCache, Uri uri) {
     if (!isPackageUri(uri)) {
       return null;
@@ -209,9 +217,10 @@
     }
     return new FileBasedSource.con2(contentCache, getCanonicalFile(_packagesDirectories[0], pkgName, relPath), UriKind.PACKAGE_URI);
   }
+
   Uri restoreAbsolute(Source source) {
     if (source is FileBasedSource) {
-      String sourcePath = ((source as FileBasedSource)).file.getPath();
+      String sourcePath = (source as FileBasedSource).file.getPath();
       for (JavaFile packagesDirectory in _packagesDirectories) {
         List<JavaFile> pkgFolders = packagesDirectory.listFiles();
         if (pkgFolders != null) {
@@ -269,6 +278,7 @@
     return filePath.startsWith("${rootPath}/lib");
   }
 }
+
 /**
  * Instances of the class [DirectoryBasedSourceContainer] represent a source container that
  * contains all sources within a given directory.
@@ -276,7 +286,6 @@
  * @coverage dart.engine.source
  */
 class DirectoryBasedSourceContainer implements SourceContainer {
-
   /**
    * Append the system file separator to the given path unless the path already ends with a
    * separator.
@@ -315,18 +324,22 @@
   DirectoryBasedSourceContainer.con2(String path) {
     this.path = appendFileSeparator(path);
   }
+
   bool contains(Source source) => source.fullName.startsWith(path);
-  bool operator ==(Object obj) => (obj is DirectoryBasedSourceContainer) && ((obj as DirectoryBasedSourceContainer)).path == path;
+
+  bool operator ==(Object obj) => (obj is DirectoryBasedSourceContainer) && (obj as DirectoryBasedSourceContainer).path == path;
+
   int get hashCode => path.hashCode;
+
   String toString() => "SourceContainer[${path}]";
 }
+
 /**
  * Instances of the class `FileUriResolver` resolve `file` URI's.
  *
  * @coverage dart.engine.source
  */
 class FileUriResolver extends UriResolver {
-
   /**
    * The name of the `file` scheme.
    */
@@ -339,12 +352,14 @@
    * @return `true` if the given URI is a `file` URI
    */
   static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
+
   Source fromEncoding(ContentCache contentCache, UriKind kind, Uri uri) {
     if (identical(kind, UriKind.FILE_URI)) {
       return new FileBasedSource.con2(contentCache, new JavaFile.fromUri(uri), kind);
     }
     return null;
   }
+
   Source resolveAbsolute(ContentCache contentCache, Uri uri) {
     if (!isFileUri(uri)) {
       return null;
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index adda610..adb9ccc 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -1,14 +1,16 @@
 // 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 engine.utilities.collection;
+
 import 'java_core.dart';
 import 'scanner.dart' show Token;
+
 /**
  * The class `BooleanArray` defines methods for operating on integers as if they were arrays
  * of booleans. These arrays can be indexed by either integers or by enumeration constants.
  */
 class BooleanArray {
-
   /**
    * Return the value of the element at the given index.
    *
@@ -73,11 +75,11 @@
     }
   }
 }
+
 /**
  * Instances of the class `TokenMap` map one set of tokens to another set of tokens.
  */
 class TokenMap {
-
   /**
    * A table mapping tokens to tokens. This should be replaced by a more performant implementation.
    * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a
@@ -104,12 +106,12 @@
     _map[key] = value;
   }
 }
+
 /**
  * The class `ListUtilities` defines utility methods useful for working with [List
  ].
  */
 class ListUtilities {
-
   /**
    * Add all of the elements in the given array to the given list.
    *
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index 40fe9a4..5344a94 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -1,7 +1,10 @@
 // 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 engine.utilities.dart;
+
 import 'java_core.dart';
+
 /**
  * The enumeration `ParameterKind` defines the different kinds of parameters. There are two
  * basic kinds of parameters: required and optional. Optional parameters are further divided into
@@ -11,8 +14,11 @@
  */
 class ParameterKind extends Enum<ParameterKind> {
   static final ParameterKind REQUIRED = new ParameterKind('REQUIRED', 0, false);
+
   static final ParameterKind POSITIONAL = new ParameterKind('POSITIONAL', 1, true);
+
   static final ParameterKind NAMED = new ParameterKind('NAMED', 2, true);
+
   static final List<ParameterKind> values = [REQUIRED, POSITIONAL, NAMED];
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index 8175055..d90cc3b 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -1,7 +1,10 @@
 // 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 engine.utilities.general;
+
 import 'java_core.dart';
+
 /**
  * Helper for measuring how much time is spent doing some operation.
  */
@@ -15,12 +18,15 @@
    */
   TimeCounter_TimeCounterHandle start() => new TimeCounter_TimeCounterHandle(this);
 }
+
 /**
  * The handle object that should be used to stop and update counter.
  */
 class TimeCounter_TimeCounterHandle {
   final TimeCounter TimeCounter_this;
+
   int _startTime = JavaSystem.currentTimeMillis();
+
   TimeCounter_TimeCounterHandle(this.TimeCounter_this);
 
   /**
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 4e444ce..51639e1 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.10.1
+version: 0.10.2
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 15e5588..5dc1b2d 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -1,6 +1,8 @@
 // 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 engine.ast_test;
+
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/scanner.dart';
@@ -11,34 +13,41 @@
 import 'parser_test.dart' show ParserTestCase;
 import 'test_support.dart';
 import 'scanner_test.dart' show TokenFactory;
+
 class NodeLocatorTest extends ParserTestCase {
   void test_range() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
     assertLocate2(unit, 4, 10, LibraryDirective);
   }
+
   void test_searchWithin_null() {
     NodeLocator locator = new NodeLocator.con2(0, 0);
     JUnitTestCase.assertNull(locator.searchWithin(null));
   }
+
   void test_searchWithin_offset() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
     assertLocate(unit, 10, SimpleIdentifier);
   }
+
   void test_searchWithin_offsetAfterNode() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
     NodeLocator locator = new NodeLocator.con2(1024, 1024);
     ASTNode node = locator.searchWithin(unit.declarations[0]);
     JUnitTestCase.assertNull(node);
   }
+
   void test_searchWithin_offsetBeforeNode() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
     NodeLocator locator = new NodeLocator.con2(0, 0);
     ASTNode node = locator.searchWithin(unit.declarations[1]);
     JUnitTestCase.assertNull(node);
   }
+
   void assertLocate(CompilationUnit unit, int offset, Type expectedClass) {
     assertLocate2(unit, offset, offset, expectedClass);
   }
+
   void assertLocate2(CompilationUnit unit, int start, int end, Type expectedClass) {
     NodeLocator locator = new NodeLocator.con2(start, end);
     ASTNode node = locator.searchWithin(unit);
@@ -48,6 +57,7 @@
     JUnitTestCase.assertTrueMsg("Node ends before range", node.offset + node.length > end);
     EngineTestCase.assertInstanceOf(expectedClass, node);
   }
+
   static dartSuite() {
     _ut.group('NodeLocatorTest', () {
       _ut.test('test_range', () {
@@ -73,67 +83,80 @@
     });
   }
 }
+
 class IndexExpressionTest extends EngineTestCase {
   void test_inGetterContext_assignment_compound_left() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
     JUnitTestCase.assertTrue(expression.inGetterContext());
   }
+
   void test_inGetterContext_assignment_simple_left() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.assignmentExpression(expression, TokenType.EQ, null);
     JUnitTestCase.assertFalse(expression.inGetterContext());
   }
+
   void test_inGetterContext_nonAssignment() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.binaryExpression(expression, TokenType.PLUS, null);
     JUnitTestCase.assertTrue(expression.inGetterContext());
   }
+
   void test_inSetterContext_assignment_compound_left() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
+
   void test_inSetterContext_assignment_compound_right() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.assignmentExpression(null, TokenType.PLUS_EQ, expression);
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
+
   void test_inSetterContext_assignment_simple_left() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.assignmentExpression(expression, TokenType.EQ, null);
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
+
   void test_inSetterContext_assignment_simple_right() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.assignmentExpression(null, TokenType.EQ, expression);
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
+
   void test_inSetterContext_nonAssignment() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.binaryExpression(expression, TokenType.PLUS, null);
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
+
   void test_inSetterContext_postfix() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
+
   void test_inSetterContext_prefix_bang() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.prefixExpression(TokenType.BANG, expression);
     JUnitTestCase.assertFalse(expression.inSetterContext());
   }
+
   void test_inSetterContext_prefix_minusMinus() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
+
   void test_inSetterContext_prefix_plusPlus() {
     IndexExpression expression = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     ASTFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
     JUnitTestCase.assertTrue(expression.inSetterContext());
   }
+
   static dartSuite() {
     _ut.group('IndexExpressionTest', () {
       _ut.test('test_inGetterContext_assignment_compound_left', () {
@@ -187,6 +210,7 @@
     });
   }
 }
+
 class VariableDeclarationTest extends ParserTestCase {
   void test_getDocumentationComment_onGrandParent() {
     VariableDeclaration varDecl = ASTFactory.variableDeclaration("a");
@@ -197,12 +221,14 @@
     JUnitTestCase.assertNotNull(varDecl.documentationComment);
     JUnitTestCase.assertNotNull(decl.documentationComment);
   }
+
   void test_getDocumentationComment_onNode() {
     VariableDeclaration decl = ASTFactory.variableDeclaration("a");
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     decl.documentationComment = comment;
     JUnitTestCase.assertNotNull(decl.documentationComment);
   }
+
   static dartSuite() {
     _ut.group('VariableDeclarationTest', () {
       _ut.test('test_getDocumentationComment_onGrandParent', () {
@@ -216,6 +242,7 @@
     });
   }
 }
+
 /**
  * The class `ASTFactory` defines utility methods that can be used to create AST nodes. The
  * nodes that are created are complete in the sense that all of the tokens that would have been
@@ -230,75 +257,145 @@
  */
 class ASTFactory {
   static AdjacentStrings adjacentStrings(List<StringLiteral> strings) => new AdjacentStrings.full(list(strings));
+
   static Annotation annotation(Identifier name) => new Annotation.full(TokenFactory.token3(TokenType.AT), name, null, null, null);
+
   static Annotation annotation2(Identifier name, SimpleIdentifier constructorName, ArgumentList arguments) => new Annotation.full(TokenFactory.token3(TokenType.AT), name, TokenFactory.token3(TokenType.PERIOD), constructorName, arguments);
+
   static ArgumentDefinitionTest argumentDefinitionTest(String identifier) => new ArgumentDefinitionTest.full(TokenFactory.token3(TokenType.QUESTION), identifier3(identifier));
+
   static ArgumentList argumentList(List<Expression> arguments) => new ArgumentList.full(TokenFactory.token3(TokenType.OPEN_PAREN), list(arguments), TokenFactory.token3(TokenType.CLOSE_PAREN));
+
   static AsExpression asExpression(Expression expression, TypeName type) => new AsExpression.full(expression, TokenFactory.token(Keyword.AS), type);
+
   static AssertStatement assertStatement(Expression condition) => new AssertStatement.full(TokenFactory.token(Keyword.ASSERT), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), TokenFactory.token3(TokenType.SEMICOLON));
+
   static AssignmentExpression assignmentExpression(Expression leftHandSide, TokenType operator, Expression rightHandSide) => new AssignmentExpression.full(leftHandSide, TokenFactory.token3(operator), rightHandSide);
+
   static BinaryExpression binaryExpression(Expression leftOperand, TokenType operator, Expression rightOperand) => new BinaryExpression.full(leftOperand, TokenFactory.token3(operator), rightOperand);
+
   static Block block(List<Statement> statements) => new Block.full(TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(statements), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+
   static BlockFunctionBody blockFunctionBody(Block block) => new BlockFunctionBody.full(block);
+
   static BlockFunctionBody blockFunctionBody2(List<Statement> statements) => new BlockFunctionBody.full(block(statements));
+
   static BooleanLiteral booleanLiteral(bool value) => new BooleanLiteral.full(value ? TokenFactory.token(Keyword.TRUE) : TokenFactory.token(Keyword.FALSE), value);
+
   static BreakStatement breakStatement() => new BreakStatement.full(TokenFactory.token(Keyword.BREAK), null, TokenFactory.token3(TokenType.SEMICOLON));
+
   static BreakStatement breakStatement2(String label) => new BreakStatement.full(TokenFactory.token(Keyword.BREAK), identifier3(label), TokenFactory.token3(TokenType.SEMICOLON));
+
   static IndexExpression cascadedIndexExpression(Expression index) => new IndexExpression.forCascade_full(TokenFactory.token3(TokenType.PERIOD_PERIOD), TokenFactory.token3(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.token3(TokenType.CLOSE_SQUARE_BRACKET));
+
   static MethodInvocation cascadedMethodInvocation(String methodName, List<Expression> arguments) => new MethodInvocation.full(null, TokenFactory.token3(TokenType.PERIOD_PERIOD), identifier3(methodName), argumentList(arguments));
+
   static PropertyAccess cascadedPropertyAccess(String propertyName) => new PropertyAccess.full(null, TokenFactory.token3(TokenType.PERIOD_PERIOD), identifier3(propertyName));
+
   static CascadeExpression cascadeExpression(Expression target, List<Expression> cascadeSections) => new CascadeExpression.full(target, list(cascadeSections));
+
   static CatchClause catchClause(String exceptionParameter, List<Statement> statements) => catchClause5(null, exceptionParameter, null, statements);
+
   static CatchClause catchClause2(String exceptionParameter, String stackTraceParameter, List<Statement> statements) => catchClause5(null, exceptionParameter, stackTraceParameter, statements);
+
   static CatchClause catchClause3(TypeName exceptionType, List<Statement> statements) => catchClause5(exceptionType, null, null, statements);
+
   static CatchClause catchClause4(TypeName exceptionType, String exceptionParameter, List<Statement> statements) => catchClause5(exceptionType, exceptionParameter, null, statements);
+
   static CatchClause catchClause5(TypeName exceptionType, String exceptionParameter, String stackTraceParameter, List<Statement> statements) => new CatchClause.full(exceptionType == null ? null : TokenFactory.token4(TokenType.IDENTIFIER, "on"), exceptionType, exceptionParameter == null ? null : TokenFactory.token(Keyword.CATCH), exceptionParameter == null ? null : TokenFactory.token3(TokenType.OPEN_PAREN), identifier3(exceptionParameter), stackTraceParameter == null ? null : TokenFactory.token3(TokenType.COMMA), stackTraceParameter == null ? null : identifier3(stackTraceParameter), exceptionParameter == null ? null : TokenFactory.token3(TokenType.CLOSE_PAREN), block(statements));
+
   static ClassDeclaration classDeclaration(Keyword abstractKeyword, String name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, List<ClassMember> members) => new ClassDeclaration.full(null, null, abstractKeyword == null ? null : TokenFactory.token(abstractKeyword), TokenFactory.token(Keyword.CLASS), identifier3(name), typeParameters, extendsClause, withClause, implementsClause, TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(members), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+
   static ClassTypeAlias classTypeAlias(String name, TypeParameterList typeParameters, Keyword abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause) => new ClassTypeAlias.full(null, null, TokenFactory.token(Keyword.CLASS), identifier3(name), typeParameters, TokenFactory.token3(TokenType.EQ), abstractKeyword == null ? null : TokenFactory.token(abstractKeyword), superclass, withClause, implementsClause, TokenFactory.token3(TokenType.SEMICOLON));
+
   static CompilationUnit compilationUnit() => compilationUnit8(null, null, null);
+
   static CompilationUnit compilationUnit2(List<CompilationUnitMember> declarations) => compilationUnit8(null, null, list(declarations));
+
   static CompilationUnit compilationUnit3(List<Directive> directives) => compilationUnit8(null, list(directives), null);
+
   static CompilationUnit compilationUnit4(List<Directive> directives, List<CompilationUnitMember> declarations) => compilationUnit8(null, directives, declarations);
+
   static CompilationUnit compilationUnit5(String scriptTag) => compilationUnit8(scriptTag, null, null);
+
   static CompilationUnit compilationUnit6(String scriptTag, List<CompilationUnitMember> declarations) => compilationUnit8(scriptTag, null, list(declarations));
+
   static CompilationUnit compilationUnit7(String scriptTag, List<Directive> directives) => compilationUnit8(scriptTag, list(directives), null);
+
   static CompilationUnit compilationUnit8(String scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations) => new CompilationUnit.full(TokenFactory.token3(TokenType.EOF), scriptTag == null ? null : ASTFactory.scriptTag(scriptTag), directives == null ? new List<Directive>() : directives, declarations == null ? new List<CompilationUnitMember>() : declarations, TokenFactory.token3(TokenType.EOF));
+
   static ConditionalExpression conditionalExpression(Expression condition, Expression thenExpression, Expression elseExpression) => new ConditionalExpression.full(condition, TokenFactory.token3(TokenType.QUESTION), thenExpression, TokenFactory.token3(TokenType.COLON), elseExpression);
+
   static ConstructorDeclaration constructorDeclaration(Identifier returnType, String name, FormalParameterList parameters, List<ConstructorInitializer> initializers) => new ConstructorDeclaration.full(null, null, TokenFactory.token(Keyword.EXTERNAL), null, null, returnType, name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name), parameters, initializers == null || initializers.isEmpty ? null : TokenFactory.token3(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, emptyFunctionBody());
+
   static ConstructorDeclaration constructorDeclaration2(Keyword constKeyword, Keyword factoryKeyword, Identifier returnType, String name, FormalParameterList parameters, List<ConstructorInitializer> initializers, FunctionBody body) => new ConstructorDeclaration.full(null, null, null, constKeyword == null ? null : TokenFactory.token(constKeyword), factoryKeyword == null ? null : TokenFactory.token(factoryKeyword), returnType, name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name), parameters, initializers == null || initializers.isEmpty ? null : TokenFactory.token3(TokenType.PERIOD), initializers == null ? new List<ConstructorInitializer>() : initializers, null, body);
+
   static ConstructorFieldInitializer constructorFieldInitializer(bool prefixedWithThis, String fieldName, Expression expression) => new ConstructorFieldInitializer.full(prefixedWithThis ? TokenFactory.token(Keyword.THIS) : null, prefixedWithThis ? TokenFactory.token3(TokenType.PERIOD) : null, identifier3(fieldName), TokenFactory.token3(TokenType.EQ), expression);
+
   static ConstructorName constructorName(TypeName type, String name) => new ConstructorName.full(type, name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name));
+
   static ContinueStatement continueStatement() => new ContinueStatement.full(TokenFactory.token(Keyword.CONTINUE), null, TokenFactory.token3(TokenType.SEMICOLON));
+
   static ContinueStatement continueStatement2(String label) => new ContinueStatement.full(TokenFactory.token(Keyword.CONTINUE), identifier3(label), TokenFactory.token3(TokenType.SEMICOLON));
+
   static DeclaredIdentifier declaredIdentifier(Keyword keyword, String identifier) => declaredIdentifier2(keyword, null, identifier);
+
   static DeclaredIdentifier declaredIdentifier2(Keyword keyword, TypeName type, String identifier) => new DeclaredIdentifier.full(null, null, keyword == null ? null : TokenFactory.token(keyword), type, identifier3(identifier));
+
   static DeclaredIdentifier declaredIdentifier3(String identifier) => declaredIdentifier2(null, null, identifier);
+
   static DeclaredIdentifier declaredIdentifier4(TypeName type, String identifier) => declaredIdentifier2(null, type, identifier);
+
   static DoStatement doStatement(Statement body, Expression condition) => new DoStatement.full(TokenFactory.token(Keyword.DO), body, TokenFactory.token(Keyword.WHILE), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), TokenFactory.token3(TokenType.SEMICOLON));
+
   static DoubleLiteral doubleLiteral(double value) => new DoubleLiteral.full(TokenFactory.token2(value.toString()), value);
+
   static EmptyFunctionBody emptyFunctionBody() => new EmptyFunctionBody.full(TokenFactory.token3(TokenType.SEMICOLON));
+
   static EmptyStatement emptyStatement() => new EmptyStatement.full(TokenFactory.token3(TokenType.SEMICOLON));
+
   static ExportDirective exportDirective(List<Annotation> metadata, String uri, List<Combinator> combinators) => new ExportDirective.full(null, metadata, TokenFactory.token(Keyword.EXPORT), string2(uri), list(combinators), TokenFactory.token3(TokenType.SEMICOLON));
+
   static ExportDirective exportDirective2(String uri, List<Combinator> combinators) => exportDirective(new List<Annotation>(), uri, combinators);
+
   static ExpressionFunctionBody expressionFunctionBody(Expression expression) => new ExpressionFunctionBody.full(TokenFactory.token3(TokenType.FUNCTION), expression, TokenFactory.token3(TokenType.SEMICOLON));
+
   static ExpressionStatement expressionStatement(Expression expression) => new ExpressionStatement.full(expression, TokenFactory.token3(TokenType.SEMICOLON));
+
   static ExtendsClause extendsClause(TypeName type) => new ExtendsClause.full(TokenFactory.token(Keyword.EXTENDS), type);
+
   static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new FieldDeclaration.full(null, null, isStatic ? TokenFactory.token(Keyword.STATIC) : null, variableDeclarationList(keyword, type, variables), TokenFactory.token3(TokenType.SEMICOLON));
+
   static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword, List<VariableDeclaration> variables) => fieldDeclaration(isStatic, keyword, null, variables);
+
   static FieldFormalParameter fieldFormalParameter(Keyword keyword, TypeName type, String identifier) => new FieldFormalParameter.full(null, null, keyword == null ? null : TokenFactory.token(keyword), type, TokenFactory.token(Keyword.THIS), TokenFactory.token3(TokenType.PERIOD), identifier3(identifier), null);
+
   static FieldFormalParameter fieldFormalParameter2(Keyword keyword, TypeName type, String identifier, FormalParameterList parameterList) => new FieldFormalParameter.full(null, null, keyword == null ? null : TokenFactory.token(keyword), type, TokenFactory.token(Keyword.THIS), TokenFactory.token3(TokenType.PERIOD), identifier3(identifier), parameterList);
+
   static FieldFormalParameter fieldFormalParameter3(String identifier) => fieldFormalParameter(null, null, identifier);
+
   static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable, Expression iterator, Statement body) => new ForEachStatement.con1_full(TokenFactory.token(Keyword.FOR), TokenFactory.token3(TokenType.OPEN_PAREN), loopVariable, TokenFactory.token(Keyword.IN), iterator, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+
   static FormalParameterList formalParameterList(List<FormalParameter> parameters) => new FormalParameterList.full(TokenFactory.token3(TokenType.OPEN_PAREN), list(parameters), null, null, TokenFactory.token3(TokenType.CLOSE_PAREN));
+
   static ForStatement forStatement(Expression initialization, Expression condition, List<Expression> updaters, Statement body) => new ForStatement.full(TokenFactory.token(Keyword.FOR), TokenFactory.token3(TokenType.OPEN_PAREN), null, initialization, TokenFactory.token3(TokenType.SEMICOLON), condition, TokenFactory.token3(TokenType.SEMICOLON), updaters, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+
   static ForStatement forStatement2(VariableDeclarationList variableList, Expression condition, List<Expression> updaters, Statement body) => new ForStatement.full(TokenFactory.token(Keyword.FOR), TokenFactory.token3(TokenType.OPEN_PAREN), variableList, null, TokenFactory.token3(TokenType.SEMICOLON), condition, TokenFactory.token3(TokenType.SEMICOLON), updaters, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+
   static FunctionDeclaration functionDeclaration(TypeName type, Keyword keyword, String name, FunctionExpression functionExpression) => new FunctionDeclaration.full(null, null, null, type, keyword == null ? null : TokenFactory.token(keyword), identifier3(name), functionExpression);
+
   static FunctionDeclarationStatement functionDeclarationStatement(TypeName type, Keyword keyword, String name, FunctionExpression functionExpression) => new FunctionDeclarationStatement.full(functionDeclaration(type, keyword, name, functionExpression));
+
   static FunctionExpression functionExpression() => new FunctionExpression.full(formalParameterList([]), blockFunctionBody2([]));
+
   static FunctionExpression functionExpression2(FormalParameterList parameters, FunctionBody body) => new FunctionExpression.full(parameters, body);
+
   static FunctionExpressionInvocation functionExpressionInvocation(Expression function, List<Expression> arguments) => new FunctionExpressionInvocation.full(function, argumentList(arguments));
+
   static FunctionTypedFormalParameter functionTypedFormalParameter(TypeName returnType, String identifier, List<FormalParameter> parameters) => new FunctionTypedFormalParameter.full(null, null, returnType, identifier3(identifier), formalParameterList(parameters));
+
   static HideCombinator hideCombinator(List<SimpleIdentifier> identifiers) => new HideCombinator.full(TokenFactory.token2("hide"), list(identifiers));
+
   static HideCombinator hideCombinator2(List<String> identifiers) {
     List<SimpleIdentifier> identifierList = new List<SimpleIdentifier>();
     for (String identifier in identifiers) {
@@ -306,30 +403,55 @@
     }
     return new HideCombinator.full(TokenFactory.token2("hide"), identifierList);
   }
+
   static PrefixedIdentifier identifier(SimpleIdentifier prefix, SimpleIdentifier identifier) => new PrefixedIdentifier.full(prefix, TokenFactory.token3(TokenType.PERIOD), identifier);
+
   static SimpleIdentifier identifier3(String lexeme) => new SimpleIdentifier.full(TokenFactory.token4(TokenType.IDENTIFIER, lexeme));
+
   static PrefixedIdentifier identifier4(String prefix, SimpleIdentifier identifier) => new PrefixedIdentifier.full(identifier3(prefix), TokenFactory.token3(TokenType.PERIOD), identifier);
+
   static PrefixedIdentifier identifier5(String prefix, String identifier) => new PrefixedIdentifier.full(identifier3(prefix), TokenFactory.token3(TokenType.PERIOD), identifier3(identifier));
+
   static IfStatement ifStatement(Expression condition, Statement thenStatement) => ifStatement2(condition, thenStatement, null);
+
   static IfStatement ifStatement2(Expression condition, Statement thenStatement, Statement elseStatement) => new IfStatement.full(TokenFactory.token(Keyword.IF), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), thenStatement, elseStatement == null ? null : TokenFactory.token(Keyword.ELSE), elseStatement);
+
   static ImplementsClause implementsClause(List<TypeName> types) => new ImplementsClause.full(TokenFactory.token(Keyword.IMPLEMENTS), list(types));
+
   static ImportDirective importDirective(List<Annotation> metadata, String uri, String prefix, List<Combinator> combinators) => new ImportDirective.full(null, metadata, TokenFactory.token(Keyword.IMPORT), string2(uri), prefix == null ? null : TokenFactory.token(Keyword.AS), prefix == null ? null : identifier3(prefix), list(combinators), TokenFactory.token3(TokenType.SEMICOLON));
+
   static ImportDirective importDirective2(String uri, String prefix, List<Combinator> combinators) => importDirective(new List<Annotation>(), uri, prefix, combinators);
+
   static IndexExpression indexExpression(Expression array, Expression index) => new IndexExpression.forTarget_full(array, TokenFactory.token3(TokenType.OPEN_SQUARE_BRACKET), index, TokenFactory.token3(TokenType.CLOSE_SQUARE_BRACKET));
+
   static InstanceCreationExpression instanceCreationExpression(Keyword keyword, ConstructorName name, List<Expression> arguments) => new InstanceCreationExpression.full(keyword == null ? null : TokenFactory.token(keyword), name, argumentList(arguments));
+
   static InstanceCreationExpression instanceCreationExpression2(Keyword keyword, TypeName type, List<Expression> arguments) => instanceCreationExpression3(keyword, type, null, arguments);
+
   static InstanceCreationExpression instanceCreationExpression3(Keyword keyword, TypeName type, String identifier, List<Expression> arguments) => instanceCreationExpression(keyword, new ConstructorName.full(type, identifier == null ? null : TokenFactory.token3(TokenType.PERIOD), identifier == null ? null : identifier3(identifier)), arguments);
+
   static IntegerLiteral integer(int value) => new IntegerLiteral.full(TokenFactory.token4(TokenType.INT, value.toString()), value);
+
   static InterpolationExpression interpolationExpression(Expression expression) => new InterpolationExpression.full(TokenFactory.token3(TokenType.STRING_INTERPOLATION_EXPRESSION), expression, TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+
   static InterpolationExpression interpolationExpression2(String identifier) => new InterpolationExpression.full(TokenFactory.token3(TokenType.STRING_INTERPOLATION_IDENTIFIER), identifier3(identifier), null);
+
   static InterpolationString interpolationString(String contents, String value) => new InterpolationString.full(TokenFactory.token2(contents), value);
+
   static IsExpression isExpression(Expression expression, bool negated, TypeName type) => new IsExpression.full(expression, TokenFactory.token(Keyword.IS), negated ? TokenFactory.token3(TokenType.BANG) : null, type);
+
   static Label label(SimpleIdentifier label) => new Label.full(label, TokenFactory.token3(TokenType.COLON));
+
   static Label label2(String label) => ASTFactory.label(identifier3(label));
+
   static LabeledStatement labeledStatement(List<Label> labels, Statement statement) => new LabeledStatement.full(labels, statement);
+
   static LibraryDirective libraryDirective(List<Annotation> metadata, LibraryIdentifier libraryName) => new LibraryDirective.full(null, metadata, TokenFactory.token(Keyword.LIBRARY), libraryName, TokenFactory.token3(TokenType.SEMICOLON));
+
   static LibraryDirective libraryDirective2(String libraryName) => libraryDirective(new List<Annotation>(), libraryIdentifier2([libraryName]));
+
   static LibraryIdentifier libraryIdentifier(List<SimpleIdentifier> components) => new LibraryIdentifier.full(list(components));
+
   static LibraryIdentifier libraryIdentifier2(List<String> components) {
     List<SimpleIdentifier> componentList = new List<SimpleIdentifier>();
     for (String component in components) {
@@ -337,6 +459,7 @@
     }
     return new LibraryIdentifier.full(componentList);
   }
+
   static List list(List<Object> elements) {
     List elementList = new List();
     for (Object element in elements) {
@@ -344,38 +467,71 @@
     }
     return elementList;
   }
+
   static ListLiteral listLiteral(List<Expression> elements) => listLiteral2(null, null, elements);
+
   static ListLiteral listLiteral2(Keyword keyword, TypeArgumentList typeArguments, List<Expression> elements) => new ListLiteral.full(keyword == null ? null : TokenFactory.token(keyword), null, TokenFactory.token3(TokenType.OPEN_SQUARE_BRACKET), list(elements), TokenFactory.token3(TokenType.CLOSE_SQUARE_BRACKET));
+
   static MapLiteral mapLiteral(Keyword keyword, TypeArgumentList typeArguments, List<MapLiteralEntry> entries) => new MapLiteral.full(keyword == null ? null : TokenFactory.token(keyword), typeArguments, TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(entries), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+
   static MapLiteral mapLiteral2(List<MapLiteralEntry> entries) => mapLiteral(null, null, entries);
+
   static MapLiteralEntry mapLiteralEntry(String key, Expression value) => new MapLiteralEntry.full(string2(key), TokenFactory.token3(TokenType.COLON), value);
+
   static MethodDeclaration methodDeclaration(Keyword modifier, TypeName returnType, Keyword property, Keyword operator, SimpleIdentifier name, FormalParameterList parameters) => new MethodDeclaration.full(null, null, TokenFactory.token(Keyword.EXTERNAL), modifier == null ? null : TokenFactory.token(modifier), returnType, property == null ? null : TokenFactory.token(property), operator == null ? null : TokenFactory.token(operator), name, parameters, emptyFunctionBody());
+
   static MethodDeclaration methodDeclaration2(Keyword modifier, TypeName returnType, Keyword property, Keyword operator, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) => new MethodDeclaration.full(null, null, null, modifier == null ? null : TokenFactory.token(modifier), returnType, property == null ? null : TokenFactory.token(property), operator == null ? null : TokenFactory.token(operator), name, parameters, body);
+
   static MethodInvocation methodInvocation(Expression target, String methodName, List<Expression> arguments) => new MethodInvocation.full(target, target == null ? null : TokenFactory.token3(TokenType.PERIOD), identifier3(methodName), argumentList(arguments));
+
   static MethodInvocation methodInvocation2(String methodName, List<Expression> arguments) => methodInvocation(null, methodName, arguments);
+
   static NamedExpression namedExpression(Label label, Expression expression) => new NamedExpression.full(label, expression);
+
   static NamedExpression namedExpression2(String label, Expression expression) => namedExpression(label2(label), expression);
+
   static DefaultFormalParameter namedFormalParameter(NormalFormalParameter parameter, Expression expression) => new DefaultFormalParameter.full(parameter, ParameterKind.NAMED, expression == null ? null : TokenFactory.token3(TokenType.COLON), expression);
+
   static NativeClause nativeClause(String nativeCode) => new NativeClause.full(TokenFactory.token2("native"), string2(nativeCode));
+
   static NativeFunctionBody nativeFunctionBody(String nativeMethodName) => new NativeFunctionBody.full(TokenFactory.token2("native"), string2(nativeMethodName), TokenFactory.token3(TokenType.SEMICOLON));
+
   static NullLiteral nullLiteral() => new NullLiteral.full(TokenFactory.token(Keyword.NULL));
+
   static ParenthesizedExpression parenthesizedExpression(Expression expression) => new ParenthesizedExpression.full(TokenFactory.token3(TokenType.OPEN_PAREN), expression, TokenFactory.token3(TokenType.CLOSE_PAREN));
+
   static PartDirective partDirective(List<Annotation> metadata, String url) => new PartDirective.full(null, metadata, TokenFactory.token(Keyword.PART), string2(url), TokenFactory.token3(TokenType.SEMICOLON));
+
   static PartDirective partDirective2(String url) => partDirective(new List<Annotation>(), url);
+
   static PartOfDirective partOfDirective(LibraryIdentifier libraryName) => partOfDirective2(new List<Annotation>(), libraryName);
+
   static PartOfDirective partOfDirective2(List<Annotation> metadata, LibraryIdentifier libraryName) => new PartOfDirective.full(null, metadata, TokenFactory.token(Keyword.PART), TokenFactory.token2("of"), libraryName, TokenFactory.token3(TokenType.SEMICOLON));
+
   static DefaultFormalParameter positionalFormalParameter(NormalFormalParameter parameter, Expression expression) => new DefaultFormalParameter.full(parameter, ParameterKind.POSITIONAL, expression == null ? null : TokenFactory.token3(TokenType.EQ), expression);
+
   static PostfixExpression postfixExpression(Expression expression, TokenType operator) => new PostfixExpression.full(expression, TokenFactory.token3(operator));
+
   static PrefixExpression prefixExpression(TokenType operator, Expression expression) => new PrefixExpression.full(TokenFactory.token3(operator), expression);
+
   static PropertyAccess propertyAccess(Expression target, SimpleIdentifier propertyName) => new PropertyAccess.full(target, TokenFactory.token3(TokenType.PERIOD), propertyName);
+
   static PropertyAccess propertyAccess2(Expression target, String propertyName) => new PropertyAccess.full(target, TokenFactory.token3(TokenType.PERIOD), identifier3(propertyName));
+
   static RedirectingConstructorInvocation redirectingConstructorInvocation(List<Expression> arguments) => redirectingConstructorInvocation2(null, arguments);
+
   static RedirectingConstructorInvocation redirectingConstructorInvocation2(String constructorName, List<Expression> arguments) => new RedirectingConstructorInvocation.full(TokenFactory.token(Keyword.THIS), constructorName == null ? null : TokenFactory.token3(TokenType.PERIOD), constructorName == null ? null : identifier3(constructorName), argumentList(arguments));
+
   static RethrowExpression rethrowExpression() => new RethrowExpression.full(TokenFactory.token(Keyword.RETHROW));
+
   static ReturnStatement returnStatement() => returnStatement2(null);
+
   static ReturnStatement returnStatement2(Expression expression) => new ReturnStatement.full(TokenFactory.token(Keyword.RETURN), expression, TokenFactory.token3(TokenType.SEMICOLON));
+
   static ScriptTag scriptTag(String scriptTag) => new ScriptTag.full(TokenFactory.token2(scriptTag));
+
   static ShowCombinator showCombinator(List<SimpleIdentifier> identifiers) => new ShowCombinator.full(TokenFactory.token2("show"), list(identifiers));
+
   static ShowCombinator showCombinator2(List<String> identifiers) {
     List<SimpleIdentifier> identifierList = new List<SimpleIdentifier>();
     for (String identifier in identifiers) {
@@ -383,20 +539,35 @@
     }
     return new ShowCombinator.full(TokenFactory.token2("show"), identifierList);
   }
+
   static SimpleFormalParameter simpleFormalParameter(Keyword keyword, String parameterName) => simpleFormalParameter2(keyword, null, parameterName);
+
   static SimpleFormalParameter simpleFormalParameter2(Keyword keyword, TypeName type, String parameterName) => new SimpleFormalParameter.full(null, null, keyword == null ? null : TokenFactory.token(keyword), type, identifier3(parameterName));
+
   static SimpleFormalParameter simpleFormalParameter3(String parameterName) => simpleFormalParameter2(null, null, parameterName);
+
   static SimpleFormalParameter simpleFormalParameter4(TypeName type, String parameterName) => simpleFormalParameter2(null, type, parameterName);
+
   static StringInterpolation string(List<InterpolationElement> elements) => new StringInterpolation.full(list(elements));
+
   static SimpleStringLiteral string2(String content) => new SimpleStringLiteral.full(TokenFactory.token2("'${content}'"), content);
+
   static SuperConstructorInvocation superConstructorInvocation(List<Expression> arguments) => superConstructorInvocation2(null, arguments);
+
   static SuperConstructorInvocation superConstructorInvocation2(String name, List<Expression> arguments) => new SuperConstructorInvocation.full(TokenFactory.token(Keyword.SUPER), name == null ? null : TokenFactory.token3(TokenType.PERIOD), name == null ? null : identifier3(name), argumentList(arguments));
+
   static SuperExpression superExpression() => new SuperExpression.full(TokenFactory.token(Keyword.SUPER));
+
   static SwitchCase switchCase(Expression expression, List<Statement> statements) => switchCase2(new List<Label>(), expression, statements);
+
   static SwitchCase switchCase2(List<Label> labels, Expression expression, List<Statement> statements) => new SwitchCase.full(labels, TokenFactory.token(Keyword.CASE), expression, TokenFactory.token3(TokenType.COLON), list(statements));
+
   static SwitchDefault switchDefault(List<Label> labels, List<Statement> statements) => new SwitchDefault.full(labels, TokenFactory.token(Keyword.DEFAULT), TokenFactory.token3(TokenType.COLON), list(statements));
+
   static SwitchDefault switchDefault2(List<Statement> statements) => switchDefault(new List<Label>(), statements);
+
   static SwitchStatement switchStatement(Expression expression, List<SwitchMember> members) => new SwitchStatement.full(TokenFactory.token(Keyword.SWITCH), TokenFactory.token3(TokenType.OPEN_PAREN), expression, TokenFactory.token3(TokenType.CLOSE_PAREN), TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(members), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
+
   static SymbolLiteral symbolLiteral(List<String> components) {
     List<Token> identifierList = new List<Token>();
     for (String component in components) {
@@ -404,15 +575,25 @@
     }
     return new SymbolLiteral.full(TokenFactory.token3(TokenType.HASH), new List.from(identifierList));
   }
+
   static ThisExpression thisExpression() => new ThisExpression.full(TokenFactory.token(Keyword.THIS));
+
   static ThrowExpression throwExpression() => throwExpression2(null);
+
   static ThrowExpression throwExpression2(Expression expression) => new ThrowExpression.full(TokenFactory.token(Keyword.THROW), expression);
+
   static TopLevelVariableDeclaration topLevelVariableDeclaration(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new TopLevelVariableDeclaration.full(null, null, variableDeclarationList(keyword, type, variables), TokenFactory.token3(TokenType.SEMICOLON));
+
   static TopLevelVariableDeclaration topLevelVariableDeclaration2(Keyword keyword, List<VariableDeclaration> variables) => new TopLevelVariableDeclaration.full(null, null, variableDeclarationList(keyword, null, variables), TokenFactory.token3(TokenType.SEMICOLON));
+
   static TryStatement tryStatement(Block body, Block finallyClause) => tryStatement3(body, new List<CatchClause>(), finallyClause);
+
   static TryStatement tryStatement2(Block body, List<CatchClause> catchClauses) => tryStatement3(body, list(catchClauses), null);
+
   static TryStatement tryStatement3(Block body, List<CatchClause> catchClauses, Block finallyClause) => new TryStatement.full(TokenFactory.token(Keyword.TRY), body, catchClauses, finallyClause == null ? null : TokenFactory.token(Keyword.FINALLY), finallyClause);
+
   static FunctionTypeAlias typeAlias(TypeName returnType, String name, TypeParameterList typeParameters, FormalParameterList parameters) => new FunctionTypeAlias.full(null, null, TokenFactory.token(Keyword.TYPEDEF), returnType, identifier3(name), typeParameters, parameters, TokenFactory.token3(TokenType.SEMICOLON));
+
   static TypeArgumentList typeArgumentList(List<TypeName> typeNames) => new TypeArgumentList.full(TokenFactory.token3(TokenType.LT), list(typeNames), TokenFactory.token3(TokenType.GT));
 
   /**
@@ -431,20 +612,25 @@
     typeName.type = element.type;
     return typeName;
   }
+
   static TypeName typeName3(Identifier name, List<TypeName> arguments) {
     if (arguments.length == 0) {
       return new TypeName.full(name, null);
     }
     return new TypeName.full(name, typeArgumentList(arguments));
   }
+
   static TypeName typeName4(String name, List<TypeName> arguments) {
     if (arguments.length == 0) {
       return new TypeName.full(identifier3(name), null);
     }
     return new TypeName.full(identifier3(name), typeArgumentList(arguments));
   }
+
   static TypeParameter typeParameter(String name) => new TypeParameter.full(null, null, identifier3(name), null, null);
+
   static TypeParameter typeParameter2(String name, TypeName bound) => new TypeParameter.full(null, null, identifier3(name), TokenFactory.token(Keyword.EXTENDS), bound);
+
   static TypeParameterList typeParameterList(List<String> typeNames) {
     List<TypeParameter> typeParameters = new List<TypeParameter>();
     for (String typeName in typeNames) {
@@ -452,90 +638,116 @@
     }
     return new TypeParameterList.full(TokenFactory.token3(TokenType.LT), typeParameters, TokenFactory.token3(TokenType.GT));
   }
+
   static VariableDeclaration variableDeclaration(String name) => new VariableDeclaration.full(null, null, identifier3(name), null, null);
+
   static VariableDeclaration variableDeclaration2(String name, Expression initializer) => new VariableDeclaration.full(null, null, identifier3(name), TokenFactory.token3(TokenType.EQ), initializer);
+
   static VariableDeclarationList variableDeclarationList(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new VariableDeclarationList.full(null, null, keyword == null ? null : TokenFactory.token(keyword), type, list(variables));
+
   static VariableDeclarationList variableDeclarationList2(Keyword keyword, List<VariableDeclaration> variables) => variableDeclarationList(keyword, null, variables);
+
   static VariableDeclarationStatement variableDeclarationStatement(Keyword keyword, TypeName type, List<VariableDeclaration> variables) => new VariableDeclarationStatement.full(variableDeclarationList(keyword, type, variables), TokenFactory.token3(TokenType.SEMICOLON));
+
   static VariableDeclarationStatement variableDeclarationStatement2(Keyword keyword, List<VariableDeclaration> variables) => variableDeclarationStatement(keyword, null, variables);
+
   static WhileStatement whileStatement(Expression condition, Statement body) => new WhileStatement.full(TokenFactory.token(Keyword.WHILE), TokenFactory.token3(TokenType.OPEN_PAREN), condition, TokenFactory.token3(TokenType.CLOSE_PAREN), body);
+
   static WithClause withClause(List<TypeName> types) => new WithClause.full(TokenFactory.token(Keyword.WITH), list(types));
 }
+
 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());
   }
+
   void test_inDeclarationContext_catch_stack() {
     SimpleIdentifier identifier = ASTFactory.catchClause2("e", "s", []).stackTraceParameter;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_classDeclaration() {
     SimpleIdentifier identifier = ASTFactory.classDeclaration(null, "C", null, null, null, null, []).name;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_classTypeAlias() {
     SimpleIdentifier identifier = ASTFactory.classTypeAlias("C", null, null, null, null, null).name;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_constructorDeclaration() {
     SimpleIdentifier identifier = ASTFactory.constructorDeclaration(ASTFactory.identifier3("C"), "c", null, null).name;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_declaredIdentifier() {
     DeclaredIdentifier declaredIdentifier = ASTFactory.declaredIdentifier3("v");
     SimpleIdentifier identifier = declaredIdentifier.identifier;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_fieldFormalParameter() {
     SimpleIdentifier identifier = ASTFactory.fieldFormalParameter3("p").identifier;
     JUnitTestCase.assertFalse(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_functionDeclaration() {
     SimpleIdentifier identifier = ASTFactory.functionDeclaration(null, null, "f", null).name;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_functionTypeAlias() {
     SimpleIdentifier identifier = ASTFactory.typeAlias(null, "F", null, null).name;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_label_false() {
     SimpleIdentifier identifier = ASTFactory.namedExpression2("l", ASTFactory.integer(0)).name.label;
     JUnitTestCase.assertFalse(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_label_true() {
     Label label = ASTFactory.label2("l");
     SimpleIdentifier identifier = label.label;
     ASTFactory.labeledStatement(ASTFactory.list([label]), ASTFactory.emptyStatement());
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_methodDeclaration() {
     SimpleIdentifier identifier = ASTFactory.identifier3("m");
     ASTFactory.methodDeclaration2(null, null, null, null, identifier, null, null);
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_simpleFormalParameter() {
     SimpleIdentifier identifier = ASTFactory.simpleFormalParameter3("p").identifier;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_typeParameter_bound() {
     TypeName bound = ASTFactory.typeName4("A", []);
     SimpleIdentifier identifier = bound.name as SimpleIdentifier;
     ASTFactory.typeParameter2("E", bound);
     JUnitTestCase.assertFalse(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_typeParameter_name() {
     SimpleIdentifier identifier = ASTFactory.typeParameter("E").name;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inDeclarationContext_variableDeclaration() {
     SimpleIdentifier identifier = ASTFactory.variableDeclaration("v").name;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
+
   void test_inGetterContext() {
     for (WrapperKind wrapper in WrapperKind.values) {
       for (AssignmentKind assignment in AssignmentKind.values) {
@@ -552,12 +764,14 @@
       }
     }
   }
+
   void test_inReferenceContext() {
     SimpleIdentifier identifier = ASTFactory.identifier3("id");
     ASTFactory.namedExpression(ASTFactory.label(identifier), ASTFactory.identifier3("_"));
     JUnitTestCase.assertFalse(identifier.inGetterContext());
     JUnitTestCase.assertFalse(identifier.inSetterContext());
   }
+
   void test_inSetterContext() {
     for (WrapperKind wrapper in WrapperKind.values) {
       for (AssignmentKind assignment in AssignmentKind.values) {
@@ -574,6 +788,7 @@
       }
     }
   }
+
   SimpleIdentifier createIdentifier(WrapperKind wrapper, AssignmentKind assignment) {
     SimpleIdentifier identifier = ASTFactory.identifier3("a");
     Expression expression = identifier;
@@ -629,6 +844,7 @@
     }
     return child;
   }
+
   static dartSuite() {
     _ut.group('SimpleIdentifierTest', () {
       _ut.test('test_inDeclarationContext_argumentDefinition', () {
@@ -714,17 +930,28 @@
     });
   }
 }
+
 class AssignmentKind extends Enum<AssignmentKind> {
   static final AssignmentKind BINARY = new AssignmentKind('BINARY', 0);
+
   static final AssignmentKind COMPOUND_LEFT = new AssignmentKind('COMPOUND_LEFT', 1);
+
   static final AssignmentKind COMPOUND_RIGHT = new AssignmentKind('COMPOUND_RIGHT', 2);
+
   static final AssignmentKind POSTFIX_INC = new AssignmentKind('POSTFIX_INC', 3);
+
   static final AssignmentKind PREFIX_DEC = new AssignmentKind('PREFIX_DEC', 4);
+
   static final AssignmentKind PREFIX_INC = new AssignmentKind('PREFIX_INC', 5);
+
   static final AssignmentKind PREFIX_NOT = new AssignmentKind('PREFIX_NOT', 6);
+
   static final AssignmentKind SIMPLE_LEFT = new AssignmentKind('SIMPLE_LEFT', 7);
+
   static final AssignmentKind SIMPLE_RIGHT = new AssignmentKind('SIMPLE_RIGHT', 8);
+
   static final AssignmentKind NONE = new AssignmentKind('NONE', 9);
+
   static final List<AssignmentKind> values = [
       BINARY,
       COMPOUND_LEFT,
@@ -736,22 +963,31 @@
       SIMPLE_LEFT,
       SIMPLE_RIGHT,
       NONE];
+
   AssignmentKind(String name, int ordinal) : super(name, ordinal);
 }
+
 class WrapperKind extends Enum<WrapperKind> {
   static final WrapperKind PREFIXED_LEFT = new WrapperKind('PREFIXED_LEFT', 0);
+
   static final WrapperKind PREFIXED_RIGHT = new WrapperKind('PREFIXED_RIGHT', 1);
+
   static final WrapperKind PROPERTY_LEFT = new WrapperKind('PROPERTY_LEFT', 2);
+
   static final WrapperKind PROPERTY_RIGHT = new WrapperKind('PROPERTY_RIGHT', 3);
+
   static final WrapperKind NONE = new WrapperKind('NONE', 4);
+
   static final List<WrapperKind> values = [
       PREFIXED_LEFT,
       PREFIXED_RIGHT,
       PROPERTY_LEFT,
       PROPERTY_RIGHT,
       NONE];
+
   WrapperKind(String name, int ordinal) : super(name, ordinal);
 }
+
 class BreadthFirstVisitorTest extends ParserTestCase {
   void testIt() {
     String source = EngineTestCase.createSource([
@@ -775,7 +1011,7 @@
         "}"]);
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(source, []);
     List<ASTNode> nodes = new List<ASTNode>();
-    BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_18(nodes);
+    BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_19(nodes);
     visitor.visitAllNodes(unit);
     EngineTestCase.assertSize(59, nodes);
     EngineTestCase.assertInstanceOf(CompilationUnit, nodes[0]);
@@ -784,6 +1020,7 @@
     EngineTestCase.assertInstanceOf(FunctionDeclarationStatement, nodes[27]);
     EngineTestCase.assertInstanceOf(IntegerLiteral, nodes[58]);
   }
+
   static dartSuite() {
     _ut.group('BreadthFirstVisitorTest', () {
       _ut.test('testIt', () {
@@ -793,14 +1030,18 @@
     });
   }
 }
-class BreadthFirstVisitor_18 extends BreadthFirstVisitor<Object> {
+
+class BreadthFirstVisitor_19 extends BreadthFirstVisitor<Object> {
   List<ASTNode> nodes;
-  BreadthFirstVisitor_18(this.nodes) : super();
+
+  BreadthFirstVisitor_19(this.nodes) : super();
+
   Object visitNode(ASTNode node) {
     nodes.add(node);
     return super.visitNode(node);
   }
 }
+
 class NodeListTest extends EngineTestCase {
   void test_add() {
     ASTNode parent = ASTFactory.argumentList([]);
@@ -824,6 +1065,7 @@
     JUnitTestCase.assertSame(parent, secondNode.parent);
     JUnitTestCase.assertSame(parent, thirdNode.parent);
   }
+
   void test_add_negative() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     try {
@@ -832,6 +1074,7 @@
     } on RangeError catch (exception) {
     }
   }
+
   void test_add_tooBig() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     try {
@@ -840,6 +1083,7 @@
     } on RangeError catch (exception) {
     }
   }
+
   void test_addAll() {
     ASTNode parent = ASTFactory.argumentList([]);
     List<ASTNode> firstNodes = new List<ASTNode>();
@@ -870,6 +1114,7 @@
     JUnitTestCase.assertSame(parent, thirdNode.parent);
     JUnitTestCase.assertSame(parent, fourthNode.parent);
   }
+
   void test_create() {
     ASTNode owner = ASTFactory.argumentList([]);
     NodeList<ASTNode> list = NodeList.create(owner);
@@ -877,6 +1122,7 @@
     EngineTestCase.assertSize(0, list);
     JUnitTestCase.assertSame(owner, list.owner);
   }
+
   void test_creation() {
     ASTNode owner = ASTFactory.argumentList([]);
     NodeList<ASTNode> list = new NodeList<ASTNode>(owner);
@@ -884,6 +1130,7 @@
     EngineTestCase.assertSize(0, list);
     JUnitTestCase.assertSame(owner, list.owner);
   }
+
   void test_get_negative() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     try {
@@ -892,6 +1139,7 @@
     } on RangeError catch (exception) {
     }
   }
+
   void test_get_tooBig() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     try {
@@ -900,26 +1148,31 @@
     } on RangeError catch (exception) {
     }
   }
+
   void test_getBeginToken_empty() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     JUnitTestCase.assertNull(list.beginToken);
   }
+
   void test_getBeginToken_nonEmpty() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     ASTNode node = ASTFactory.parenthesizedExpression(ASTFactory.booleanLiteral(true));
     list.add(node);
     JUnitTestCase.assertSame(node.beginToken, list.beginToken);
   }
+
   void test_getEndToken_empty() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     JUnitTestCase.assertNull(list.endToken);
   }
+
   void test_getEndToken_nonEmpty() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     ASTNode node = ASTFactory.parenthesizedExpression(ASTFactory.booleanLiteral(true));
     list.add(node);
     JUnitTestCase.assertSame(node.endToken, list.endToken);
   }
+
   void test_indexOf() {
     List<ASTNode> nodes = new List<ASTNode>();
     ASTNode firstNode = ASTFactory.booleanLiteral(true);
@@ -938,6 +1191,7 @@
     JUnitTestCase.assertEquals(-1, list.indexOf(fourthNode));
     JUnitTestCase.assertEquals(-1, list.indexOf(null));
   }
+
   void test_remove() {
     List<ASTNode> nodes = new List<ASTNode>();
     ASTNode firstNode = ASTFactory.booleanLiteral(true);
@@ -954,6 +1208,7 @@
     JUnitTestCase.assertSame(firstNode, list[0]);
     JUnitTestCase.assertSame(thirdNode, list[1]);
   }
+
   void test_remove_negative() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     try {
@@ -962,6 +1217,7 @@
     } on RangeError catch (exception) {
     }
   }
+
   void test_remove_tooBig() {
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
     try {
@@ -970,6 +1226,7 @@
     } on RangeError catch (exception) {
     }
   }
+
   void test_set() {
     List<ASTNode> nodes = new List<ASTNode>();
     ASTNode firstNode = ASTFactory.booleanLiteral(true);
@@ -988,6 +1245,7 @@
     JUnitTestCase.assertSame(fourthNode, list[1]);
     JUnitTestCase.assertSame(thirdNode, list[2]);
   }
+
   void test_set_negative() {
     ASTNode node = ASTFactory.booleanLiteral(true);
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
@@ -997,6 +1255,7 @@
     } on RangeError catch (exception) {
     }
   }
+
   void test_set_tooBig() {
     ASTNode node = ASTFactory.booleanLiteral(true);
     NodeList<ASTNode> list = new NodeList<ASTNode>(ASTFactory.argumentList([]));
@@ -1006,6 +1265,7 @@
     } on RangeError catch (exception) {
     }
   }
+
   static dartSuite() {
     _ut.group('NodeListTest', () {
       _ut.test('test_add', () {
@@ -1087,192 +1347,235 @@
     });
   }
 }
+
 class ConstantEvaluatorTest extends ParserTestCase {
   void fail_constructor() {
     Object value = getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void fail_identifier_class() {
     Object value = getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void fail_identifier_function() {
     Object value = getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void fail_identifier_static() {
     Object value = getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void fail_identifier_staticMethod() {
     Object value = getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void fail_identifier_topLevel() {
     Object value = getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void fail_identifier_typeParameter() {
     Object value = getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void test_binary_bitAnd() {
     Object value = getConstantValue("74 & 42");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(74 & 42, value as int);
   }
+
   void test_binary_bitOr() {
     Object value = getConstantValue("74 | 42");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(74 | 42, value as int);
   }
+
   void test_binary_bitXor() {
     Object value = getConstantValue("74 ^ 42");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(74 ^ 42, value as int);
   }
+
   void test_binary_divide_double() {
     Object value = getConstantValue("3.2 / 2.3");
     EngineTestCase.assertInstanceOf(double, value);
     JUnitTestCase.assertEquals(3.2 / 2.3, value as double);
   }
+
   void test_binary_divide_integer() {
     Object value = getConstantValue("3 / 2");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(1, value as int);
   }
+
   void test_binary_equal_boolean() {
     Object value = getConstantValue("true == false");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_binary_equal_integer() {
     Object value = getConstantValue("2 == 3");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_binary_equal_invalidLeft() {
     Object value = getConstantValue("a == 3");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
+
   void test_binary_equal_invalidRight() {
     Object value = getConstantValue("2 == a");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
+
   void test_binary_equal_string() {
     Object value = getConstantValue("'a' == 'b'");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_binary_greaterThan() {
     Object value = getConstantValue("2 > 3");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_binary_greaterThanOrEqual() {
     Object value = getConstantValue("2 >= 3");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_binary_leftShift() {
     Object value = getConstantValue("16 << 2");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(64, value as int);
   }
+
   void test_binary_lessThan() {
     Object value = getConstantValue("2 < 3");
     JUnitTestCase.assertEquals(true, value);
   }
+
   void test_binary_lessThanOrEqual() {
     Object value = getConstantValue("2 <= 3");
     JUnitTestCase.assertEquals(true, value);
   }
+
   void test_binary_logicalAnd() {
     Object value = getConstantValue("true && false");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_binary_logicalOr() {
     Object value = getConstantValue("true || false");
     JUnitTestCase.assertEquals(true, value);
   }
+
   void test_binary_minus_double() {
     Object value = getConstantValue("3.2 - 2.3");
     EngineTestCase.assertInstanceOf(double, value);
     JUnitTestCase.assertEquals(3.2 - 2.3, value as double);
   }
+
   void test_binary_minus_integer() {
     Object value = getConstantValue("3 - 2");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(1, value as int);
   }
+
   void test_binary_notEqual_boolean() {
     Object value = getConstantValue("true != false");
     JUnitTestCase.assertEquals(true, value);
   }
+
   void test_binary_notEqual_integer() {
     Object value = getConstantValue("2 != 3");
     JUnitTestCase.assertEquals(true, value);
   }
+
   void test_binary_notEqual_invalidLeft() {
     Object value = getConstantValue("a != 3");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
+
   void test_binary_notEqual_invalidRight() {
     Object value = getConstantValue("2 != a");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
+
   void test_binary_notEqual_string() {
     Object value = getConstantValue("'a' != 'b'");
     JUnitTestCase.assertEquals(true, value);
   }
+
   void test_binary_plus_double() {
     Object value = getConstantValue("2.3 + 3.2");
     EngineTestCase.assertInstanceOf(double, value);
     JUnitTestCase.assertEquals(2.3 + 3.2, value as double);
   }
+
   void test_binary_plus_integer() {
     Object value = getConstantValue("2 + 3");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(5, value as int);
   }
+
   void test_binary_remainder_double() {
     Object value = getConstantValue("3.2 % 2.3");
     EngineTestCase.assertInstanceOf(double, value);
     JUnitTestCase.assertEquals(3.2 % 2.3, value as double);
   }
+
   void test_binary_remainder_integer() {
     Object value = getConstantValue("8 % 3");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(2, value as int);
   }
+
   void test_binary_rightShift() {
     Object value = getConstantValue("64 >> 2");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(16, value as int);
   }
+
   void test_binary_times_double() {
     Object value = getConstantValue("2.3 * 3.2");
     EngineTestCase.assertInstanceOf(double, value);
     JUnitTestCase.assertEquals(2.3 * 3.2, value as double);
   }
+
   void test_binary_times_integer() {
     Object value = getConstantValue("2 * 3");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(6, value as int);
   }
+
   void test_binary_truncatingDivide_double() {
     Object value = getConstantValue("3.2 ~/ 2.3");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(1, value as int);
   }
+
   void test_binary_truncatingDivide_integer() {
     Object value = getConstantValue("10 ~/ 3");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(3, value as int);
   }
+
   void test_literal_boolean_false() {
     Object value = getConstantValue("false");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_literal_boolean_true() {
     Object value = getConstantValue("true");
     JUnitTestCase.assertEquals(true, value);
   }
+
   void test_literal_list() {
     Object value = getConstantValue("['a', 'b', 'c']");
     EngineTestCase.assertInstanceOf(List, value);
@@ -1282,6 +1585,7 @@
     JUnitTestCase.assertEquals("b", list[1]);
     JUnitTestCase.assertEquals("c", list[2]);
   }
+
   void test_literal_map() {
     Object value = getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
     EngineTestCase.assertInstanceOf(Map, value);
@@ -1291,60 +1595,74 @@
     JUnitTestCase.assertEquals("n", map["b"]);
     JUnitTestCase.assertEquals("o", map["c"]);
   }
+
   void test_literal_null() {
     Object value = getConstantValue("null");
     JUnitTestCase.assertEquals(null, value);
   }
+
   void test_literal_number_double() {
     Object value = getConstantValue("3.45");
     EngineTestCase.assertInstanceOf(double, value);
     JUnitTestCase.assertEquals(3.45, value as double);
   }
+
   void test_literal_number_integer() {
     Object value = getConstantValue("42");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(42, value as int);
   }
+
   void test_literal_string_adjacent() {
     Object value = getConstantValue("'abc' 'def'");
     JUnitTestCase.assertEquals("abcdef", value);
   }
+
   void test_literal_string_interpolation_invalid() {
     Object value = getConstantValue("'a\${f()}c'");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
+
   void test_literal_string_interpolation_valid() {
     Object value = getConstantValue("'a\${3}c'");
     JUnitTestCase.assertEquals("a3c", value);
   }
+
   void test_literal_string_simple() {
     Object value = getConstantValue("'abc'");
     JUnitTestCase.assertEquals("abc", value);
   }
+
   void test_parenthesizedExpression() {
     Object value = getConstantValue("('a')");
     JUnitTestCase.assertEquals("a", value);
   }
+
   void test_unary_bitNot() {
     Object value = getConstantValue("~42");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(~42, value as int);
   }
+
   void test_unary_logicalNot() {
     Object value = getConstantValue("!true");
     JUnitTestCase.assertEquals(false, value);
   }
+
   void test_unary_negated_double() {
     Object value = getConstantValue("-42.3");
     EngineTestCase.assertInstanceOf(double, value);
     JUnitTestCase.assertEquals(-42.3, value as double);
   }
+
   void test_unary_negated_integer() {
     Object value = getConstantValue("-42");
     EngineTestCase.assertInstanceOf(int, value);
     JUnitTestCase.assertEquals(-42, value as int);
   }
+
   Object getConstantValue(String source) => ParserTestCase.parseExpression(source, []).accept(new ConstantEvaluator());
+
   static dartSuite() {
     _ut.group('ConstantEvaluatorTest', () {
       _ut.test('test_binary_bitAnd', () {
@@ -1546,352 +1864,457 @@
     });
   }
 }
+
 class ToSourceVisitorTest extends EngineTestCase {
   void test_visitAdjacentStrings() {
     assertSource("'a' 'b'", ASTFactory.adjacentStrings([ASTFactory.string2("a"), ASTFactory.string2("b")]));
   }
+
   void test_visitAnnotation_constant() {
     assertSource("@A", ASTFactory.annotation(ASTFactory.identifier3("A")));
   }
+
   void test_visitAnnotation_constructor() {
     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")]));
   }
+
   void test_visitAsExpression() {
     assertSource("e as T", ASTFactory.asExpression(ASTFactory.identifier3("e"), ASTFactory.typeName4("T", [])));
   }
+
   void test_visitAssertStatement() {
     assertSource("assert (a);", ASTFactory.assertStatement(ASTFactory.identifier3("a")));
   }
+
   void test_visitAssignmentExpression() {
     assertSource("a = b", ASTFactory.assignmentExpression(ASTFactory.identifier3("a"), TokenType.EQ, ASTFactory.identifier3("b")));
   }
+
   void test_visitBinaryExpression() {
     assertSource("a + b", ASTFactory.binaryExpression(ASTFactory.identifier3("a"), TokenType.PLUS, ASTFactory.identifier3("b")));
   }
+
   void test_visitBlock_empty() {
     assertSource("{}", ASTFactory.block([]));
   }
+
   void test_visitBlock_nonEmpty() {
     assertSource("{break; break;}", ASTFactory.block([ASTFactory.breakStatement(), ASTFactory.breakStatement()]));
   }
+
   void test_visitBlockFunctionBody() {
     assertSource("{}", ASTFactory.blockFunctionBody2([]));
   }
+
   void test_visitBooleanLiteral_false() {
     assertSource("false", ASTFactory.booleanLiteral(false));
   }
+
   void test_visitBooleanLiteral_true() {
     assertSource("true", ASTFactory.booleanLiteral(true));
   }
+
   void test_visitBreakStatement_label() {
     assertSource("break l;", ASTFactory.breakStatement2("l"));
   }
+
   void test_visitBreakStatement_noLabel() {
     assertSource("break;", ASTFactory.breakStatement());
   }
+
   void test_visitCascadeExpression_field() {
     assertSource("a..b..c", ASTFactory.cascadeExpression(ASTFactory.identifier3("a"), [
         ASTFactory.cascadedPropertyAccess("b"),
         ASTFactory.cascadedPropertyAccess("c")]));
   }
+
   void test_visitCascadeExpression_index() {
     assertSource("a..[0]..[1]", ASTFactory.cascadeExpression(ASTFactory.identifier3("a"), [
         ASTFactory.cascadedIndexExpression(ASTFactory.integer(0)),
         ASTFactory.cascadedIndexExpression(ASTFactory.integer(1))]));
   }
+
   void test_visitCascadeExpression_method() {
     assertSource("a..b()..c()", ASTFactory.cascadeExpression(ASTFactory.identifier3("a"), [
         ASTFactory.cascadedMethodInvocation("b", []),
         ASTFactory.cascadedMethodInvocation("c", [])]));
   }
+
   void test_visitCatchClause_catch_noStack() {
     assertSource("catch (e) {}", ASTFactory.catchClause("e", []));
   }
+
   void test_visitCatchClause_catch_stack() {
     assertSource("catch (e, s) {}", ASTFactory.catchClause2("e", "s", []));
   }
+
   void test_visitCatchClause_on() {
     assertSource("on E {}", ASTFactory.catchClause3(ASTFactory.typeName4("E", []), []));
   }
+
   void test_visitCatchClause_on_catch() {
     assertSource("on E catch (e) {}", ASTFactory.catchClause4(ASTFactory.typeName4("E", []), "e", []));
   }
+
   void test_visitClassDeclaration_abstract() {
     assertSource("abstract class C {}", ASTFactory.classDeclaration(Keyword.ABSTRACT, "C", null, null, null, null, []));
   }
+
   void test_visitClassDeclaration_empty() {
     assertSource("class C {}", ASTFactory.classDeclaration(null, "C", null, null, null, null, []));
   }
+
   void test_visitClassDeclaration_extends() {
     assertSource("class C extends A {}", ASTFactory.classDeclaration(null, "C", null, ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), null, null, []));
   }
+
   void test_visitClassDeclaration_extends_implements() {
     assertSource("class C extends A implements B {}", ASTFactory.classDeclaration(null, "C", null, ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), null, ASTFactory.implementsClause([ASTFactory.typeName4("B", [])]), []));
   }
+
   void test_visitClassDeclaration_extends_with() {
     assertSource("class C extends A with M {}", ASTFactory.classDeclaration(null, "C", null, ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), ASTFactory.withClause([ASTFactory.typeName4("M", [])]), null, []));
   }
+
   void test_visitClassDeclaration_extends_with_implements() {
     assertSource("class C extends A with M implements B {}", ASTFactory.classDeclaration(null, "C", null, ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), ASTFactory.withClause([ASTFactory.typeName4("M", [])]), ASTFactory.implementsClause([ASTFactory.typeName4("B", [])]), []));
   }
+
   void test_visitClassDeclaration_implements() {
     assertSource("class C implements B {}", ASTFactory.classDeclaration(null, "C", null, null, null, ASTFactory.implementsClause([ASTFactory.typeName4("B", [])]), []));
   }
+
   void test_visitClassDeclaration_multipleMember() {
     assertSource("class C {var a; var b;}", ASTFactory.classDeclaration(null, "C", null, null, null, null, [
         ASTFactory.fieldDeclaration2(false, Keyword.VAR, [ASTFactory.variableDeclaration("a")]),
         ASTFactory.fieldDeclaration2(false, Keyword.VAR, [ASTFactory.variableDeclaration("b")])]));
   }
+
   void test_visitClassDeclaration_parameters() {
     assertSource("class C<E> {}", ASTFactory.classDeclaration(null, "C", ASTFactory.typeParameterList(["E"]), null, null, null, []));
   }
+
   void test_visitClassDeclaration_parameters_extends() {
     assertSource("class C<E> extends A {}", ASTFactory.classDeclaration(null, "C", ASTFactory.typeParameterList(["E"]), ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), null, null, []));
   }
+
   void test_visitClassDeclaration_parameters_extends_implements() {
     assertSource("class C<E> extends A implements B {}", ASTFactory.classDeclaration(null, "C", ASTFactory.typeParameterList(["E"]), ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), null, ASTFactory.implementsClause([ASTFactory.typeName4("B", [])]), []));
   }
+
   void test_visitClassDeclaration_parameters_extends_with() {
     assertSource("class C<E> extends A with M {}", ASTFactory.classDeclaration(null, "C", ASTFactory.typeParameterList(["E"]), ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), ASTFactory.withClause([ASTFactory.typeName4("M", [])]), null, []));
   }
+
   void test_visitClassDeclaration_parameters_extends_with_implements() {
     assertSource("class C<E> extends A with M implements B {}", ASTFactory.classDeclaration(null, "C", ASTFactory.typeParameterList(["E"]), ASTFactory.extendsClause(ASTFactory.typeName4("A", [])), ASTFactory.withClause([ASTFactory.typeName4("M", [])]), ASTFactory.implementsClause([ASTFactory.typeName4("B", [])]), []));
   }
+
   void test_visitClassDeclaration_parameters_implements() {
     assertSource("class C<E> implements B {}", ASTFactory.classDeclaration(null, "C", ASTFactory.typeParameterList(["E"]), null, null, ASTFactory.implementsClause([ASTFactory.typeName4("B", [])]), []));
   }
+
   void test_visitClassDeclaration_singleMember() {
     assertSource("class C {var a;}", ASTFactory.classDeclaration(null, "C", null, null, null, null, [ASTFactory.fieldDeclaration2(false, Keyword.VAR, [ASTFactory.variableDeclaration("a")])]));
   }
+
   void test_visitClassTypeAlias_abstract() {
     assertSource("class C = abstract S with M1;", ASTFactory.classTypeAlias("C", null, Keyword.ABSTRACT, ASTFactory.typeName4("S", []), ASTFactory.withClause([ASTFactory.typeName4("M1", [])]), null));
   }
+
   void test_visitClassTypeAlias_abstract_implements() {
     assertSource("class C = abstract S with M1 implements I;", ASTFactory.classTypeAlias("C", null, Keyword.ABSTRACT, ASTFactory.typeName4("S", []), ASTFactory.withClause([ASTFactory.typeName4("M1", [])]), ASTFactory.implementsClause([ASTFactory.typeName4("I", [])])));
   }
+
   void test_visitClassTypeAlias_generic() {
     assertSource("class C<E> = S<E> with M1<E>;", ASTFactory.classTypeAlias("C", ASTFactory.typeParameterList(["E"]), null, ASTFactory.typeName4("S", [ASTFactory.typeName4("E", [])]), ASTFactory.withClause([ASTFactory.typeName4("M1", [ASTFactory.typeName4("E", [])])]), null));
   }
+
   void test_visitClassTypeAlias_implements() {
     assertSource("class C = S with M1 implements I;", ASTFactory.classTypeAlias("C", null, null, ASTFactory.typeName4("S", []), ASTFactory.withClause([ASTFactory.typeName4("M1", [])]), ASTFactory.implementsClause([ASTFactory.typeName4("I", [])])));
   }
+
   void test_visitClassTypeAlias_minimal() {
     assertSource("class C = S with M1;", ASTFactory.classTypeAlias("C", null, null, ASTFactory.typeName4("S", []), ASTFactory.withClause([ASTFactory.typeName4("M1", [])]), null));
   }
+
   void test_visitClassTypeAlias_parameters_abstract() {
     assertSource("class C<E> = abstract S with M1;", ASTFactory.classTypeAlias("C", ASTFactory.typeParameterList(["E"]), Keyword.ABSTRACT, ASTFactory.typeName4("S", []), ASTFactory.withClause([ASTFactory.typeName4("M1", [])]), null));
   }
+
   void test_visitClassTypeAlias_parameters_abstract_implements() {
     assertSource("class C<E> = abstract S with M1 implements I;", ASTFactory.classTypeAlias("C", ASTFactory.typeParameterList(["E"]), Keyword.ABSTRACT, ASTFactory.typeName4("S", []), ASTFactory.withClause([ASTFactory.typeName4("M1", [])]), ASTFactory.implementsClause([ASTFactory.typeName4("I", [])])));
   }
+
   void test_visitClassTypeAlias_parameters_implements() {
     assertSource("class C<E> = S with M1 implements I;", ASTFactory.classTypeAlias("C", ASTFactory.typeParameterList(["E"]), null, ASTFactory.typeName4("S", []), ASTFactory.withClause([ASTFactory.typeName4("M1", [])]), ASTFactory.implementsClause([ASTFactory.typeName4("I", [])])));
   }
+
   void test_visitComment() {
     assertSource("", Comment.createBlockComment(<Token> [TokenFactory.token2("/* comment */")]));
   }
+
   void test_visitCommentReference() {
     assertSource("", new CommentReference.full(null, ASTFactory.identifier3("a")));
   }
+
   void test_visitCompilationUnit_declaration() {
     assertSource("var a;", ASTFactory.compilationUnit2([ASTFactory.topLevelVariableDeclaration2(Keyword.VAR, [ASTFactory.variableDeclaration("a")])]));
   }
+
   void test_visitCompilationUnit_directive() {
     assertSource("library l;", ASTFactory.compilationUnit3([ASTFactory.libraryDirective2("l")]));
   }
+
   void test_visitCompilationUnit_directive_declaration() {
     assertSource("library l; var a;", ASTFactory.compilationUnit4(ASTFactory.list([ASTFactory.libraryDirective2("l") as Directive]), ASTFactory.list([ASTFactory.topLevelVariableDeclaration2(Keyword.VAR, [ASTFactory.variableDeclaration("a")]) as CompilationUnitMember])));
   }
+
   void test_visitCompilationUnit_empty() {
     assertSource("", ASTFactory.compilationUnit());
   }
+
   void test_visitCompilationUnit_script() {
     assertSource("!#/bin/dartvm", ASTFactory.compilationUnit5("!#/bin/dartvm"));
   }
+
   void test_visitCompilationUnit_script_declaration() {
     assertSource("!#/bin/dartvm var a;", ASTFactory.compilationUnit6("!#/bin/dartvm", [ASTFactory.topLevelVariableDeclaration2(Keyword.VAR, [ASTFactory.variableDeclaration("a")])]));
   }
+
   void test_visitCompilationUnit_script_directive() {
     assertSource("!#/bin/dartvm library l;", ASTFactory.compilationUnit7("!#/bin/dartvm", [ASTFactory.libraryDirective2("l")]));
   }
+
   void test_visitCompilationUnit_script_directives_declarations() {
     assertSource("!#/bin/dartvm library l; var a;", ASTFactory.compilationUnit8("!#/bin/dartvm", ASTFactory.list([ASTFactory.libraryDirective2("l") as Directive]), ASTFactory.list([ASTFactory.topLevelVariableDeclaration2(Keyword.VAR, [ASTFactory.variableDeclaration("a")]) as CompilationUnitMember])));
   }
+
   void test_visitConditionalExpression() {
     assertSource("a ? b : c", ASTFactory.conditionalExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("b"), ASTFactory.identifier3("c")));
   }
+
   void test_visitConstructorDeclaration_const() {
     assertSource("const C() {}", ASTFactory.constructorDeclaration2(Keyword.CONST, null, ASTFactory.identifier3("C"), null, ASTFactory.formalParameterList([]), null, ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitConstructorDeclaration_external() {
     assertSource("external C();", ASTFactory.constructorDeclaration(ASTFactory.identifier3("C"), null, ASTFactory.formalParameterList([]), null));
   }
+
   void test_visitConstructorDeclaration_minimal() {
     assertSource("C() {}", ASTFactory.constructorDeclaration2(null, null, ASTFactory.identifier3("C"), null, ASTFactory.formalParameterList([]), null, ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitConstructorDeclaration_multipleInitializers() {
     assertSource("C() : a = b, c = d {}", ASTFactory.constructorDeclaration2(null, null, ASTFactory.identifier3("C"), null, ASTFactory.formalParameterList([]), ASTFactory.list([
         ASTFactory.constructorFieldInitializer(false, "a", ASTFactory.identifier3("b")) as ConstructorInitializer,
         ASTFactory.constructorFieldInitializer(false, "c", ASTFactory.identifier3("d"))]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitConstructorDeclaration_multipleParameters() {
     assertSource("C(var a, var b) {}", ASTFactory.constructorDeclaration2(null, null, ASTFactory.identifier3("C"), null, ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter(Keyword.VAR, "a"),
         ASTFactory.simpleFormalParameter(Keyword.VAR, "b")]), null, ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitConstructorDeclaration_named() {
     assertSource("C.m() {}", ASTFactory.constructorDeclaration2(null, null, ASTFactory.identifier3("C"), "m", ASTFactory.formalParameterList([]), null, ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitConstructorDeclaration_singleInitializer() {
     assertSource("C() : a = b {}", ASTFactory.constructorDeclaration2(null, null, ASTFactory.identifier3("C"), null, ASTFactory.formalParameterList([]), ASTFactory.list([ASTFactory.constructorFieldInitializer(false, "a", ASTFactory.identifier3("b")) as ConstructorInitializer]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitConstructorFieldInitializer_withoutThis() {
     assertSource("a = b", ASTFactory.constructorFieldInitializer(false, "a", ASTFactory.identifier3("b")));
   }
+
   void test_visitConstructorFieldInitializer_withThis() {
     assertSource("this.a = b", ASTFactory.constructorFieldInitializer(true, "a", ASTFactory.identifier3("b")));
   }
+
   void test_visitConstructorName_named_prefix() {
     assertSource("p.C.n", ASTFactory.constructorName(ASTFactory.typeName4("p.C.n", []), null));
   }
+
   void test_visitConstructorName_unnamed_noPrefix() {
     assertSource("C", ASTFactory.constructorName(ASTFactory.typeName4("C", []), null));
   }
+
   void test_visitConstructorName_unnamed_prefix() {
     assertSource("p.C", ASTFactory.constructorName(ASTFactory.typeName3(ASTFactory.identifier5("p", "C"), []), null));
   }
+
   void test_visitContinueStatement_label() {
     assertSource("continue l;", ASTFactory.continueStatement2("l"));
   }
+
   void test_visitContinueStatement_noLabel() {
     assertSource("continue;", ASTFactory.continueStatement());
   }
+
   void test_visitDefaultFormalParameter_named_noValue() {
     assertSource("p", ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("p"), null));
   }
+
   void test_visitDefaultFormalParameter_named_value() {
     assertSource("p : 0", ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("p"), ASTFactory.integer(0)));
   }
+
   void test_visitDefaultFormalParameter_positional_noValue() {
     assertSource("p", ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("p"), null));
   }
+
   void test_visitDefaultFormalParameter_positional_value() {
     assertSource("p = 0", ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("p"), ASTFactory.integer(0)));
   }
+
   void test_visitDoStatement() {
     assertSource("do {} while (c);", ASTFactory.doStatement(ASTFactory.block([]), ASTFactory.identifier3("c")));
   }
+
   void test_visitDoubleLiteral() {
     assertSource("4.2", ASTFactory.doubleLiteral(4.2));
   }
+
   void test_visitEmptyFunctionBody() {
     assertSource(";", ASTFactory.emptyFunctionBody());
   }
+
   void test_visitEmptyStatement() {
     assertSource(";", ASTFactory.emptyStatement());
   }
+
   void test_visitExportDirective_combinator() {
     assertSource("export 'a.dart' show A;", ASTFactory.exportDirective2("a.dart", [ASTFactory.showCombinator([ASTFactory.identifier3("A")]) as Combinator]));
   }
+
   void test_visitExportDirective_combinators() {
     assertSource("export 'a.dart' show A hide B;", ASTFactory.exportDirective2("a.dart", [
         ASTFactory.showCombinator([ASTFactory.identifier3("A")]),
         ASTFactory.hideCombinator([ASTFactory.identifier3("B")])]));
   }
+
   void test_visitExportDirective_minimal() {
     assertSource("export 'a.dart';", ASTFactory.exportDirective2("a.dart", []));
   }
+
   void test_visitExpressionFunctionBody() {
     assertSource("=> a;", ASTFactory.expressionFunctionBody(ASTFactory.identifier3("a")));
   }
+
   void test_visitExpressionStatement() {
     assertSource("a;", ASTFactory.expressionStatement(ASTFactory.identifier3("a")));
   }
+
   void test_visitExtendsClause() {
     assertSource("extends C", ASTFactory.extendsClause(ASTFactory.typeName4("C", [])));
   }
+
   void test_visitFieldDeclaration_instance() {
     assertSource("var a;", ASTFactory.fieldDeclaration2(false, Keyword.VAR, [ASTFactory.variableDeclaration("a")]));
   }
+
   void test_visitFieldDeclaration_static() {
     assertSource("static var a;", ASTFactory.fieldDeclaration2(true, Keyword.VAR, [ASTFactory.variableDeclaration("a")]));
   }
+
   void test_visitFieldFormalParameter_functionTyped() {
     assertSource("A this.a(b)", ASTFactory.fieldFormalParameter2(null, ASTFactory.typeName4("A", []), "a", ASTFactory.formalParameterList([ASTFactory.simpleFormalParameter3("b")])));
   }
+
   void test_visitFieldFormalParameter_keyword() {
     assertSource("var this.a", ASTFactory.fieldFormalParameter(Keyword.VAR, null, "a"));
   }
+
   void test_visitFieldFormalParameter_keywordAndType() {
     assertSource("final A this.a", ASTFactory.fieldFormalParameter(Keyword.FINAL, ASTFactory.typeName4("A", []), "a"));
   }
+
   void test_visitFieldFormalParameter_type() {
     assertSource("A this.a", ASTFactory.fieldFormalParameter(null, ASTFactory.typeName4("A", []), "a"));
   }
+
   void test_visitForEachStatement() {
     assertSource("for (a in b) {}", ASTFactory.forEachStatement(ASTFactory.declaredIdentifier3("a"), ASTFactory.identifier3("b"), ASTFactory.block([])));
   }
+
   void test_visitFormalParameterList_empty() {
     assertSource("()", ASTFactory.formalParameterList([]));
   }
+
   void test_visitFormalParameterList_n() {
     assertSource("({a : 0})", ASTFactory.formalParameterList([ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("a"), ASTFactory.integer(0))]));
   }
+
   void test_visitFormalParameterList_nn() {
     assertSource("({a : 0, b : 1})", ASTFactory.formalParameterList([
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("a"), ASTFactory.integer(0)),
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("b"), ASTFactory.integer(1))]));
   }
+
   void test_visitFormalParameterList_p() {
     assertSource("([a = 0])", ASTFactory.formalParameterList([ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("a"), ASTFactory.integer(0))]));
   }
+
   void test_visitFormalParameterList_pp() {
     assertSource("([a = 0, b = 1])", ASTFactory.formalParameterList([
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("a"), ASTFactory.integer(0)),
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("b"), ASTFactory.integer(1))]));
   }
+
   void test_visitFormalParameterList_r() {
     assertSource("(a)", ASTFactory.formalParameterList([ASTFactory.simpleFormalParameter3("a")]));
   }
+
   void test_visitFormalParameterList_rn() {
     assertSource("(a, {b : 1})", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("b"), ASTFactory.integer(1))]));
   }
+
   void test_visitFormalParameterList_rnn() {
     assertSource("(a, {b : 1, c : 2})", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("b"), ASTFactory.integer(1)),
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("c"), ASTFactory.integer(2))]));
   }
+
   void test_visitFormalParameterList_rp() {
     assertSource("(a, [b = 1])", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("b"), ASTFactory.integer(1))]));
   }
+
   void test_visitFormalParameterList_rpp() {
     assertSource("(a, [b = 1, c = 2])", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("b"), ASTFactory.integer(1)),
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("c"), ASTFactory.integer(2))]));
   }
+
   void test_visitFormalParameterList_rr() {
     assertSource("(a, b)", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
         ASTFactory.simpleFormalParameter3("b")]));
   }
+
   void test_visitFormalParameterList_rrn() {
     assertSource("(a, b, {c : 3})", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
         ASTFactory.simpleFormalParameter3("b"),
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("c"), ASTFactory.integer(3))]));
   }
+
   void test_visitFormalParameterList_rrnn() {
     assertSource("(a, b, {c : 3, d : 4})", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
@@ -1899,12 +2322,14 @@
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("c"), ASTFactory.integer(3)),
         ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("d"), ASTFactory.integer(4))]));
   }
+
   void test_visitFormalParameterList_rrp() {
     assertSource("(a, b, [c = 3])", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
         ASTFactory.simpleFormalParameter3("b"),
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("c"), ASTFactory.integer(3))]));
   }
+
   void test_visitFormalParameterList_rrpp() {
     assertSource("(a, b, [c = 3, d = 4])", ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter3("a"),
@@ -1912,465 +2337,605 @@
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("c"), ASTFactory.integer(3)),
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("d"), ASTFactory.integer(4))]));
   }
+
   void test_visitForStatement_c() {
     assertSource("for (; c;) {}", ASTFactory.forStatement(null as Expression, ASTFactory.identifier3("c"), null, ASTFactory.block([])));
   }
+
   void test_visitForStatement_cu() {
     assertSource("for (; c; u) {}", ASTFactory.forStatement(null as Expression, ASTFactory.identifier3("c"), ASTFactory.list([ASTFactory.identifier3("u") as Expression]), ASTFactory.block([])));
   }
+
   void test_visitForStatement_e() {
     assertSource("for (e;;) {}", ASTFactory.forStatement(ASTFactory.identifier3("e"), null, null, ASTFactory.block([])));
   }
+
   void test_visitForStatement_ec() {
     assertSource("for (e; c;) {}", ASTFactory.forStatement(ASTFactory.identifier3("e"), ASTFactory.identifier3("c"), null, ASTFactory.block([])));
   }
+
   void test_visitForStatement_ecu() {
     assertSource("for (e; c; u) {}", ASTFactory.forStatement(ASTFactory.identifier3("e"), ASTFactory.identifier3("c"), ASTFactory.list([ASTFactory.identifier3("u") as Expression]), ASTFactory.block([])));
   }
+
   void test_visitForStatement_eu() {
     assertSource("for (e;; u) {}", ASTFactory.forStatement(ASTFactory.identifier3("e"), null, ASTFactory.list([ASTFactory.identifier3("u") as Expression]), ASTFactory.block([])));
   }
+
   void test_visitForStatement_i() {
     assertSource("for (var i;;) {}", ASTFactory.forStatement2(ASTFactory.variableDeclarationList2(Keyword.VAR, [ASTFactory.variableDeclaration("i")]), null, null, ASTFactory.block([])));
   }
+
   void test_visitForStatement_ic() {
     assertSource("for (var i; c;) {}", ASTFactory.forStatement2(ASTFactory.variableDeclarationList2(Keyword.VAR, [ASTFactory.variableDeclaration("i")]), ASTFactory.identifier3("c"), null, ASTFactory.block([])));
   }
+
   void test_visitForStatement_icu() {
     assertSource("for (var i; c; u) {}", ASTFactory.forStatement2(ASTFactory.variableDeclarationList2(Keyword.VAR, [ASTFactory.variableDeclaration("i")]), ASTFactory.identifier3("c"), ASTFactory.list([ASTFactory.identifier3("u") as Expression]), ASTFactory.block([])));
   }
+
   void test_visitForStatement_iu() {
     assertSource("for (var i;; u) {}", ASTFactory.forStatement2(ASTFactory.variableDeclarationList2(Keyword.VAR, [ASTFactory.variableDeclaration("i")]), null, ASTFactory.list([ASTFactory.identifier3("u") as Expression]), ASTFactory.block([])));
   }
+
   void test_visitForStatement_u() {
     assertSource("for (;; u) {}", ASTFactory.forStatement(null as Expression, null, ASTFactory.list([ASTFactory.identifier3("u") as Expression]), ASTFactory.block([])));
   }
+
   void test_visitFunctionDeclaration_getter() {
     assertSource("get f() {}", ASTFactory.functionDeclaration(null, Keyword.GET, "f", ASTFactory.functionExpression()));
   }
+
   void test_visitFunctionDeclaration_normal() {
     assertSource("f() {}", ASTFactory.functionDeclaration(null, null, "f", ASTFactory.functionExpression()));
   }
+
   void test_visitFunctionDeclaration_setter() {
     assertSource("set f() {}", ASTFactory.functionDeclaration(null, Keyword.SET, "f", ASTFactory.functionExpression()));
   }
+
   void test_visitFunctionDeclarationStatement() {
     assertSource("f() {};", ASTFactory.functionDeclarationStatement(null, null, "f", ASTFactory.functionExpression()));
   }
+
   void test_visitFunctionExpression() {
     assertSource("() {}", ASTFactory.functionExpression());
   }
+
   void test_visitFunctionExpressionInvocation() {
     assertSource("f()", ASTFactory.functionExpressionInvocation(ASTFactory.identifier3("f"), []));
   }
+
   void test_visitFunctionTypedFormalParameter_noType() {
     assertSource("f()", ASTFactory.functionTypedFormalParameter(null, "f", []));
   }
+
   void test_visitFunctionTypedFormalParameter_type() {
     assertSource("T f()", ASTFactory.functionTypedFormalParameter(ASTFactory.typeName4("T", []), "f", []));
   }
+
   void test_visitIfStatement_withElse() {
     assertSource("if (c) {} else {}", ASTFactory.ifStatement2(ASTFactory.identifier3("c"), ASTFactory.block([]), ASTFactory.block([])));
   }
+
   void test_visitIfStatement_withoutElse() {
     assertSource("if (c) {}", ASTFactory.ifStatement(ASTFactory.identifier3("c"), ASTFactory.block([])));
   }
+
   void test_visitImplementsClause_multiple() {
     assertSource("implements A, B", ASTFactory.implementsClause([
         ASTFactory.typeName4("A", []),
         ASTFactory.typeName4("B", [])]));
   }
+
   void test_visitImplementsClause_single() {
     assertSource("implements A", ASTFactory.implementsClause([ASTFactory.typeName4("A", [])]));
   }
+
   void test_visitImportDirective_combinator() {
     assertSource("import 'a.dart' show A;", ASTFactory.importDirective2("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, [
         ASTFactory.showCombinator([ASTFactory.identifier3("A")]),
         ASTFactory.hideCombinator([ASTFactory.identifier3("B")])]));
   }
+
   void test_visitImportDirective_minimal() {
     assertSource("import 'a.dart';", ASTFactory.importDirective2("a.dart", null, []));
   }
+
   void test_visitImportDirective_prefix() {
     assertSource("import 'a.dart' as p;", ASTFactory.importDirective2("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")])]));
   }
+
   void test_visitImportDirective_prefix_combinators() {
     assertSource("import 'a.dart' as p show A hide B;", ASTFactory.importDirective2("a.dart", "p", [
         ASTFactory.showCombinator([ASTFactory.identifier3("A")]),
         ASTFactory.hideCombinator([ASTFactory.identifier3("B")])]));
   }
+
   void test_visitImportHideCombinator_multiple() {
     assertSource("hide a, b", ASTFactory.hideCombinator([ASTFactory.identifier3("a"), ASTFactory.identifier3("b")]));
   }
+
   void test_visitImportHideCombinator_single() {
     assertSource("hide a", ASTFactory.hideCombinator([ASTFactory.identifier3("a")]));
   }
+
   void test_visitImportShowCombinator_multiple() {
     assertSource("show a, b", ASTFactory.showCombinator([ASTFactory.identifier3("a"), ASTFactory.identifier3("b")]));
   }
+
   void test_visitImportShowCombinator_single() {
     assertSource("show a", ASTFactory.showCombinator([ASTFactory.identifier3("a")]));
   }
+
   void test_visitIndexExpression() {
     assertSource("a[i]", ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.identifier3("i")));
   }
+
   void test_visitInstanceCreationExpression_const() {
     assertSource("const C()", ASTFactory.instanceCreationExpression2(Keyword.CONST, ASTFactory.typeName4("C", []), []));
   }
+
   void test_visitInstanceCreationExpression_named() {
     assertSource("new C.c()", ASTFactory.instanceCreationExpression3(Keyword.NEW, ASTFactory.typeName4("C", []), "c", []));
   }
+
   void test_visitInstanceCreationExpression_unnamed() {
     assertSource("new C()", ASTFactory.instanceCreationExpression2(Keyword.NEW, ASTFactory.typeName4("C", []), []));
   }
+
   void test_visitIntegerLiteral() {
     assertSource("42", ASTFactory.integer(42));
   }
+
   void test_visitInterpolationExpression_expression() {
     assertSource("\${a}", ASTFactory.interpolationExpression(ASTFactory.identifier3("a")));
   }
+
   void test_visitInterpolationExpression_identifier() {
     assertSource("\$a", ASTFactory.interpolationExpression2("a"));
   }
+
   void test_visitInterpolationString() {
     assertSource("'x", ASTFactory.interpolationString("'x", "x"));
   }
+
   void test_visitIsExpression_negated() {
     assertSource("a is! C", ASTFactory.isExpression(ASTFactory.identifier3("a"), true, ASTFactory.typeName4("C", [])));
   }
+
   void test_visitIsExpression_normal() {
     assertSource("a is C", ASTFactory.isExpression(ASTFactory.identifier3("a"), false, ASTFactory.typeName4("C", [])));
   }
+
   void test_visitLabel() {
     assertSource("a:", ASTFactory.label2("a"));
   }
+
   void test_visitLabeledStatement_multiple() {
     assertSource("a: b: return;", ASTFactory.labeledStatement(ASTFactory.list([ASTFactory.label2("a"), ASTFactory.label2("b")]), ASTFactory.returnStatement()));
   }
+
   void test_visitLabeledStatement_single() {
     assertSource("a: return;", ASTFactory.labeledStatement(ASTFactory.list([ASTFactory.label2("a")]), ASTFactory.returnStatement()));
   }
+
   void test_visitLibraryDirective() {
     assertSource("library l;", ASTFactory.libraryDirective2("l"));
   }
+
   void test_visitLibraryIdentifier_multiple() {
     assertSource("a.b.c", ASTFactory.libraryIdentifier([
         ASTFactory.identifier3("a"),
         ASTFactory.identifier3("b"),
         ASTFactory.identifier3("c")]));
   }
+
   void test_visitLibraryIdentifier_single() {
     assertSource("a", ASTFactory.libraryIdentifier([ASTFactory.identifier3("a")]));
   }
+
   void test_visitListLiteral_const() {
     assertSource("const []", ASTFactory.listLiteral2(Keyword.CONST, null, []));
   }
+
   void test_visitListLiteral_empty() {
     assertSource("[]", ASTFactory.listLiteral([]));
   }
+
   void test_visitListLiteral_nonEmpty() {
     assertSource("[a, b, c]", ASTFactory.listLiteral([
         ASTFactory.identifier3("a"),
         ASTFactory.identifier3("b"),
         ASTFactory.identifier3("c")]));
   }
+
   void test_visitMapLiteral_const() {
     assertSource("const {}", ASTFactory.mapLiteral(Keyword.CONST, null, []));
   }
+
   void test_visitMapLiteral_empty() {
     assertSource("{}", ASTFactory.mapLiteral2([]));
   }
+
   void test_visitMapLiteral_nonEmpty() {
     assertSource("{'a' : a, 'b' : b, 'c' : c}", ASTFactory.mapLiteral2([
         ASTFactory.mapLiteralEntry("a", ASTFactory.identifier3("a")),
         ASTFactory.mapLiteralEntry("b", ASTFactory.identifier3("b")),
         ASTFactory.mapLiteralEntry("c", ASTFactory.identifier3("c"))]));
   }
+
   void test_visitMapLiteralEntry() {
     assertSource("'a' : b", ASTFactory.mapLiteralEntry("a", ASTFactory.identifier3("b")));
   }
+
   void test_visitMethodDeclaration_external() {
     assertSource("external m();", ASTFactory.methodDeclaration(null, null, null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([])));
   }
+
   void test_visitMethodDeclaration_external_returnType() {
     assertSource("external T m();", ASTFactory.methodDeclaration(null, ASTFactory.typeName4("T", []), null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([])));
   }
+
   void test_visitMethodDeclaration_getter() {
     assertSource("get m {}", ASTFactory.methodDeclaration2(null, null, Keyword.GET, null, ASTFactory.identifier3("m"), null, ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_getter_returnType() {
     assertSource("T get m {}", ASTFactory.methodDeclaration2(null, ASTFactory.typeName4("T", []), Keyword.GET, null, ASTFactory.identifier3("m"), null, ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_getter_seturnType() {
     assertSource("T set m(var v) {}", ASTFactory.methodDeclaration2(null, ASTFactory.typeName4("T", []), Keyword.SET, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([ASTFactory.simpleFormalParameter(Keyword.VAR, "v")]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_minimal() {
     assertSource("m() {}", ASTFactory.methodDeclaration2(null, null, null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_multipleParameters() {
     assertSource("m(var a, var b) {}", ASTFactory.methodDeclaration2(null, null, null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([
         ASTFactory.simpleFormalParameter(Keyword.VAR, "a"),
         ASTFactory.simpleFormalParameter(Keyword.VAR, "b")]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_operator() {
     assertSource("operator +() {}", ASTFactory.methodDeclaration2(null, null, null, Keyword.OPERATOR, ASTFactory.identifier3("+"), ASTFactory.formalParameterList([]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_operator_returnType() {
     assertSource("T operator +() {}", ASTFactory.methodDeclaration2(null, ASTFactory.typeName4("T", []), null, Keyword.OPERATOR, ASTFactory.identifier3("+"), ASTFactory.formalParameterList([]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_returnType() {
     assertSource("T m() {}", ASTFactory.methodDeclaration2(null, ASTFactory.typeName4("T", []), null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_setter() {
     assertSource("set m(var v) {}", ASTFactory.methodDeclaration2(null, null, Keyword.SET, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([ASTFactory.simpleFormalParameter(Keyword.VAR, "v")]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_static() {
     assertSource("static m() {}", ASTFactory.methodDeclaration2(Keyword.STATIC, null, null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodDeclaration_static_returnType() {
     assertSource("static T m() {}", ASTFactory.methodDeclaration2(Keyword.STATIC, ASTFactory.typeName4("T", []), null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([]), ASTFactory.blockFunctionBody2([])));
   }
+
   void test_visitMethodInvocation_noTarget() {
     assertSource("m()", ASTFactory.methodInvocation2("m", []));
   }
+
   void test_visitMethodInvocation_target() {
     assertSource("t.m()", ASTFactory.methodInvocation(ASTFactory.identifier3("t"), "m", []));
   }
+
   void test_visitNamedExpression() {
     assertSource("a: b", ASTFactory.namedExpression2("a", ASTFactory.identifier3("b")));
   }
+
   void test_visitNamedFormalParameter() {
     assertSource("var a : 0", ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter(Keyword.VAR, "a"), ASTFactory.integer(0)));
   }
+
   void test_visitNativeClause() {
     assertSource("native 'code'", ASTFactory.nativeClause("code"));
   }
+
   void test_visitNativeFunctionBody() {
     assertSource("native 'str';", ASTFactory.nativeFunctionBody("str"));
   }
+
   void test_visitNullLiteral() {
     assertSource("null", ASTFactory.nullLiteral());
   }
+
   void test_visitParenthesizedExpression() {
     assertSource("(a)", ASTFactory.parenthesizedExpression(ASTFactory.identifier3("a")));
   }
+
   void test_visitPartDirective() {
     assertSource("part 'a.dart';", ASTFactory.partDirective2("a.dart"));
   }
+
   void test_visitPartOfDirective() {
     assertSource("part of l;", ASTFactory.partOfDirective(ASTFactory.libraryIdentifier2(["l"])));
   }
+
   void test_visitPositionalFormalParameter() {
     assertSource("var a = 0", ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter(Keyword.VAR, "a"), ASTFactory.integer(0)));
   }
+
   void test_visitPostfixExpression() {
     assertSource("a++", ASTFactory.postfixExpression(ASTFactory.identifier3("a"), TokenType.PLUS_PLUS));
   }
+
   void test_visitPrefixedIdentifier() {
     assertSource("a.b", ASTFactory.identifier5("a", "b"));
   }
+
   void test_visitPrefixExpression() {
     assertSource("-a", ASTFactory.prefixExpression(TokenType.MINUS, ASTFactory.identifier3("a")));
   }
+
   void test_visitPropertyAccess() {
     assertSource("a.b", ASTFactory.propertyAccess2(ASTFactory.identifier3("a"), "b"));
   }
+
   void test_visitRedirectingConstructorInvocation_named() {
     assertSource("this.c()", ASTFactory.redirectingConstructorInvocation2("c", []));
   }
+
   void test_visitRedirectingConstructorInvocation_unnamed() {
     assertSource("this()", ASTFactory.redirectingConstructorInvocation([]));
   }
+
   void test_visitRethrowExpression() {
     assertSource("rethrow", ASTFactory.rethrowExpression());
   }
+
   void test_visitReturnStatement_expression() {
     assertSource("return a;", ASTFactory.returnStatement2(ASTFactory.identifier3("a")));
   }
+
   void test_visitReturnStatement_noExpression() {
     assertSource("return;", ASTFactory.returnStatement());
   }
+
   void test_visitScriptTag() {
     String scriptTag = "!#/bin/dart.exe";
     assertSource(scriptTag, ASTFactory.scriptTag(scriptTag));
   }
+
   void test_visitSimpleFormalParameter_keyword() {
     assertSource("var a", ASTFactory.simpleFormalParameter(Keyword.VAR, "a"));
   }
+
   void test_visitSimpleFormalParameter_keyword_type() {
     assertSource("final A a", ASTFactory.simpleFormalParameter2(Keyword.FINAL, ASTFactory.typeName4("A", []), "a"));
   }
+
   void test_visitSimpleFormalParameter_type() {
     assertSource("A a", ASTFactory.simpleFormalParameter4(ASTFactory.typeName4("A", []), "a"));
   }
+
   void test_visitSimpleIdentifier() {
     assertSource("a", ASTFactory.identifier3("a"));
   }
+
   void test_visitSimpleStringLiteral() {
     assertSource("'a'", ASTFactory.string2("a"));
   }
+
   void test_visitStringInterpolation() {
     assertSource("'a\${e}b'", ASTFactory.string([
         ASTFactory.interpolationString("'a", "a"),
         ASTFactory.interpolationExpression(ASTFactory.identifier3("e")),
         ASTFactory.interpolationString("b'", "b")]));
   }
+
   void test_visitSuperConstructorInvocation() {
     assertSource("super()", ASTFactory.superConstructorInvocation([]));
   }
+
   void test_visitSuperConstructorInvocation_named() {
     assertSource("super.c()", ASTFactory.superConstructorInvocation2("c", []));
   }
+
   void test_visitSuperExpression() {
     assertSource("super", ASTFactory.superExpression());
   }
+
   void test_visitSwitchCase_multipleLabels() {
     assertSource("l1: l2: case a: {}", ASTFactory.switchCase2(ASTFactory.list([ASTFactory.label2("l1"), ASTFactory.label2("l2")]), ASTFactory.identifier3("a"), [ASTFactory.block([])]));
   }
+
   void test_visitSwitchCase_multipleStatements() {
     assertSource("case a: {} {}", ASTFactory.switchCase(ASTFactory.identifier3("a"), [ASTFactory.block([]), ASTFactory.block([])]));
   }
+
   void test_visitSwitchCase_noLabels() {
     assertSource("case a: {}", ASTFactory.switchCase(ASTFactory.identifier3("a"), [ASTFactory.block([])]));
   }
+
   void test_visitSwitchCase_singleLabel() {
     assertSource("l1: case a: {}", ASTFactory.switchCase2(ASTFactory.list([ASTFactory.label2("l1")]), ASTFactory.identifier3("a"), [ASTFactory.block([])]));
   }
+
   void test_visitSwitchDefault_multipleLabels() {
     assertSource("l1: l2: default: {}", ASTFactory.switchDefault(ASTFactory.list([ASTFactory.label2("l1"), ASTFactory.label2("l2")]), [ASTFactory.block([])]));
   }
+
   void test_visitSwitchDefault_multipleStatements() {
     assertSource("default: {} {}", ASTFactory.switchDefault2([ASTFactory.block([]), ASTFactory.block([])]));
   }
+
   void test_visitSwitchDefault_noLabels() {
     assertSource("default: {}", ASTFactory.switchDefault2([ASTFactory.block([])]));
   }
+
   void test_visitSwitchDefault_singleLabel() {
     assertSource("l1: default: {}", ASTFactory.switchDefault(ASTFactory.list([ASTFactory.label2("l1")]), [ASTFactory.block([])]));
   }
+
   void test_visitSwitchStatement() {
     assertSource("switch (a) {case 'b': {} default: {}}", ASTFactory.switchStatement(ASTFactory.identifier3("a"), [
         ASTFactory.switchCase(ASTFactory.string2("b"), [ASTFactory.block([])]),
         ASTFactory.switchDefault2([ASTFactory.block([])])]));
   }
+
   void test_visitSymbolLiteral_multiple() {
     assertSource("#a.b.c", ASTFactory.symbolLiteral(["a", "b", "c"]));
   }
+
   void test_visitSymbolLiteral_single() {
     assertSource("#a", ASTFactory.symbolLiteral(["a"]));
   }
+
   void test_visitThisExpression() {
     assertSource("this", ASTFactory.thisExpression());
   }
+
   void test_visitThrowStatement() {
     assertSource("throw e", ASTFactory.throwExpression2(ASTFactory.identifier3("e")));
   }
+
   void test_visitTopLevelVariableDeclaration_multiple() {
     assertSource("var a;", ASTFactory.topLevelVariableDeclaration2(Keyword.VAR, [ASTFactory.variableDeclaration("a")]));
   }
+
   void test_visitTopLevelVariableDeclaration_single() {
     assertSource("var a, b;", ASTFactory.topLevelVariableDeclaration2(Keyword.VAR, [
         ASTFactory.variableDeclaration("a"),
         ASTFactory.variableDeclaration("b")]));
   }
+
   void test_visitTryStatement_catch() {
     assertSource("try {} on E {}", ASTFactory.tryStatement2(ASTFactory.block([]), [ASTFactory.catchClause3(ASTFactory.typeName4("E", []), [])]));
   }
+
   void test_visitTryStatement_catches() {
     assertSource("try {} on E {} on F {}", ASTFactory.tryStatement2(ASTFactory.block([]), [
         ASTFactory.catchClause3(ASTFactory.typeName4("E", []), []),
         ASTFactory.catchClause3(ASTFactory.typeName4("F", []), [])]));
   }
+
   void test_visitTryStatement_catchFinally() {
     assertSource("try {} on E {} finally {}", ASTFactory.tryStatement3(ASTFactory.block([]), ASTFactory.list([ASTFactory.catchClause3(ASTFactory.typeName4("E", []), [])]), ASTFactory.block([])));
   }
+
   void test_visitTryStatement_finally() {
     assertSource("try {} finally {}", ASTFactory.tryStatement(ASTFactory.block([]), ASTFactory.block([])));
   }
+
   void test_visitTypeAlias_generic() {
     assertSource("typedef A F<B>();", ASTFactory.typeAlias(ASTFactory.typeName4("A", []), "F", ASTFactory.typeParameterList(["B"]), ASTFactory.formalParameterList([])));
   }
+
   void test_visitTypeAlias_nonGeneric() {
     assertSource("typedef A F();", ASTFactory.typeAlias(ASTFactory.typeName4("A", []), "F", null, ASTFactory.formalParameterList([])));
   }
+
   void test_visitTypeArgumentList_multiple() {
     assertSource("<E, F>", ASTFactory.typeArgumentList([
         ASTFactory.typeName4("E", []),
         ASTFactory.typeName4("F", [])]));
   }
+
   void test_visitTypeArgumentList_single() {
     assertSource("<E>", ASTFactory.typeArgumentList([ASTFactory.typeName4("E", [])]));
   }
+
   void test_visitTypeName_multipleArgs() {
     assertSource("C<D, E>", ASTFactory.typeName4("C", [
         ASTFactory.typeName4("D", []),
         ASTFactory.typeName4("E", [])]));
   }
+
   void test_visitTypeName_nestedArg() {
     assertSource("C<D<E>>", ASTFactory.typeName4("C", [ASTFactory.typeName4("D", [ASTFactory.typeName4("E", [])])]));
   }
+
   void test_visitTypeName_noArgs() {
     assertSource("C", ASTFactory.typeName4("C", []));
   }
+
   void test_visitTypeName_singleArg() {
     assertSource("C<D>", ASTFactory.typeName4("C", [ASTFactory.typeName4("D", [])]));
   }
+
   void test_visitTypeParameter_withExtends() {
     assertSource("E extends C", ASTFactory.typeParameter2("E", ASTFactory.typeName4("C", [])));
   }
+
   void test_visitTypeParameter_withoutExtends() {
     assertSource("E", ASTFactory.typeParameter("E"));
   }
+
   void test_visitTypeParameterList_multiple() {
     assertSource("<E, F>", ASTFactory.typeParameterList(["E", "F"]));
   }
+
   void test_visitTypeParameterList_single() {
     assertSource("<E>", ASTFactory.typeParameterList(["E"]));
   }
+
   void test_visitVariableDeclaration_initialized() {
     assertSource("a = b", ASTFactory.variableDeclaration2("a", ASTFactory.identifier3("b")));
   }
+
   void test_visitVariableDeclaration_uninitialized() {
     assertSource("a", ASTFactory.variableDeclaration("a"));
   }
+
   void test_visitVariableDeclarationList_const_type() {
     assertSource("const C a, b", ASTFactory.variableDeclarationList(Keyword.CONST, ASTFactory.typeName4("C", []), [
         ASTFactory.variableDeclaration("a"),
         ASTFactory.variableDeclaration("b")]));
   }
+
   void test_visitVariableDeclarationList_final_noType() {
     assertSource("final a, b", ASTFactory.variableDeclarationList2(Keyword.FINAL, [
         ASTFactory.variableDeclaration("a"),
         ASTFactory.variableDeclaration("b")]));
   }
+
   void test_visitVariableDeclarationList_type() {
     assertSource("C a, b", ASTFactory.variableDeclarationList(null, ASTFactory.typeName4("C", []), [
         ASTFactory.variableDeclaration("a"),
         ASTFactory.variableDeclaration("b")]));
   }
+
   void test_visitVariableDeclarationList_var() {
     assertSource("var a, b", ASTFactory.variableDeclarationList2(Keyword.VAR, [
         ASTFactory.variableDeclaration("a"),
         ASTFactory.variableDeclaration("b")]));
   }
+
   void test_visitVariableDeclarationStatement() {
     assertSource("C c;", ASTFactory.variableDeclarationStatement(null, ASTFactory.typeName4("C", []), [ASTFactory.variableDeclaration("c")]));
   }
+
   void test_visitWhileStatement() {
     assertSource("while (c) {}", ASTFactory.whileStatement(ASTFactory.identifier3("c"), ASTFactory.block([])));
   }
+
   void test_visitWithClause_multiple() {
     assertSource("with A, B, C", ASTFactory.withClause([
         ASTFactory.typeName4("A", []),
         ASTFactory.typeName4("B", []),
         ASTFactory.typeName4("C", [])]));
   }
+
   void test_visitWithClause_single() {
     assertSource("with A", ASTFactory.withClause([ASTFactory.typeName4("A", [])]));
   }
@@ -2388,6 +2953,7 @@
     node.accept(new ToSourceVisitor(writer));
     JUnitTestCase.assertEquals(expectedSource, writer.toString());
   }
+
   static dartSuite() {
     _ut.group('ToSourceVisitorTest', () {
       _ut.test('test_visitAdjacentStrings', () {
@@ -3381,6 +3947,7 @@
     });
   }
 }
+
 main() {
   ConstantEvaluatorTest.dartSuite();
   NodeLocatorTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 16ac04b..496ce5e 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -1,6 +1,8 @@
 // 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 engine.element_test;
+
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
@@ -13,37 +15,44 @@
 import 'test_support.dart';
 import 'ast_test.dart' show ASTFactory;
 import 'resolver_test.dart' show TestTypeProvider;
+
 class ElementLocationImplTest extends EngineTestCase {
   void test_create_encoding() {
     String encoding = "a;b;c";
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
     JUnitTestCase.assertEquals(encoding, location.encoding);
   }
+
   void test_equals_equal() {
     String encoding = "a;b;c";
     ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
     ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
     JUnitTestCase.assertTrue(first == second);
   }
+
   void test_equals_equalWithDifferentUriKind() {
     ElementLocationImpl first = new ElementLocationImpl.con2("fa;fb;c");
     ElementLocationImpl second = new ElementLocationImpl.con2("pa;pb;c");
     JUnitTestCase.assertTrue(first == second);
   }
+
   void test_equals_notEqual_differentLengths() {
     ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
     ElementLocationImpl second = new ElementLocationImpl.con2("a;b;c;d");
     JUnitTestCase.assertFalse(first == second);
   }
+
   void test_equals_notEqual_notLocation() {
     ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
     JUnitTestCase.assertFalse(first == "a;b;d");
   }
+
   void test_equals_notEqual_sameLengths() {
     ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
     ElementLocationImpl second = new ElementLocationImpl.con2("a;b;d");
     JUnitTestCase.assertFalse(first == second);
   }
+
   void test_getComponents() {
     String encoding = "a;b;c";
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
@@ -53,22 +62,26 @@
     JUnitTestCase.assertEquals("b", components[1]);
     JUnitTestCase.assertEquals("c", components[2]);
   }
+
   void test_getEncoding() {
     String encoding = "a;b;c;;d";
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
     JUnitTestCase.assertEquals(encoding, location.encoding);
   }
+
   void test_hashCode_equal() {
     String encoding = "a;b;c";
     ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
     ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
     JUnitTestCase.assertTrue(first.hashCode == second.hashCode);
   }
+
   void test_hashCode_equalWithDifferentUriKind() {
     ElementLocationImpl first = new ElementLocationImpl.con2("fa;fb;c");
     ElementLocationImpl second = new ElementLocationImpl.con2("pa;pb;c");
     JUnitTestCase.assertTrue(first.hashCode == second.hashCode);
   }
+
   static dartSuite() {
     _ut.group('ElementLocationImplTest', () {
       _ut.test('test_create_encoding', () {
@@ -114,34 +127,38 @@
     });
   }
 }
+
 class MultiplyDefinedElementImplTest extends EngineTestCase {
   void test_fromElements_conflicting() {
     Element firstElement = ElementFactory.localVariableElement2("xx");
     Element secondElement = ElementFactory.localVariableElement2("yy");
     Element result = MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement);
     EngineTestCase.assertInstanceOf(MultiplyDefinedElement, result);
-    List<Element> elements = ((result as MultiplyDefinedElement)).conflictingElements;
+    List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
     EngineTestCase.assertLength(2, elements);
     for (int i = 0; i < elements.length; i++) {
       EngineTestCase.assertInstanceOf(LocalVariableElement, elements[i]);
     }
   }
+
   void test_fromElements_multiple() {
     Element firstElement = ElementFactory.localVariableElement2("xx");
     Element secondElement = ElementFactory.localVariableElement2("yy");
     Element thirdElement = ElementFactory.localVariableElement2("zz");
     Element result = MultiplyDefinedElementImpl.fromElements(null, MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement), thirdElement);
     EngineTestCase.assertInstanceOf(MultiplyDefinedElement, result);
-    List<Element> elements = ((result as MultiplyDefinedElement)).conflictingElements;
+    List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
     EngineTestCase.assertLength(3, elements);
     for (int i = 0; i < elements.length; i++) {
       EngineTestCase.assertInstanceOf(LocalVariableElement, elements[i]);
     }
   }
+
   void test_fromElements_nonConflicting() {
     Element element = ElementFactory.localVariableElement2("xx");
     JUnitTestCase.assertSame(element, MultiplyDefinedElementImpl.fromElements(null, element, element));
   }
+
   static dartSuite() {
     _ut.group('MultiplyDefinedElementImplTest', () {
       _ut.test('test_fromElements_conflicting', () {
@@ -159,10 +176,12 @@
     });
   }
 }
+
 class LibraryElementImplTest extends EngineTestCase {
   void test_creation() {
     JUnitTestCase.assertNotNull(new LibraryElementImpl(createAnalysisContext(), ASTFactory.libraryIdentifier2(["l"])));
   }
+
   void test_getImportedLibraries() {
     AnalysisContext context = createAnalysisContext();
     LibraryElementImpl library1 = ElementFactory.library(context, "l1");
@@ -182,6 +201,7 @@
     List<LibraryElement> libraries = library1.importedLibraries;
     EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library2, library3, library4], libraries);
   }
+
   void test_getPrefixes() {
     AnalysisContext context = createAnalysisContext();
     LibraryElementImpl library = ElementFactory.library(context, "l1");
@@ -203,6 +223,7 @@
       JUnitTestCase.assertSame(prefixA, prefixes[1]);
     }
   }
+
   void test_isUpToDate() {
     AnalysisContext context = createAnalysisContext();
     context.sourceFactory = new SourceFactory.con2([]);
@@ -211,6 +232,7 @@
     JUnitTestCase.assertFalse(library.isUpToDate2(0));
     JUnitTestCase.assertTrue(library.isUpToDate2(JavaSystem.currentTimeMillis() + 1000));
   }
+
   void test_setImports() {
     AnalysisContext context = createAnalysisContext();
     LibraryElementImpl library = new LibraryElementImpl(context, ASTFactory.libraryIdentifier2(["l1"]));
@@ -224,6 +246,7 @@
       JUnitTestCase.assertSame(expectedImports[i], actualImports[i]);
     }
   }
+
   static dartSuite() {
     _ut.group('LibraryElementImplTest', () {
       _ut.test('test_creation', () {
@@ -249,30 +272,36 @@
     });
   }
 }
+
 class TypeParameterTypeImplTest extends EngineTestCase {
   void test_creation() {
     JUnitTestCase.assertNotNull(new TypeParameterTypeImpl(new TypeParameterElementImpl(ASTFactory.identifier3("E"))));
   }
+
   void test_getElement() {
     TypeParameterElementImpl element = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     JUnitTestCase.assertEquals(element, type.element);
   }
+
   void test_isMoreSpecificThan_typeArguments_bottom() {
     TypeParameterElementImpl element = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(BottomTypeImpl.instance));
   }
+
   void test_isMoreSpecificThan_typeArguments_dynamic() {
     TypeParameterElementImpl element = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
   }
+
   void test_isMoreSpecificThan_typeArguments_object() {
     TypeParameterElementImpl element = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(ElementFactory.object.type));
   }
+
   void test_isMoreSpecificThan_typeArguments_resursive() {
     ClassElementImpl classS = ElementFactory.classElement2("A", []);
     TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(ASTFactory.identifier3("U"));
@@ -283,11 +312,13 @@
     typeParameterU.bound = typeParameterTypeU;
     JUnitTestCase.assertFalse(typeParameterTypeT.isMoreSpecificThan(classS.type));
   }
+
   void test_isMoreSpecificThan_typeArguments_self() {
     TypeParameterElementImpl element = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
   }
+
   void test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -298,6 +329,7 @@
     TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
     JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(typeA));
   }
+
   void test_isMoreSpecificThan_typeArguments_transitivity_typeParameters() {
     ClassElementImpl classS = ElementFactory.classElement2("A", []);
     TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(ASTFactory.identifier3("U"));
@@ -308,6 +340,7 @@
     TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
     JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
   }
+
   void test_isMoreSpecificThan_typeArguments_upperBound() {
     ClassElementImpl classS = ElementFactory.classElement2("A", []);
     TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(ASTFactory.identifier3("T"));
@@ -315,6 +348,7 @@
     TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
     JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
   }
+
   void test_substitute_equal() {
     TypeParameterElementImpl element = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
@@ -322,12 +356,14 @@
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(element);
     JUnitTestCase.assertSame(argument, type.substitute2(<Type2> [argument], <Type2> [parameter]));
   }
+
   void test_substitute_notEqual() {
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(new TypeParameterElementImpl(ASTFactory.identifier3("E")));
     InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("A")));
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(new TypeParameterElementImpl(ASTFactory.identifier3("F")));
     JUnitTestCase.assertSame(type, type.substitute2(<Type2> [argument], <Type2> [parameter]));
   }
+
   static dartSuite() {
     _ut.group('TypeParameterTypeImplTest', () {
       _ut.test('test_creation', () {
@@ -381,15 +417,17 @@
     });
   }
 }
-class InterfaceTypeImplTest extends EngineTestCase {
 
+class InterfaceTypeImplTest extends EngineTestCase {
   /**
    * The type provider used to access the types.
    */
   TestTypeProvider _typeProvider;
+
   void setUp() {
     _typeProvider = new TestTypeProvider();
   }
+
   void test_computeLongestInheritancePathToObject_multipleInterfacePaths() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -403,6 +441,7 @@
     JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
     JUnitTestCase.assertEquals(4, InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type));
   }
+
   void test_computeLongestInheritancePathToObject_multipleSuperclassPaths() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -413,17 +452,20 @@
     JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
     JUnitTestCase.assertEquals(4, InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type));
   }
+
   void test_computeLongestInheritancePathToObject_object() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType object = classA.supertype;
     JUnitTestCase.assertEquals(0, InterfaceTypeImpl.computeLongestInheritancePathToObject(object));
   }
+
   void test_computeLongestInheritancePathToObject_recursion() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type));
   }
+
   void test_computeLongestInheritancePathToObject_singleInterfacePath() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -434,6 +476,7 @@
     JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
     JUnitTestCase.assertEquals(3, InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type));
   }
+
   void test_computeLongestInheritancePathToObject_singleSuperclassPath() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -442,6 +485,7 @@
     JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
     JUnitTestCase.assertEquals(3, InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type));
   }
+
   void test_computeSuperinterfaceSet_multipleInterfacePaths() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -465,6 +509,7 @@
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classC.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classD.type));
   }
+
   void test_computeSuperinterfaceSet_multipleSuperclassPaths() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -485,6 +530,7 @@
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classC.type));
     JUnitTestCase.assertTrue(superinterfacesOfE.contains(classD.type));
   }
+
   void test_computeSuperinterfaceSet_recursion() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -492,6 +538,7 @@
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
     EngineTestCase.assertSize3(2, superinterfacesOfB);
   }
+
   void test_computeSuperinterfaceSet_singleInterfacePath() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -511,6 +558,7 @@
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
   }
+
   void test_computeSuperinterfaceSet_singleSuperclassPath() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -528,9 +576,11 @@
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
     JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
   }
+
   void test_creation() {
     JUnitTestCase.assertNotNull(new InterfaceTypeImpl.con1(ElementFactory.classElement2("A", [])));
   }
+
   void test_getAccessors() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     PropertyAccessorElement getterG = ElementFactory.getterElement("g", false, null);
@@ -539,16 +589,19 @@
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
     JUnitTestCase.assertEquals(2, type.accessors.length);
   }
+
   void test_getAccessors_empty() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
     JUnitTestCase.assertEquals(0, type.accessors.length);
   }
+
   void test_getElement() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
     JUnitTestCase.assertEquals(typeElement, type.element);
   }
+
   void test_getGetter_implemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -557,13 +610,14 @@
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertSame(getterG, typeA.getGetter(getterName));
   }
+
   void test_getGetter_parameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     Type2 typeE = classA.type.typeArguments[0];
     String getterName = "g";
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, typeE);
     classA.accessors = <PropertyAccessorElement> [getterG];
-    ((getterG.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
+    (getterG.type as FunctionTypeImpl).typeArguments = classA.type.typeArguments;
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <Type2> [typeI];
@@ -572,11 +626,13 @@
     FunctionType getterType = getter.type;
     JUnitTestCase.assertSame(typeI, getterType.returnType);
   }
+
   void test_getGetter_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertNull(typeA.getGetter("g"));
   }
+
   void test_getInterfaces_nonParameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -593,6 +649,7 @@
       JUnitTestCase.assertSame(typeA, interfaces[1]);
     }
   }
+
   void test_getInterfaces_parameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
@@ -609,6 +666,7 @@
     JUnitTestCase.assertSame(classA, result.element);
     JUnitTestCase.assertSame(typeI, result.typeArguments[0]);
   }
+
   void test_getLeastUpperBound_directInterfaceCase() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -621,6 +679,7 @@
     JUnitTestCase.assertEquals(typeB, typeB.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_directSubclassCase() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -630,11 +689,13 @@
     JUnitTestCase.assertEquals(typeB, typeB.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_functionType() {
     Type2 interfaceType = ElementFactory.classElement2("A", []).type;
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     JUnitTestCase.assertNull(interfaceType.getLeastUpperBound(functionType));
   }
+
   void test_getLeastUpperBound_mixinCase() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -651,25 +712,29 @@
     JUnitTestCase.assertEquals(typeA, typeD.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeD));
   }
+
   void test_getLeastUpperBound_null() {
     Type2 interfaceType = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertNull(interfaceType.getLeastUpperBound(null));
   }
+
   void test_getLeastUpperBound_object() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
     Type2 typeObject = typeA.element.supertype;
-    JUnitTestCase.assertNull(((typeObject.element as ClassElement)).supertype);
+    JUnitTestCase.assertNull((typeObject.element as ClassElement).supertype);
     JUnitTestCase.assertEquals(typeObject, typeB.element.supertype);
     JUnitTestCase.assertEquals(typeObject, typeA.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_self() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertEquals(typeA, typeA.getLeastUpperBound(typeA));
   }
+
   void test_getLeastUpperBound_sharedSuperclass1() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -680,6 +745,7 @@
     JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_sharedSuperclass2() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -691,6 +757,7 @@
     JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeD));
     JUnitTestCase.assertEquals(typeA, typeD.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_sharedSuperclass3() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -702,6 +769,7 @@
     JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeD));
     JUnitTestCase.assertEquals(typeB, typeD.getLeastUpperBound(typeC));
   }
+
   void test_getLeastUpperBound_sharedSuperclass4() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classA2 = ElementFactory.classElement2("A2", []);
@@ -718,6 +786,7 @@
     JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_sharedSuperinterface1() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -730,6 +799,7 @@
     JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_sharedSuperinterface2() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -745,6 +815,7 @@
     JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeD));
     JUnitTestCase.assertEquals(typeA, typeD.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_sharedSuperinterface3() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -760,6 +831,7 @@
     JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeD));
     JUnitTestCase.assertEquals(typeB, typeD.getLeastUpperBound(typeC));
   }
+
   void test_getLeastUpperBound_sharedSuperinterface4() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classA2 = ElementFactory.classElement2("A2", []);
@@ -776,11 +848,13 @@
     JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
     JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
   }
+
   void test_getLeastUpperBound_twoComparables() {
     InterfaceType string = _typeProvider.stringType;
     InterfaceType num = _typeProvider.numType;
     JUnitTestCase.assertEquals(_typeProvider.objectType, string.getLeastUpperBound(num));
   }
+
   void test_getLeastUpperBound_typeParameters_different() {
     InterfaceType listType = _typeProvider.listType;
     InterfaceType intType = _typeProvider.intType;
@@ -789,12 +863,14 @@
     InterfaceType listOfDoubleType = listType.substitute4(<Type2> [doubleType]);
     JUnitTestCase.assertEquals(listType.substitute4(<Type2> [_typeProvider.dynamicType]), listOfIntType.getLeastUpperBound(listOfDoubleType));
   }
+
   void test_getLeastUpperBound_typeParameters_same() {
     InterfaceType listType = _typeProvider.listType;
     InterfaceType intType = _typeProvider.intType;
     InterfaceType listOfIntType = listType.substitute4(<Type2> [intType]);
     JUnitTestCase.assertEquals(listOfIntType, listOfIntType.getLeastUpperBound(listOfIntType));
   }
+
   void test_getMethod_implemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -803,13 +879,14 @@
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertSame(methodM, typeA.getMethod(methodName));
   }
+
   void test_getMethod_parameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     Type2 typeE = classA.type.typeArguments[0];
     String methodName = "m";
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, typeE, [typeE]);
     classA.methods = <MethodElement> [methodM];
-    ((methodM.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
+    (methodM.type as FunctionTypeImpl).typeArguments = classA.type.typeArguments;
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <Type2> [typeI];
@@ -821,11 +898,13 @@
     EngineTestCase.assertLength(1, parameterTypes);
     JUnitTestCase.assertSame(typeI, parameterTypes[0]);
   }
+
   void test_getMethod_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertNull(typeA.getMethod("m"));
   }
+
   void test_getMethods() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     MethodElementImpl methodOne = ElementFactory.methodElement("one", null, []);
@@ -834,11 +913,13 @@
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
     JUnitTestCase.assertEquals(2, type.methods.length);
   }
+
   void test_getMethods_empty() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
     JUnitTestCase.assertEquals(0, type.methods.length);
   }
+
   void test_getMixins_nonParameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -855,6 +936,7 @@
       JUnitTestCase.assertSame(typeA, interfaces[1]);
     }
   }
+
   void test_getMixins_parameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
@@ -871,6 +953,7 @@
     JUnitTestCase.assertSame(classA, result.element);
     JUnitTestCase.assertSame(typeI, result.typeArguments[0]);
   }
+
   void test_getSetter_implemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -879,13 +962,14 @@
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertSame(setterS, typeA.getSetter(setterName));
   }
+
   void test_getSetter_parameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     Type2 typeE = classA.type.typeArguments[0];
     String setterName = "s";
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, typeE);
     classA.accessors = <PropertyAccessorElement> [setterS];
-    ((setterS.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
+    (setterS.type as FunctionTypeImpl).typeArguments = classA.type.typeArguments;
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <Type2> [typeI];
@@ -896,11 +980,13 @@
     EngineTestCase.assertLength(1, parameterTypes);
     JUnitTestCase.assertSame(typeI, parameterTypes[0]);
   }
+
   void test_getSetter_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertNull(typeA.getSetter("s"));
   }
+
   void test_getSuperclass_nonParameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -908,6 +994,7 @@
     InterfaceType typeB = classB.type;
     JUnitTestCase.assertSame(typeA, typeB.superclass);
   }
+
   void test_getSuperclass_parameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
@@ -922,15 +1009,18 @@
     JUnitTestCase.assertSame(classA, superclass.element);
     JUnitTestCase.assertSame(typeI, superclass.typeArguments[0]);
   }
+
   void test_getTypeArguments_empty() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
     EngineTestCase.assertLength(0, type.typeArguments);
   }
+
   void test_hashCode() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertFalse(0 == typeA.hashCode);
   }
+
   void test_isDirectSupertypeOf_extends() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -938,6 +1028,7 @@
     InterfaceType typeB = classB.type;
     JUnitTestCase.assertTrue(typeA.isDirectSupertypeOf(typeB));
   }
+
   void test_isDirectSupertypeOf_false() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement2("B", []);
@@ -946,6 +1037,7 @@
     InterfaceType typeC = classC.type;
     JUnitTestCase.assertFalse(typeA.isDirectSupertypeOf(typeC));
   }
+
   void test_isDirectSupertypeOf_implements() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -954,6 +1046,7 @@
     classB.interfaces = <InterfaceType> [typeA];
     JUnitTestCase.assertTrue(typeA.isDirectSupertypeOf(typeB));
   }
+
   void test_isDirectSupertypeOf_with() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -962,10 +1055,12 @@
     classB.mixins = <InterfaceType> [typeA];
     JUnitTestCase.assertTrue(typeA.isDirectSupertypeOf(typeB));
   }
+
   void test_isMoreSpecificThan_bottom() {
     Type2 type = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertTrue(BottomTypeImpl.instance.isMoreSpecificThan(type));
   }
+
   void test_isMoreSpecificThan_covariance() {
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     ClassElement classI = ElementFactory.classElement2("I", []);
@@ -977,6 +1072,7 @@
     JUnitTestCase.assertTrue(typeAJ.isMoreSpecificThan(typeAI));
     JUnitTestCase.assertFalse(typeAI.isMoreSpecificThan(typeAJ));
   }
+
   void test_isMoreSpecificThan_directSupertype() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -985,14 +1081,17 @@
     JUnitTestCase.assertTrue(typeB.isMoreSpecificThan(typeA));
     JUnitTestCase.assertFalse(typeA.isMoreSpecificThan(typeB));
   }
+
   void test_isMoreSpecificThan_dynamic() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
   }
+
   void test_isMoreSpecificThan_self() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
   }
+
   void test_isMoreSpecificThan_transitive_interface() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -1002,6 +1101,7 @@
     InterfaceType typeC = classC.type;
     JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
   }
+
   void test_isMoreSpecificThan_transitive_mixin() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -1011,6 +1111,7 @@
     InterfaceType typeC = classC.type;
     JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
   }
+
   void test_isMoreSpecificThan_transitive_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -1020,6 +1121,7 @@
     classA.supertype = classB.type;
     JUnitTestCase.assertFalse(typeA.isMoreSpecificThan(typeC));
   }
+
   void test_isMoreSpecificThan_transitive_superclass() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1028,6 +1130,7 @@
     InterfaceType typeC = classC.type;
     JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
   }
+
   void test_isSubtypeOf_directSubtype() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1036,6 +1139,7 @@
     JUnitTestCase.assertTrue(typeB.isSubtypeOf(typeA));
     JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeB));
   }
+
   void test_isSubtypeOf_dynamic() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1043,6 +1147,7 @@
     JUnitTestCase.assertTrue(dynamicType.isSubtypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSubtypeOf(dynamicType));
   }
+
   void test_isSubtypeOf_function() {
     InterfaceType stringType = _typeProvider.stringType;
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -1050,6 +1155,7 @@
     FunctionType functionType = ElementFactory.functionElement5("f", <ClassElement> [stringType.element]).type;
     JUnitTestCase.assertTrue(classA.type.isSubtypeOf(functionType));
   }
+
   void test_isSubtypeOf_interface() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1064,6 +1170,7 @@
     JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
     JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
   }
+
   void test_isSubtypeOf_mixins() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1078,6 +1185,7 @@
     JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
     JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
   }
+
   void test_isSubtypeOf_object() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1085,11 +1193,13 @@
     JUnitTestCase.assertTrue(typeA.isSubtypeOf(typeObject));
     JUnitTestCase.assertFalse(typeObject.isSubtypeOf(typeA));
   }
+
   void test_isSubtypeOf_self() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertTrue(typeA.isSubtypeOf(typeA));
   }
+
   void test_isSubtypeOf_transitive_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -1099,6 +1209,7 @@
     classA.supertype = classB.type;
     JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
   }
+
   void test_isSubtypeOf_transitive_superclass() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1108,6 +1219,7 @@
     JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
     JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
   }
+
   void test_isSubtypeOf_typeArguments() {
     Type2 dynamicType = DynamicTypeImpl.instance;
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
@@ -1132,6 +1244,7 @@
     JUnitTestCase.assertFalse(typeAI.isSubtypeOf(typeAK));
     JUnitTestCase.assertFalse(typeAK.isSubtypeOf(typeAI));
   }
+
   void test_isSupertypeOf_directSupertype() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1140,6 +1253,7 @@
     JUnitTestCase.assertFalse(typeB.isSupertypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeB));
   }
+
   void test_isSupertypeOf_dynamic() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1147,6 +1261,7 @@
     JUnitTestCase.assertTrue(dynamicType.isSupertypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSupertypeOf(dynamicType));
   }
+
   void test_isSupertypeOf_indirectSupertype() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1156,6 +1271,7 @@
     JUnitTestCase.assertFalse(typeC.isSupertypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeC));
   }
+
   void test_isSupertypeOf_interface() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1170,6 +1286,7 @@
     JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeC));
     JUnitTestCase.assertFalse(typeC.isSupertypeOf(typeA));
   }
+
   void test_isSupertypeOf_mixins() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1184,6 +1301,7 @@
     JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeC));
     JUnitTestCase.assertFalse(typeC.isSupertypeOf(typeA));
   }
+
   void test_isSupertypeOf_object() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1191,11 +1309,13 @@
     JUnitTestCase.assertFalse(typeA.isSupertypeOf(typeObject));
     JUnitTestCase.assertTrue(typeObject.isSupertypeOf(typeA));
   }
+
   void test_isSupertypeOf_self() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeA));
   }
+
   void test_lookUpGetter_implemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -1204,9 +1324,10 @@
     InterfaceType typeA = classA.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(getterG, typeA.lookUpGetter(getterName, library));
   }
+
   void test_lookUpGetter_inherited() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -1216,9 +1337,10 @@
     InterfaceType typeB = classB.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(getterG, typeB.lookUpGetter(getterName, library));
   }
+
   void test_lookUpGetter_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1226,17 +1348,19 @@
     classA.supertype = classB.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertNull(typeA.lookUpGetter("g", library));
   }
+
   void test_lookUpGetter_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(typeA.lookUpGetter("g", library));
   }
+
   void test_lookUpMethod_implemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -1245,9 +1369,10 @@
     InterfaceType typeA = classA.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(methodM, typeA.lookUpMethod(methodName, library));
   }
+
   void test_lookUpMethod_inherited() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -1257,16 +1382,17 @@
     InterfaceType typeB = classB.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(methodM, typeB.lookUpMethod(methodName, library));
   }
+
   void test_lookUpMethod_parameterized() {
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     Type2 typeE = classA.type.typeArguments[0];
     String methodName = "m";
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, typeE, [typeE]);
     classA.methods = <MethodElement> [methodM];
-    ((methodM.type as FunctionTypeImpl)).typeArguments = classA.type.typeArguments;
+    (methodM.type as FunctionTypeImpl).typeArguments = classA.type.typeArguments;
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
     InterfaceType typeB = classB.type;
     InterfaceTypeImpl typeAF = new InterfaceTypeImpl.con1(classA);
@@ -1274,7 +1400,7 @@
     classB.supertype = typeAF;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
     typeBI.typeArguments = <Type2> [typeI];
@@ -1286,6 +1412,7 @@
     EngineTestCase.assertLength(1, parameterTypes);
     JUnitTestCase.assertSame(typeI, parameterTypes[0]);
   }
+
   void test_lookUpMethod_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1293,17 +1420,19 @@
     classA.supertype = classB.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertNull(typeA.lookUpMethod("m", library));
   }
+
   void test_lookUpMethod_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(typeA.lookUpMethod("m", library));
   }
+
   void test_lookUpSetter_implemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -1312,9 +1441,10 @@
     InterfaceType typeA = classA.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(setterS, typeA.lookUpSetter(setterName, library));
   }
+
   void test_lookUpSetter_inherited() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "g";
@@ -1324,9 +1454,10 @@
     InterfaceType typeB = classB.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(setterS, typeB.lookUpSetter(setterName, library));
   }
+
   void test_lookUpSetter_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -1334,17 +1465,19 @@
     classA.supertype = classB.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertNull(typeA.lookUpSetter("s", library));
   }
+
   void test_lookUpSetter_unimplemented() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    ((unit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(typeA.lookUpSetter("s", library));
   }
+
   void test_setTypeArguments() {
     InterfaceTypeImpl type = ElementFactory.classElement2("A", []).type as InterfaceTypeImpl;
     List<Type2> typeArguments = <Type2> [
@@ -1353,6 +1486,7 @@
     type.typeArguments = typeArguments;
     JUnitTestCase.assertEquals(typeArguments, type.typeArguments);
   }
+
   void test_substitute_equal() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     TypeParameterElementImpl parameterElement = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
@@ -1366,6 +1500,7 @@
     EngineTestCase.assertLength(1, resultArguments);
     JUnitTestCase.assertEquals(argumentType, resultArguments[0]);
   }
+
   void test_substitute_exception() {
     try {
       ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -1376,6 +1511,7 @@
     } on JavaException catch (e) {
     }
   }
+
   void test_substitute_notEqual() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     TypeParameterElementImpl parameterElement = new TypeParameterElementImpl(ASTFactory.identifier3("E"));
@@ -1390,6 +1526,7 @@
     EngineTestCase.assertLength(1, resultArguments);
     JUnitTestCase.assertEquals(parameter, resultArguments[0]);
   }
+
   static dartSuite() {
     _ut.group('InterfaceTypeImplTest', () {
       _ut.test('test_computeLongestInheritancePathToObject_multipleInterfacePaths', () {
@@ -1791,17 +1928,88 @@
     });
   }
 }
+
+class VoidTypeImplTest extends EngineTestCase {
+  /**
+   * Reference {code VoidTypeImpl.getInstance()}.
+   */
+  Type2 _voidType = VoidTypeImpl.instance;
+
+  void test_isMoreSpecificThan_void_A() {
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    JUnitTestCase.assertFalse(_voidType.isMoreSpecificThan(classA.type));
+  }
+
+  void test_isMoreSpecificThan_void_dynamic() {
+    JUnitTestCase.assertTrue(_voidType.isMoreSpecificThan(DynamicTypeImpl.instance));
+  }
+
+  void test_isMoreSpecificThan_void_void() {
+    JUnitTestCase.assertTrue(_voidType.isMoreSpecificThan(_voidType));
+  }
+
+  void test_isSubtypeOf_void_A() {
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    JUnitTestCase.assertFalse(_voidType.isSubtypeOf(classA.type));
+  }
+
+  void test_isSubtypeOf_void_dynamic() {
+    JUnitTestCase.assertTrue(_voidType.isSubtypeOf(DynamicTypeImpl.instance));
+  }
+
+  void test_isSubtypeOf_void_void() {
+    JUnitTestCase.assertTrue(_voidType.isSubtypeOf(_voidType));
+  }
+
+  void test_isVoid() {
+    JUnitTestCase.assertTrue(_voidType.isVoid);
+  }
+
+  static dartSuite() {
+    _ut.group('VoidTypeImplTest', () {
+      _ut.test('test_isMoreSpecificThan_void_A', () {
+        final __test = new VoidTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_void_A);
+      });
+      _ut.test('test_isMoreSpecificThan_void_dynamic', () {
+        final __test = new VoidTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_void_dynamic);
+      });
+      _ut.test('test_isMoreSpecificThan_void_void', () {
+        final __test = new VoidTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_void_void);
+      });
+      _ut.test('test_isSubtypeOf_void_A', () {
+        final __test = new VoidTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_void_A);
+      });
+      _ut.test('test_isSubtypeOf_void_dynamic', () {
+        final __test = new VoidTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_void_dynamic);
+      });
+      _ut.test('test_isSubtypeOf_void_void', () {
+        final __test = new VoidTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_void_void);
+      });
+      _ut.test('test_isVoid', () {
+        final __test = new VoidTypeImplTest();
+        runJUnitTest(__test, __test.test_isVoid);
+      });
+    });
+  }
+}
+
 /**
  * The class `ElementFactory` defines utility methods used to create elements for testing
  * purposes. The elements that are created are complete in the sense that as much of the element
  * model as can be created, given the provided information, has been created.
  */
 class ElementFactory {
-
   /**
    * The element representing the class 'Object'.
    */
   static ClassElementImpl _objectElement;
+
   static ClassElementImpl classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
     ClassElementImpl element = new ClassElementImpl(ASTFactory.identifier3(typeName));
     element.supertype = superclassType;
@@ -1822,21 +2030,37 @@
     }
     return element;
   }
+
   static ClassElementImpl classElement2(String typeName, List<String> parameterNames) => classElement(typeName, object.type, parameterNames);
-  static ConstructorElementImpl constructorElement(ClassElement definingClass, String name) {
+
+  static ConstructorElementImpl constructorElement(ClassElement definingClass, String name, bool isConst, List<Type2> argumentTypes) {
     Type2 type = definingClass.type;
     ConstructorElementImpl constructor = new ConstructorElementImpl(name == null ? null : ASTFactory.identifier3(name));
+    constructor.const2 = isConst;
+    int count = argumentTypes.length;
+    List<ParameterElement> parameters = new List<ParameterElement>(count);
+    for (int i = 0; i < count; i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl.con1(ASTFactory.identifier3("a${i}"));
+      parameter.type = argumentTypes[i];
+      parameter.parameterKind = ParameterKind.REQUIRED;
+      parameters[i] = parameter;
+    }
+    constructor.parameters = parameters;
     constructor.returnType = type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
     constructor.type = constructorType;
     return constructor;
   }
+
+  static ConstructorElementImpl constructorElement2(ClassElement definingClass, String name, List<Type2> argumentTypes) => constructorElement(definingClass, name, false, argumentTypes);
+
   static ExportElementImpl exportFor(LibraryElement exportedLibrary, List<NamespaceCombinator> combinators) {
     ExportElementImpl spec = new ExportElementImpl();
     spec.exportedLibrary = exportedLibrary;
     spec.combinators = combinators;
     return spec;
   }
+
   static FieldElementImpl fieldElement(String name, bool isStatic, bool isFinal, bool isConst, Type2 type) {
     FieldElementImpl field = new FieldElementImpl.con1(ASTFactory.identifier3(name));
     field.const3 = isConst;
@@ -1865,9 +2089,13 @@
     }
     return field;
   }
+
   static FieldFormalParameterElementImpl fieldFormalParameter(Identifier name) => new FieldFormalParameterElementImpl(name);
+
   static FunctionElementImpl functionElement(String functionName) => functionElement4(functionName, null, null, null, null);
+
   static FunctionElementImpl functionElement2(String functionName, ClassElement returnElement) => functionElement3(functionName, returnElement, null, null);
+
   static FunctionElementImpl functionElement3(String functionName, ClassElement returnElement, List<ClassElement> normalParameters, List<ClassElement> optionalParameters) {
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3(functionName));
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
@@ -1895,6 +2123,7 @@
     functionElement.parameters = parameters;
     return functionElement;
   }
+
   static FunctionElementImpl functionElement4(String functionName, ClassElement returnElement, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) {
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3(functionName));
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
@@ -1928,15 +2157,20 @@
     }
     return functionElement;
   }
+
   static FunctionElementImpl functionElement5(String functionName, List<ClassElement> normalParameters) => functionElement3(functionName, null, normalParameters, null);
+
   static FunctionElementImpl functionElement6(String functionName, List<ClassElement> normalParameters, List<ClassElement> optionalParameters) => functionElement3(functionName, null, normalParameters, optionalParameters);
+
   static FunctionElementImpl functionElement7(String functionName, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) => functionElement4(functionName, null, normalParameters, names, namedParameters);
+
   static ClassElementImpl get object {
     if (_objectElement == null) {
       _objectElement = classElement("Object", null as InterfaceType, []);
     }
     return _objectElement;
   }
+
   static PropertyAccessorElementImpl getterElement(String name, bool isStatic, Type2 type) {
     FieldElementImpl field = new FieldElementImpl.con1(ASTFactory.identifier3(name));
     field.static = isStatic;
@@ -1952,6 +2186,7 @@
     getter.type = getterType;
     return getter;
   }
+
   static ImportElementImpl importFor(LibraryElement importedLibrary, PrefixElement prefix, List<NamespaceCombinator> combinators) {
     ImportElementImpl spec = new ImportElementImpl();
     spec.importedLibrary = importedLibrary;
@@ -1959,6 +2194,7 @@
     spec.combinators = combinators;
     return spec;
   }
+
   static LibraryElementImpl library(AnalysisContext context, String libraryName) {
     String fileName = "/${libraryName}.dart";
     FileBasedSource source = new FileBasedSource.con1(context.sourceFactory.contentCache, FileUtilities2.createFile(fileName));
@@ -1968,8 +2204,11 @@
     library.definingCompilationUnit = unit;
     return library;
   }
+
   static LocalVariableElementImpl localVariableElement(Identifier name) => new LocalVariableElementImpl(name);
+
   static LocalVariableElementImpl localVariableElement2(String name) => new LocalVariableElementImpl(ASTFactory.identifier3(name));
+
   static MethodElementImpl methodElement(String methodName, Type2 returnType, List<Type2> argumentTypes) {
     MethodElementImpl method = new MethodElementImpl.con1(ASTFactory.identifier3(methodName));
     int count = argumentTypes.length;
@@ -1986,40 +2225,48 @@
     method.type = methodType;
     return method;
   }
+
   static ParameterElementImpl namedParameter(String name) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(ASTFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.NAMED;
     return parameter;
   }
+
   static ParameterElementImpl namedParameter2(String name, Type2 type) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(ASTFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.NAMED;
     parameter.type = type;
     return parameter;
   }
+
   static ParameterElementImpl positionalParameter(String name) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(ASTFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.POSITIONAL;
     return parameter;
   }
+
   static ParameterElementImpl positionalParameter2(String name, Type2 type) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(ASTFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.POSITIONAL;
     parameter.type = type;
     return parameter;
   }
+
   static PrefixElementImpl prefix(String name) => new PrefixElementImpl(ASTFactory.identifier3(name));
+
   static ParameterElementImpl requiredParameter(String name) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(ASTFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.REQUIRED;
     return parameter;
   }
+
   static ParameterElementImpl requiredParameter2(String name, Type2 type) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(ASTFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.REQUIRED;
     parameter.type = type;
     return parameter;
   }
+
   static PropertyAccessorElementImpl setterElement(String name, bool isStatic, Type2 type) {
     FieldElementImpl field = new FieldElementImpl.con1(ASTFactory.identifier3(name));
     field.static = isStatic;
@@ -2045,10 +2292,14 @@
     field.setter = setter;
     return setter;
   }
+
   static TopLevelVariableElementImpl topLevelVariableElement(Identifier name) => new TopLevelVariableElementImpl.con1(name);
+
   static TopLevelVariableElementImpl topLevelVariableElement2(String name) => new TopLevelVariableElementImpl.con2(name);
-  static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isFinal, Type2 type) {
+
+  static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isConst, bool isFinal, Type2 type) {
     TopLevelVariableElementImpl variable = new TopLevelVariableElementImpl.con2(name);
+    variable.const3 = isConst;
     variable.final2 = isFinal;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
     getter.getter = true;
@@ -2073,13 +2324,16 @@
     return variable;
   }
 }
+
 class ElementKindTest extends EngineTestCase {
   void test_of_nonNull() {
     JUnitTestCase.assertSame(ElementKind.CLASS, ElementKind.of(ElementFactory.classElement2("A", [])));
   }
+
   void test_of_null() {
     JUnitTestCase.assertSame(ElementKind.ERROR, ElementKind.of(null));
   }
+
   static dartSuite() {
     _ut.group('ElementKindTest', () {
       _ut.test('test_of_nonNull', () {
@@ -2093,6 +2347,7 @@
     });
   }
 }
+
 class ClassElementImplTest extends EngineTestCase {
   void test_getAllSupertypes_interface() {
     ClassElement classA = ElementFactory.classElement2("A", []);
@@ -2111,6 +2366,7 @@
     JUnitTestCase.assertTrue(types.contains(typeObject));
     JUnitTestCase.assertFalse(types.contains(typeC));
   }
+
   void test_getAllSupertypes_mixins() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -2128,6 +2384,7 @@
     JUnitTestCase.assertTrue(types.contains(typeObject));
     JUnitTestCase.assertFalse(types.contains(typeC));
   }
+
   void test_getAllSupertypes_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -2135,6 +2392,7 @@
     List<InterfaceType> supers = classB.allSupertypes;
     EngineTestCase.assertLength(1, supers);
   }
+
   void test_getMethod_declared() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -2142,6 +2400,7 @@
     classA.methods = <MethodElement> [method];
     JUnitTestCase.assertSame(method, classA.getMethod(methodName));
   }
+
   void test_getMethod_undeclared() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -2149,42 +2408,49 @@
     classA.methods = <MethodElement> [method];
     JUnitTestCase.assertNull(classA.getMethod("${methodName}x"));
   }
+
   void test_hasNonFinalField_false_const() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, true, classA.type)];
     JUnitTestCase.assertFalse(classA.hasNonFinalField());
   }
+
   void test_hasNonFinalField_false_final() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, true, false, classA.type)];
     JUnitTestCase.assertFalse(classA.hasNonFinalField());
   }
+
   void test_hasNonFinalField_false_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     JUnitTestCase.assertFalse(classA.hasNonFinalField());
   }
+
   void test_hasNonFinalField_true_immediate() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
     JUnitTestCase.assertTrue(classA.hasNonFinalField());
   }
+
   void test_hasNonFinalField_true_inherited() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
     JUnitTestCase.assertTrue(classB.hasNonFinalField());
   }
+
   void test_lookUpGetter_declared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
     PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
     classA.accessors = <PropertyAccessorElement> [getter];
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(getter, classA.lookUpGetter(getterName, library));
   }
+
   void test_lookUpGetter_inherited() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -2192,32 +2458,36 @@
     PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
     classA.accessors = <PropertyAccessorElement> [getter];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(getter, classB.lookUpGetter(getterName, library));
   }
+
   void test_lookUpGetter_undeclared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
   }
+
   void test_lookUpGetter_undeclared_recursive() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
   }
+
   void test_lookUpMethod_declared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(method, classA.lookUpMethod(methodName, library));
   }
+
   void test_lookUpMethod_inherited() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -2225,32 +2495,36 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(method, classB.lookUpMethod(methodName, library));
   }
+
   void test_lookUpMethod_undeclared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
   }
+
   void test_lookUpMethod_undeclared_recursive() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
   }
+
   void test_lookUpSetter_declared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
     PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
     classA.accessors = <PropertyAccessorElement> [setter];
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertSame(setter, classA.lookUpSetter(setterName, library));
   }
+
   void test_lookUpSetter_inherited() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -2258,23 +2532,26 @@
     PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
     classA.accessors = <PropertyAccessorElement> [setter];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertSame(setter, classB.lookUpSetter(setterName, library));
   }
+
   void test_lookUpSetter_undeclared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
     JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
   }
+
   void test_lookUpSetter_undeclared_recursive() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classA, classB];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
     JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
   }
+
   static dartSuite() {
     _ut.group('ClassElementImplTest', () {
       _ut.test('test_getAllSupertypes_interface', () {
@@ -2368,11 +2645,12 @@
     });
   }
 }
+
 class ElementImplTest extends EngineTestCase {
   void test_equals() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classElement = ElementFactory.classElement2("C", []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classElement];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     FieldElement field = ElementFactory.fieldElement("next", false, false, false, classElement.type);
     classElement.fields = <FieldElement> [field];
     JUnitTestCase.assertTrue(field == field);
@@ -2380,34 +2658,39 @@
     JUnitTestCase.assertFalse(field == field.setter);
     JUnitTestCase.assertFalse(field.getter == field.setter);
   }
+
   void test_isAccessibleIn_private_differentLibrary() {
     AnalysisContextImpl context = createAnalysisContext();
     LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
     ClassElement classElement = ElementFactory.classElement2("_C", []);
-    ((library1.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classElement];
+    (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
     JUnitTestCase.assertFalse(classElement.isAccessibleIn(library2));
   }
+
   void test_isAccessibleIn_private_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElement classElement = ElementFactory.classElement2("_C", []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classElement];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
   }
+
   void test_isAccessibleIn_public_differentLibrary() {
     AnalysisContextImpl context = createAnalysisContext();
     LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
     ClassElement classElement = ElementFactory.classElement2("C", []);
-    ((library1.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classElement];
+    (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
     JUnitTestCase.assertTrue(classElement.isAccessibleIn(library2));
   }
+
   void test_isAccessibleIn_public_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElement classElement = ElementFactory.classElement2("C", []);
-    ((library.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [classElement];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
   }
+
   void test_SORT_BY_OFFSET() {
     ClassElementImpl classElementA = ElementFactory.classElement2("A", []);
     classElementA.nameOffset = 1;
@@ -2417,6 +2700,7 @@
     JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementA, classElementB) < 0);
     JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementB, classElementA) > 0);
   }
+
   static dartSuite() {
     _ut.group('ElementImplTest', () {
       _ut.test('test_SORT_BY_OFFSET', () {
@@ -2446,25 +2730,30 @@
     });
   }
 }
+
 class FunctionTypeImplTest extends EngineTestCase {
   void test_creation() {
     JUnitTestCase.assertNotNull(new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f"))));
   }
+
   void test_getElement() {
     FunctionElementImpl typeElement = new FunctionElementImpl.con1(ASTFactory.identifier3("f"));
     FunctionTypeImpl type = new FunctionTypeImpl.con1(typeElement);
     JUnitTestCase.assertEquals(typeElement, type.element);
   }
+
   void test_getNamedParameterTypes() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     Map<String, Type2> types = type.namedParameterTypes;
     EngineTestCase.assertSize2(0, types);
   }
+
   void test_getNormalParameterTypes() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     List<Type2> types = type.normalParameterTypes;
     EngineTestCase.assertLength(0, types);
   }
+
   void test_getReturnType() {
     Type2 expectedReturnType = VoidTypeImpl.instance;
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3("f"));
@@ -2473,19 +2762,23 @@
     Type2 returnType = type.returnType;
     JUnitTestCase.assertEquals(expectedReturnType, returnType);
   }
+
   void test_getTypeArguments() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     List<Type2> types = type.typeArguments;
     EngineTestCase.assertLength(0, types);
   }
+
   void test_hashCode_element() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(ASTFactory.identifier3("f")));
     type.hashCode;
   }
+
   void test_hashCode_noElement() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(null as ExecutableElement);
     type.hashCode;
   }
+
   void test_isAssignableTo_normalAndPositionalArgs() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
@@ -2495,25 +2788,30 @@
     JUnitTestCase.assertTrue(t.isAssignableTo(s));
     JUnitTestCase.assertFalse(s.isAssignableTo(t));
   }
+
   void test_isSubtypeOf_baseCase_classFunction() {
     ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
-    InterfaceTypeImpl functionType = new InterfaceTypeImpl_23(functionElement);
+    InterfaceTypeImpl functionType = new InterfaceTypeImpl_24(functionElement);
     FunctionType f = ElementFactory.functionElement("f").type;
     JUnitTestCase.assertTrue(f.isSubtypeOf(functionType));
   }
+
   void test_isSubtypeOf_baseCase_notFunctionType() {
     FunctionType f = ElementFactory.functionElement("f").type;
     InterfaceType t = ElementFactory.classElement2("C", []).type;
     JUnitTestCase.assertFalse(f.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_baseCase_null() {
     FunctionType f = ElementFactory.functionElement("f").type;
     JUnitTestCase.assertFalse(f.isSubtypeOf(null));
   }
+
   void test_isSubtypeOf_baseCase_self() {
     FunctionType f = ElementFactory.functionElement("f").type;
     JUnitTestCase.assertTrue(f.isSubtypeOf(f));
   }
+
   void test_isSubtypeOf_namedParameters_isAssignable() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2522,11 +2820,13 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertTrue(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_namedParameters_isNotAssignable() {
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("A", [])]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("B", [])]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_namedParameters_namesDifferent() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2535,6 +2835,7 @@
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_namedParameters_orderOfParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2542,6 +2843,7 @@
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_namedParameters_orderOfParams2() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2549,6 +2851,7 @@
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_namedParameters_orderOfParams3() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2556,6 +2859,7 @@
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B"], <ClassElement> [b]).type;
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_namedParameters_sHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2563,6 +2867,7 @@
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name", "name2"], <ClassElement> [b, b]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_namedParameters_tHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2570,6 +2875,7 @@
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_normalAndPositionalArgs_1() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
@@ -2577,6 +2883,7 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_normalAndPositionalArgs_2() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a], <ClassElement> [a]).type;
@@ -2584,6 +2891,7 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_normalAndPositionalArgs_3() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
@@ -2591,6 +2899,7 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_normalAndPositionalArgs_4() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement2("B", []);
@@ -2602,6 +2911,7 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_normalParameters_isAssignable() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2610,11 +2920,13 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertTrue(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_normalParameters_isNotAssignable() {
     FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [ElementFactory.classElement2("A", [])]).type;
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [ElementFactory.classElement2("B", [])]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_normalParameters_sHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2622,6 +2934,7 @@
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b, b]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_normalParameters_tHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2629,11 +2942,13 @@
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_Object() {
     FunctionType f = ElementFactory.functionElement("f").type;
     InterfaceType t = ElementFactory.object.type;
     JUnitTestCase.assertTrue(f.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_positionalParameters_isAssignable() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2642,11 +2957,13 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertTrue(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_positionalParameters_isNotAssignable() {
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [ElementFactory.classElement2("A", [])]).type;
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [ElementFactory.classElement2("B", [])]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_positionalParameters_sHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2654,6 +2971,7 @@
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b, b]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_positionalParameters_tHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2661,12 +2979,14 @@
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b]).type;
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_returnType_sIsVoid() {
     FunctionType t = ElementFactory.functionElement("t").type;
     FunctionType s = ElementFactory.functionElement("s").type;
     JUnitTestCase.assertTrue(VoidTypeImpl.instance == s.returnType);
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_returnType_tAssignableToS() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2675,11 +2995,13 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertTrue(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_returnType_tNotAssignableToS() {
     FunctionType t = ElementFactory.functionElement2("t", ElementFactory.classElement2("A", [])).type;
     FunctionType s = ElementFactory.functionElement2("s", ElementFactory.classElement2("B", [])).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+
   void test_isSubtypeOf_typeParameters_matchesBounds() {
     TestTypeProvider provider = new TestTypeProvider();
     InterfaceType boolType = provider.boolType;
@@ -2706,6 +3028,7 @@
     functionElement.type = functionType;
     JUnitTestCase.assertTrue(functionType.isAssignableTo(functionAliasType));
   }
+
   void test_isSubtypeOf_wrongFunctionType_normal_named() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
@@ -2713,6 +3036,7 @@
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
+
   void test_isSubtypeOf_wrongFunctionType_optional_named() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
@@ -2720,6 +3044,7 @@
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
+
   void test_setTypeArguments() {
     ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]);
     MethodElementImpl methodElement = new MethodElementImpl.con1(ASTFactory.identifier3("m"));
@@ -2731,6 +3056,7 @@
     EngineTestCase.assertLength(1, arguments);
     JUnitTestCase.assertEquals(expectedType, arguments[0]);
   }
+
   void test_substitute2_equal() {
     ClassElementImpl definingClass = ElementFactory.classElement2("C", ["E"]);
     TypeParameterType parameterType = definingClass.typeParameters[0].type;
@@ -2757,6 +3083,7 @@
     EngineTestCase.assertSize2(1, namedParameters);
     JUnitTestCase.assertEquals(argumentType, namedParameters[namedParameterName]);
   }
+
   void test_substitute2_notEqual() {
     Type2 returnType = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("R")));
     Type2 normalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(ASTFactory.identifier3("A")));
@@ -2784,6 +3111,7 @@
     EngineTestCase.assertSize2(1, namedParameters);
     JUnitTestCase.assertEquals(namedParameterType, namedParameters[namedParameterName]);
   }
+
   static dartSuite() {
     _ut.group('FunctionTypeImplTest', () {
       _ut.test('test_creation', () {
@@ -2961,15 +3289,19 @@
     });
   }
 }
-class InterfaceTypeImpl_23 extends InterfaceTypeImpl {
-  InterfaceTypeImpl_23(ClassElement arg0) : super.con1(arg0);
+
+class InterfaceTypeImpl_24 extends InterfaceTypeImpl {
+  InterfaceTypeImpl_24(ClassElement arg0) : super.con1(arg0);
+
   bool get isDartCoreFunction => true;
 }
+
 main() {
   ElementKindTest.dartSuite();
   FunctionTypeImplTest.dartSuite();
   InterfaceTypeImplTest.dartSuite();
   TypeParameterTypeImplTest.dartSuite();
+  VoidTypeImplTest.dartSuite();
   ClassElementImplTest.dartSuite();
   ElementLocationImplTest.dartSuite();
   ElementImplTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index e8f3dad..8ea3dae 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -1,6 +1,8 @@
 // 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 engine.parser_test;
+
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/error.dart';
@@ -15,6 +17,7 @@
 import 'scanner_test.dart' show TokenFactory;
 import 'ast_test.dart' show ASTFactory;
 import 'element_test.dart' show ElementFactory;
+
 /**
  * The class `SimpleParserTest` defines parser tests that test individual parsing method. The
  * code fragments should be as minimal as possible in order to test the method, but should not test
@@ -30,188 +33,262 @@
     JUnitTestCase.assertEquals("a", identifier.name);
     JUnitTestCase.assertEquals(5, identifier.offset);
   }
+
   void test_computeStringValue_emptyInterpolationPrefix() {
     JUnitTestCase.assertEquals("", computeStringValue("'''", true, false));
   }
+
   void test_computeStringValue_escape_b() {
     JUnitTestCase.assertEquals("\b", computeStringValue("'\\b'", true, true));
   }
+
   void test_computeStringValue_escape_f() {
     JUnitTestCase.assertEquals("\f", computeStringValue("'\\f'", true, true));
   }
+
   void test_computeStringValue_escape_n() {
     JUnitTestCase.assertEquals("\n", computeStringValue("'\\n'", true, true));
   }
+
   void test_computeStringValue_escape_notSpecial() {
     JUnitTestCase.assertEquals(":", computeStringValue("'\\:'", true, true));
   }
+
   void test_computeStringValue_escape_r() {
     JUnitTestCase.assertEquals("\r", computeStringValue("'\\r'", true, true));
   }
+
   void test_computeStringValue_escape_t() {
     JUnitTestCase.assertEquals("\t", computeStringValue("'\\t'", true, true));
   }
+
   void test_computeStringValue_escape_u_fixed() {
     JUnitTestCase.assertEquals("\u4321", computeStringValue("'\\u4321'", true, true));
   }
+
   void test_computeStringValue_escape_u_variable() {
     JUnitTestCase.assertEquals("\u0123", computeStringValue("'\\u{123}'", true, true));
   }
+
   void test_computeStringValue_escape_v() {
     JUnitTestCase.assertEquals("\u000B", computeStringValue("'\\v'", true, true));
   }
+
   void test_computeStringValue_escape_x() {
     JUnitTestCase.assertEquals("\u00FF", computeStringValue("'\\xFF'", true, true));
   }
+
   void test_computeStringValue_noEscape_single() {
     JUnitTestCase.assertEquals("text", computeStringValue("'text'", true, true));
   }
+
   void test_computeStringValue_noEscape_triple() {
     JUnitTestCase.assertEquals("text", computeStringValue("'''text'''", true, true));
   }
+
   void test_computeStringValue_raw_single() {
     JUnitTestCase.assertEquals("text", computeStringValue("r'text'", true, true));
   }
+
   void test_computeStringValue_raw_triple() {
     JUnitTestCase.assertEquals("text", computeStringValue("r'''text'''", true, true));
   }
+
   void test_computeStringValue_raw_withEscape() {
     JUnitTestCase.assertEquals("two\\nlines", computeStringValue("r'two\\nlines'", true, true));
   }
+
   void test_computeStringValue_triple_internalQuote_first_empty() {
     JUnitTestCase.assertEquals("'", computeStringValue("''''", true, false));
   }
+
   void test_computeStringValue_triple_internalQuote_first_nonEmpty() {
     JUnitTestCase.assertEquals("'text", computeStringValue("''''text", true, false));
   }
+
   void test_computeStringValue_triple_internalQuote_last_empty() {
     JUnitTestCase.assertEquals("", computeStringValue("'''", false, true));
   }
+
   void test_computeStringValue_triple_internalQuote_last_nonEmpty() {
     JUnitTestCase.assertEquals("text", computeStringValue("text'''", false, true));
   }
+
   void test_constFactory() {
     ParserTestCase.parse("parseClassMember", <Object> ["C"], "const factory C() = A;");
   }
+
   void test_createSyntheticIdentifier() {
     SimpleIdentifier identifier = createSyntheticIdentifier();
     JUnitTestCase.assertTrue(identifier.isSynthetic);
   }
+
   void test_createSyntheticStringLiteral() {
     SimpleStringLiteral literal = createSyntheticStringLiteral();
     JUnitTestCase.assertTrue(literal.isSynthetic);
   }
+
   void test_isFunctionDeclaration_nameButNoReturn_block() {
     JUnitTestCase.assertTrue(isFunctionDeclaration("f() {}"));
   }
+
   void test_isFunctionDeclaration_nameButNoReturn_expression() {
     JUnitTestCase.assertTrue(isFunctionDeclaration("f() => e"));
   }
+
   void test_isFunctionDeclaration_normalReturn_block() {
     JUnitTestCase.assertTrue(isFunctionDeclaration("C f() {}"));
   }
+
   void test_isFunctionDeclaration_normalReturn_expression() {
     JUnitTestCase.assertTrue(isFunctionDeclaration("C f() => e"));
   }
+
   void test_isFunctionDeclaration_voidReturn_block() {
     JUnitTestCase.assertTrue(isFunctionDeclaration("void f() {}"));
   }
+
   void test_isFunctionDeclaration_voidReturn_expression() {
     JUnitTestCase.assertTrue(isFunctionDeclaration("void f() => e"));
   }
+
   void test_isFunctionExpression_false_noBody() {
     JUnitTestCase.assertFalse(isFunctionExpression("f();"));
   }
+
   void test_isFunctionExpression_false_notParameters() {
     JUnitTestCase.assertFalse(isFunctionExpression("(a + b) {"));
   }
+
   void test_isFunctionExpression_noName_block() {
     JUnitTestCase.assertTrue(isFunctionExpression("() {}"));
   }
+
   void test_isFunctionExpression_noName_expression() {
     JUnitTestCase.assertTrue(isFunctionExpression("() => e"));
   }
+
+  void test_isFunctionExpression_parameter_final() {
+    JUnitTestCase.assertTrue(isFunctionExpression("(final a) {}"));
+    JUnitTestCase.assertTrue(isFunctionExpression("(final a, b) {}"));
+    JUnitTestCase.assertTrue(isFunctionExpression("(final a, final b) {}"));
+  }
+
+  void test_isFunctionExpression_parameter_final_typed() {
+    JUnitTestCase.assertTrue(isFunctionExpression("(final int a) {}"));
+    JUnitTestCase.assertTrue(isFunctionExpression("(final prefix.List a) {}"));
+    JUnitTestCase.assertTrue(isFunctionExpression("(final List<int> a) {}"));
+    JUnitTestCase.assertTrue(isFunctionExpression("(final prefix.List<int> a) {}"));
+  }
+
   void test_isFunctionExpression_parameter_multiple() {
     JUnitTestCase.assertTrue(isFunctionExpression("(a, b) {}"));
   }
+
   void test_isFunctionExpression_parameter_named() {
     JUnitTestCase.assertTrue(isFunctionExpression("({a}) {}"));
   }
+
   void test_isFunctionExpression_parameter_optional() {
     JUnitTestCase.assertTrue(isFunctionExpression("([a]) {}"));
   }
+
   void test_isFunctionExpression_parameter_single() {
     JUnitTestCase.assertTrue(isFunctionExpression("(a) {}"));
   }
+
   void test_isFunctionExpression_parameter_typed() {
     JUnitTestCase.assertTrue(isFunctionExpression("(int a, int b) {}"));
   }
+
   void test_isInitializedVariableDeclaration_assignment() {
     JUnitTestCase.assertFalse(isInitializedVariableDeclaration("a = null;"));
   }
+
   void test_isInitializedVariableDeclaration_comparison() {
     JUnitTestCase.assertFalse(isInitializedVariableDeclaration("a < 0;"));
   }
+
   void test_isInitializedVariableDeclaration_conditional() {
     JUnitTestCase.assertFalse(isInitializedVariableDeclaration("a == null ? init() : update();"));
   }
+
   void test_isInitializedVariableDeclaration_const_noType_initialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("const a = 0;"));
   }
+
   void test_isInitializedVariableDeclaration_const_noType_uninitialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("const a;"));
   }
+
   void test_isInitializedVariableDeclaration_const_simpleType_uninitialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("const A a;"));
   }
+
   void test_isInitializedVariableDeclaration_final_noType_initialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("final a = 0;"));
   }
+
   void test_isInitializedVariableDeclaration_final_noType_uninitialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("final a;"));
   }
+
   void test_isInitializedVariableDeclaration_final_simpleType_initialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("final A a = 0;"));
   }
+
   void test_isInitializedVariableDeclaration_functionDeclaration_typed() {
     JUnitTestCase.assertFalse(isInitializedVariableDeclaration("A f() {};"));
   }
+
   void test_isInitializedVariableDeclaration_functionDeclaration_untyped() {
     JUnitTestCase.assertFalse(isInitializedVariableDeclaration("f() {};"));
   }
+
   void test_isInitializedVariableDeclaration_noType_initialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("var a = 0;"));
   }
+
   void test_isInitializedVariableDeclaration_noType_uninitialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("var a;"));
   }
+
   void test_isInitializedVariableDeclaration_parameterizedType_initialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("List<int> a = null;"));
   }
+
   void test_isInitializedVariableDeclaration_parameterizedType_uninitialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("List<int> a;"));
   }
+
   void test_isInitializedVariableDeclaration_simpleType_initialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("A a = 0;"));
   }
+
   void test_isInitializedVariableDeclaration_simpleType_uninitialized() {
     JUnitTestCase.assertTrue(isInitializedVariableDeclaration("A a;"));
   }
+
   void test_isSwitchMember_case_labeled() {
     JUnitTestCase.assertTrue(isSwitchMember("l1: l2: case"));
   }
+
   void test_isSwitchMember_case_unlabeled() {
     JUnitTestCase.assertTrue(isSwitchMember("case"));
   }
+
   void test_isSwitchMember_default_labeled() {
     JUnitTestCase.assertTrue(isSwitchMember("l1: l2: default"));
   }
+
   void test_isSwitchMember_default_unlabeled() {
     JUnitTestCase.assertTrue(isSwitchMember("default"));
   }
+
   void test_isSwitchMember_false() {
     JUnitTestCase.assertFalse(isSwitchMember("break;"));
   }
+
   void test_parseAdditiveExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseAdditiveExpression", "x + y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -219,6 +296,7 @@
     JUnitTestCase.assertEquals(TokenType.PLUS, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseAdditiveExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseAdditiveExpression", "super + y", []);
     EngineTestCase.assertInstanceOf(SuperExpression, expression.leftOperand);
@@ -226,6 +304,7 @@
     JUnitTestCase.assertEquals(TokenType.PLUS, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseAnnotation_n1() {
     Annotation annotation = ParserTestCase.parse5("parseAnnotation", "@A", []);
     JUnitTestCase.assertNotNull(annotation.atSign);
@@ -234,6 +313,7 @@
     JUnitTestCase.assertNull(annotation.constructorName);
     JUnitTestCase.assertNull(annotation.arguments);
   }
+
   void test_parseAnnotation_n1_a() {
     Annotation annotation = ParserTestCase.parse5("parseAnnotation", "@A(x,y)", []);
     JUnitTestCase.assertNotNull(annotation.atSign);
@@ -242,6 +322,7 @@
     JUnitTestCase.assertNull(annotation.constructorName);
     JUnitTestCase.assertNotNull(annotation.arguments);
   }
+
   void test_parseAnnotation_n2() {
     Annotation annotation = ParserTestCase.parse5("parseAnnotation", "@A.B", []);
     JUnitTestCase.assertNotNull(annotation.atSign);
@@ -250,6 +331,7 @@
     JUnitTestCase.assertNull(annotation.constructorName);
     JUnitTestCase.assertNull(annotation.arguments);
   }
+
   void test_parseAnnotation_n2_a() {
     Annotation annotation = ParserTestCase.parse5("parseAnnotation", "@A.B(x,y)", []);
     JUnitTestCase.assertNotNull(annotation.atSign);
@@ -258,6 +340,7 @@
     JUnitTestCase.assertNull(annotation.constructorName);
     JUnitTestCase.assertNotNull(annotation.arguments);
   }
+
   void test_parseAnnotation_n3() {
     Annotation annotation = ParserTestCase.parse5("parseAnnotation", "@A.B.C", []);
     JUnitTestCase.assertNotNull(annotation.atSign);
@@ -266,6 +349,7 @@
     JUnitTestCase.assertNotNull(annotation.constructorName);
     JUnitTestCase.assertNull(annotation.arguments);
   }
+
   void test_parseAnnotation_n3_a() {
     Annotation annotation = ParserTestCase.parse5("parseAnnotation", "@A.B.C(x,y)", []);
     JUnitTestCase.assertNotNull(annotation.atSign);
@@ -274,6 +358,7 @@
     JUnitTestCase.assertNotNull(annotation.constructorName);
     JUnitTestCase.assertNotNull(annotation.arguments);
   }
+
   void test_parseArgument_named() {
     NamedExpression expression = ParserTestCase.parse5("parseArgument", "n: x", []);
     Label name = expression.name;
@@ -282,36 +367,43 @@
     JUnitTestCase.assertNotNull(name.colon);
     JUnitTestCase.assertNotNull(expression.expression);
   }
+
   void test_parseArgument_unnamed() {
     String lexeme = "x";
     SimpleIdentifier identifier = ParserTestCase.parse5("parseArgument", lexeme, []);
     JUnitTestCase.assertEquals(lexeme, identifier.name);
   }
+
   void test_parseArgumentDefinitionTest() {
     ArgumentDefinitionTest test = ParserTestCase.parse5("parseArgumentDefinitionTest", "?x", [ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST]);
     JUnitTestCase.assertNotNull(test.question);
     JUnitTestCase.assertNotNull(test.identifier);
   }
+
   void test_parseArgumentList_empty() {
     ArgumentList argumentList = ParserTestCase.parse5("parseArgumentList", "()", []);
     NodeList<Expression> arguments = argumentList.arguments;
     EngineTestCase.assertSize(0, arguments);
   }
+
   void test_parseArgumentList_mixed() {
     ArgumentList argumentList = ParserTestCase.parse5("parseArgumentList", "(w, x, y: y, z: z)", []);
     NodeList<Expression> arguments = argumentList.arguments;
     EngineTestCase.assertSize(4, arguments);
   }
+
   void test_parseArgumentList_noNamed() {
     ArgumentList argumentList = ParserTestCase.parse5("parseArgumentList", "(x, y, z)", []);
     NodeList<Expression> arguments = argumentList.arguments;
     EngineTestCase.assertSize(3, arguments);
   }
+
   void test_parseArgumentList_onlyNamed() {
     ArgumentList argumentList = ParserTestCase.parse5("parseArgumentList", "(x: x, y: y)", []);
     NodeList<Expression> arguments = argumentList.arguments;
     EngineTestCase.assertSize(2, arguments);
   }
+
   void test_parseAssertStatement() {
     AssertStatement statement = ParserTestCase.parse5("parseAssertStatement", "assert (x);", []);
     JUnitTestCase.assertNotNull(statement.keyword);
@@ -320,6 +412,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseAssignableExpression_expression_args_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "(x)(y).z");
     FunctionExpressionInvocation invocation = propertyAccess.target as FunctionExpressionInvocation;
@@ -330,12 +423,14 @@
     JUnitTestCase.assertNotNull(propertyAccess.operator);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
+
   void test_parseAssignableExpression_expression_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "(x).y");
     JUnitTestCase.assertNotNull(propertyAccess.target);
     JUnitTestCase.assertNotNull(propertyAccess.operator);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
+
   void test_parseAssignableExpression_expression_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "(x)[y]");
     JUnitTestCase.assertNotNull(expression.target);
@@ -343,10 +438,12 @@
     JUnitTestCase.assertNotNull(expression.index);
     JUnitTestCase.assertNotNull(expression.rightBracket);
   }
+
   void test_parseAssignableExpression_identifier() {
     SimpleIdentifier identifier = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x");
     JUnitTestCase.assertNotNull(identifier);
   }
+
   void test_parseAssignableExpression_identifier_args_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x(y).z");
     MethodInvocation invocation = propertyAccess.target as MethodInvocation;
@@ -357,12 +454,14 @@
     JUnitTestCase.assertNotNull(propertyAccess.operator);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
+
   void test_parseAssignableExpression_identifier_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x.y");
     JUnitTestCase.assertNotNull(propertyAccess.target);
     JUnitTestCase.assertNotNull(propertyAccess.operator);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
+
   void test_parseAssignableExpression_identifier_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x[y]");
     JUnitTestCase.assertNotNull(expression.target);
@@ -370,12 +469,14 @@
     JUnitTestCase.assertNotNull(expression.index);
     JUnitTestCase.assertNotNull(expression.rightBracket);
   }
+
   void test_parseAssignableExpression_super_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "super.y");
     EngineTestCase.assertInstanceOf(SuperExpression, propertyAccess.target);
     JUnitTestCase.assertNotNull(propertyAccess.operator);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
+
   void test_parseAssignableExpression_super_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "super[y]");
     EngineTestCase.assertInstanceOf(SuperExpression, expression.target);
@@ -383,21 +484,25 @@
     JUnitTestCase.assertNotNull(expression.index);
     JUnitTestCase.assertNotNull(expression.rightBracket);
   }
+
   void test_parseAssignableSelector_dot() {
     PropertyAccess selector = ParserTestCase.parse("parseAssignableSelector", <Object> [null, true], ".x");
     JUnitTestCase.assertNotNull(selector.operator);
     JUnitTestCase.assertNotNull(selector.propertyName);
   }
+
   void test_parseAssignableSelector_index() {
     IndexExpression selector = ParserTestCase.parse("parseAssignableSelector", <Object> [null, true], "[x]");
     JUnitTestCase.assertNotNull(selector.leftBracket);
     JUnitTestCase.assertNotNull(selector.index);
     JUnitTestCase.assertNotNull(selector.rightBracket);
   }
+
   void test_parseAssignableSelector_none() {
     SimpleIdentifier selector = ParserTestCase.parse("parseAssignableSelector", <Object> [new SimpleIdentifier.full(null), true], ";");
     JUnitTestCase.assertNotNull(selector);
   }
+
   void test_parseBitwiseAndExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseBitwiseAndExpression", "x & y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -405,6 +510,7 @@
     JUnitTestCase.assertEquals(TokenType.AMPERSAND, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseBitwiseAndExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseBitwiseAndExpression", "super & y", []);
     EngineTestCase.assertInstanceOf(SuperExpression, expression.leftOperand);
@@ -412,6 +518,7 @@
     JUnitTestCase.assertEquals(TokenType.AMPERSAND, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseBitwiseOrExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseBitwiseOrExpression", "x | y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -419,6 +526,7 @@
     JUnitTestCase.assertEquals(TokenType.BAR, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseBitwiseOrExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseBitwiseOrExpression", "super | y", []);
     EngineTestCase.assertInstanceOf(SuperExpression, expression.leftOperand);
@@ -426,6 +534,7 @@
     JUnitTestCase.assertEquals(TokenType.BAR, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseBitwiseXorExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseBitwiseXorExpression", "x ^ y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -433,6 +542,7 @@
     JUnitTestCase.assertEquals(TokenType.CARET, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseBitwiseXorExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseBitwiseXorExpression", "super ^ y", []);
     EngineTestCase.assertInstanceOf(SuperExpression, expression.leftOperand);
@@ -440,30 +550,35 @@
     JUnitTestCase.assertEquals(TokenType.CARET, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseBlock_empty() {
     Block block = ParserTestCase.parse5("parseBlock", "{}", []);
     JUnitTestCase.assertNotNull(block.leftBracket);
     EngineTestCase.assertSize(0, block.statements);
     JUnitTestCase.assertNotNull(block.rightBracket);
   }
+
   void test_parseBlock_nonEmpty() {
     Block block = ParserTestCase.parse5("parseBlock", "{;}", []);
     JUnitTestCase.assertNotNull(block.leftBracket);
     EngineTestCase.assertSize(1, block.statements);
     JUnitTestCase.assertNotNull(block.rightBracket);
   }
+
   void test_parseBreakStatement_label() {
     BreakStatement statement = ParserTestCase.parse5("parseBreakStatement", "break foo;", []);
     JUnitTestCase.assertNotNull(statement.keyword);
     JUnitTestCase.assertNotNull(statement.label);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseBreakStatement_noLabel() {
     BreakStatement statement = ParserTestCase.parse5("parseBreakStatement", "break;", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
     JUnitTestCase.assertNotNull(statement.keyword);
     JUnitTestCase.assertNull(statement.label);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseCascadeSection_i() {
     IndexExpression section = ParserTestCase.parse5("parseCascadeSection", "..[i]", []);
     JUnitTestCase.assertNull(section.target);
@@ -471,11 +586,13 @@
     JUnitTestCase.assertNotNull(section.index);
     JUnitTestCase.assertNotNull(section.rightBracket);
   }
+
   void test_parseCascadeSection_ia() {
     FunctionExpressionInvocation section = ParserTestCase.parse5("parseCascadeSection", "..[i](b)", []);
     EngineTestCase.assertInstanceOf(IndexExpression, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
   }
+
   void test_parseCascadeSection_ii() {
     MethodInvocation section = ParserTestCase.parse5("parseCascadeSection", "..a(b).c(d)", []);
     EngineTestCase.assertInstanceOf(MethodInvocation, section.target);
@@ -484,12 +601,14 @@
     JUnitTestCase.assertNotNull(section.argumentList);
     EngineTestCase.assertSize(1, section.argumentList.arguments);
   }
+
   void test_parseCascadeSection_p() {
     PropertyAccess section = ParserTestCase.parse5("parseCascadeSection", "..a", []);
     JUnitTestCase.assertNull(section.target);
     JUnitTestCase.assertNotNull(section.operator);
     JUnitTestCase.assertNotNull(section.propertyName);
   }
+
   void test_parseCascadeSection_p_assign() {
     AssignmentExpression section = ParserTestCase.parse5("parseCascadeSection", "..a = 3", []);
     JUnitTestCase.assertNotNull(section.leftHandSide);
@@ -497,6 +616,7 @@
     Expression rhs = section.rightHandSide;
     JUnitTestCase.assertNotNull(rhs);
   }
+
   void test_parseCascadeSection_p_assign_withCascade() {
     AssignmentExpression section = ParserTestCase.parse5("parseCascadeSection", "..a = 3..m()", []);
     JUnitTestCase.assertNotNull(section.leftHandSide);
@@ -504,12 +624,14 @@
     Expression rhs = section.rightHandSide;
     EngineTestCase.assertInstanceOf(IntegerLiteral, rhs);
   }
+
   void test_parseCascadeSection_p_builtIn() {
     PropertyAccess section = ParserTestCase.parse5("parseCascadeSection", "..as", []);
     JUnitTestCase.assertNull(section.target);
     JUnitTestCase.assertNotNull(section.operator);
     JUnitTestCase.assertNotNull(section.propertyName);
   }
+
   void test_parseCascadeSection_pa() {
     MethodInvocation section = ParserTestCase.parse5("parseCascadeSection", "..a(b)", []);
     JUnitTestCase.assertNull(section.target);
@@ -518,24 +640,28 @@
     JUnitTestCase.assertNotNull(section.argumentList);
     EngineTestCase.assertSize(1, section.argumentList.arguments);
   }
+
   void test_parseCascadeSection_paa() {
     FunctionExpressionInvocation section = ParserTestCase.parse5("parseCascadeSection", "..a(b)(c)", []);
     EngineTestCase.assertInstanceOf(MethodInvocation, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
     EngineTestCase.assertSize(1, section.argumentList.arguments);
   }
+
   void test_parseCascadeSection_paapaa() {
     FunctionExpressionInvocation section = ParserTestCase.parse5("parseCascadeSection", "..a(b)(c).d(e)(f)", []);
     EngineTestCase.assertInstanceOf(MethodInvocation, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
     EngineTestCase.assertSize(1, section.argumentList.arguments);
   }
+
   void test_parseCascadeSection_pap() {
     PropertyAccess section = ParserTestCase.parse5("parseCascadeSection", "..a(b).c", []);
     JUnitTestCase.assertNotNull(section.target);
     JUnitTestCase.assertNotNull(section.operator);
     JUnitTestCase.assertNotNull(section.propertyName);
   }
+
   void test_parseClassDeclaration_abstract() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [
         emptyCommentAndMetadata(),
@@ -551,6 +677,7 @@
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
+
   void test_parseClassDeclaration_empty() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -564,6 +691,7 @@
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
+
   void test_parseClassDeclaration_extends() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -577,6 +705,7 @@
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
+
   void test_parseClassDeclaration_extendsAndImplements() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B implements C {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -590,6 +719,7 @@
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
+
   void test_parseClassDeclaration_extendsAndWith() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B with C {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -604,6 +734,7 @@
     EngineTestCase.assertSize(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
   }
+
   void test_parseClassDeclaration_extendsAndWithAndImplements() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B with C implements D {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -618,6 +749,7 @@
     EngineTestCase.assertSize(0, declaration.members);
     JUnitTestCase.assertNotNull(declaration.rightBracket);
   }
+
   void test_parseClassDeclaration_implements() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A implements C {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -631,6 +763,7 @@
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
+
   void test_parseClassDeclaration_native() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A native 'nativeValue' {}");
     NativeClause nativeClause = declaration.nativeClause;
@@ -640,6 +773,7 @@
     JUnitTestCase.assertSame(nativeClause.keyword, nativeClause.beginToken);
     JUnitTestCase.assertSame(nativeClause.name.endToken, nativeClause.endToken);
   }
+
   void test_parseClassDeclaration_nonEmpty() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A {var f;}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -653,6 +787,7 @@
     JUnitTestCase.assertNotNull(declaration.rightBracket);
     JUnitTestCase.assertNull(declaration.typeParameters);
   }
+
   void test_parseClassDeclaration_typeAlias_implementsC() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A = Object with B implements C;");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -664,6 +799,7 @@
     JUnitTestCase.assertEquals(1, typeAlias.implementsClause.interfaces.length);
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
   }
+
   void test_parseClassDeclaration_typeAlias_withB() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A = Object with B;");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -675,6 +811,7 @@
     JUnitTestCase.assertNull(typeAlias.implementsClause);
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
   }
+
   void test_parseClassDeclaration_typeParameters() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A<B> {}");
     JUnitTestCase.assertNull(declaration.documentationComment);
@@ -689,6 +826,7 @@
     JUnitTestCase.assertNotNull(declaration.typeParameters);
     EngineTestCase.assertSize(1, declaration.typeParameters.typeParameters);
   }
+
   void test_parseClassMember_constructor_withInitializers() {
     ConstructorDeclaration constructor = ParserTestCase.parse("parseClassMember", <Object> ["C"], "C(_, _\$, this.__) : _a = _ + _\$ {}");
     JUnitTestCase.assertNotNull(constructor.body);
@@ -702,6 +840,7 @@
     JUnitTestCase.assertNotNull(constructor.returnType);
     EngineTestCase.assertSize(1, constructor.initializers);
   }
+
   void test_parseClassMember_field_instance_prefixedType() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "p.A f;");
     JUnitTestCase.assertNull(field.documentationComment);
@@ -714,6 +853,7 @@
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
+
   void test_parseClassMember_field_namedGet() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var get;");
     JUnitTestCase.assertNull(field.documentationComment);
@@ -726,6 +866,7 @@
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
+
   void test_parseClassMember_field_namedOperator() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var operator;");
     JUnitTestCase.assertNull(field.documentationComment);
@@ -738,6 +879,21 @@
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
+
+  void test_parseClassMember_field_namedOperator_withAssignment() {
+    FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var operator = (5);");
+    JUnitTestCase.assertNull(field.documentationComment);
+    EngineTestCase.assertSize(0, field.metadata);
+    JUnitTestCase.assertNull(field.staticKeyword);
+    VariableDeclarationList list = field.fields;
+    JUnitTestCase.assertNotNull(list);
+    NodeList<VariableDeclaration> variables = list.variables;
+    EngineTestCase.assertSize(1, variables);
+    VariableDeclaration variable = variables[0];
+    JUnitTestCase.assertNotNull(variable.name);
+    JUnitTestCase.assertNotNull(variable.initializer);
+  }
+
   void test_parseClassMember_field_namedSet() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var set;");
     JUnitTestCase.assertNull(field.documentationComment);
@@ -750,6 +906,7 @@
     VariableDeclaration variable = variables[0];
     JUnitTestCase.assertNotNull(variable.name);
   }
+
   void test_parseClassMember_getter_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void get g {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -761,6 +918,7 @@
     JUnitTestCase.assertNull(method.operatorKeyword);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_external() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "external m();");
     JUnitTestCase.assertNotNull(method.body);
@@ -773,6 +931,7 @@
     JUnitTestCase.assertNull(method.propertyKeyword);
     JUnitTestCase.assertNull(method.returnType);
   }
+
   void test_parseClassMember_method_external_withTypeAndArgs() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "external int m(int a);");
     JUnitTestCase.assertNotNull(method.body);
@@ -785,6 +944,7 @@
     JUnitTestCase.assertNull(method.propertyKeyword);
     JUnitTestCase.assertNotNull(method.returnType);
   }
+
   void test_parseClassMember_method_get_noType() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "get() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -797,6 +957,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_get_type() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int get() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -809,6 +970,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_get_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void get() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -821,6 +983,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_operator_noType() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "operator() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -833,6 +996,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_operator_type() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int operator() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -845,6 +1009,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_operator_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void operator() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -857,6 +1022,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_returnType_parameterized() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "p.A m() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -869,6 +1035,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_set_noType() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "set() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -881,6 +1048,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_set_type() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int set() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -893,6 +1061,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_method_set_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void set() {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -905,6 +1074,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_operator_index() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int operator [](int i) {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -917,6 +1087,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_operator_indexAssign() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int operator []=(int i) {}");
     JUnitTestCase.assertNull(method.documentationComment);
@@ -929,6 +1100,7 @@
     JUnitTestCase.assertNotNull(method.parameters);
     JUnitTestCase.assertNotNull(method.body);
   }
+
   void test_parseClassMember_redirectingFactory_const() {
     ConstructorDeclaration constructor = ParserTestCase.parse("parseClassMember", <Object> ["C"], "const factory C() = B;");
     JUnitTestCase.assertNull(constructor.externalKeyword);
@@ -943,6 +1115,7 @@
     JUnitTestCase.assertNotNull(constructor.redirectedConstructor);
     JUnitTestCase.assertNotNull(constructor.body);
   }
+
   void test_parseClassMember_redirectingFactory_nonConst() {
     ConstructorDeclaration constructor = ParserTestCase.parse("parseClassMember", <Object> ["C"], "factory C() = B;");
     JUnitTestCase.assertNull(constructor.externalKeyword);
@@ -957,6 +1130,7 @@
     JUnitTestCase.assertNotNull(constructor.redirectedConstructor);
     JUnitTestCase.assertNotNull(constructor.body);
   }
+
   void test_parseClassTypeAlias() {
     Token token = TokenFactory.token(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), token], "A = B;");
@@ -969,6 +1143,7 @@
     JUnitTestCase.assertNull(classTypeAlias.implementsClause);
     JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
   }
+
   void test_parseClassTypeAlias_abstract() {
     Token token = TokenFactory.token(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), token], "A = abstract B;");
@@ -981,6 +1156,7 @@
     JUnitTestCase.assertNull(classTypeAlias.implementsClause);
     JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
   }
+
   void test_parseClassTypeAlias_implements() {
     Token token = TokenFactory.token(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), token], "A = B implements C;");
@@ -993,6 +1169,7 @@
     JUnitTestCase.assertNotNull(classTypeAlias.implementsClause);
     JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
   }
+
   void test_parseClassTypeAlias_with() {
     Token token = TokenFactory.token(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), token], "A = B with C;");
@@ -1005,6 +1182,7 @@
     JUnitTestCase.assertNull(classTypeAlias.implementsClause);
     JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
   }
+
   void test_parseClassTypeAlias_with_implements() {
     Token token = TokenFactory.token(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), token], "A = B with C implements D;");
@@ -1017,6 +1195,7 @@
     JUnitTestCase.assertNotNull(classTypeAlias.implementsClause);
     JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
   }
+
   void test_parseCombinators_h() {
     List<Combinator> combinators = ParserTestCase.parse5("parseCombinators", "hide a;", []);
     EngineTestCase.assertSize(1, combinators);
@@ -1025,6 +1204,7 @@
     JUnitTestCase.assertNotNull(combinator.keyword);
     EngineTestCase.assertSize(1, combinator.hiddenNames);
   }
+
   void test_parseCombinators_hs() {
     List<Combinator> combinators = ParserTestCase.parse5("parseCombinators", "hide a show b;", []);
     EngineTestCase.assertSize(2, combinators);
@@ -1037,10 +1217,12 @@
     JUnitTestCase.assertNotNull(showCombinator.keyword);
     EngineTestCase.assertSize(1, showCombinator.shownNames);
   }
+
   void test_parseCombinators_hshs() {
     List<Combinator> combinators = ParserTestCase.parse5("parseCombinators", "hide a show b hide c show d;", []);
     EngineTestCase.assertSize(4, combinators);
   }
+
   void test_parseCombinators_s() {
     List<Combinator> combinators = ParserTestCase.parse5("parseCombinators", "show a;", []);
     EngineTestCase.assertSize(1, combinators);
@@ -1049,56 +1231,67 @@
     JUnitTestCase.assertNotNull(combinator.keyword);
     EngineTestCase.assertSize(1, combinator.shownNames);
   }
+
   void test_parseCommentAndMetadata_c() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "/** 1 */ void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(0, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_cmc() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(1, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_cmcm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ @B void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(2, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_cmm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "/** 1 */ @A @B void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(2, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_m() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "@A void", []);
     JUnitTestCase.assertNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(1, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_mcm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "@A /** 1 */ @B void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(2, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_mcmc() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "@A /** 1 */ @B /** 2 */ void", []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(2, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_mm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "@A @B(x) void", []);
     JUnitTestCase.assertNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(2, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_none() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", "void", []);
     JUnitTestCase.assertNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(0, commentAndMetadata.metadata);
   }
+
   void test_parseCommentAndMetadata_singleLine() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse5("parseCommentAndMetadata", EngineTestCase.createSource(["/// 1", "/// 2", "void"]), []);
     JUnitTestCase.assertNotNull(commentAndMetadata.comment);
     EngineTestCase.assertSize(0, commentAndMetadata.metadata);
   }
+
   void test_parseCommentReference_new_prefixed() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["new a.b", 7], "");
     PrefixedIdentifier prefixedIdentifier = EngineTestCase.assertInstanceOf(PrefixedIdentifier, reference.identifier);
@@ -1112,6 +1305,7 @@
     JUnitTestCase.assertEquals("b", identifier.name);
     JUnitTestCase.assertEquals(13, identifier.offset);
   }
+
   void test_parseCommentReference_new_simple() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["new a", 5], "");
     SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(SimpleIdentifier, reference.identifier);
@@ -1119,6 +1313,7 @@
     JUnitTestCase.assertEquals("a", identifier.name);
     JUnitTestCase.assertEquals(9, identifier.offset);
   }
+
   void test_parseCommentReference_prefixed() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["a.b", 7], "");
     PrefixedIdentifier prefixedIdentifier = EngineTestCase.assertInstanceOf(PrefixedIdentifier, reference.identifier);
@@ -1132,6 +1327,7 @@
     JUnitTestCase.assertEquals("b", identifier.name);
     JUnitTestCase.assertEquals(9, identifier.offset);
   }
+
   void test_parseCommentReference_simple() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["a", 5], "");
     SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(SimpleIdentifier, reference.identifier);
@@ -1139,6 +1335,7 @@
     JUnitTestCase.assertEquals("a", identifier.name);
     JUnitTestCase.assertEquals(5, identifier.offset);
   }
+
   void test_parseCommentReferences_multiLine() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
@@ -1152,6 +1349,7 @@
     JUnitTestCase.assertNotNull(reference.identifier);
     JUnitTestCase.assertEquals(20, reference.offset);
   }
+
   void test_parseCommentReferences_singleLine() {
     List<Token> tokens = <Token> [
         new StringToken(TokenType.SINGLE_LINE_COMMENT, "/// xxx [a] yyy [b] zzz", 3),
@@ -1171,6 +1369,7 @@
     JUnitTestCase.assertNotNull(reference.identifier);
     JUnitTestCase.assertEquals(35, reference.offset);
   }
+
   void test_parseCommentReferences_skipCodeBlock_bracketed() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [:xxx [a] yyy:] [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
@@ -1180,6 +1379,7 @@
     JUnitTestCase.assertNotNull(reference.identifier);
     JUnitTestCase.assertEquals(24, reference.offset);
   }
+
   void test_parseCommentReferences_skipCodeBlock_spaces() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/**\n *     a[i]\n * xxx [i] zzz\n */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
@@ -1189,6 +1389,7 @@
     JUnitTestCase.assertNotNull(reference.identifier);
     JUnitTestCase.assertEquals(27, reference.offset);
   }
+
   void test_parseCommentReferences_skipLinkDefinition() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a]: http://www.google.com (Google) [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
@@ -1198,6 +1399,7 @@
     JUnitTestCase.assertNotNull(reference.identifier);
     JUnitTestCase.assertEquals(44, reference.offset);
   }
+
   void test_parseCommentReferences_skipLinked() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a](http://www.google.com) [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
@@ -1207,6 +1409,7 @@
     JUnitTestCase.assertNotNull(reference.identifier);
     JUnitTestCase.assertEquals(35, reference.offset);
   }
+
   void test_parseCommentReferences_skipReferenceLink() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a][c] [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
@@ -1216,156 +1419,202 @@
     JUnitTestCase.assertNotNull(reference.identifier);
     JUnitTestCase.assertEquals(15, reference.offset);
   }
+
   void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "abstract<dynamic> _abstract = new abstract.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(1, unit.declarations);
   }
+
+  void test_parseCompilationUnit_builtIn_asFunctionName() {
+    ParserTestCase.parse5("parseCompilationUnit", "abstract(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "as(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "dynamic(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "export(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "external(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "factory(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "get(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "implements(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "import(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "library(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "operator(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "part(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "set(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "static(x) => 0;", []);
+    ParserTestCase.parse5("parseCompilationUnit", "typedef(x) => 0;", []);
+  }
+
   void test_parseCompilationUnit_directives_multiple() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "library l;\npart 'a.dart';", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(2, unit.directives);
     EngineTestCase.assertSize(0, unit.declarations);
   }
+
   void test_parseCompilationUnit_directives_single() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "library l;", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(1, unit.directives);
     EngineTestCase.assertSize(0, unit.declarations);
   }
+
   void test_parseCompilationUnit_empty() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(0, unit.declarations);
   }
+
   void test_parseCompilationUnit_exportAsPrefix() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "export.A _export = new export.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(1, unit.declarations);
   }
+
   void test_parseCompilationUnit_exportAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "export<dynamic> _export = new export.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(1, unit.declarations);
   }
+
   void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "operator<dynamic> _operator = new operator.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(1, unit.declarations);
   }
+
   void test_parseCompilationUnit_script() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "#! /bin/dart", []);
     JUnitTestCase.assertNotNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(0, unit.declarations);
   }
+
   void test_parseCompilationUnit_topLevelDeclaration() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "class A {}", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(1, unit.declarations);
   }
+
   void test_parseCompilationUnit_typedefAsPrefix() {
     CompilationUnit unit = ParserTestCase.parse5("parseCompilationUnit", "typedef.A _typedef = new typedef.A();", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSize(0, unit.directives);
     EngineTestCase.assertSize(1, unit.declarations);
   }
+
   void test_parseCompilationUnitMember_abstractAsPrefix() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "abstract.A _abstract = new abstract.A();");
     JUnitTestCase.assertNotNull(declaration.semicolon);
     JUnitTestCase.assertNotNull(declaration.variables);
   }
+
   void test_parseCompilationUnitMember_class() {
     ClassDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class A {}");
     JUnitTestCase.assertEquals("A", declaration.name.name);
     EngineTestCase.assertSize(0, declaration.members);
   }
+
   void test_parseCompilationUnitMember_constVariable() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "const int x = 0;");
     JUnitTestCase.assertNotNull(declaration.semicolon);
     JUnitTestCase.assertNotNull(declaration.variables);
   }
+
   void test_parseCompilationUnitMember_finalVariable() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "final x = 0;");
     JUnitTestCase.assertNotNull(declaration.semicolon);
     JUnitTestCase.assertNotNull(declaration.variables);
   }
+
   void test_parseCompilationUnitMember_function_external_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external f();");
     JUnitTestCase.assertNotNull(declaration.externalKeyword);
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_function_external_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external int f();");
     JUnitTestCase.assertNotNull(declaration.externalKeyword);
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_function_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "f() {}");
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_function_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "int f() {}");
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_function_void() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void f() {}");
     JUnitTestCase.assertNotNull(declaration.returnType);
   }
+
   void test_parseCompilationUnitMember_getter_external_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external get p;");
     JUnitTestCase.assertNotNull(declaration.externalKeyword);
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_getter_external_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external int get p;");
     JUnitTestCase.assertNotNull(declaration.externalKeyword);
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_getter_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "get p => 0;");
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_getter_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "int get p => 0;");
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_setter_external_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external set p(v);");
     JUnitTestCase.assertNotNull(declaration.externalKeyword);
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_setter_external_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external void set p(int v);");
     JUnitTestCase.assertNotNull(declaration.externalKeyword);
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_setter_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "set p(v) {}");
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_setter_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void set p(int v) {}");
     JUnitTestCase.assertNotNull(declaration.functionExpression);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseCompilationUnitMember_typeAlias_abstract() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C = abstract S with M;");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -1378,6 +1627,7 @@
     JUnitTestCase.assertNull(typeAlias.implementsClause);
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
   }
+
   void test_parseCompilationUnitMember_typeAlias_generic() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C<E> = S<E> with M<E> implements I<E>;");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -1390,6 +1640,7 @@
     JUnitTestCase.assertNotNull(typeAlias.implementsClause);
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
   }
+
   void test_parseCompilationUnitMember_typeAlias_implements() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C = S with M implements I;");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -1402,6 +1653,7 @@
     JUnitTestCase.assertNotNull(typeAlias.implementsClause);
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
   }
+
   void test_parseCompilationUnitMember_typeAlias_noImplements() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C = S with M;");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -1414,26 +1666,31 @@
     JUnitTestCase.assertNull(typeAlias.implementsClause);
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
   }
+
   void test_parseCompilationUnitMember_typedef() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "typedef F();");
     JUnitTestCase.assertEquals("F", typeAlias.name.name);
     EngineTestCase.assertSize(0, typeAlias.parameters.parameters);
   }
+
   void test_parseCompilationUnitMember_variable() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "var x = 0;");
     JUnitTestCase.assertNotNull(declaration.semicolon);
     JUnitTestCase.assertNotNull(declaration.variables);
   }
+
   void test_parseCompilationUnitMember_variableGet() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "String get = null;");
     JUnitTestCase.assertNotNull(declaration.semicolon);
     JUnitTestCase.assertNotNull(declaration.variables);
   }
+
   void test_parseCompilationUnitMember_variableSet() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "String set = null;");
     JUnitTestCase.assertNotNull(declaration.semicolon);
     JUnitTestCase.assertNotNull(declaration.variables);
   }
+
   void test_parseConditionalExpression() {
     ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? y : z", []);
     JUnitTestCase.assertNotNull(expression.condition);
@@ -1442,6 +1699,7 @@
     JUnitTestCase.assertNotNull(expression.colon);
     JUnitTestCase.assertNotNull(expression.elseExpression);
   }
+
   void test_parseConstExpression_instanceCreation() {
     InstanceCreationExpression expression = ParserTestCase.parse5("parseConstExpression", "const A()", []);
     JUnitTestCase.assertNotNull(expression.keyword);
@@ -1452,6 +1710,7 @@
     JUnitTestCase.assertNull(name.name);
     JUnitTestCase.assertNotNull(expression.argumentList);
   }
+
   void test_parseConstExpression_listLiteral_typed() {
     ListLiteral literal = ParserTestCase.parse5("parseConstExpression", "const <A> []", []);
     JUnitTestCase.assertNotNull(literal.constKeyword);
@@ -1460,6 +1719,7 @@
     EngineTestCase.assertSize(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseConstExpression_listLiteral_untyped() {
     ListLiteral literal = ParserTestCase.parse5("parseConstExpression", "const []", []);
     JUnitTestCase.assertNotNull(literal.constKeyword);
@@ -1468,6 +1728,7 @@
     EngineTestCase.assertSize(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseConstExpression_mapLiteral_typed() {
     MapLiteral literal = ParserTestCase.parse5("parseConstExpression", "const <A, B> {}", []);
     JUnitTestCase.assertNotNull(literal.leftBracket);
@@ -1475,6 +1736,7 @@
     JUnitTestCase.assertNotNull(literal.rightBracket);
     JUnitTestCase.assertNotNull(literal.typeArguments);
   }
+
   void test_parseConstExpression_mapLiteral_untyped() {
     MapLiteral literal = ParserTestCase.parse5("parseConstExpression", "const {}", []);
     JUnitTestCase.assertNotNull(literal.leftBracket);
@@ -1482,8 +1744,10 @@
     JUnitTestCase.assertNotNull(literal.rightBracket);
     JUnitTestCase.assertNull(literal.typeArguments);
   }
+
   void test_parseConstructor() {
   }
+
   void test_parseConstructorFieldInitializer_qualified() {
     ConstructorFieldInitializer invocation = ParserTestCase.parse5("parseConstructorFieldInitializer", "this.a = b", []);
     JUnitTestCase.assertNotNull(invocation.equals);
@@ -1492,6 +1756,7 @@
     JUnitTestCase.assertNotNull(invocation.keyword);
     JUnitTestCase.assertNotNull(invocation.period);
   }
+
   void test_parseConstructorFieldInitializer_unqualified() {
     ConstructorFieldInitializer invocation = ParserTestCase.parse5("parseConstructorFieldInitializer", "a = b", []);
     JUnitTestCase.assertNotNull(invocation.equals);
@@ -1500,42 +1765,49 @@
     JUnitTestCase.assertNull(invocation.keyword);
     JUnitTestCase.assertNull(invocation.period);
   }
+
   void test_parseConstructorName_named_noPrefix() {
     ConstructorName name = ParserTestCase.parse5("parseConstructorName", "A.n;", []);
     JUnitTestCase.assertNotNull(name.type);
     JUnitTestCase.assertNull(name.period);
     JUnitTestCase.assertNull(name.name);
   }
+
   void test_parseConstructorName_named_prefixed() {
     ConstructorName name = ParserTestCase.parse5("parseConstructorName", "p.A.n;", []);
     JUnitTestCase.assertNotNull(name.type);
     JUnitTestCase.assertNotNull(name.period);
     JUnitTestCase.assertNotNull(name.name);
   }
+
   void test_parseConstructorName_unnamed_noPrefix() {
     ConstructorName name = ParserTestCase.parse5("parseConstructorName", "A;", []);
     JUnitTestCase.assertNotNull(name.type);
     JUnitTestCase.assertNull(name.period);
     JUnitTestCase.assertNull(name.name);
   }
+
   void test_parseConstructorName_unnamed_prefixed() {
     ConstructorName name = ParserTestCase.parse5("parseConstructorName", "p.A;", []);
     JUnitTestCase.assertNotNull(name.type);
     JUnitTestCase.assertNull(name.period);
     JUnitTestCase.assertNull(name.name);
   }
+
   void test_parseContinueStatement_label() {
     ContinueStatement statement = ParserTestCase.parse5("parseContinueStatement", "continue foo;", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
     JUnitTestCase.assertNotNull(statement.keyword);
     JUnitTestCase.assertNotNull(statement.label);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseContinueStatement_noLabel() {
     ContinueStatement statement = ParserTestCase.parse5("parseContinueStatement", "continue;", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
     JUnitTestCase.assertNotNull(statement.keyword);
     JUnitTestCase.assertNull(statement.label);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseDirective_export() {
     ExportDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -1543,6 +1815,7 @@
     EngineTestCase.assertSize(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseDirective_import() {
     ImportDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -1552,18 +1825,21 @@
     EngineTestCase.assertSize(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseDirective_library() {
     LibraryDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "library l;");
     JUnitTestCase.assertNotNull(directive.libraryToken);
     JUnitTestCase.assertNotNull(directive.name);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseDirective_part() {
     PartDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "part 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.partToken);
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseDirective_partOf() {
     PartOfDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "part of l;");
     JUnitTestCase.assertNotNull(directive.partToken);
@@ -1571,12 +1847,14 @@
     JUnitTestCase.assertNotNull(directive.libraryName);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseDocumentationComment_block() {
     Comment comment = ParserTestCase.parse5("parseDocumentationComment", "/** */ class", []);
     JUnitTestCase.assertFalse(comment.isBlock);
     JUnitTestCase.assertTrue(comment.isDocumentation);
     JUnitTestCase.assertFalse(comment.isEndOfLine);
   }
+
   void test_parseDocumentationComment_block_withReference() {
     Comment comment = ParserTestCase.parse5("parseDocumentationComment", "/** [a] */ class", []);
     JUnitTestCase.assertFalse(comment.isBlock);
@@ -1588,12 +1866,14 @@
     JUnitTestCase.assertNotNull(reference);
     JUnitTestCase.assertEquals(5, reference.offset);
   }
+
   void test_parseDocumentationComment_endOfLine() {
     Comment comment = ParserTestCase.parse5("parseDocumentationComment", "/// \n/// \n class", []);
     JUnitTestCase.assertFalse(comment.isBlock);
     JUnitTestCase.assertTrue(comment.isDocumentation);
     JUnitTestCase.assertFalse(comment.isEndOfLine);
   }
+
   void test_parseDoStatement() {
     DoStatement statement = ParserTestCase.parse5("parseDoStatement", "do {} while (x);", []);
     JUnitTestCase.assertNotNull(statement.doKeyword);
@@ -1604,10 +1884,12 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseEmptyStatement() {
     EmptyStatement statement = ParserTestCase.parse5("parseEmptyStatement", ";", []);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseEqualityExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseEqualityExpression", "x == y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -1615,6 +1897,7 @@
     JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseEqualityExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseEqualityExpression", "super == y", []);
     EngineTestCase.assertInstanceOf(SuperExpression, expression.leftOperand);
@@ -1622,6 +1905,7 @@
     JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseExportDirective_hide() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' hide A, B;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -1629,6 +1913,7 @@
     EngineTestCase.assertSize(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseExportDirective_hide_show() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' hide A show B;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -1636,6 +1921,7 @@
     EngineTestCase.assertSize(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseExportDirective_noCombinator() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -1643,6 +1929,7 @@
     EngineTestCase.assertSize(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseExportDirective_show() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' show A, B;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -1650,6 +1937,7 @@
     EngineTestCase.assertSize(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseExportDirective_show_hide() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' show B hide A;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -1657,6 +1945,7 @@
     EngineTestCase.assertSize(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseExpression_assign() {
     AssignmentExpression expression = ParserTestCase.parse5("parseExpression", "x = y", []);
     JUnitTestCase.assertNotNull(expression.leftHandSide);
@@ -1664,6 +1953,7 @@
     JUnitTestCase.assertEquals(TokenType.EQ, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightHandSide);
   }
+
   void test_parseExpression_comparison() {
     BinaryExpression expression = ParserTestCase.parse5("parseExpression", "--a.b == c", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -1671,6 +1961,7 @@
     JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseExpression_invokeFunctionExpression() {
     FunctionExpressionInvocation invocation = ParserTestCase.parse5("parseExpression", "(a) {return a + a;} (3)", []);
     EngineTestCase.assertInstanceOf(FunctionExpression, invocation.function);
@@ -1681,20 +1972,24 @@
     JUnitTestCase.assertNotNull(list);
     EngineTestCase.assertSize(1, list.arguments);
   }
+
   void test_parseExpression_superMethodInvocation() {
     MethodInvocation invocation = ParserTestCase.parse5("parseExpression", "super.m()", []);
     JUnitTestCase.assertNotNull(invocation.target);
     JUnitTestCase.assertNotNull(invocation.methodName);
     JUnitTestCase.assertNotNull(invocation.argumentList);
   }
+
   void test_parseExpressionList_multiple() {
     List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, 3", []);
     EngineTestCase.assertSize(3, result);
   }
+
   void test_parseExpressionList_single() {
     List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1", []);
     EngineTestCase.assertSize(1, result);
   }
+
   void test_parseExpressionWithoutCascade_assign() {
     AssignmentExpression expression = ParserTestCase.parse5("parseExpressionWithoutCascade", "x = y", []);
     JUnitTestCase.assertNotNull(expression.leftHandSide);
@@ -1702,6 +1997,7 @@
     JUnitTestCase.assertEquals(TokenType.EQ, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightHandSide);
   }
+
   void test_parseExpressionWithoutCascade_comparison() {
     BinaryExpression expression = ParserTestCase.parse5("parseExpressionWithoutCascade", "--a.b == c", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -1709,86 +2005,99 @@
     JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseExpressionWithoutCascade_superMethodInvocation() {
     MethodInvocation invocation = ParserTestCase.parse5("parseExpressionWithoutCascade", "super.m()", []);
     JUnitTestCase.assertNotNull(invocation.target);
     JUnitTestCase.assertNotNull(invocation.methodName);
     JUnitTestCase.assertNotNull(invocation.argumentList);
   }
+
   void test_parseExtendsClause() {
     ExtendsClause clause = ParserTestCase.parse5("parseExtendsClause", "extends B", []);
     JUnitTestCase.assertNotNull(clause.keyword);
     JUnitTestCase.assertNotNull(clause.superclass);
     EngineTestCase.assertInstanceOf(TypeName, clause.superclass);
   }
+
   void test_parseFinalConstVarOrType_const_noType() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "const");
     Token keyword = result.keyword;
     JUnitTestCase.assertNotNull(keyword);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.CONST, ((keyword as KeywordToken)).keyword);
+    JUnitTestCase.assertEquals(Keyword.CONST, (keyword as KeywordToken).keyword);
     JUnitTestCase.assertNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_const_type() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "const A a");
     Token keyword = result.keyword;
     JUnitTestCase.assertNotNull(keyword);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.CONST, ((keyword as KeywordToken)).keyword);
+    JUnitTestCase.assertEquals(Keyword.CONST, (keyword as KeywordToken).keyword);
     JUnitTestCase.assertNotNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_final_noType() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final");
     Token keyword = result.keyword;
     JUnitTestCase.assertNotNull(keyword);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.FINAL, ((keyword as KeywordToken)).keyword);
+    JUnitTestCase.assertEquals(Keyword.FINAL, (keyword as KeywordToken).keyword);
     JUnitTestCase.assertNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_final_prefixedType() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final p.A a");
     Token keyword = result.keyword;
     JUnitTestCase.assertNotNull(keyword);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.FINAL, ((keyword as KeywordToken)).keyword);
+    JUnitTestCase.assertEquals(Keyword.FINAL, (keyword as KeywordToken).keyword);
     JUnitTestCase.assertNotNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_final_type() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final A a");
     Token keyword = result.keyword;
     JUnitTestCase.assertNotNull(keyword);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.FINAL, ((keyword as KeywordToken)).keyword);
+    JUnitTestCase.assertEquals(Keyword.FINAL, (keyword as KeywordToken).keyword);
     JUnitTestCase.assertNotNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_type_parameterized() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "A<B> a");
     JUnitTestCase.assertNull(result.keyword);
     JUnitTestCase.assertNotNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_type_prefixed() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "p.A a");
     JUnitTestCase.assertNull(result.keyword);
     JUnitTestCase.assertNotNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_type_prefixedAndParameterized() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "p.A<B> a");
     JUnitTestCase.assertNull(result.keyword);
     JUnitTestCase.assertNotNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_type_simple() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "A a");
     JUnitTestCase.assertNull(result.keyword);
     JUnitTestCase.assertNotNull(result.type);
   }
+
   void test_parseFinalConstVarOrType_var() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "var");
     Token keyword = result.keyword;
     JUnitTestCase.assertNotNull(keyword);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.VAR, ((keyword as KeywordToken)).keyword);
+    JUnitTestCase.assertEquals(Keyword.VAR, (keyword as KeywordToken).keyword);
     JUnitTestCase.assertNull(result.type);
   }
+
   void test_parseFormalParameter_final_withType_named() {
     ParameterKind kind = ParameterKind.NAMED;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "final A a : null");
@@ -1801,6 +2110,7 @@
     JUnitTestCase.assertNotNull(parameter.defaultValue);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_final_withType_normal() {
     ParameterKind kind = ParameterKind.REQUIRED;
     SimpleFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "final A a");
@@ -1809,6 +2119,7 @@
     JUnitTestCase.assertNotNull(parameter.type);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_final_withType_positional() {
     ParameterKind kind = ParameterKind.POSITIONAL;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "final A a = null");
@@ -1821,6 +2132,7 @@
     JUnitTestCase.assertNotNull(parameter.defaultValue);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_nonFinal_withType_named() {
     ParameterKind kind = ParameterKind.NAMED;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "A a : null");
@@ -1833,6 +2145,7 @@
     JUnitTestCase.assertNotNull(parameter.defaultValue);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_nonFinal_withType_normal() {
     ParameterKind kind = ParameterKind.REQUIRED;
     SimpleFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "A a");
@@ -1841,6 +2154,7 @@
     JUnitTestCase.assertNotNull(parameter.type);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_nonFinal_withType_positional() {
     ParameterKind kind = ParameterKind.POSITIONAL;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "A a = null");
@@ -1853,6 +2167,7 @@
     JUnitTestCase.assertNotNull(parameter.defaultValue);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_var() {
     ParameterKind kind = ParameterKind.REQUIRED;
     SimpleFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "var a");
@@ -1861,6 +2176,7 @@
     JUnitTestCase.assertNull(parameter.type);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_var_named() {
     ParameterKind kind = ParameterKind.NAMED;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "var a : null");
@@ -1873,6 +2189,7 @@
     JUnitTestCase.assertNotNull(parameter.defaultValue);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameter_var_positional() {
     ParameterKind kind = ParameterKind.POSITIONAL;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "var a = null");
@@ -1885,6 +2202,7 @@
     JUnitTestCase.assertNotNull(parameter.defaultValue);
     JUnitTestCase.assertEquals(kind, parameter.kind);
   }
+
   void test_parseFormalParameterList_empty() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "()", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1893,6 +2211,7 @@
     JUnitTestCase.assertNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_named_multiple() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "({A a : 1, B b, C c : 3})", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1901,6 +2220,7 @@
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_named_single() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "({A a})", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1909,6 +2229,7 @@
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_normal_multiple() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "(A a, B b, C c)", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1917,6 +2238,7 @@
     JUnitTestCase.assertNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_normal_named() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "(A a, {B b})", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1925,6 +2247,7 @@
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_normal_positional() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "(A a, [B b])", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1933,6 +2256,7 @@
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_normal_single() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "(A a)", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1941,6 +2265,7 @@
     JUnitTestCase.assertNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_positional_multiple() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "([A a = null, B b, C c = null])", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1949,6 +2274,7 @@
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseFormalParameterList_positional_single() {
     FormalParameterList parameterList = ParserTestCase.parse5("parseFormalParameterList", "([A a = null])", []);
     JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
@@ -1957,6 +2283,7 @@
     JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
     JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
   }
+
   void test_parseForStatement_each_identifier() {
     ForEachStatement statement = ParserTestCase.parse5("parseForStatement", "for (element in list) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -1968,6 +2295,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_each_noType_metadata() {
     ForEachStatement statement = ParserTestCase.parse5("parseForStatement", "for (@A var element in list) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -1980,6 +2308,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_each_type() {
     ForEachStatement statement = ParserTestCase.parse5("parseForStatement", "for (A element in list) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -1991,6 +2320,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_each_var() {
     ForEachStatement statement = ParserTestCase.parse5("parseForStatement", "for (var element in list) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2002,6 +2332,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_c() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (; i < count;) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2015,6 +2346,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_cu() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (; i < count; i++) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2028,6 +2360,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_ecu() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (i--; i < count; i++) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2041,6 +2374,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_i() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (var i = 0;;) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2057,6 +2391,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_i_withMetadata() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (@A var i = 0;;) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2073,6 +2408,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_ic() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (var i = 0; i < count;) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2088,6 +2424,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_icu() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (var i = 0; i < count; i++) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2103,6 +2440,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_iicuu() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (int i = 0, j = count; i < j; i++, j--) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2118,6 +2456,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_iu() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (var i = 0;; i++) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2133,6 +2472,7 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseForStatement_loop_u() {
     ForStatement statement = ParserTestCase.parse5("parseForStatement", "for (;; i++) {}", []);
     JUnitTestCase.assertNotNull(statement.forKeyword);
@@ -2146,26 +2486,31 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseFunctionBody_block() {
     BlockFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "{}");
     JUnitTestCase.assertNotNull(functionBody.block);
   }
+
   void test_parseFunctionBody_empty() {
     EmptyFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [true, null, false], ";");
     JUnitTestCase.assertNotNull(functionBody.semicolon);
   }
+
   void test_parseFunctionBody_expression() {
     ExpressionFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "=> y;");
     JUnitTestCase.assertNotNull(functionBody.functionDefinition);
     JUnitTestCase.assertNotNull(functionBody.expression);
     JUnitTestCase.assertNotNull(functionBody.semicolon);
   }
+
   void test_parseFunctionBody_nativeFunctionBody() {
     NativeFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "native 'str';");
     JUnitTestCase.assertNotNull(functionBody.nativeToken);
     JUnitTestCase.assertNotNull(functionBody.stringLiteral);
     JUnitTestCase.assertNotNull(functionBody.semicolon);
   }
+
   void test_parseFunctionDeclaration_function() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName.full(new SimpleIdentifier.full(null), null);
@@ -2179,6 +2524,7 @@
     JUnitTestCase.assertNotNull(expression.parameters);
     JUnitTestCase.assertNull(declaration.propertyKeyword);
   }
+
   void test_parseFunctionDeclaration_getter() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName.full(new SimpleIdentifier.full(null), null);
@@ -2192,6 +2538,7 @@
     JUnitTestCase.assertNull(expression.parameters);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseFunctionDeclaration_setter() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName.full(new SimpleIdentifier.full(null), null);
@@ -2205,21 +2552,25 @@
     JUnitTestCase.assertNotNull(expression.parameters);
     JUnitTestCase.assertNotNull(declaration.propertyKeyword);
   }
+
   void test_parseFunctionDeclarationStatement() {
     FunctionDeclarationStatement statement = ParserTestCase.parse5("parseFunctionDeclarationStatement", "void f(int p) => p * 2;", []);
     JUnitTestCase.assertNotNull(statement.functionDeclaration);
   }
+
   void test_parseFunctionExpression_body_inExpression() {
     FunctionExpression expression = ParserTestCase.parse5("parseFunctionExpression", "(int i) => i++", []);
     JUnitTestCase.assertNotNull(expression.body);
     JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNull(((expression.body as ExpressionFunctionBody)).semicolon);
+    JUnitTestCase.assertNull((expression.body as ExpressionFunctionBody).semicolon);
   }
+
   void test_parseFunctionExpression_minimal() {
     FunctionExpression expression = ParserTestCase.parse5("parseFunctionExpression", "() {}", []);
     JUnitTestCase.assertNotNull(expression.body);
     JUnitTestCase.assertNotNull(expression.parameters);
   }
+
   void test_parseGetter_nonStatic() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName.full(new SimpleIdentifier.full(null), null);
@@ -2234,6 +2585,7 @@
     JUnitTestCase.assertNotNull(method.propertyKeyword);
     JUnitTestCase.assertEquals(returnType, method.returnType);
   }
+
   void test_parseGetter_static() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     Token staticKeyword = TokenFactory.token(Keyword.STATIC);
@@ -2253,14 +2605,17 @@
     JUnitTestCase.assertNotNull(method.propertyKeyword);
     JUnitTestCase.assertEquals(returnType, method.returnType);
   }
+
   void test_parseIdentifierList_multiple() {
     List<SimpleIdentifier> list = ParserTestCase.parse5("parseIdentifierList", "a, b, c", []);
     EngineTestCase.assertSize(3, list);
   }
+
   void test_parseIdentifierList_single() {
     List<SimpleIdentifier> list = ParserTestCase.parse5("parseIdentifierList", "a", []);
     EngineTestCase.assertSize(1, list);
   }
+
   void test_parseIfStatement_else_block() {
     IfStatement statement = ParserTestCase.parse5("parseIfStatement", "if (x) {} else {}", []);
     JUnitTestCase.assertNotNull(statement.ifKeyword);
@@ -2271,6 +2626,7 @@
     JUnitTestCase.assertNotNull(statement.elseKeyword);
     JUnitTestCase.assertNotNull(statement.elseStatement);
   }
+
   void test_parseIfStatement_else_statement() {
     IfStatement statement = ParserTestCase.parse5("parseIfStatement", "if (x) f(x); else f(y);", []);
     JUnitTestCase.assertNotNull(statement.ifKeyword);
@@ -2281,6 +2637,7 @@
     JUnitTestCase.assertNotNull(statement.elseKeyword);
     JUnitTestCase.assertNotNull(statement.elseStatement);
   }
+
   void test_parseIfStatement_noElse_block() {
     IfStatement statement = ParserTestCase.parse5("parseIfStatement", "if (x) {}", []);
     JUnitTestCase.assertNotNull(statement.ifKeyword);
@@ -2291,6 +2648,7 @@
     JUnitTestCase.assertNull(statement.elseKeyword);
     JUnitTestCase.assertNull(statement.elseStatement);
   }
+
   void test_parseIfStatement_noElse_statement() {
     IfStatement statement = ParserTestCase.parse5("parseIfStatement", "if (x) f(x);", []);
     JUnitTestCase.assertNotNull(statement.ifKeyword);
@@ -2301,16 +2659,19 @@
     JUnitTestCase.assertNull(statement.elseKeyword);
     JUnitTestCase.assertNull(statement.elseStatement);
   }
+
   void test_parseImplementsClause_multiple() {
     ImplementsClause clause = ParserTestCase.parse5("parseImplementsClause", "implements A, B, C", []);
     EngineTestCase.assertSize(3, clause.interfaces);
     JUnitTestCase.assertNotNull(clause.keyword);
   }
+
   void test_parseImplementsClause_single() {
     ImplementsClause clause = ParserTestCase.parse5("parseImplementsClause", "implements A", []);
     EngineTestCase.assertSize(1, clause.interfaces);
     JUnitTestCase.assertNotNull(clause.keyword);
   }
+
   void test_parseImportDirective_hide() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' hide A, B;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -2320,6 +2681,7 @@
     EngineTestCase.assertSize(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseImportDirective_noCombinator() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -2329,6 +2691,7 @@
     EngineTestCase.assertSize(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseImportDirective_prefix() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' as a;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -2338,6 +2701,7 @@
     EngineTestCase.assertSize(0, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseImportDirective_prefix_hide_show() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' as a hide A show B;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -2347,6 +2711,7 @@
     EngineTestCase.assertSize(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseImportDirective_prefix_show_hide() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' as a show B hide A;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -2356,6 +2721,7 @@
     EngineTestCase.assertSize(2, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseImportDirective_show() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' show A, B;");
     JUnitTestCase.assertNotNull(directive.keyword);
@@ -2365,6 +2731,7 @@
     EngineTestCase.assertSize(1, directive.combinators);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseInitializedIdentifierList_type() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     Token staticKeyword = TokenFactory.token(Keyword.STATIC);
@@ -2383,6 +2750,7 @@
     JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
     JUnitTestCase.assertNotNull(declaration.semicolon);
   }
+
   void test_parseInitializedIdentifierList_var() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     Token staticKeyword = TokenFactory.token(Keyword.STATIC);
@@ -2401,6 +2769,7 @@
     JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
     JUnitTestCase.assertNotNull(declaration.semicolon);
   }
+
   void test_parseInstanceCreationExpression_qualifiedType() {
     Token token = TokenFactory.token(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A.B()");
@@ -2412,6 +2781,7 @@
     JUnitTestCase.assertNull(name.name);
     JUnitTestCase.assertNotNull(expression.argumentList);
   }
+
   void test_parseInstanceCreationExpression_qualifiedType_named() {
     Token token = TokenFactory.token(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A.B.c()");
@@ -2423,6 +2793,7 @@
     JUnitTestCase.assertNotNull(name.name);
     JUnitTestCase.assertNotNull(expression.argumentList);
   }
+
   void test_parseInstanceCreationExpression_type() {
     Token token = TokenFactory.token(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A()");
@@ -2434,6 +2805,7 @@
     JUnitTestCase.assertNull(name.name);
     JUnitTestCase.assertNotNull(expression.argumentList);
   }
+
   void test_parseInstanceCreationExpression_type_named() {
     Token token = TokenFactory.token(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A<B>.c()");
@@ -2445,22 +2817,26 @@
     JUnitTestCase.assertNotNull(name.name);
     JUnitTestCase.assertNotNull(expression.argumentList);
   }
+
   void test_parseLibraryDirective() {
     LibraryDirective directive = ParserTestCase.parse("parseLibraryDirective", <Object> [emptyCommentAndMetadata()], "library l;");
     JUnitTestCase.assertNotNull(directive.libraryToken);
     JUnitTestCase.assertNotNull(directive.name);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parseLibraryIdentifier_multiple() {
     String name = "a.b.c";
     LibraryIdentifier identifier = ParserTestCase.parse5("parseLibraryIdentifier", name, []);
     JUnitTestCase.assertEquals(name, identifier.name);
   }
+
   void test_parseLibraryIdentifier_single() {
     String name = "a";
     LibraryIdentifier identifier = ParserTestCase.parse5("parseLibraryIdentifier", name, []);
     JUnitTestCase.assertEquals(name, identifier.name);
   }
+
   void test_parseListLiteral_empty_oneToken() {
     Token token = TokenFactory.token(Keyword.CONST);
     TypeArgumentList typeArguments = null;
@@ -2471,6 +2847,7 @@
     EngineTestCase.assertSize(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseListLiteral_empty_twoTokens() {
     Token token = TokenFactory.token(Keyword.CONST);
     TypeArgumentList typeArguments = null;
@@ -2481,6 +2858,7 @@
     EngineTestCase.assertSize(0, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseListLiteral_multiple() {
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [null, null], "[1, 2, 3]");
     JUnitTestCase.assertNull(literal.constKeyword);
@@ -2489,6 +2867,7 @@
     EngineTestCase.assertSize(3, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseListLiteral_single() {
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [null, null], "[1]");
     JUnitTestCase.assertNull(literal.constKeyword);
@@ -2497,6 +2876,7 @@
     EngineTestCase.assertSize(1, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseListOrMapLiteral_list_noType() {
     ListLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "[1]");
     JUnitTestCase.assertNull(literal.constKeyword);
@@ -2505,6 +2885,7 @@
     EngineTestCase.assertSize(1, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseListOrMapLiteral_list_type() {
     ListLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<int> [1]");
     JUnitTestCase.assertNull(literal.constKeyword);
@@ -2513,6 +2894,7 @@
     EngineTestCase.assertSize(1, literal.elements);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseListOrMapLiteral_map_noType() {
     MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "{'1' : 1}");
     JUnitTestCase.assertNull(literal.constKeyword);
@@ -2521,6 +2903,7 @@
     EngineTestCase.assertSize(1, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseListOrMapLiteral_map_type() {
     MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<String, int> {'1' : 1}");
     JUnitTestCase.assertNull(literal.constKeyword);
@@ -2529,6 +2912,7 @@
     EngineTestCase.assertSize(1, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseLogicalAndExpression() {
     BinaryExpression expression = ParserTestCase.parse5("parseLogicalAndExpression", "x && y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -2536,6 +2920,7 @@
     JUnitTestCase.assertEquals(TokenType.AMPERSAND_AMPERSAND, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseLogicalOrExpression() {
     BinaryExpression expression = ParserTestCase.parse5("parseLogicalOrExpression", "x || y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -2543,6 +2928,7 @@
     JUnitTestCase.assertEquals(TokenType.BAR_BAR, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseMapLiteral_empty() {
     Token token = TokenFactory.token(Keyword.CONST);
     TypeArgumentList typeArguments = ASTFactory.typeArgumentList([
@@ -2555,64 +2941,77 @@
     EngineTestCase.assertSize(0, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseMapLiteral_multiple() {
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [null, null], "{'a' : b, 'x' : y}");
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(2, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseMapLiteral_single() {
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [null, null], "{'x' : y}");
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(1, literal.entries);
     JUnitTestCase.assertNotNull(literal.rightBracket);
   }
+
   void test_parseMapLiteralEntry_complex() {
     MapLiteralEntry entry = ParserTestCase.parse5("parseMapLiteralEntry", "2 + 2 : y", []);
     JUnitTestCase.assertNotNull(entry.key);
     JUnitTestCase.assertNotNull(entry.separator);
     JUnitTestCase.assertNotNull(entry.value);
   }
+
   void test_parseMapLiteralEntry_int() {
     MapLiteralEntry entry = ParserTestCase.parse5("parseMapLiteralEntry", "0 : y", []);
     JUnitTestCase.assertNotNull(entry.key);
     JUnitTestCase.assertNotNull(entry.separator);
     JUnitTestCase.assertNotNull(entry.value);
   }
+
   void test_parseMapLiteralEntry_string() {
     MapLiteralEntry entry = ParserTestCase.parse5("parseMapLiteralEntry", "'x' : y", []);
     JUnitTestCase.assertNotNull(entry.key);
     JUnitTestCase.assertNotNull(entry.separator);
     JUnitTestCase.assertNotNull(entry.value);
   }
+
   void test_parseModifiers_abstract() {
     Modifiers modifiers = ParserTestCase.parse5("parseModifiers", "abstract A", []);
     JUnitTestCase.assertNotNull(modifiers.abstractKeyword);
   }
+
   void test_parseModifiers_const() {
     Modifiers modifiers = ParserTestCase.parse5("parseModifiers", "const A", []);
     JUnitTestCase.assertNotNull(modifiers.constKeyword);
   }
+
   void test_parseModifiers_external() {
     Modifiers modifiers = ParserTestCase.parse5("parseModifiers", "external A", []);
     JUnitTestCase.assertNotNull(modifiers.externalKeyword);
   }
+
   void test_parseModifiers_factory() {
     Modifiers modifiers = ParserTestCase.parse5("parseModifiers", "factory A", []);
     JUnitTestCase.assertNotNull(modifiers.factoryKeyword);
   }
+
   void test_parseModifiers_final() {
     Modifiers modifiers = ParserTestCase.parse5("parseModifiers", "final A", []);
     JUnitTestCase.assertNotNull(modifiers.finalKeyword);
   }
+
   void test_parseModifiers_static() {
     Modifiers modifiers = ParserTestCase.parse5("parseModifiers", "static A", []);
     JUnitTestCase.assertNotNull(modifiers.staticKeyword);
   }
+
   void test_parseModifiers_var() {
     Modifiers modifiers = ParserTestCase.parse5("parseModifiers", "var A", []);
     JUnitTestCase.assertNotNull(modifiers.varKeyword);
   }
+
   void test_parseMultiplicativeExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseMultiplicativeExpression", "x * y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -2620,6 +3019,7 @@
     JUnitTestCase.assertEquals(TokenType.STAR, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseMultiplicativeExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseMultiplicativeExpression", "super * y", []);
     EngineTestCase.assertInstanceOf(SuperExpression, expression.leftOperand);
@@ -2627,6 +3027,7 @@
     JUnitTestCase.assertEquals(TokenType.STAR, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseNewExpression() {
     InstanceCreationExpression expression = ParserTestCase.parse5("parseNewExpression", "new A()", []);
     JUnitTestCase.assertNotNull(expression.keyword);
@@ -2637,51 +3038,64 @@
     JUnitTestCase.assertNull(name.name);
     JUnitTestCase.assertNotNull(expression.argumentList);
   }
+
   void test_parseNonLabeledStatement_const_list_empty() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "const [];", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_const_list_nonEmpty() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "const [1, 2];", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_const_map_empty() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "const {};", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_const_map_nonEmpty() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "const {'a' : 1};", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_const_object() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "const A();", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_const_object_named_typeParameters() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "const A<B>.c();", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_constructorInvocation() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "new C().m();", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_false() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "false;", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_functionDeclaration() {
     ParserTestCase.parse5("parseNonLabeledStatement", "f() {};", []);
   }
+
   void test_parseNonLabeledStatement_functionDeclaration_arguments() {
     ParserTestCase.parse5("parseNonLabeledStatement", "f(void g()) {};", []);
   }
+
   void test_parseNonLabeledStatement_functionExpressionIndex() {
     ParserTestCase.parse5("parseNonLabeledStatement", "() {}[0] = null;", []);
   }
+
   void test_parseNonLabeledStatement_functionInvocation() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "f();", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_invokeFunctionExpression() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "(a) {return a + a;} (3);", []);
     EngineTestCase.assertInstanceOf(FunctionExpressionInvocation, statement.expression);
@@ -2694,22 +3108,27 @@
     JUnitTestCase.assertNotNull(list);
     EngineTestCase.assertSize(1, list.arguments);
   }
+
   void test_parseNonLabeledStatement_null() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "null;", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_startingWithBuiltInIdentifier() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "library.getName();", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_true() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "true;", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNonLabeledStatement_typeCast() {
     ExpressionStatement statement = ParserTestCase.parse5("parseNonLabeledStatement", "double.NAN as num;", []);
     JUnitTestCase.assertNotNull(statement.expression);
   }
+
   void test_parseNormalFormalParameter_field_const_noType() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "const this.a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
@@ -2717,6 +3136,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_field_const_type() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "const A this.a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
@@ -2724,6 +3144,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_field_final_noType() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "final this.a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
@@ -2731,6 +3152,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_field_final_type() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "final A this.a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
@@ -2738,6 +3160,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_field_function_nested() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "this.a(B b))", []);
     JUnitTestCase.assertNull(parameter.keyword);
@@ -2747,6 +3170,7 @@
     JUnitTestCase.assertNotNull(parameterList);
     EngineTestCase.assertSize(1, parameterList.parameters);
   }
+
   void test_parseNormalFormalParameter_field_function_noNested() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "this.a())", []);
     JUnitTestCase.assertNull(parameter.keyword);
@@ -2756,6 +3180,7 @@
     JUnitTestCase.assertNotNull(parameterList);
     EngineTestCase.assertSize(0, parameterList.parameters);
   }
+
   void test_parseNormalFormalParameter_field_noType() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "this.a)", []);
     JUnitTestCase.assertNull(parameter.keyword);
@@ -2763,6 +3188,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_field_type() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "A this.a)", []);
     JUnitTestCase.assertNull(parameter.keyword);
@@ -2770,6 +3196,7 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_field_var() {
     FieldFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "var this.a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
@@ -2777,60 +3204,70 @@
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_function_noType() {
     FunctionTypedFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "a())", []);
     JUnitTestCase.assertNull(parameter.returnType);
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNotNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_function_type() {
     FunctionTypedFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "A a())", []);
     JUnitTestCase.assertNotNull(parameter.returnType);
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNotNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_function_void() {
     FunctionTypedFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "void a())", []);
     JUnitTestCase.assertNotNull(parameter.returnType);
     JUnitTestCase.assertNotNull(parameter.identifier);
     JUnitTestCase.assertNotNull(parameter.parameters);
   }
+
   void test_parseNormalFormalParameter_simple_const_noType() {
     SimpleFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "const a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
     JUnitTestCase.assertNull(parameter.type);
     JUnitTestCase.assertNotNull(parameter.identifier);
   }
+
   void test_parseNormalFormalParameter_simple_const_type() {
     SimpleFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "const A a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
     JUnitTestCase.assertNotNull(parameter.type);
     JUnitTestCase.assertNotNull(parameter.identifier);
   }
+
   void test_parseNormalFormalParameter_simple_final_noType() {
     SimpleFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "final a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
     JUnitTestCase.assertNull(parameter.type);
     JUnitTestCase.assertNotNull(parameter.identifier);
   }
+
   void test_parseNormalFormalParameter_simple_final_type() {
     SimpleFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "final A a)", []);
     JUnitTestCase.assertNotNull(parameter.keyword);
     JUnitTestCase.assertNotNull(parameter.type);
     JUnitTestCase.assertNotNull(parameter.identifier);
   }
+
   void test_parseNormalFormalParameter_simple_noType() {
     SimpleFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "a)", []);
     JUnitTestCase.assertNull(parameter.keyword);
     JUnitTestCase.assertNull(parameter.type);
     JUnitTestCase.assertNotNull(parameter.identifier);
   }
+
   void test_parseNormalFormalParameter_simple_type() {
     SimpleFormalParameter parameter = ParserTestCase.parse5("parseNormalFormalParameter", "A a)", []);
     JUnitTestCase.assertNull(parameter.keyword);
     JUnitTestCase.assertNotNull(parameter.type);
     JUnitTestCase.assertNotNull(parameter.identifier);
   }
+
   void test_parseOperator() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName.full(new SimpleIdentifier.full(null), null);
@@ -2845,14 +3282,17 @@
     JUnitTestCase.assertNull(method.propertyKeyword);
     JUnitTestCase.assertEquals(returnType, method.returnType);
   }
+
   void test_parseOptionalReturnType() {
   }
+
   void test_parsePartDirective_part() {
     PartDirective directive = ParserTestCase.parse("parsePartDirective", <Object> [emptyCommentAndMetadata()], "part 'lib/lib.dart';");
     JUnitTestCase.assertNotNull(directive.partToken);
     JUnitTestCase.assertNotNull(directive.uri);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parsePartDirective_partOf() {
     PartOfDirective directive = ParserTestCase.parse("parsePartDirective", <Object> [emptyCommentAndMetadata()], "part of l;");
     JUnitTestCase.assertNotNull(directive.partToken);
@@ -2860,40 +3300,47 @@
     JUnitTestCase.assertNotNull(directive.libraryName);
     JUnitTestCase.assertNotNull(directive.semicolon);
   }
+
   void test_parsePostfixExpression_decrement() {
     PostfixExpression expression = ParserTestCase.parse5("parsePostfixExpression", "i--", []);
     JUnitTestCase.assertNotNull(expression.operand);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.MINUS_MINUS, expression.operator.type);
   }
+
   void test_parsePostfixExpression_increment() {
     PostfixExpression expression = ParserTestCase.parse5("parsePostfixExpression", "i++", []);
     JUnitTestCase.assertNotNull(expression.operand);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.PLUS_PLUS, expression.operator.type);
   }
+
   void test_parsePostfixExpression_none_indexExpression() {
     IndexExpression expression = ParserTestCase.parse5("parsePostfixExpression", "a[0]", []);
     JUnitTestCase.assertNotNull(expression.target);
     JUnitTestCase.assertNotNull(expression.index);
   }
+
   void test_parsePostfixExpression_none_methodInvocation() {
     MethodInvocation expression = ParserTestCase.parse5("parsePostfixExpression", "a.m()", []);
     JUnitTestCase.assertNotNull(expression.target);
     JUnitTestCase.assertNotNull(expression.methodName);
     JUnitTestCase.assertNotNull(expression.argumentList);
   }
+
   void test_parsePostfixExpression_none_propertyAccess() {
     PrefixedIdentifier expression = ParserTestCase.parse5("parsePostfixExpression", "a.b", []);
     JUnitTestCase.assertNotNull(expression.prefix);
     JUnitTestCase.assertNotNull(expression.identifier);
   }
+
   void test_parsePrefixedIdentifier_noPrefix() {
     String lexeme = "bar";
     SimpleIdentifier identifier = ParserTestCase.parse5("parsePrefixedIdentifier", lexeme, []);
     JUnitTestCase.assertNotNull(identifier.token);
     JUnitTestCase.assertEquals(lexeme, identifier.name);
   }
+
   void test_parsePrefixedIdentifier_prefix() {
     String lexeme = "foo.bar";
     PrefixedIdentifier identifier = ParserTestCase.parse5("parsePrefixedIdentifier", lexeme, []);
@@ -2901,86 +3348,104 @@
     JUnitTestCase.assertNotNull(identifier.period);
     JUnitTestCase.assertEquals("bar", identifier.identifier.name);
   }
+
   void test_parsePrimaryExpression_const() {
     InstanceCreationExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "const A()", []);
     JUnitTestCase.assertNotNull(expression);
   }
+
   void test_parsePrimaryExpression_double() {
     String doubleLiteral = "3.2e4";
     DoubleLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", doubleLiteral, []);
     JUnitTestCase.assertNotNull(literal.literal);
     JUnitTestCase.assertEquals(double.parse(doubleLiteral), literal.value);
   }
+
   void test_parsePrimaryExpression_false() {
     BooleanLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "false", []);
     JUnitTestCase.assertNotNull(literal.literal);
     JUnitTestCase.assertFalse(literal.value);
   }
+
   void test_parsePrimaryExpression_function_arguments() {
     FunctionExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "(int i) => i + 1", []);
     JUnitTestCase.assertNotNull(expression.parameters);
     JUnitTestCase.assertNotNull(expression.body);
   }
+
   void test_parsePrimaryExpression_function_noArguments() {
     FunctionExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "() => 42", []);
     JUnitTestCase.assertNotNull(expression.parameters);
     JUnitTestCase.assertNotNull(expression.body);
   }
+
   void test_parsePrimaryExpression_hex() {
     String hexLiteral = "3F";
     IntegerLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "0x${hexLiteral}", []);
     JUnitTestCase.assertNotNull(literal.literal);
     JUnitTestCase.assertEquals(int.parse(hexLiteral, radix: 16), literal.value);
   }
+
   void test_parsePrimaryExpression_identifier() {
     SimpleIdentifier identifier = ParserTestCase.parse5("parsePrimaryExpression", "a", []);
     JUnitTestCase.assertNotNull(identifier);
   }
+
   void test_parsePrimaryExpression_int() {
     String intLiteral = "472";
     IntegerLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", intLiteral, []);
     JUnitTestCase.assertNotNull(literal.literal);
     JUnitTestCase.assertEquals(int.parse(intLiteral), literal.value);
   }
+
   void test_parsePrimaryExpression_listLiteral() {
     ListLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "[ ]", []);
     JUnitTestCase.assertNotNull(literal);
   }
+
   void test_parsePrimaryExpression_listLiteral_index() {
     ListLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "[]", []);
     JUnitTestCase.assertNotNull(literal);
   }
+
   void test_parsePrimaryExpression_listLiteral_typed() {
     ListLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "<A>[ ]", []);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     EngineTestCase.assertSize(1, literal.typeArguments.arguments);
   }
+
   void test_parsePrimaryExpression_mapLiteral() {
     MapLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "{}", []);
     JUnitTestCase.assertNotNull(literal);
   }
+
   void test_parsePrimaryExpression_mapLiteral_typed() {
     MapLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "<A, B>{}", []);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     EngineTestCase.assertSize(2, literal.typeArguments.arguments);
   }
+
   void test_parsePrimaryExpression_new() {
     InstanceCreationExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "new A()", []);
     JUnitTestCase.assertNotNull(expression);
   }
+
   void test_parsePrimaryExpression_null() {
     NullLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "null", []);
     JUnitTestCase.assertNotNull(literal.literal);
   }
+
   void test_parsePrimaryExpression_parenthesized() {
     ParenthesizedExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "(x)", []);
     JUnitTestCase.assertNotNull(expression);
   }
+
   void test_parsePrimaryExpression_string() {
     SimpleStringLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "\"string\"", []);
     JUnitTestCase.assertFalse(literal.isMultiline);
     JUnitTestCase.assertEquals("string", literal.value);
   }
+
   void test_parsePrimaryExpression_super() {
     PropertyAccess propertyAccess = ParserTestCase.parse5("parsePrimaryExpression", "super.x", []);
     JUnitTestCase.assertTrue(propertyAccess.target is SuperExpression);
@@ -2988,18 +3453,22 @@
     JUnitTestCase.assertEquals(TokenType.PERIOD, propertyAccess.operator.type);
     JUnitTestCase.assertNotNull(propertyAccess.propertyName);
   }
+
   void test_parsePrimaryExpression_this() {
     ThisExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "this", []);
     JUnitTestCase.assertNotNull(expression.keyword);
   }
+
   void test_parsePrimaryExpression_true() {
     BooleanLiteral literal = ParserTestCase.parse5("parsePrimaryExpression", "true", []);
     JUnitTestCase.assertNotNull(literal.literal);
     JUnitTestCase.assertTrue(literal.value);
   }
+
   void test_Parser() {
     JUnitTestCase.assertNotNull(new Parser(null, null));
   }
+
   void test_parseRedirectingConstructorInvocation_named() {
     RedirectingConstructorInvocation invocation = ParserTestCase.parse5("parseRedirectingConstructorInvocation", "this.a()", []);
     JUnitTestCase.assertNotNull(invocation.argumentList);
@@ -3007,6 +3476,7 @@
     JUnitTestCase.assertNotNull(invocation.keyword);
     JUnitTestCase.assertNotNull(invocation.period);
   }
+
   void test_parseRedirectingConstructorInvocation_unnamed() {
     RedirectingConstructorInvocation invocation = ParserTestCase.parse5("parseRedirectingConstructorInvocation", "this()", []);
     JUnitTestCase.assertNotNull(invocation.argumentList);
@@ -3014,12 +3484,14 @@
     JUnitTestCase.assertNotNull(invocation.keyword);
     JUnitTestCase.assertNull(invocation.period);
   }
+
   void test_parseRelationalExpression_as() {
     AsExpression expression = ParserTestCase.parse5("parseRelationalExpression", "x as Y", []);
     JUnitTestCase.assertNotNull(expression.expression);
     JUnitTestCase.assertNotNull(expression.asOperator);
     JUnitTestCase.assertNotNull(expression.type);
   }
+
   void test_parseRelationalExpression_is() {
     IsExpression expression = ParserTestCase.parse5("parseRelationalExpression", "x is y", []);
     JUnitTestCase.assertNotNull(expression.expression);
@@ -3027,6 +3499,7 @@
     JUnitTestCase.assertNull(expression.notOperator);
     JUnitTestCase.assertNotNull(expression.type);
   }
+
   void test_parseRelationalExpression_isNot() {
     IsExpression expression = ParserTestCase.parse5("parseRelationalExpression", "x is! y", []);
     JUnitTestCase.assertNotNull(expression.expression);
@@ -3034,6 +3507,7 @@
     JUnitTestCase.assertNotNull(expression.notOperator);
     JUnitTestCase.assertNotNull(expression.type);
   }
+
   void test_parseRelationalExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseRelationalExpression", "x < y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -3041,6 +3515,7 @@
     JUnitTestCase.assertEquals(TokenType.LT, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseRelationalExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseRelationalExpression", "super < y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -3048,32 +3523,38 @@
     JUnitTestCase.assertEquals(TokenType.LT, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseRethrowExpression() {
     RethrowExpression expression = ParserTestCase.parse5("parseRethrowExpression", "rethrow;", []);
     JUnitTestCase.assertNotNull(expression.keyword);
   }
+
   void test_parseReturnStatement_noValue() {
     ReturnStatement statement = ParserTestCase.parse5("parseReturnStatement", "return;", []);
     JUnitTestCase.assertNotNull(statement.keyword);
     JUnitTestCase.assertNull(statement.expression);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseReturnStatement_value() {
     ReturnStatement statement = ParserTestCase.parse5("parseReturnStatement", "return x;", []);
     JUnitTestCase.assertNotNull(statement.keyword);
     JUnitTestCase.assertNotNull(statement.expression);
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
+
   void test_parseReturnType_nonVoid() {
     TypeName typeName = ParserTestCase.parse5("parseReturnType", "A<B>", []);
     JUnitTestCase.assertNotNull(typeName.name);
     JUnitTestCase.assertNotNull(typeName.typeArguments);
   }
+
   void test_parseReturnType_void() {
     TypeName typeName = ParserTestCase.parse5("parseReturnType", "void", []);
     JUnitTestCase.assertNotNull(typeName.name);
     JUnitTestCase.assertNull(typeName.typeArguments);
   }
+
   void test_parseSetter_nonStatic() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName.full(new SimpleIdentifier.full(null), null);
@@ -3088,6 +3569,7 @@
     JUnitTestCase.assertNotNull(method.propertyKeyword);
     JUnitTestCase.assertEquals(returnType, method.returnType);
   }
+
   void test_parseSetter_static() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     Token staticKeyword = TokenFactory.token(Keyword.STATIC);
@@ -3107,6 +3589,7 @@
     JUnitTestCase.assertNotNull(method.propertyKeyword);
     JUnitTestCase.assertEquals(returnType, method.returnType);
   }
+
   void test_parseShiftExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse5("parseShiftExpression", "x << y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -3114,6 +3597,7 @@
     JUnitTestCase.assertEquals(TokenType.LT_LT, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseShiftExpression_super() {
     BinaryExpression expression = ParserTestCase.parse5("parseShiftExpression", "super << y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -3121,54 +3605,65 @@
     JUnitTestCase.assertEquals(TokenType.LT_LT, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.rightOperand);
   }
+
   void test_parseSimpleIdentifier_builtInIdentifier() {
     String lexeme = "as";
     SimpleIdentifier identifier = ParserTestCase.parse5("parseSimpleIdentifier", lexeme, []);
     JUnitTestCase.assertNotNull(identifier.token);
     JUnitTestCase.assertEquals(lexeme, identifier.name);
   }
+
   void test_parseSimpleIdentifier_normalIdentifier() {
     String lexeme = "foo";
     SimpleIdentifier identifier = ParserTestCase.parse5("parseSimpleIdentifier", lexeme, []);
     JUnitTestCase.assertNotNull(identifier.token);
     JUnitTestCase.assertEquals(lexeme, identifier.name);
   }
+
   void test_parseSimpleIdentifier1_normalIdentifier() {
   }
+
   void test_parseStatement_functionDeclaration() {
     FunctionDeclarationStatement statement = ParserTestCase.parse5("parseStatement", "int f(a, b) {};", []);
     JUnitTestCase.assertNotNull(statement.functionDeclaration);
   }
+
   void test_parseStatement_mulipleLabels() {
     LabeledStatement statement = ParserTestCase.parse5("parseStatement", "l: m: return x;", []);
     EngineTestCase.assertSize(2, statement.labels);
     JUnitTestCase.assertNotNull(statement.statement);
   }
+
   void test_parseStatement_noLabels() {
     ParserTestCase.parse5("parseStatement", "return x;", []);
   }
+
   void test_parseStatement_singleLabel() {
     LabeledStatement statement = ParserTestCase.parse5("parseStatement", "l: return x;", []);
     EngineTestCase.assertSize(1, statement.labels);
     JUnitTestCase.assertNotNull(statement.statement);
   }
+
   void test_parseStatements_multiple() {
     List<Statement> statements = ParserTestCase.parseStatements("return; return;", 2, []);
     EngineTestCase.assertSize(2, statements);
   }
+
   void test_parseStatements_single() {
     List<Statement> statements = ParserTestCase.parseStatements("return;", 1, []);
     EngineTestCase.assertSize(1, statements);
   }
+
   void test_parseStringLiteral_adjacent() {
     AdjacentStrings literal = ParserTestCase.parse5("parseStringLiteral", "'a' 'b'", []);
     NodeList<StringLiteral> strings = literal.strings;
     EngineTestCase.assertSize(2, strings);
     StringLiteral firstString = strings[0];
     StringLiteral secondString = strings[1];
-    JUnitTestCase.assertEquals("a", ((firstString as SimpleStringLiteral)).value);
-    JUnitTestCase.assertEquals("b", ((secondString as SimpleStringLiteral)).value);
+    JUnitTestCase.assertEquals("a", (firstString as SimpleStringLiteral).value);
+    JUnitTestCase.assertEquals("b", (secondString as SimpleStringLiteral).value);
   }
+
   void test_parseStringLiteral_interpolated() {
     StringInterpolation literal = ParserTestCase.parse5("parseStringLiteral", "'a \${b} c \$this d'", []);
     NodeList<InterpolationElement> elements = literal.elements;
@@ -3179,11 +3674,13 @@
     JUnitTestCase.assertTrue(elements[3] is InterpolationExpression);
     JUnitTestCase.assertTrue(elements[4] is InterpolationString);
   }
+
   void test_parseStringLiteral_single() {
     SimpleStringLiteral literal = ParserTestCase.parse5("parseStringLiteral", "'a'", []);
     JUnitTestCase.assertNotNull(literal.literal);
     JUnitTestCase.assertEquals("a", literal.value);
   }
+
   void test_parseSuperConstructorInvocation_named() {
     SuperConstructorInvocation invocation = ParserTestCase.parse5("parseSuperConstructorInvocation", "super.a()", []);
     JUnitTestCase.assertNotNull(invocation.argumentList);
@@ -3191,6 +3688,7 @@
     JUnitTestCase.assertNotNull(invocation.keyword);
     JUnitTestCase.assertNotNull(invocation.period);
   }
+
   void test_parseSuperConstructorInvocation_unnamed() {
     SuperConstructorInvocation invocation = ParserTestCase.parse5("parseSuperConstructorInvocation", "super()", []);
     JUnitTestCase.assertNotNull(invocation.argumentList);
@@ -3198,6 +3696,7 @@
     JUnitTestCase.assertNotNull(invocation.keyword);
     JUnitTestCase.assertNull(invocation.period);
   }
+
   void test_parseSwitchStatement_case() {
     SwitchStatement statement = ParserTestCase.parse5("parseSwitchStatement", "switch (a) {case 1: return 'I';}", []);
     JUnitTestCase.assertNotNull(statement.keyword);
@@ -3208,6 +3707,7 @@
     EngineTestCase.assertSize(1, statement.members);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
+
   void test_parseSwitchStatement_empty() {
     SwitchStatement statement = ParserTestCase.parse5("parseSwitchStatement", "switch (a) {}", []);
     JUnitTestCase.assertNotNull(statement.keyword);
@@ -3218,6 +3718,7 @@
     EngineTestCase.assertSize(0, statement.members);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
+
   void test_parseSwitchStatement_labeledCase() {
     SwitchStatement statement = ParserTestCase.parse5("parseSwitchStatement", "switch (a) {l1: l2: l3: case(1):}", []);
     JUnitTestCase.assertNotNull(statement.keyword);
@@ -3229,6 +3730,7 @@
     EngineTestCase.assertSize(3, statement.members[0].labels);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
+
   void test_parseSwitchStatement_labeledStatementInCase() {
     SwitchStatement statement = ParserTestCase.parse5("parseSwitchStatement", "switch (a) {case 0: f(); l1: g(); break;}", []);
     JUnitTestCase.assertNotNull(statement.keyword);
@@ -3240,6 +3742,7 @@
     EngineTestCase.assertSize(3, statement.members[0].statements);
     JUnitTestCase.assertNotNull(statement.rightBracket);
   }
+
   void test_parseSymbolLiteral_builtInIdentifier() {
     SymbolLiteral literal = ParserTestCase.parse5("parseSymbolLiteral", "#dynamic.static.abstract", []);
     JUnitTestCase.assertNotNull(literal.poundSign);
@@ -3249,6 +3752,7 @@
     JUnitTestCase.assertEquals("static", components[1].lexeme);
     JUnitTestCase.assertEquals("abstract", components[2].lexeme);
   }
+
   void test_parseSymbolLiteral_multiple() {
     SymbolLiteral literal = ParserTestCase.parse5("parseSymbolLiteral", "#a.b.c", []);
     JUnitTestCase.assertNotNull(literal.poundSign);
@@ -3258,6 +3762,7 @@
     JUnitTestCase.assertEquals("b", components[1].lexeme);
     JUnitTestCase.assertEquals("c", components[2].lexeme);
   }
+
   void test_parseSymbolLiteral_operator() {
     SymbolLiteral literal = ParserTestCase.parse5("parseSymbolLiteral", "#==", []);
     JUnitTestCase.assertNotNull(literal.poundSign);
@@ -3265,6 +3770,7 @@
     EngineTestCase.assertLength(1, components);
     JUnitTestCase.assertEquals("==", components[0].lexeme);
   }
+
   void test_parseSymbolLiteral_single() {
     SymbolLiteral literal = ParserTestCase.parse5("parseSymbolLiteral", "#a", []);
     JUnitTestCase.assertNotNull(literal.poundSign);
@@ -3272,16 +3778,19 @@
     EngineTestCase.assertLength(1, components);
     JUnitTestCase.assertEquals("a", components[0].lexeme);
   }
+
   void test_parseThrowExpression() {
     ThrowExpression expression = ParserTestCase.parse5("parseThrowExpression", "throw x;", []);
     JUnitTestCase.assertNotNull(expression.keyword);
     JUnitTestCase.assertNotNull(expression.expression);
   }
+
   void test_parseThrowExpressionWithoutCascade() {
     ThrowExpression expression = ParserTestCase.parse5("parseThrowExpressionWithoutCascade", "throw x;", []);
     JUnitTestCase.assertNotNull(expression.keyword);
     JUnitTestCase.assertNotNull(expression.expression);
   }
+
   void test_parseTryStatement_catch() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} catch (e) {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
@@ -3299,6 +3808,7 @@
     JUnitTestCase.assertNull(statement.finallyKeyword);
     JUnitTestCase.assertNull(statement.finallyBlock);
   }
+
   void test_parseTryStatement_catch_finally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} catch (e, s) {} finally {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
@@ -3316,6 +3826,7 @@
     JUnitTestCase.assertNotNull(statement.finallyKeyword);
     JUnitTestCase.assertNotNull(statement.finallyBlock);
   }
+
   void test_parseTryStatement_finally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} finally {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
@@ -3324,6 +3835,7 @@
     JUnitTestCase.assertNotNull(statement.finallyKeyword);
     JUnitTestCase.assertNotNull(statement.finallyBlock);
   }
+
   void test_parseTryStatement_multiple() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on NPE catch (e) {} on Error {} catch (e) {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
@@ -3332,6 +3844,7 @@
     JUnitTestCase.assertNull(statement.finallyKeyword);
     JUnitTestCase.assertNull(statement.finallyBlock);
   }
+
   void test_parseTryStatement_on() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on Error {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
@@ -3349,6 +3862,7 @@
     JUnitTestCase.assertNull(statement.finallyKeyword);
     JUnitTestCase.assertNull(statement.finallyBlock);
   }
+
   void test_parseTryStatement_on_catch() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on Error catch (e, s) {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
@@ -3366,6 +3880,7 @@
     JUnitTestCase.assertNull(statement.finallyKeyword);
     JUnitTestCase.assertNull(statement.finallyBlock);
   }
+
   void test_parseTryStatement_on_catch_finally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on Error catch (e, s) {} finally {}", []);
     JUnitTestCase.assertNotNull(statement.tryKeyword);
@@ -3383,6 +3898,7 @@
     JUnitTestCase.assertNotNull(statement.finallyKeyword);
     JUnitTestCase.assertNotNull(statement.finallyBlock);
   }
+
   void test_parseTypeAlias_function_noParameters() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef bool F();");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -3392,6 +3908,7 @@
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
     JUnitTestCase.assertNull(typeAlias.typeParameters);
   }
+
   void test_parseTypeAlias_function_noReturnType() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef F();");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -3401,6 +3918,7 @@
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
     JUnitTestCase.assertNull(typeAlias.typeParameters);
   }
+
   void test_parseTypeAlias_function_parameterizedReturnType() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef A<B> F();");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -3410,6 +3928,7 @@
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
     JUnitTestCase.assertNull(typeAlias.typeParameters);
   }
+
   void test_parseTypeAlias_function_parameters() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef bool F(Object value);");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -3419,6 +3938,7 @@
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
     JUnitTestCase.assertNull(typeAlias.typeParameters);
   }
+
   void test_parseTypeAlias_function_typeParameters() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef bool F<E>();");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -3428,6 +3948,7 @@
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
     JUnitTestCase.assertNotNull(typeAlias.typeParameters);
   }
+
   void test_parseTypeAlias_function_voidReturnType() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef void F();");
     JUnitTestCase.assertNotNull(typeAlias.keyword);
@@ -3437,12 +3958,14 @@
     JUnitTestCase.assertNotNull(typeAlias.semicolon);
     JUnitTestCase.assertNull(typeAlias.typeParameters);
   }
+
   void test_parseTypeArgumentList_multiple() {
     TypeArgumentList argumentList = ParserTestCase.parse5("parseTypeArgumentList", "<int, int, int>", []);
     JUnitTestCase.assertNotNull(argumentList.leftBracket);
     EngineTestCase.assertSize(3, argumentList.arguments);
     JUnitTestCase.assertNotNull(argumentList.rightBracket);
   }
+
   void test_parseTypeArgumentList_nested() {
     TypeArgumentList argumentList = ParserTestCase.parse5("parseTypeArgumentList", "<A<B>>", []);
     JUnitTestCase.assertNotNull(argumentList.leftBracket);
@@ -3454,64 +3977,75 @@
     EngineTestCase.assertSize(1, innerList.arguments);
     JUnitTestCase.assertNotNull(argumentList.rightBracket);
   }
+
   void test_parseTypeArgumentList_single() {
     TypeArgumentList argumentList = ParserTestCase.parse5("parseTypeArgumentList", "<int>", []);
     JUnitTestCase.assertNotNull(argumentList.leftBracket);
     EngineTestCase.assertSize(1, argumentList.arguments);
     JUnitTestCase.assertNotNull(argumentList.rightBracket);
   }
+
   void test_parseTypeName_parameterized() {
     TypeName typeName = ParserTestCase.parse5("parseTypeName", "List<int>", []);
     JUnitTestCase.assertNotNull(typeName.name);
     JUnitTestCase.assertNotNull(typeName.typeArguments);
   }
+
   void test_parseTypeName_simple() {
     TypeName typeName = ParserTestCase.parse5("parseTypeName", "int", []);
     JUnitTestCase.assertNotNull(typeName.name);
     JUnitTestCase.assertNull(typeName.typeArguments);
   }
+
   void test_parseTypeParameter_bounded() {
     TypeParameter parameter = ParserTestCase.parse5("parseTypeParameter", "A extends B", []);
     JUnitTestCase.assertNotNull(parameter.bound);
     JUnitTestCase.assertNotNull(parameter.keyword);
     JUnitTestCase.assertNotNull(parameter.name);
   }
+
   void test_parseTypeParameter_simple() {
     TypeParameter parameter = ParserTestCase.parse5("parseTypeParameter", "A", []);
     JUnitTestCase.assertNull(parameter.bound);
     JUnitTestCase.assertNull(parameter.keyword);
     JUnitTestCase.assertNotNull(parameter.name);
   }
+
   void test_parseTypeParameterList_multiple() {
     TypeParameterList parameterList = ParserTestCase.parse5("parseTypeParameterList", "<A, B extends C, D>", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
     EngineTestCase.assertSize(3, parameterList.typeParameters);
   }
+
   void test_parseTypeParameterList_parameterizedWithTrailingEquals() {
     TypeParameterList parameterList = ParserTestCase.parse5("parseTypeParameterList", "<A extends B<E>>=", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
     EngineTestCase.assertSize(1, parameterList.typeParameters);
   }
+
   void test_parseTypeParameterList_single() {
     TypeParameterList parameterList = ParserTestCase.parse5("parseTypeParameterList", "<A>", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
     EngineTestCase.assertSize(1, parameterList.typeParameters);
   }
+
   void test_parseTypeParameterList_withTrailingEquals() {
     TypeParameterList parameterList = ParserTestCase.parse5("parseTypeParameterList", "<A>=", []);
     JUnitTestCase.assertNotNull(parameterList.leftBracket);
     JUnitTestCase.assertNotNull(parameterList.rightBracket);
     EngineTestCase.assertSize(1, parameterList.typeParameters);
   }
+
   void test_parseUnaryExpression_decrement_normal() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "--x", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.MINUS_MINUS, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseUnaryExpression_decrement_super() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "--super", []);
     JUnitTestCase.assertNotNull(expression.operator);
@@ -3524,6 +4058,7 @@
     JUnitTestCase.assertEquals(TokenType.MINUS, operand.operator.type);
     JUnitTestCase.assertNotNull(operand.operand);
   }
+
   void test_parseUnaryExpression_decrement_super_propertyAccess() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "--super.x", []);
     JUnitTestCase.assertNotNull(expression.operator);
@@ -3533,12 +4068,14 @@
     JUnitTestCase.assertTrue(operand.target is SuperExpression);
     JUnitTestCase.assertEquals("x", operand.propertyName.name);
   }
+
   void test_parseUnaryExpression_increment_normal() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "++x", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.PLUS_PLUS, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseUnaryExpression_increment_super_index() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "++super[0]", []);
     JUnitTestCase.assertNotNull(expression.operator);
@@ -3548,6 +4085,7 @@
     JUnitTestCase.assertTrue(operand.realTarget is SuperExpression);
     JUnitTestCase.assertTrue(operand.index is IntegerLiteral);
   }
+
   void test_parseUnaryExpression_increment_super_propertyAccess() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "++super.x", []);
     JUnitTestCase.assertNotNull(expression.operator);
@@ -3557,102 +4095,119 @@
     JUnitTestCase.assertTrue(operand.target is SuperExpression);
     JUnitTestCase.assertEquals("x", operand.propertyName.name);
   }
+
   void test_parseUnaryExpression_minus_normal() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "-x", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseUnaryExpression_minus_super() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "-super", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseUnaryExpression_not_normal() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "!x", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.BANG, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseUnaryExpression_not_super() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "!super", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.BANG, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseUnaryExpression_tilda_normal() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "~x", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.TILDE, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseUnaryExpression_tilda_super() {
     PrefixExpression expression = ParserTestCase.parse5("parseUnaryExpression", "~super", []);
     JUnitTestCase.assertNotNull(expression.operator);
     JUnitTestCase.assertEquals(TokenType.TILDE, expression.operator.type);
     JUnitTestCase.assertNotNull(expression.operand);
   }
+
   void test_parseVariableDeclaration_equals() {
     VariableDeclaration declaration = ParserTestCase.parse5("parseVariableDeclaration", "a = b", []);
     JUnitTestCase.assertNotNull(declaration.name);
     JUnitTestCase.assertNotNull(declaration.equals);
     JUnitTestCase.assertNotNull(declaration.initializer);
   }
+
   void test_parseVariableDeclaration_noEquals() {
     VariableDeclaration declaration = ParserTestCase.parse5("parseVariableDeclaration", "a", []);
     JUnitTestCase.assertNotNull(declaration.name);
     JUnitTestCase.assertNull(declaration.equals);
     JUnitTestCase.assertNull(declaration.initializer);
   }
+
   void test_parseVariableDeclarationList_const_noType() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "const a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
     EngineTestCase.assertSize(1, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList_const_type() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "const A a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
     EngineTestCase.assertSize(1, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList_final_noType() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "final a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
     EngineTestCase.assertSize(1, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList_final_type() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "final A a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
     EngineTestCase.assertSize(1, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList_type_multiple() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "A a, b, c");
     JUnitTestCase.assertNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
     EngineTestCase.assertSize(3, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList_type_single() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "A a");
     JUnitTestCase.assertNull(declarationList.keyword);
     JUnitTestCase.assertNotNull(declarationList.type);
     EngineTestCase.assertSize(1, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList_var_multiple() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "var a, b, c");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
     EngineTestCase.assertSize(3, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList_var_single() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata()], "var a");
     JUnitTestCase.assertNotNull(declarationList.keyword);
     JUnitTestCase.assertNull(declarationList.type);
     EngineTestCase.assertSize(1, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList2_type() {
     TypeName type = new TypeName.full(new SimpleIdentifier.full(null), null);
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata(), null, type], "a");
@@ -3660,6 +4215,7 @@
     JUnitTestCase.assertEquals(type, declarationList.type);
     EngineTestCase.assertSize(1, declarationList.variables);
   }
+
   void test_parseVariableDeclarationList2_var() {
     Token keyword = TokenFactory.token(Keyword.VAR);
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationList", <Object> [emptyCommentAndMetadata(), keyword, null], "a, b, c");
@@ -3667,6 +4223,7 @@
     JUnitTestCase.assertNull(declarationList.type);
     EngineTestCase.assertSize(3, declarationList.variables);
   }
+
   void test_parseVariableDeclarationStatement_multiple() {
     VariableDeclarationStatement statement = ParserTestCase.parse("parseVariableDeclarationStatement", <Object> [emptyCommentAndMetadata()], "var x, y, z;");
     JUnitTestCase.assertNotNull(statement.semicolon);
@@ -3674,6 +4231,7 @@
     JUnitTestCase.assertNotNull(variableList);
     EngineTestCase.assertSize(3, variableList.variables);
   }
+
   void test_parseVariableDeclarationStatement_single() {
     VariableDeclarationStatement statement = ParserTestCase.parse("parseVariableDeclarationStatement", <Object> [emptyCommentAndMetadata()], "var x;");
     JUnitTestCase.assertNotNull(statement.semicolon);
@@ -3681,6 +4239,7 @@
     JUnitTestCase.assertNotNull(variableList);
     EngineTestCase.assertSize(1, variableList.variables);
   }
+
   void test_parseWhileStatement() {
     WhileStatement statement = ParserTestCase.parse5("parseWhileStatement", "while (x) {}", []);
     JUnitTestCase.assertNotNull(statement.keyword);
@@ -3689,100 +4248,121 @@
     JUnitTestCase.assertNotNull(statement.rightParenthesis);
     JUnitTestCase.assertNotNull(statement.body);
   }
+
   void test_parseWithClause_multiple() {
     WithClause clause = ParserTestCase.parse5("parseWithClause", "with A, B, C", []);
     JUnitTestCase.assertNotNull(clause.withKeyword);
     EngineTestCase.assertSize(3, clause.mixinTypes);
   }
+
   void test_parseWithClause_single() {
     WithClause clause = ParserTestCase.parse5("parseWithClause", "with M", []);
     JUnitTestCase.assertNotNull(clause.withKeyword);
     EngineTestCase.assertSize(1, clause.mixinTypes);
   }
+
   void test_skipPrefixedIdentifier_invalid() {
     Token following = skip("skipPrefixedIdentifier", "+");
     JUnitTestCase.assertNull(following);
   }
+
   void test_skipPrefixedIdentifier_notPrefixed() {
     Token following = skip("skipPrefixedIdentifier", "a +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipPrefixedIdentifier_prefixed() {
     Token following = skip("skipPrefixedIdentifier", "a.b +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipReturnType_invalid() {
     Token following = skip("skipReturnType", "+");
     JUnitTestCase.assertNull(following);
   }
+
   void test_skipReturnType_type() {
     Token following = skip("skipReturnType", "C +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipReturnType_void() {
     Token following = skip("skipReturnType", "void +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipSimpleIdentifier_identifier() {
     Token following = skip("skipSimpleIdentifier", "i +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipSimpleIdentifier_invalid() {
     Token following = skip("skipSimpleIdentifier", "9 +");
     JUnitTestCase.assertNull(following);
   }
+
   void test_skipSimpleIdentifier_pseudoKeyword() {
     Token following = skip("skipSimpleIdentifier", "as +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipStringLiteral_adjacent() {
     Token following = skip("skipStringLiteral", "'a' 'b' +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipStringLiteral_interpolated() {
     Token following = skip("skipStringLiteral", "'a\${b}c' +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipStringLiteral_invalid() {
     Token following = skip("skipStringLiteral", "a");
     JUnitTestCase.assertNull(following);
   }
+
   void test_skipStringLiteral_single() {
     Token following = skip("skipStringLiteral", "'a' +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipTypeArgumentList_invalid() {
     Token following = skip("skipTypeArgumentList", "+");
     JUnitTestCase.assertNull(following);
   }
+
   void test_skipTypeArgumentList_multiple() {
     Token following = skip("skipTypeArgumentList", "<E, F, G> +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipTypeArgumentList_single() {
     Token following = skip("skipTypeArgumentList", "<E> +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipTypeName_invalid() {
     Token following = skip("skipTypeName", "+");
     JUnitTestCase.assertNull(following);
   }
+
   void test_skipTypeName_parameterized() {
     Token following = skip("skipTypeName", "C<E<F<G>>> +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
+
   void test_skipTypeName_simple() {
     Token following = skip("skipTypeName", "C +");
     JUnitTestCase.assertNotNull(following);
@@ -3799,7 +4379,7 @@
    * @throws Exception if the method could not be invoked or throws an exception
    */
   String computeStringValue(String lexeme, bool first, bool last) {
-    AnalysisErrorListener listener = new AnalysisErrorListener_24();
+    AnalysisErrorListener listener = new AnalysisErrorListener_25();
     Parser parser = new Parser(null, listener);
     return invokeParserMethodImpl(parser, "computeStringValue", <Object> [lexeme, first, last], null) as String;
   }
@@ -3902,6 +4482,7 @@
     Parser parser = new Parser(null, listener);
     return invokeParserMethodImpl(parser, methodName, <Object> [tokenStream], tokenStream) as Token;
   }
+
   static dartSuite() {
     _ut.group('SimpleParserTest', () {
       _ut.test('test_Parser', () {
@@ -4040,6 +4621,14 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_isFunctionExpression_noName_expression);
       });
+      _ut.test('test_isFunctionExpression_parameter_final', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_isFunctionExpression_parameter_final);
+      });
+      _ut.test('test_isFunctionExpression_parameter_final_typed', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_isFunctionExpression_parameter_final_typed);
+      });
       _ut.test('test_isFunctionExpression_parameter_multiple', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_isFunctionExpression_parameter_multiple);
@@ -4408,6 +4997,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseClassMember_field_namedOperator);
       });
+      _ut.test('test_parseClassMember_field_namedOperator_withAssignment', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseClassMember_field_namedOperator_withAssignment);
+      });
       _ut.test('test_parseClassMember_field_namedSet', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseClassMember_field_namedSet);
@@ -4704,6 +5297,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseCompilationUnit_abstractAsPrefix_parameterized);
       });
+      _ut.test('test_parseCompilationUnit_builtIn_asFunctionName', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseCompilationUnit_builtIn_asFunctionName);
+      });
       _ut.test('test_parseCompilationUnit_directives_multiple', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseCompilationUnit_directives_multiple);
@@ -6035,11 +6632,13 @@
     });
   }
 }
-class AnalysisErrorListener_24 implements AnalysisErrorListener {
+
+class AnalysisErrorListener_25 implements AnalysisErrorListener {
   void onError(AnalysisError event) {
     JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
   }
 }
+
 /**
  * The class `ComplexParserTest` defines parser tests that test the parsing of more complex
  * code fragments or the interactions between multiple parsing methods. For example, tests to ensure
@@ -6052,27 +6651,33 @@
     BinaryExpression expression = ParserTestCase.parseExpression("x + y - z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_additiveExpression_noSpaces() {
     BinaryExpression expression = ParserTestCase.parseExpression("i+1", []);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     EngineTestCase.assertInstanceOf(IntegerLiteral, expression.rightOperand);
   }
+
   void test_additiveExpression_precedence_multiplicative_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x * y + z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_additiveExpression_precedence_multiplicative_left_withSuper() {
     BinaryExpression expression = ParserTestCase.parseExpression("super * y - z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_additiveExpression_precedence_multiplicative_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x + y * z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_additiveExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super + y - z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_assignableExpression_arguments_normal_chain() {
     PropertyAccess propertyAccess1 = ParserTestCase.parseExpression("a(b)(c).d(e).f", []);
     JUnitTestCase.assertEquals("f", propertyAccess1.propertyName.name);
@@ -6091,90 +6696,109 @@
     JUnitTestCase.assertNotNull(argumentList4);
     EngineTestCase.assertSize(1, argumentList4.arguments);
   }
+
   void test_assignmentExpression_compound() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x = y = 0", []);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftHandSide);
     EngineTestCase.assertInstanceOf(AssignmentExpression, expression.rightHandSide);
   }
+
   void test_assignmentExpression_indexExpression() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x[1] = 0", []);
     EngineTestCase.assertInstanceOf(IndexExpression, expression.leftHandSide);
     EngineTestCase.assertInstanceOf(IntegerLiteral, expression.rightHandSide);
   }
+
   void test_assignmentExpression_prefixedIdentifier() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x.y = 0", []);
     EngineTestCase.assertInstanceOf(PrefixedIdentifier, expression.leftHandSide);
     EngineTestCase.assertInstanceOf(IntegerLiteral, expression.rightHandSide);
   }
+
   void test_assignmentExpression_propertyAccess() {
     AssignmentExpression expression = ParserTestCase.parseExpression("super.y = 0", []);
     EngineTestCase.assertInstanceOf(PropertyAccess, expression.leftHandSide);
     EngineTestCase.assertInstanceOf(IntegerLiteral, expression.rightHandSide);
   }
+
   void test_bitwiseAndExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x & y & z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseAndExpression_precedence_equality_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x == y && z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseAndExpression_precedence_equality_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x && y == z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_bitwiseAndExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super & y & z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseOrExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x | y | z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseOrExpression_precedence_xor_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ^ y | z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseOrExpression_precedence_xor_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x | y ^ z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_bitwiseOrExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super | y | z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseXorExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ^ y ^ z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseXorExpression_precedence_and_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x & y ^ z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseXorExpression_precedence_and_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ^ y & z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_bitwiseXorExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ^ y ^ z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_cascade_withAssignment() {
     CascadeExpression cascade = ParserTestCase.parseExpression("new Map()..[3] = 4 ..[0] = 11;", []);
     Expression target = cascade.target;
     for (Expression section in cascade.cascadeSections) {
       EngineTestCase.assertInstanceOf(AssignmentExpression, section);
-      Expression lhs = ((section as AssignmentExpression)).leftHandSide;
+      Expression lhs = (section as AssignmentExpression).leftHandSide;
       EngineTestCase.assertInstanceOf(IndexExpression, lhs);
       IndexExpression index = lhs as IndexExpression;
       JUnitTestCase.assertTrue(index.isCascaded);
       JUnitTestCase.assertSame(target, index.realTarget);
     }
   }
+
   void test_conditionalExpression_precedence_logicalOrExpression() {
     ConditionalExpression expression = ParserTestCase.parseExpression("a | b ? y : z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.condition);
   }
+
   void test_constructor_initializer_withParenthesizedExpression() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource([
         "class C {",
@@ -6185,90 +6809,112 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     EngineTestCase.assertSize(1, declarations);
   }
+
   void test_equalityExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x == y != z", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_equalityExpression_precedence_relational_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x is y == z", []);
     EngineTestCase.assertInstanceOf(IsExpression, expression.leftOperand);
   }
+
   void test_equalityExpression_precedence_relational_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x == y is z", []);
     EngineTestCase.assertInstanceOf(IsExpression, expression.rightOperand);
   }
+
   void test_equalityExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super == y != z", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_logicalAndExpression() {
     BinaryExpression expression = ParserTestCase.parseExpression("x && y && z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x | y < z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x < y | z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_logicalOrExpression() {
     BinaryExpression expression = ParserTestCase.parseExpression("x || y || z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_logicalOrExpression_precedence_logicalAnd_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x && y || z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_logicalOrExpression_precedence_logicalAnd_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x || y && z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_multipleLabels_statement() {
     LabeledStatement statement = ParserTestCase.parseStatement("a: b: c: return x;", []);
     EngineTestCase.assertSize(3, statement.labels);
     EngineTestCase.assertInstanceOf(ReturnStatement, statement.statement);
   }
+
   void test_multiplicativeExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x * y / z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_multiplicativeExpression_precedence_unary_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("-x * y", []);
     EngineTestCase.assertInstanceOf(PrefixExpression, expression.leftOperand);
   }
+
   void test_multiplicativeExpression_precedence_unary_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x * -y", []);
     EngineTestCase.assertInstanceOf(PrefixExpression, expression.rightOperand);
   }
+
   void test_multiplicativeExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super * y / z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_relationalExpression_precedence_shift_right() {
     IsExpression expression = ParserTestCase.parseExpression("x << y is z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.expression);
   }
+
   void test_shiftExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x >> 4 << 3", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_shiftExpression_precedence_additive_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("x + y << z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_shiftExpression_precedence_additive_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("x << y + z", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_shiftExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super >> 4 << 3", []);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_topLevelVariable_withMetadata() {
     ParserTestCase.parseCompilationUnit("String @A string;", []);
   }
+
   static dartSuite() {
     _ut.group('ComplexParserTest', () {
       _ut.test('test_additiveExpression_noSpaces', () {
@@ -6462,12 +7108,12 @@
     });
   }
 }
+
 /**
  * Instances of the class `ASTValidator` are used to validate the correct construction of an
  * AST structure.
  */
 class ASTValidator extends UnifyingASTVisitor<Object> {
-
   /**
    * A list containing the errors found while traversing the AST structure.
    */
@@ -6488,6 +7134,7 @@
       JUnitTestCase.fail(builder.toString());
     }
   }
+
   Object visitNode(ASTNode node) {
     validate(node);
     return super.visitNode(node);
@@ -6533,8 +7180,8 @@
     }
   }
 }
-class ParserTestCase extends EngineTestCase {
 
+class ParserTestCase extends EngineTestCase {
   /**
    * An empty array of objects used as arguments to zero-argument methods.
    */
@@ -6769,11 +7416,13 @@
    * @return an empty CommentAndMetadata object that can be used for testing
    */
   CommentAndMetadata emptyCommentAndMetadata() => new CommentAndMetadata(null, new List<Annotation>());
+
   static dartSuite() {
     _ut.group('ParserTestCase', () {
     });
   }
 }
+
 class ResolutionCopierTest extends EngineTestCase {
   void test_visitAnnotation() {
     String annotationName = "proxy";
@@ -6784,6 +7433,7 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
+
   void test_visitArgumentDefinitionTest() {
     String identifier = "p";
     ArgumentDefinitionTest fromNode = ASTFactory.argumentDefinitionTest(identifier);
@@ -6796,6 +7446,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitAsExpression() {
     AsExpression fromNode = ASTFactory.asExpression(ASTFactory.identifier3("x"), ASTFactory.typeName4("A", []));
     Type2 propagatedType = ElementFactory.classElement2("A", []).type;
@@ -6807,6 +7458,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitAssignmentExpression() {
     AssignmentExpression fromNode = ASTFactory.assignmentExpression(ASTFactory.identifier3("a"), TokenType.PLUS_EQ, ASTFactory.identifier3("b"));
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -6824,6 +7476,7 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitBinaryExpression() {
     BinaryExpression fromNode = ASTFactory.binaryExpression(ASTFactory.identifier3("a"), TokenType.PLUS, ASTFactory.identifier3("b"));
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -6841,6 +7494,7 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitBooleanLiteral() {
     BooleanLiteral fromNode = ASTFactory.booleanLiteral(true);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -6852,6 +7506,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitCascadeExpression() {
     CascadeExpression fromNode = ASTFactory.cascadeExpression(ASTFactory.identifier3("a"), [ASTFactory.identifier3("b")]);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -6863,6 +7518,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitCompilationUnit() {
     CompilationUnit fromNode = ASTFactory.compilationUnit();
     CompilationUnitElement element = new CompilationUnitElementImpl("test.dart");
@@ -6871,6 +7527,7 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
+
   void test_visitConditionalExpression() {
     ConditionalExpression fromNode = ASTFactory.conditionalExpression(ASTFactory.identifier3("c"), ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -6882,24 +7539,27 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitConstructorDeclaration() {
     String className = "A";
     String constructorName = "c";
     ConstructorDeclaration fromNode = ASTFactory.constructorDeclaration(ASTFactory.identifier3(className), constructorName, ASTFactory.formalParameterList([]), null);
-    ConstructorElement element = ElementFactory.constructorElement(ElementFactory.classElement2(className, []), constructorName);
+    ConstructorElement element = ElementFactory.constructorElement2(ElementFactory.classElement2(className, []), constructorName, []);
     fromNode.element = element;
     ConstructorDeclaration toNode = ASTFactory.constructorDeclaration(ASTFactory.identifier3(className), constructorName, ASTFactory.formalParameterList([]), null);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
+
   void test_visitConstructorName() {
     ConstructorName fromNode = ASTFactory.constructorName(ASTFactory.typeName4("A", []), "c");
-    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("A", []), "c");
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("A", []), "c", []);
     fromNode.staticElement = staticElement;
     ConstructorName toNode = ASTFactory.constructorName(ASTFactory.typeName4("A", []), "c");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
   }
+
   void test_visitDoubleLiteral() {
     DoubleLiteral fromNode = ASTFactory.doubleLiteral(1.0);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -6911,6 +7571,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitExportDirective() {
     ExportDirective fromNode = ASTFactory.exportDirective2("dart:uri", []);
     ExportElement element = new ExportElementImpl();
@@ -6919,6 +7580,7 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
+
   void test_visitFunctionExpression() {
     FunctionExpression fromNode = ASTFactory.functionExpression2(ASTFactory.formalParameterList([]), ASTFactory.emptyFunctionBody());
     MethodElement element = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
@@ -6933,6 +7595,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitFunctionExpressionInvocation() {
     FunctionExpressionInvocation fromNode = ASTFactory.functionExpressionInvocation(ASTFactory.identifier3("f"), []);
     MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
@@ -6950,6 +7613,7 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitImportDirective() {
     ImportDirective fromNode = ASTFactory.importDirective2("dart:uri", null, []);
     ImportElement element = new ImportElementImpl();
@@ -6958,6 +7622,7 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
+
   void test_visitIndexExpression() {
     IndexExpression fromNode = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.integer(0));
     MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
@@ -6978,11 +7643,12 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitInstanceCreationExpression() {
     InstanceCreationExpression fromNode = ASTFactory.instanceCreationExpression2(Keyword.NEW, ASTFactory.typeName4("C", []), []);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("C", []), null);
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
     fromNode.staticElement = staticElement;
     Type2 staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
@@ -6992,6 +7658,7 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitIntegerLiteral() {
     IntegerLiteral fromNode = ASTFactory.integer(2);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7003,6 +7670,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitIsExpression() {
     IsExpression fromNode = ASTFactory.isExpression(ASTFactory.identifier3("x"), false, ASTFactory.typeName4("A", []));
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7014,6 +7682,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitLibraryIdentifier() {
     LibraryIdentifier fromNode = ASTFactory.libraryIdentifier([ASTFactory.identifier3("lib")]);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7025,6 +7694,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitListLiteral() {
     ListLiteral fromNode = ASTFactory.listLiteral([]);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7036,6 +7706,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitMapLiteral() {
     MapLiteral fromNode = ASTFactory.mapLiteral2([]);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7047,6 +7718,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitMethodInvocation() {
     MethodInvocation fromNode = ASTFactory.methodInvocation2("m", []);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7058,6 +7730,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitNamedExpression() {
     NamedExpression fromNode = ASTFactory.namedExpression2("n", ASTFactory.integer(0));
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7069,6 +7742,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitNullLiteral() {
     NullLiteral fromNode = ASTFactory.nullLiteral();
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7080,6 +7754,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitParenthesizedExpression() {
     ParenthesizedExpression fromNode = ASTFactory.parenthesizedExpression(ASTFactory.integer(0));
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7091,6 +7766,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitPartDirective() {
     PartDirective fromNode = ASTFactory.partDirective2("part.dart");
     LibraryElement element = new LibraryElementImpl(null, ASTFactory.libraryIdentifier2(["lib"]));
@@ -7099,6 +7775,7 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
+
   void test_visitPartOfDirective() {
     PartOfDirective fromNode = ASTFactory.partOfDirective(ASTFactory.libraryIdentifier2(["lib"]));
     LibraryElement element = new LibraryElementImpl(null, ASTFactory.libraryIdentifier2(["lib"]));
@@ -7107,6 +7784,7 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(element, toNode.element);
   }
+
   void test_visitPostfixExpression() {
     String variableName = "x";
     PostfixExpression fromNode = ASTFactory.postfixExpression(ASTFactory.identifier3(variableName), TokenType.PLUS_PLUS);
@@ -7125,6 +7803,7 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitPrefixedIdentifier() {
     PrefixedIdentifier fromNode = ASTFactory.identifier5("p", "f");
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7136,6 +7815,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitPrefixExpression() {
     PrefixExpression fromNode = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, ASTFactory.identifier3("x"));
     MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
@@ -7153,6 +7833,7 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitPropertyAccess() {
     PropertyAccess fromNode = ASTFactory.propertyAccess2(ASTFactory.identifier3("x"), "y");
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7164,14 +7845,16 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitRedirectingConstructorInvocation() {
     RedirectingConstructorInvocation fromNode = ASTFactory.redirectingConstructorInvocation([]);
-    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("C", []), null);
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
     fromNode.staticElement = staticElement;
     RedirectingConstructorInvocation toNode = ASTFactory.redirectingConstructorInvocation([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
   }
+
   void test_visitRethrowExpression() {
     RethrowExpression fromNode = ASTFactory.rethrowExpression();
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7183,6 +7866,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitSimpleIdentifier() {
     SimpleIdentifier fromNode = ASTFactory.identifier3("x");
     MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
@@ -7203,6 +7887,7 @@
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitSimpleStringLiteral() {
     SimpleStringLiteral fromNode = ASTFactory.string2("abc");
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7214,6 +7899,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitStringInterpolation() {
     StringInterpolation fromNode = ASTFactory.string([ASTFactory.interpolationString("a", "'a'")]);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7225,14 +7911,16 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitSuperConstructorInvocation() {
     SuperConstructorInvocation fromNode = ASTFactory.superConstructorInvocation([]);
-    ConstructorElement staticElement = ElementFactory.constructorElement(ElementFactory.classElement2("C", []), null);
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
     fromNode.staticElement = staticElement;
     SuperConstructorInvocation toNode = ASTFactory.superConstructorInvocation([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(staticElement, toNode.staticElement);
   }
+
   void test_visitSuperExpression() {
     SuperExpression fromNode = ASTFactory.superExpression();
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7244,6 +7932,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitSymbolLiteral() {
     SymbolLiteral fromNode = ASTFactory.symbolLiteral(["s"]);
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7255,6 +7944,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitThisExpression() {
     ThisExpression fromNode = ASTFactory.thisExpression();
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7266,6 +7956,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitThrowExpression() {
     ThrowExpression fromNode = ASTFactory.throwExpression();
     Type2 propagatedType = ElementFactory.classElement2("C", []).type;
@@ -7277,6 +7968,7 @@
     JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
     JUnitTestCase.assertSame(staticType, toNode.staticType);
   }
+
   void test_visitTypeName() {
     TypeName fromNode = ASTFactory.typeName4("C", []);
     Type2 type = ElementFactory.classElement2("C", []).type;
@@ -7285,6 +7977,7 @@
     ResolutionCopier.copyResolutionData(fromNode, toNode);
     JUnitTestCase.assertSame(type, toNode.type);
   }
+
   static dartSuite() {
     _ut.group('ResolutionCopierTest', () {
       _ut.test('test_visitAnnotation', () {
@@ -7466,6 +8159,7 @@
     });
   }
 }
+
 /**
  * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
  * sequences to ensure that the correct recovery steps are taken in the parser.
@@ -7482,11 +8176,13 @@
         "  return result;",
         "}"]), []);
   }
+
   void test_additiveExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_additiveExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("+", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7496,16 +8192,19 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_additiveExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_additiveExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_additiveExpression_precedence_multiplicative_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("* +", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7513,6 +8212,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_additiveExpression_precedence_multiplicative_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("+ *", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7520,45 +8220,53 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_additiveExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super + +", [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_assignmentExpression_missing_compound1() {
     AssignmentExpression expression = ParserTestCase.parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = expression.leftHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
   }
+
   void test_assignmentExpression_missing_compound2() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
-    Expression syntheticExpression = ((expression.rightHandSide as AssignmentExpression)).leftHandSide;
+    Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).leftHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
   }
+
   void test_assignmentExpression_missing_compound3() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
-    Expression syntheticExpression = ((expression.rightHandSide as AssignmentExpression)).rightHandSide;
+    Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).rightHandSide;
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
   }
+
   void test_assignmentExpression_missing_LHS() {
     AssignmentExpression expression = ParserTestCase.parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftHandSide);
     JUnitTestCase.assertTrue(expression.leftHandSide.isSynthetic);
   }
+
   void test_assignmentExpression_missing_RHS() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftHandSide);
     JUnitTestCase.assertTrue(expression.rightHandSide.isSynthetic);
   }
+
   void test_bitwiseAndExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_bitwiseAndExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("&", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7568,16 +8276,19 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseAndExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseAndExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseAndExpression_precedence_equality_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("== &&", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7585,6 +8296,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseAndExpression_precedence_equality_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("&& ==", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7592,17 +8304,20 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_bitwiseAndExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super &  &", [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseOrExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_bitwiseOrExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("|", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7612,16 +8327,19 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseOrExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseOrExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseOrExpression_precedence_xor_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("^ |", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7629,6 +8347,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseOrExpression_precedence_xor_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("| ^", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7636,17 +8355,20 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_bitwiseOrExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super |  |", [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseXorExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_bitwiseXorExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("^", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7656,16 +8378,19 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseXorExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseXorExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_bitwiseXorExpression_precedence_and_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("& ^", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7673,6 +8398,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_bitwiseXorExpression_precedence_and_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("^ &", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7680,30 +8406,36 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_bitwiseXorExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ^  ^", [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_classTypeAlias_withBody() {
     ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B = Object with A {}"]), [ParserErrorCode.EXPECTED_TOKEN]);
   }
+
   void test_conditionalExpression_missingElse() {
     ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.elseExpression);
     JUnitTestCase.assertTrue(expression.elseExpression.isSynthetic);
   }
+
   void test_conditionalExpression_missingThen() {
     ConditionalExpression expression = ParserTestCase.parse5("parseConditionalExpression", "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.thenExpression);
     JUnitTestCase.assertTrue(expression.thenExpression.isSynthetic);
   }
+
   void test_equalityExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_equalityExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("==", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7713,16 +8445,19 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_equalityExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_equalityExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_equalityExpression_precedence_relational_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("is ==", [
         ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -7730,6 +8465,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(IsExpression, expression.leftOperand);
   }
+
   void test_equalityExpression_precedence_relational_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("== is", [
         ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -7737,6 +8473,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(IsExpression, expression.rightOperand);
   }
+
   void test_equalityExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7744,6 +8481,7 @@
         ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_expressionList_multiple_end() {
     List<Expression> result = ParserTestCase.parse5("parseExpressionList", ", 2, 3, 4", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
@@ -7751,6 +8489,7 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
   }
+
   void test_expressionList_multiple_middle() {
     List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, , 4", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
@@ -7758,6 +8497,7 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
   }
+
   void test_expressionList_multiple_start() {
     List<Expression> result = ParserTestCase.parse5("parseExpressionList", "1, 2, 3,", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertSize(4, result);
@@ -7765,17 +8505,19 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, syntheticExpression);
     JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
   }
+
   void test_incomplete_topLevelVariable() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     EngineTestCase.assertSize(1, declarations);
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf(TopLevelVariableDeclaration, member);
-    NodeList<VariableDeclaration> variables = ((member as TopLevelVariableDeclaration)).variables.variables;
+    NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
     EngineTestCase.assertSize(1, variables);
     SimpleIdentifier name = variables[0].name;
     JUnitTestCase.assertTrue(name.isSynthetic);
   }
+
   void test_isExpression_noType() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [
         ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -7794,11 +8536,13 @@
     JUnitTestCase.assertTrue(type.name.isSynthetic);
     EngineTestCase.assertInstanceOf(EmptyStatement, ifStatement.thenStatement);
   }
+
   void test_logicalAndExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_logicalAndExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("&&", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7808,11 +8552,13 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_logicalAndExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("| &&", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7820,6 +8566,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("&& |", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7827,11 +8574,13 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_logicalOrExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_logicalOrExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("||", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7841,11 +8590,13 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_logicalOrExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_logicalOrExpression_precedence_logicalAnd_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("&& ||", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7853,6 +8604,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_logicalOrExpression_precedence_logicalAnd_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("|| &&", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7860,11 +8612,13 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_multiplicativeExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_multiplicativeExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("*", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7874,24 +8628,29 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_multiplicativeExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_multiplicativeExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_multiplicativeExpression_precedence_unary_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(PrefixExpression, expression.leftOperand);
   }
+
   void test_multiplicativeExpression_precedence_unary_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("* -y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(PrefixExpression, expression.rightOperand);
   }
+
   void test_multiplicativeExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7899,17 +8658,20 @@
         ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_prefixExpression_missing_operand_minus() {
     PrefixExpression expression = ParserTestCase.parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.operand);
     JUnitTestCase.assertTrue(expression.operand.isSynthetic);
     JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
   }
+
   void test_relationalExpression_missing_LHS() {
     IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.expression);
     JUnitTestCase.assertTrue(expression.expression.isSynthetic);
   }
+
   void test_relationalExpression_missing_LHS_RHS() {
     IsExpression expression = ParserTestCase.parseExpression("is", [
         ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -7919,11 +8681,13 @@
     EngineTestCase.assertInstanceOf(TypeName, expression.type);
     JUnitTestCase.assertTrue(expression.type.isSynthetic);
   }
+
   void test_relationalExpression_missing_RHS() {
     IsExpression expression = ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
     EngineTestCase.assertInstanceOf(TypeName, expression.type);
     JUnitTestCase.assertTrue(expression.type.isSynthetic);
   }
+
   void test_relationalExpression_precedence_shift_right() {
     IsExpression expression = ParserTestCase.parseExpression("<< is", [
         ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -7931,11 +8695,13 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.expression);
   }
+
   void test_shiftExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.leftOperand);
     JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
   }
+
   void test_shiftExpression_missing_LHS_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("<<", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7945,16 +8711,19 @@
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_shiftExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_shiftExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression.rightOperand);
     JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
   }
+
   void test_shiftExpression_precedence_unary_left() {
     BinaryExpression expression = ParserTestCase.parseExpression("+ <<", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7962,6 +8731,7 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_shiftExpression_precedence_unary_right() {
     BinaryExpression expression = ParserTestCase.parseExpression("<< +", [
         ParserErrorCode.MISSING_IDENTIFIER,
@@ -7969,12 +8739,14 @@
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.rightOperand);
   }
+
   void test_shiftExpression_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super << <<", [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(BinaryExpression, expression.leftOperand);
   }
+
   void test_typedef_eof() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("typedef n", [
         ParserErrorCode.EXPECTED_TOKEN,
@@ -7984,6 +8756,7 @@
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf(FunctionTypeAlias, member);
   }
+
   static dartSuite() {
     _ut.group('RecoveryParserTest', () {
       _ut.test('test_additiveExpression_missing_LHS', () {
@@ -8301,123 +9074,240 @@
     });
   }
 }
+
 class IncrementalParserTest extends EngineTestCase {
-  void fail_reparse_oneFunctionToTwo() {
-    assertParse("f() {}", "f() => 0; g() {}");
+  void fail_delete_identifier_beginning() {
+    assertParse("f() => ", "ab", "", "s + b;");
   }
-  void test_reparse_addedAfterIdentifier1() {
-    assertParse("f() => a + b;", "f() => abs + b;");
+
+  void fail_delete_mergeTokens() {
+    assertParse("f() => a", " + b + ", "", "c;");
   }
-  void test_reparse_addedAfterIdentifier2() {
-    assertParse("f() => a + b;", "f() => a + bar;");
+
+  void fail_insert_convertOneFunctionToTwo() {
+    assertParse("f()", "", " => 0; g()", " {}");
   }
-  void test_resparse_addedBeforeIdentifier1() {
-    assertParse("f() => a + b;", "f() => xa + b;");
+
+  void fail_insert_period_betweenIdentifiers1() {
+    assertParse("f() => a", "", ".", " b;");
   }
-  void test_resparse_addedBeforeIdentifier2() {
-    assertParse("f() => a + b;", "f() => a + xb;");
+
+  void fail_replace_multiple_partialFirstAndLast() {
+    assertParse("f() => a", "a + b", "b * a", "b;");
   }
-  void test_resparse_addedNewIdentifier1() {
-    assertParse("a; c;", "a; b c;");
+
+  void test_delete_identifier_end() {
+    assertParse("f() => a", "bs", "", " + b;");
   }
-  void test_resparse_addedNewIdentifier2() {
-    assertParse("a;  c;", "a;b  c;");
+
+  void test_delete_identifier_middle() {
+    assertParse("f() => a", "b", "", "s + b;");
   }
-  void test_resparse_appendWhitespace1() {
-    assertParse("f() => a + b;", "f() => a + b; ");
+
+  void test_insert_afterIdentifier1() {
+    assertParse("f() => a", "", "bs", " + b;");
   }
-  void test_resparse_appendWhitespace2() {
-    assertParse("f() => a + b;", "f() => a + b;  ");
+
+  void test_insert_afterIdentifier2() {
+    assertParse("f() => a + b", "", "ar", ";");
   }
-  void test_resparse_insertedPeriod() {
-    assertParse("f() => a + b;", "f() => a + b.;");
+
+  void test_insert_beforeIdentifier1() {
+    assertParse("f() => ", "", "x", "a + b;");
   }
-  void test_resparse_insertWhitespace() {
-    assertParse("f() => a + b;", "f() => a  + b;");
+
+  void test_insert_beforeIdentifier2() {
+    assertParse("f() => a + ", "", "x", "b;");
   }
-  void assertParse(String originalContents, String modifiedContents) {
-    int originalLength = originalContents.length;
-    int modifiedLength = modifiedContents.length;
-    int replaceStart = 0;
-    while (replaceStart < originalLength && replaceStart < modifiedLength && originalContents.codeUnitAt(replaceStart) == modifiedContents.codeUnitAt(replaceStart)) {
-      replaceStart++;
-    }
-    int lengthDelta = modifiedLength - originalLength;
-    int originalEnd = originalLength - 1;
-    int modifiedEnd = modifiedLength - 1;
-    while (originalEnd >= replaceStart && modifiedEnd >= (replaceStart + lengthDelta) && originalContents.codeUnitAt(originalEnd) == modifiedContents.codeUnitAt(modifiedEnd)) {
-      originalEnd--;
-      modifiedEnd--;
-    }
+
+  void test_insert_newIdentifier1() {
+    assertParse("f() => a;", "", " b", " c;");
+  }
+
+  void test_insert_newIdentifier2() {
+    assertParse("f() => a;", "", "b", "  c;");
+  }
+
+  void test_insert_period() {
+    assertParse("f() => a + b", "", ".", ";");
+  }
+
+  void test_insert_period_betweenIdentifiers2() {
+    assertParse("f() => a ", "", ".", "b;");
+  }
+
+  void test_insert_period_betweenIdentifiers3() {
+    assertParse("f() => a ", "", ".", " b;");
+  }
+
+  void test_insert_period_insideExistingIdentifier() {
+    assertParse("f() => a", "", ".", "b;");
+  }
+
+  void test_insert_periodAndIdentifier() {
+    assertParse("f() => a + b", "", ".x", ";");
+  }
+
+  void test_insert_whitespace_end() {
+    assertParse("f() => a + b;", "", " ", "");
+  }
+
+  void test_insert_whitespace_end_multiple() {
+    assertParse("f() => a + b;", "", "  ", "");
+  }
+
+  void test_insert_whitespace_middle() {
+    assertParse("f() => a", "", " ", " + b;");
+  }
+
+  void test_replace_identifier_beginning() {
+    assertParse("f() => ", "b", "f", "ell + b;");
+  }
+
+  void test_replace_identifier_end() {
+    assertParse("f() => bel", "l", "t", " + b;");
+  }
+
+  void test_replace_identifier_middle() {
+    assertParse("f() => f", "ir", "ro", "st + b;");
+  }
+
+  void test_replace_operator_oneForMany() {
+    assertParse("f() => a ", "+", "* c -", " b;");
+  }
+
+  void test_replace_operator_oneForOne() {
+    assertParse("f() => a ", "+", "*", " b;");
+  }
+
+  /**
+   * Given a description of the original and modified contents, perform an incremental scan of the
+   * two pieces of text.
+   *
+   * @param prefix the unchanged text before the edit region
+   * @param removed the text that was removed from the original contents
+   * @param added the text that was added to the modified contents
+   * @param suffix the unchanged text after the edit region
+   */
+  void assertParse(String prefix, String removed, String added, String suffix) {
+    String originalContents = "${prefix}${removed}${suffix}";
+    String modifiedContents = "${prefix}${added}${suffix}";
+    int replaceStart = prefix.length;
     Source source = new TestSource();
     GatheringErrorListener originalListener = new GatheringErrorListener();
     Scanner originalScanner = new Scanner(source, new CharSequenceReader(new CharSequence(originalContents)), originalListener);
-    Token originalToken = originalScanner.tokenize();
-    JUnitTestCase.assertNotNull(originalToken);
+    Token originalTokens = originalScanner.tokenize();
+    JUnitTestCase.assertNotNull(originalTokens);
     Parser originalParser = new Parser(source, originalListener);
-    CompilationUnit originalUnit = originalParser.parseCompilationUnit(originalToken);
+    CompilationUnit originalUnit = originalParser.parseCompilationUnit(originalTokens);
     JUnitTestCase.assertNotNull(originalUnit);
     GatheringErrorListener modifiedListener = new GatheringErrorListener();
     Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), modifiedListener);
-    Token modifiedToken = modifiedScanner.tokenize();
-    JUnitTestCase.assertNotNull(modifiedToken);
+    Token modifiedTokens = modifiedScanner.tokenize();
+    JUnitTestCase.assertNotNull(modifiedTokens);
     Parser modifiedParser = new Parser(source, modifiedListener);
-    CompilationUnit modifiedUnit = modifiedParser.parseCompilationUnit(modifiedToken);
+    CompilationUnit modifiedUnit = modifiedParser.parseCompilationUnit(modifiedTokens);
     JUnitTestCase.assertNotNull(modifiedUnit);
     GatheringErrorListener incrementalListener = new GatheringErrorListener();
     IncrementalScanner incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), incrementalListener);
-    Token incrementalToken = incrementalScanner.rescan(originalToken, replaceStart, originalEnd - replaceStart + 1, modifiedEnd - replaceStart + 1);
-    JUnitTestCase.assertNotNull(incrementalToken);
+    Token incrementalTokens = incrementalScanner.rescan(originalTokens, replaceStart, removed.length, added.length);
+    JUnitTestCase.assertNotNull(incrementalTokens);
     IncrementalParser incrementalParser = new IncrementalParser(source, incrementalScanner.tokenMap, incrementalListener);
-    CompilationUnit incrementalUnit = incrementalParser.reparse(originalUnit, incrementalScanner.firstToken, incrementalScanner.lastToken, replaceStart, originalEnd);
+    CompilationUnit incrementalUnit = incrementalParser.reparse(originalUnit, incrementalScanner.firstToken, incrementalScanner.lastToken, replaceStart, prefix.length + removed.length);
     JUnitTestCase.assertNotNull(incrementalUnit);
     JUnitTestCase.assertTrue(ASTComparator.equals3(modifiedUnit, incrementalUnit));
   }
+
   static dartSuite() {
     _ut.group('IncrementalParserTest', () {
-      _ut.test('test_reparse_addedAfterIdentifier1', () {
+      _ut.test('test_delete_identifier_end', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_reparse_addedAfterIdentifier1);
+        runJUnitTest(__test, __test.test_delete_identifier_end);
       });
-      _ut.test('test_reparse_addedAfterIdentifier2', () {
+      _ut.test('test_delete_identifier_middle', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_reparse_addedAfterIdentifier2);
+        runJUnitTest(__test, __test.test_delete_identifier_middle);
       });
-      _ut.test('test_resparse_addedBeforeIdentifier1', () {
+      _ut.test('test_insert_afterIdentifier1', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_addedBeforeIdentifier1);
+        runJUnitTest(__test, __test.test_insert_afterIdentifier1);
       });
-      _ut.test('test_resparse_addedBeforeIdentifier2', () {
+      _ut.test('test_insert_afterIdentifier2', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_addedBeforeIdentifier2);
+        runJUnitTest(__test, __test.test_insert_afterIdentifier2);
       });
-      _ut.test('test_resparse_addedNewIdentifier1', () {
+      _ut.test('test_insert_beforeIdentifier1', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_addedNewIdentifier1);
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier1);
       });
-      _ut.test('test_resparse_addedNewIdentifier2', () {
+      _ut.test('test_insert_beforeIdentifier2', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_addedNewIdentifier2);
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier2);
       });
-      _ut.test('test_resparse_appendWhitespace1', () {
+      _ut.test('test_insert_newIdentifier1', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_appendWhitespace1);
+        runJUnitTest(__test, __test.test_insert_newIdentifier1);
       });
-      _ut.test('test_resparse_appendWhitespace2', () {
+      _ut.test('test_insert_newIdentifier2', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_appendWhitespace2);
+        runJUnitTest(__test, __test.test_insert_newIdentifier2);
       });
-      _ut.test('test_resparse_insertWhitespace', () {
+      _ut.test('test_insert_period', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_insertWhitespace);
+        runJUnitTest(__test, __test.test_insert_period);
       });
-      _ut.test('test_resparse_insertedPeriod', () {
+      _ut.test('test_insert_periodAndIdentifier', () {
         final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_resparse_insertedPeriod);
+        runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers3', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
+      });
+      _ut.test('test_insert_period_insideExistingIdentifier', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
+      });
+      _ut.test('test_insert_whitespace_end', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_end);
+      });
+      _ut.test('test_insert_whitespace_end_multiple', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_end_multiple);
+      });
+      _ut.test('test_insert_whitespace_middle', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_middle);
+      });
+      _ut.test('test_replace_identifier_beginning', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_identifier_beginning);
+      });
+      _ut.test('test_replace_identifier_end', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_identifier_end);
+      });
+      _ut.test('test_replace_identifier_middle', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_identifier_middle);
+      });
+      _ut.test('test_replace_operator_oneForMany', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForMany);
+      });
+      _ut.test('test_replace_operator_oneForOne', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForOne);
       });
     });
   }
 }
+
 /**
  * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
  * that errors are correctly reported, and in some cases, not reported.
@@ -8427,790 +9317,1041 @@
     TypedLiteral literal = ParserTestCase.parse4("parseListOrMapLiteral", <Object> [null], "1", [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
     JUnitTestCase.assertTrue(literal.isSynthetic);
   }
+
   void fail_illegalAssignmentToNonAssignable_superAssigned() {
     ParserTestCase.parseExpression("super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
   }
+
   void fail_invalidCommentReference__new_nonIdentifier() {
     ParserTestCase.parse4("parseCommentReference", <Object> ["new 42", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
   }
+
   void fail_invalidCommentReference__new_tooMuch() {
     ParserTestCase.parse4("parseCommentReference", <Object> ["new a.b.c.d", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
   }
+
   void fail_invalidCommentReference__nonNew_nonIdentifier() {
     ParserTestCase.parse4("parseCommentReference", <Object> ["42", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
   }
+
   void fail_invalidCommentReference__nonNew_tooMuch() {
     ParserTestCase.parse4("parseCommentReference", <Object> ["a.b.c.d", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
   }
+
   void fail_missingClosingParenthesis() {
     ParserTestCase.parse5("parseFormalParameterList", "(int a, int b ;", [ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
   }
+
   void fail_missingFunctionParameters_local_nonVoid_block() {
     ParserTestCase.parseStatement("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void fail_missingFunctionParameters_local_nonVoid_expression() {
     ParserTestCase.parseStatement("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void fail_namedFunctionExpression() {
     Expression expression = ParserTestCase.parse5("parsePrimaryExpression", "f() {}", [ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
     EngineTestCase.assertInstanceOf(FunctionExpression, expression);
   }
+
   void fail_unexpectedToken_invalidPostfixExpression() {
     ParserTestCase.parseExpression("f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
   }
+
   void fail_varAndType_local() {
     ParserTestCase.parseStatement("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
   }
+
   void fail_varAndType_parameter() {
     ParserTestCase.parse5("parseFormalParameterList", "(var int x)", [ParserErrorCode.VAR_AND_TYPE]);
   }
+
   void test_abstractClassMember_constructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "abstract C.c();", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
   }
+
   void test_abstractClassMember_field() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "abstract C f;", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
   }
+
   void test_abstractClassMember_getter() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "abstract get m;", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
   }
+
   void test_abstractClassMember_method() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "abstract m();", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
   }
+
   void test_abstractClassMember_setter() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "abstract set m(v);", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
   }
+
   void test_abstractTopLevelFunction_function() {
     ParserTestCase.parseCompilationUnit("abstract f(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
   }
+
   void test_abstractTopLevelFunction_getter() {
     ParserTestCase.parseCompilationUnit("abstract get m {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
   }
+
   void test_abstractTopLevelFunction_setter() {
     ParserTestCase.parseCompilationUnit("abstract set m(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
   }
+
   void test_abstractTopLevelVariable() {
     ParserTestCase.parseCompilationUnit("abstract C f;", [ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE]);
   }
+
   void test_abstractTypeDef() {
     ParserTestCase.parseCompilationUnit("abstract typedef F();", [ParserErrorCode.ABSTRACT_TYPEDEF]);
   }
+
   void test_assertDoesNotTakeAssignment() {
     ParserTestCase.parse5("parseAssertStatement", "assert(b = true);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT]);
   }
+
   void test_assertDoesNotTakeCascades() {
     ParserTestCase.parse5("parseAssertStatement", "assert(new A()..m());", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE]);
   }
+
   void test_assertDoesNotTakeRethrow() {
     ParserTestCase.parse5("parseAssertStatement", "assert(rethrow);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW]);
   }
+
   void test_assertDoesNotTakeThrow() {
     ParserTestCase.parse5("parseAssertStatement", "assert(throw x);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW]);
   }
+
   void test_breakOutsideOfLoop_breakInDoStatement() {
     ParserTestCase.parse5("parseDoStatement", "do {break;} while (x);", []);
   }
+
   void test_breakOutsideOfLoop_breakInForStatement() {
     ParserTestCase.parse5("parseForStatement", "for (; x;) {break;}", []);
   }
+
   void test_breakOutsideOfLoop_breakInIfStatement() {
     ParserTestCase.parse5("parseIfStatement", "if (x) {break;}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
   }
+
   void test_breakOutsideOfLoop_breakInSwitchStatement() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (x) {case 1: break;}", []);
   }
+
   void test_breakOutsideOfLoop_breakInWhileStatement() {
     ParserTestCase.parse5("parseWhileStatement", "while (x) {break;}", []);
   }
+
   void test_breakOutsideOfLoop_functionExpression_inALoop() {
     ParserTestCase.parseStatement("for(; x;) {() {break;};}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
   }
+
   void test_breakOutsideOfLoop_functionExpression_withALoop() {
     ParserTestCase.parseStatement("() {for (; x;) {break;}};", []);
   }
+
   void test_constAndFinal() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const final int x;", [ParserErrorCode.CONST_AND_FINAL]);
   }
+
   void test_constAndVar() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const var x;", [ParserErrorCode.CONST_AND_VAR]);
   }
+
   void test_constClass() {
     ParserTestCase.parseCompilationUnit("const class C {}", [ParserErrorCode.CONST_CLASS]);
   }
+
   void test_constConstructorWithBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const C() {}", [ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]);
   }
+
   void test_constFactory() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const factory C() {}", [ParserErrorCode.CONST_FACTORY]);
   }
+
   void test_constMethod() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const int m() {}", [ParserErrorCode.CONST_METHOD]);
   }
+
   void test_constructorWithReturnType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "C C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
   }
+
   void test_constructorWithReturnType_var() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
   }
+
   void test_constTypedef() {
     ParserTestCase.parseCompilationUnit("const typedef F();", [ParserErrorCode.CONST_TYPEDEF]);
   }
+
   void test_continueOutsideOfLoop_continueInDoStatement() {
     ParserTestCase.parse5("parseDoStatement", "do {continue;} while (x);", []);
   }
+
   void test_continueOutsideOfLoop_continueInForStatement() {
     ParserTestCase.parse5("parseForStatement", "for (; x;) {continue;}", []);
   }
+
   void test_continueOutsideOfLoop_continueInIfStatement() {
     ParserTestCase.parse5("parseIfStatement", "if (x) {continue;}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
   }
+
   void test_continueOutsideOfLoop_continueInSwitchStatement() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (x) {case 1: continue a;}", []);
   }
+
   void test_continueOutsideOfLoop_continueInWhileStatement() {
     ParserTestCase.parse5("parseWhileStatement", "while (x) {continue;}", []);
   }
+
   void test_continueOutsideOfLoop_functionExpression_inALoop() {
     ParserTestCase.parseStatement("for(; x;) {() {continue;};}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
   }
+
   void test_continueOutsideOfLoop_functionExpression_withALoop() {
     ParserTestCase.parseStatement("() {for (; x;) {continue;}};", []);
   }
+
   void test_continueWithoutLabelInCase_error() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (x) {case 1: continue;}", [ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE]);
   }
+
   void test_continueWithoutLabelInCase_noError() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (x) {case 1: continue a;}", []);
   }
+
   void test_continueWithoutLabelInCase_noError_switchInLoop() {
     ParserTestCase.parse5("parseWhileStatement", "while (a) { switch (b) {default: continue;}}", []);
   }
+
   void test_deprecatedClassTypeAlias() {
     ParserTestCase.parseCompilationUnit("typedef C = abstract S with M;", [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
   }
+
   void test_deprecatedClassTypeAlias_withGeneric() {
     ParserTestCase.parseCompilationUnit("typedef C<T> = abstract S<T> with M;", [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
   }
+
   void test_directiveAfterDeclaration_classBeforeDirective() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Foo{} library l;", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
     JUnitTestCase.assertNotNull(unit);
   }
+
   void test_directiveAfterDeclaration_classBetweenDirectives() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library l;\nclass Foo{}\npart 'a.dart';", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
     JUnitTestCase.assertNotNull(unit);
   }
+
   void test_duplicatedModifier_const() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const const m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
+
   void test_duplicatedModifier_external() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external external f();", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
+
   void test_duplicatedModifier_factory() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "factory factory C() {}", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
+
   void test_duplicatedModifier_final() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final final m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
+
   void test_duplicatedModifier_static() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static static var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
+
   void test_duplicatedModifier_var() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
   }
+
   void test_duplicateLabelInSwitchStatement() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (e) {l1: case 0: break; l1: case 1: break;}", [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]);
   }
+
   void test_equalityCannotBeEqualityOperand_eq_eq() {
     ParserTestCase.parseExpression("1 == 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
   }
+
   void test_equalityCannotBeEqualityOperand_eq_neq() {
     ParserTestCase.parseExpression("1 == 2 != 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
   }
+
   void test_equalityCannotBeEqualityOperand_neq_eq() {
     ParserTestCase.parseExpression("1 != 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
   }
+
   void test_expectedCaseOrDefault() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (e) {break;}", [ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]);
   }
+
   void test_expectedClassMember_inClass_afterType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "heart 2 heart", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
   }
+
   void test_expectedClassMember_inClass_beforeType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "4 score", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
   }
+
   void test_expectedExecutable_inClass_afterVoid() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]);
   }
+
   void test_expectedExecutable_topLevel_afterType() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "heart 2 heart", [ParserErrorCode.EXPECTED_EXECUTABLE]);
   }
+
   void test_expectedExecutable_topLevel_afterVoid() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]);
   }
+
   void test_expectedExecutable_topLevel_beforeType() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "4 score", [ParserErrorCode.EXPECTED_EXECUTABLE]);
   }
+
   void test_expectedInterpolationIdentifier() {
     ParserTestCase.parse5("parseStringLiteral", "'\$x\$'", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
+
   void test_expectedStringLiteral() {
     StringLiteral expression = ParserTestCase.parse5("parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]);
     JUnitTestCase.assertTrue(expression.isSynthetic);
   }
+
   void test_expectedToken_commaMissingInArgumentList() {
     ParserTestCase.parse5("parseArgumentList", "(x, y z)", [ParserErrorCode.EXPECTED_TOKEN]);
   }
+
   void test_expectedToken_parseStatement_afterVoid() {
     ParserTestCase.parseStatement("void}", [
         ParserErrorCode.EXPECTED_TOKEN,
         ParserErrorCode.MISSING_IDENTIFIER]);
   }
+
   void test_expectedToken_semicolonAfterClass() {
     Token token = TokenFactory.token(Keyword.CLASS);
     ParserTestCase.parse4("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), token], "A = B", [ParserErrorCode.EXPECTED_TOKEN]);
   }
+
   void test_expectedToken_semicolonMissingAfterExpression() {
     ParserTestCase.parseStatement("x", [ParserErrorCode.EXPECTED_TOKEN]);
   }
+
   void test_expectedToken_whileMissingInDoStatement() {
     ParserTestCase.parseStatement("do {} (x);", [ParserErrorCode.EXPECTED_TOKEN]);
   }
+
   void test_expectedTypeName_is() {
     ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
   }
+
   void test_exportDirectiveAfterPartDirective() {
     ParserTestCase.parseCompilationUnit("part 'a.dart'; export 'b.dart';", [ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
   }
+
   void test_externalAfterConst() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const external C();", [ParserErrorCode.EXTERNAL_AFTER_CONST]);
   }
+
   void test_externalAfterFactory() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "factory external C();", [ParserErrorCode.EXTERNAL_AFTER_FACTORY]);
   }
+
   void test_externalAfterStatic() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static external int m();", [ParserErrorCode.EXTERNAL_AFTER_STATIC]);
   }
+
   void test_externalClass() {
     ParserTestCase.parseCompilationUnit("external class C {}", [ParserErrorCode.EXTERNAL_CLASS]);
   }
+
   void test_externalConstructorWithBody_factory() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external factory C() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
   }
+
   void test_externalConstructorWithBody_named() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external C.c() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
   }
+
   void test_externalField_const() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external const A f;", [ParserErrorCode.EXTERNAL_FIELD]);
   }
+
   void test_externalField_final() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external final A f;", [ParserErrorCode.EXTERNAL_FIELD]);
   }
+
   void test_externalField_static() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external static A f;", [ParserErrorCode.EXTERNAL_FIELD]);
   }
+
   void test_externalField_typed() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external A f;", [ParserErrorCode.EXTERNAL_FIELD]);
   }
+
   void test_externalField_untyped() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external var f;", [ParserErrorCode.EXTERNAL_FIELD]);
   }
+
   void test_externalGetterWithBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external int get x {}", [ParserErrorCode.EXTERNAL_GETTER_WITH_BODY]);
   }
+
   void test_externalMethodWithBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external m() {}", [ParserErrorCode.EXTERNAL_METHOD_WITH_BODY]);
   }
+
   void test_externalOperatorWithBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external operator +(int value) {}", [ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY]);
   }
+
   void test_externalSetterWithBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "external set x(int value) {}", [ParserErrorCode.EXTERNAL_SETTER_WITH_BODY]);
   }
+
   void test_externalTypedef() {
     ParserTestCase.parseCompilationUnit("external typedef F();", [ParserErrorCode.EXTERNAL_TYPEDEF]);
   }
+
   void test_factoryTopLevelDeclaration_class() {
     ParserTestCase.parseCompilationUnit("factory class C {}", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
   }
+
   void test_factoryTopLevelDeclaration_typedef() {
     ParserTestCase.parseCompilationUnit("factory typedef F();", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
   }
+
   void test_factoryWithoutBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "factory C();", [ParserErrorCode.FACTORY_WITHOUT_BODY]);
   }
+
   void test_fieldInitializerOutsideConstructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void m(this.x);", [ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
   }
+
   void test_finalAndVar() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final var x;", [ParserErrorCode.FINAL_AND_VAR]);
   }
+
   void test_finalClass() {
     ParserTestCase.parseCompilationUnit("final class C {}", [ParserErrorCode.FINAL_CLASS]);
   }
+
   void test_finalConstructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final C() {}", [ParserErrorCode.FINAL_CONSTRUCTOR]);
   }
+
   void test_finalMethod() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final int m() {}", [ParserErrorCode.FINAL_METHOD]);
   }
+
   void test_finalTypedef() {
     ParserTestCase.parseCompilationUnit("final typedef F();", [ParserErrorCode.FINAL_TYPEDEF]);
   }
+
   void test_functionTypedParameter_const() {
     ParserTestCase.parseCompilationUnit("void f(const x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
   }
+
   void test_functionTypedParameter_final() {
     ParserTestCase.parseCompilationUnit("void f(final x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
   }
+
   void test_functionTypedParameter_var() {
     ParserTestCase.parseCompilationUnit("void f(var x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
   }
+
   void test_getterInFunction_block() {
     ParserTestCase.parseStatement("get x { return _x; }", [ParserErrorCode.GETTER_IN_FUNCTION]);
   }
+
   void test_getterInFunction_expression() {
     ParserTestCase.parseStatement("get x => _x;", [ParserErrorCode.GETTER_IN_FUNCTION]);
   }
+
   void test_getterWithParameters() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "int get x() {}", [ParserErrorCode.GETTER_WITH_PARAMETERS]);
   }
+
   void test_illegalAssignmentToNonAssignable_superAssigned() {
     ParserTestCase.parseExpression("super = x;", [
         ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
         ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
   }
+
   void test_implementsBeforeExtends() {
     ParserTestCase.parseCompilationUnit("class A implements B extends C {}", [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]);
   }
+
   void test_implementsBeforeWith() {
     ParserTestCase.parseCompilationUnit("class A extends B implements C with D {}", [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]);
   }
+
   void test_importDirectiveAfterPartDirective() {
     ParserTestCase.parseCompilationUnit("part 'a.dart'; import 'b.dart';", [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
   }
+
   void test_initializedVariableInForEach() {
     ParserTestCase.parse5("parseForStatement", "for (int a = 0 in foo) {}", [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]);
   }
+
   void test_invalidCodePoint() {
     ParserTestCase.parse5("parseStringLiteral", "'\\uD900'", [ParserErrorCode.INVALID_CODE_POINT]);
   }
+
   void test_invalidHexEscape_invalidDigit() {
     ParserTestCase.parse5("parseStringLiteral", "'\\x0 a'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
   }
+
   void test_invalidHexEscape_tooFewDigits() {
     ParserTestCase.parse5("parseStringLiteral", "'\\x0'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
   }
+
   void test_invalidInterpolationIdentifier_startWithDigit() {
     ParserTestCase.parse5("parseStringLiteral", "'\$1'", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
+
   void test_invalidOperator() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void operator ===(x) {}", [ParserErrorCode.INVALID_OPERATOR]);
   }
+
   void test_invalidOperatorForSuper() {
     ParserTestCase.parse5("parseUnaryExpression", "++super", [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
   }
+
   void test_invalidUnicodeEscape_incomplete_noDigits() {
     ParserTestCase.parse5("parseStringLiteral", "'\\u{'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
+
   void test_invalidUnicodeEscape_incomplete_someDigits() {
     ParserTestCase.parse5("parseStringLiteral", "'\\u{0A'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
+
   void test_invalidUnicodeEscape_invalidDigit() {
     ParserTestCase.parse5("parseStringLiteral", "'\\u0 a'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
+
   void test_invalidUnicodeEscape_tooFewDigits_fixed() {
     ParserTestCase.parse5("parseStringLiteral", "'\\u04'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
+
   void test_invalidUnicodeEscape_tooFewDigits_variable() {
     ParserTestCase.parse5("parseStringLiteral", "'\\u{}'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
+
   void test_invalidUnicodeEscape_tooManyDigits_variable() {
     ParserTestCase.parse5("parseStringLiteral", "'\\u{12345678}'", [
         ParserErrorCode.INVALID_UNICODE_ESCAPE,
         ParserErrorCode.INVALID_CODE_POINT]);
   }
+
   void test_libraryDirectiveNotFirst() {
     ParserTestCase.parseCompilationUnit("import 'x.dart'; library l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
   }
+
   void test_libraryDirectiveNotFirst_afterPart() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("part 'a.dart';\nlibrary l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
     JUnitTestCase.assertNotNull(unit);
   }
+
   void test_localFunctionDeclarationModifier_abstract() {
     ParserTestCase.parseStatement("abstract f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
   }
+
   void test_localFunctionDeclarationModifier_external() {
     ParserTestCase.parseStatement("external f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
   }
+
   void test_localFunctionDeclarationModifier_factory() {
     ParserTestCase.parseStatement("factory f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
   }
+
   void test_localFunctionDeclarationModifier_static() {
     ParserTestCase.parseStatement("static f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
   }
+
   void test_missingAssignableSelector_identifiersAssigned() {
     ParserTestCase.parseExpression("x.y = y;", []);
   }
+
   void test_missingAssignableSelector_postfix_minusMinus_literal() {
     ParserTestCase.parseExpression("0--", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
   }
+
   void test_missingAssignableSelector_postfix_plusPlus_literal() {
     ParserTestCase.parseExpression("0++", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
   }
+
   void test_missingAssignableSelector_prefix_minusMinus_literal() {
     ParserTestCase.parseExpression("--0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
   }
+
   void test_missingAssignableSelector_prefix_plusPlus_literal() {
     ParserTestCase.parseExpression("++0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
   }
+
   void test_missingAssignableSelector_primarySelectorPostfix() {
     ParserTestCase.parseExpression("x(y)(z)++", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
   }
+
   void test_missingAssignableSelector_selector() {
     ParserTestCase.parseExpression("x(y)(z).a++", []);
   }
+
   void test_missingAssignableSelector_superPrimaryExpression() {
     SuperExpression expression = ParserTestCase.parse5("parsePrimaryExpression", "super", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
     JUnitTestCase.assertNotNull(expression.keyword);
   }
+
   void test_missingAssignableSelector_superPropertyAccessAssigned() {
     ParserTestCase.parseExpression("super.x = x;", []);
   }
+
   void test_missingCatchOrFinally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {}", [ParserErrorCode.MISSING_CATCH_OR_FINALLY]);
     JUnitTestCase.assertNotNull(statement);
   }
+
   void test_missingClassBody() {
     ParserTestCase.parseCompilationUnit("class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]);
   }
+
   void test_missingConstFinalVarOrType_static() {
     ParserTestCase.parseCompilationUnit("class A { static f; }", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
   }
+
   void test_missingConstFinalVarOrType_topLevel() {
     ParserTestCase.parse4("parseFinalConstVarOrType", <Object> [false], "a;", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
   }
+
   void test_missingExpressionInThrow_withCascade() {
     ParserTestCase.parse5("parseThrowExpression", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
   }
+
   void test_missingExpressionInThrow_withoutCascade() {
     ParserTestCase.parse5("parseThrowExpressionWithoutCascade", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
   }
+
   void test_missingFunctionBody_emptyNotAllowed() {
     ParserTestCase.parse4("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], ";", [ParserErrorCode.MISSING_FUNCTION_BODY]);
   }
+
   void test_missingFunctionBody_invalid() {
     ParserTestCase.parse4("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], "return 0;", [ParserErrorCode.MISSING_FUNCTION_BODY]);
   }
+
   void test_missingFunctionParameters_local_void_block() {
     ParserTestCase.parseStatement("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void test_missingFunctionParameters_local_void_expression() {
     ParserTestCase.parseStatement("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void test_missingFunctionParameters_topLevel_nonVoid_block() {
     ParserTestCase.parseCompilationUnit("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void test_missingFunctionParameters_topLevel_nonVoid_expression() {
     ParserTestCase.parseCompilationUnit("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void test_missingFunctionParameters_topLevel_void_block() {
     ParserTestCase.parseCompilationUnit("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void test_missingFunctionParameters_topLevel_void_expression() {
     ParserTestCase.parseCompilationUnit("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
   }
+
   void test_missingIdentifier_afterOperator() {
     ParserTestCase.parse5("parseMultiplicativeExpression", "1 *", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
+
   void test_missingIdentifier_beforeClosingCurly() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "int}", [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.EXPECTED_TOKEN]);
   }
+
   void test_missingIdentifier_functionDeclaration_returnTypeWithoutName() {
     ParserTestCase.parse5("parseFunctionDeclarationStatement", "A<T> () {}", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
+
   void test_missingIdentifier_inSymbol_afterPeriod() {
     ParserTestCase.parse5("parseSymbolLiteral", "#a.", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
+
   void test_missingIdentifier_inSymbol_first() {
     ParserTestCase.parse5("parseSymbolLiteral", "#", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
+
   void test_missingIdentifier_number() {
     SimpleIdentifier expression = ParserTestCase.parse5("parseSimpleIdentifier", "1", [ParserErrorCode.MISSING_IDENTIFIER]);
     JUnitTestCase.assertTrue(expression.isSynthetic);
   }
+
   void test_missingKeywordOperator() {
     ParserTestCase.parse4("parseOperator", <Object> [emptyCommentAndMetadata(), null, null], "+(x) {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
   }
+
   void test_missingKeywordOperator_parseClassMember() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "+() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
   }
+
   void test_missingKeywordOperator_parseClassMember_afterTypeName() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "int +() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
   }
+
   void test_missingKeywordOperator_parseClassMember_afterVoid() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void +() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
   }
+
   void test_missingNameInLibraryDirective() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]);
     JUnitTestCase.assertNotNull(unit);
   }
+
   void test_missingNameInPartOfDirective() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE]);
     JUnitTestCase.assertNotNull(unit);
   }
+
   void test_missingStatement() {
     ParserTestCase.parseStatement("is", [ParserErrorCode.MISSING_STATEMENT]);
   }
+
   void test_missingStatement_afterVoid() {
     ParserTestCase.parseStatement("void;", [ParserErrorCode.MISSING_STATEMENT]);
   }
+
   void test_missingTerminatorForParameterGroup_named() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, {b: 0)", [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
+
   void test_missingTerminatorForParameterGroup_optional() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b = 0)", [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
+
   void test_missingTypedefParameters_nonVoid() {
     ParserTestCase.parseCompilationUnit("typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
   }
+
   void test_missingTypedefParameters_typeParameters() {
     ParserTestCase.parseCompilationUnit("typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
   }
+
   void test_missingTypedefParameters_void() {
     ParserTestCase.parseCompilationUnit("typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
   }
+
   void test_missingVariableInForEach() {
     ParserTestCase.parse5("parseForStatement", "for (a < b in foo) {}", [ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]);
   }
+
   void test_mixedParameterGroups_namedPositional() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, {b}, [c])", [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
   }
+
   void test_mixedParameterGroups_positionalNamed() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b], {c})", [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
   }
+
   void test_multipleExtendsClauses() {
     ParserTestCase.parseCompilationUnit("class A extends B extends C {}", [ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES]);
   }
+
   void test_multipleImplementsClauses() {
     ParserTestCase.parseCompilationUnit("class A implements B implements C {}", [ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES]);
   }
+
   void test_multipleLibraryDirectives() {
     ParserTestCase.parseCompilationUnit("library l; library m;", [ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES]);
   }
+
   void test_multipleNamedParameterGroups() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, {b}, {c})", [ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS]);
   }
+
   void test_multiplePartOfDirectives() {
     ParserTestCase.parseCompilationUnit("part of l; part of m;", [ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES]);
   }
+
   void test_multiplePositionalParameterGroups() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b], [c])", [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]);
   }
+
   void test_multipleVariablesInForEach() {
     ParserTestCase.parse5("parseForStatement", "for (int a, b in foo) {}", [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]);
   }
+
   void test_multipleWithClauses() {
     ParserTestCase.parseCompilationUnit("class A extends B with C with D {}", [ParserErrorCode.MULTIPLE_WITH_CLAUSES]);
   }
+
   void test_namedParameterOutsideGroup() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, b : 0)", [ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]);
   }
+
   void test_nonConstructorFactory_field() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "factory int x;", [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
   }
+
   void test_nonConstructorFactory_method() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "factory int m() {}", [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
   }
+
   void test_nonIdentifierLibraryName_library() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
     JUnitTestCase.assertNotNull(unit);
   }
+
   void test_nonIdentifierLibraryName_partOf() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
     JUnitTestCase.assertNotNull(unit);
   }
+
   void test_nonPartOfDirectiveInPart_after() {
     ParserTestCase.parseCompilationUnit("part of l; part 'f.dart';", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
   }
+
   void test_nonPartOfDirectiveInPart_before() {
     ParserTestCase.parseCompilationUnit("part 'f.dart'; part of m;", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
   }
+
   void test_nonUserDefinableOperator() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "operator +=(int x) => x + 1;", [ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]);
   }
+
   void test_optionalAfterNormalParameters_named() {
     ParserTestCase.parseCompilationUnit("f({a}, b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
   }
+
   void test_optionalAfterNormalParameters_positional() {
     ParserTestCase.parseCompilationUnit("f([a], b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
   }
+
   void test_parseCascadeSection_missingIdentifier() {
     MethodInvocation methodInvocation = ParserTestCase.parse5("parseCascadeSection", "..()", [ParserErrorCode.MISSING_IDENTIFIER]);
     JUnitTestCase.assertNull(methodInvocation.target);
     JUnitTestCase.assertEquals("", methodInvocation.methodName.name);
     EngineTestCase.assertSize(0, methodInvocation.argumentList.arguments);
   }
+
   void test_positionalAfterNamedArgument() {
     ParserTestCase.parse5("parseArgumentList", "(x: 1, 2)", [ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT]);
   }
+
   void test_positionalParameterOutsideGroup() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, b = 0)", [ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP]);
   }
+
   void test_redirectionInNonFactoryConstructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "C() = D;", [ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR]);
   }
+
   void test_setterInFunction_block() {
     ParserTestCase.parseStatement("set x(v) {_x = v;}", [ParserErrorCode.SETTER_IN_FUNCTION]);
   }
+
   void test_setterInFunction_expression() {
     ParserTestCase.parseStatement("set x(v) => _x = v;", [ParserErrorCode.SETTER_IN_FUNCTION]);
   }
+
   void test_staticAfterConst() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "final static int f;", [ParserErrorCode.STATIC_AFTER_FINAL]);
   }
+
   void test_staticAfterFinal() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "const static int f;", [ParserErrorCode.STATIC_AFTER_CONST]);
   }
+
   void test_staticAfterVar() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var static f;", [ParserErrorCode.STATIC_AFTER_VAR]);
   }
+
   void test_staticConstructor() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static C.m() {}", [ParserErrorCode.STATIC_CONSTRUCTOR]);
   }
+
   void test_staticGetterWithoutBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static get m;", [ParserErrorCode.STATIC_GETTER_WITHOUT_BODY]);
   }
+
   void test_staticOperator_noReturnType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
   }
+
   void test_staticOperator_returnType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static int operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
   }
+
   void test_staticSetterWithoutBody() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "static set m(x);", [ParserErrorCode.STATIC_SETTER_WITHOUT_BODY]);
   }
+
   void test_staticTopLevelDeclaration_class() {
     ParserTestCase.parseCompilationUnit("static class C {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
   }
+
   void test_staticTopLevelDeclaration_function() {
     ParserTestCase.parseCompilationUnit("static f() {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
   }
+
   void test_staticTopLevelDeclaration_typedef() {
     ParserTestCase.parseCompilationUnit("static typedef F();", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
   }
+
   void test_staticTopLevelDeclaration_variable() {
     ParserTestCase.parseCompilationUnit("static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
   }
+
   void test_switchHasCaseAfterDefaultCase() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (a) {default: return 0; case 1: return 1;}", [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
   }
+
   void test_switchHasCaseAfterDefaultCase_repeated() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (a) {default: return 0; case 1: return 1; case 2: return 2;}", [
         ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
         ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
   }
+
   void test_switchHasMultipleDefaultCases() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (a) {default: return 0; default: return 1;}", [ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]);
   }
+
   void test_switchHasMultipleDefaultCases_repeated() {
     ParserTestCase.parse5("parseSwitchStatement", "switch (a) {default: return 0; default: return 1; default: return 2;}", [
         ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
         ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]);
   }
+
   void test_topLevelOperator_withoutType() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
   }
+
   void test_topLevelOperator_withType() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "bool operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
   }
+
   void test_topLevelOperator_withVoid() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
   }
+
   void test_unexpectedTerminatorForParameterGroup_named() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, b})", [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
+
   void test_unexpectedTerminatorForParameterGroup_optional() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, b])", [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
+
   void test_unexpectedToken_semicolonBetweenClassMembers() {
     ParserTestCase.parse4("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class C { int x; ; int y;}", [ParserErrorCode.UNEXPECTED_TOKEN]);
   }
+
   void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
     ParserTestCase.parseCompilationUnit("int x; ; int y;", [ParserErrorCode.UNEXPECTED_TOKEN]);
   }
+
   void test_useOfUnaryPlusOperator() {
     SimpleIdentifier expression = ParserTestCase.parse5("parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf(SimpleIdentifier, expression);
     JUnitTestCase.assertTrue(expression.isSynthetic);
   }
+
   void test_varAndType_field() {
     ParserTestCase.parseCompilationUnit("class C { var int x; }", [ParserErrorCode.VAR_AND_TYPE]);
   }
+
   void test_varAndType_topLevelVariable() {
     ParserTestCase.parseCompilationUnit("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
   }
+
   void test_varAsTypeName_as() {
     ParserTestCase.parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]);
   }
+
   void test_varClass() {
     ParserTestCase.parseCompilationUnit("var class C {}", [ParserErrorCode.VAR_CLASS]);
   }
+
   void test_varReturnType() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "var m() {}", [ParserErrorCode.VAR_RETURN_TYPE]);
   }
+
   void test_varTypedef() {
     ParserTestCase.parseCompilationUnit("var typedef F();", [ParserErrorCode.VAR_TYPEDEF]);
   }
+
   void test_voidParameter() {
     ParserTestCase.parse5("parseNormalFormalParameter", "void a)", [ParserErrorCode.VOID_PARAMETER]);
   }
+
   void test_voidVariable_parseClassMember_initializer() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
   }
+
   void test_voidVariable_parseClassMember_noInitializer() {
     ParserTestCase.parse4("parseClassMember", <Object> ["C"], "void x;", [ParserErrorCode.VOID_VARIABLE]);
   }
+
   void test_voidVariable_parseCompilationUnit_initializer() {
     ParserTestCase.parseCompilationUnit("void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
   }
+
   void test_voidVariable_parseCompilationUnit_noInitializer() {
     ParserTestCase.parseCompilationUnit("void x;", [ParserErrorCode.VOID_VARIABLE]);
   }
+
   void test_voidVariable_parseCompilationUnitMember_initializer() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void a = 0;", [ParserErrorCode.VOID_VARIABLE]);
   }
+
   void test_voidVariable_parseCompilationUnitMember_noInitializer() {
     ParserTestCase.parse4("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void a;", [ParserErrorCode.VOID_VARIABLE]);
   }
+
   void test_voidVariable_statement_initializer() {
     ParserTestCase.parseStatement("void x = 0;", [
         ParserErrorCode.VOID_VARIABLE,
         ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
   }
+
   void test_voidVariable_statement_noInitializer() {
     ParserTestCase.parseStatement("void x;", [
         ParserErrorCode.VOID_VARIABLE,
         ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
   }
+
   void test_withBeforeExtends() {
     ParserTestCase.parseCompilationUnit("class A with B extends C {}", [ParserErrorCode.WITH_BEFORE_EXTENDS]);
   }
+
   void test_withWithoutExtends() {
     ParserTestCase.parse4("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A with B, C {}", [ParserErrorCode.WITH_WITHOUT_EXTENDS]);
   }
+
   void test_wrongSeparatorForNamedParameter() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, {b = 0})", [ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER]);
   }
+
   void test_wrongSeparatorForPositionalParameter() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b : 0])", [ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER]);
   }
+
   void test_wrongTerminatorForParameterGroup_named() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, {b, c])", [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
+
   void test_wrongTerminatorForParameterGroup_optional() {
     ParserTestCase.parse5("parseFormalParameterList", "(a, [b, c})", [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
+
   static dartSuite() {
     _ut.group('ErrorParserTest', () {
       _ut.test('test_abstractClassMember_constructor', () {
@@ -10168,6 +11309,7 @@
     });
   }
 }
+
 main() {
   ComplexParserTest.dartSuite();
   ErrorParserTest.dartSuite();
@@ -10326,7 +11468,7 @@
   'peek_0': new MethodTrampoline(0, (Parser target) => target.peek()),
   'peek_1': new MethodTrampoline(1, (Parser target, arg0) => target.peek2(arg0)),
   'reportError_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.reportError(arg0, arg1, arg2)),
-  'reportError_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportError8(arg0, arg1)),
+  'reportError_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportError9(arg0, arg1)),
   'scrapeTodoComment_1': new MethodTrampoline(1, (Parser target, arg0) => target.scrapeTodoComment(arg0)),
   'skipFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFinalConstVarOrType(arg0)),
   'skipFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFormalParameterList(arg0)),
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index ef46283..e85b6c5 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -1,6 +1,8 @@
 // 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 engine.resolver_test;
+
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -18,11 +20,13 @@
 import 'test_support.dart';
 import 'ast_test.dart' show ASTFactory;
 import 'element_test.dart' show ElementFactory;
+
 class TypePropagationTest extends ResolverTestCase {
   void fail_propagatedReturnType_functionExpression() {
     String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
+
   void test_as() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -44,10 +48,11 @@
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_assert() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -67,6 +72,7 @@
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_assignment() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v;", "  v = 0;", "  return v;", "}"]));
     LibraryElement library = resolve(source);
@@ -79,6 +85,7 @@
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
   }
+
   void test_assignment_afterInitializer() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  v = 1.0;", "  return v;", "}"]));
     LibraryElement library = resolve(source);
@@ -91,6 +98,7 @@
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeProvider.doubleType, variableName.propagatedType);
   }
+
   void test_forEach() {
     String code = EngineTestCase.createSource([
         "f(List<String> p) {",
@@ -113,6 +121,7 @@
       JUnitTestCase.assertSame(stringType, identifier.propagatedType);
     }
   }
+
   void test_functionExpression_asInvocationArgument() {
     String code = EngineTestCase.createSource([
         "class MyMap<K, V> {",
@@ -142,6 +151,7 @@
     JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
     JUnitTestCase.assertSame(typeProvider.dynamicType, vIdentifier.staticType);
   }
+
   void test_functionExpression_asInvocationArgument_fromInferredInvocation() {
     String code = EngineTestCase.createSource([
         "class MyMap<K, V> {",
@@ -163,6 +173,7 @@
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", SimpleFormalParameter);
     JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
   }
+
   void test_functionExpression_asInvocationArgument_functionExpressionInvocation() {
     String code = EngineTestCase.createSource([
         "main() {",
@@ -184,6 +195,7 @@
     JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
     JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
   }
+
   void test_functionExpression_asInvocationArgument_keepIfLessSpecific() {
     String code = EngineTestCase.createSource([
         "class MyList {",
@@ -207,6 +219,7 @@
     JUnitTestCase.assertSame(intType, vIdentifier.staticType);
     JUnitTestCase.assertSame(null, vIdentifier.propagatedType);
   }
+
   void test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() {
     String code = EngineTestCase.createSource([
         "class MyList<E> {",
@@ -229,6 +242,7 @@
     SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", SimpleIdentifier);
     JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
   }
+
   void test_Future_then() {
     String code = EngineTestCase.createSource([
         "import 'dart:async';",
@@ -252,6 +266,7 @@
     FormalParameter p3 = EngineTestCase.findNode(unit, code, "p3) {", SimpleFormalParameter);
     JUnitTestCase.assertSame(typeProvider.stringType, p3.identifier.propagatedType);
   }
+
   void test_initializer() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  return v;", "}"]));
     LibraryElement library = resolve(source);
@@ -273,6 +288,7 @@
       JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
     }
   }
+
   void test_initializer_dereference() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 'String';", "  v.", "}"]));
     LibraryElement library = resolve(source);
@@ -284,6 +300,7 @@
     SimpleIdentifier variableName = invocation.prefix;
     JUnitTestCase.assertSame(typeProvider.stringType, variableName.propagatedType);
   }
+
   void test_is_conditional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -303,6 +320,7 @@
     SimpleIdentifier variableName = conditional.thenExpression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_is_if() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -322,10 +340,11 @@
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_is_if_lessSpecific() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -343,10 +362,11 @@
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(null, variableName.propagatedType);
   }
+
   void test_is_if_logicalAnd() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -366,10 +386,11 @@
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_is_postConditional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -389,6 +410,7 @@
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_is_postIf() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -412,6 +434,7 @@
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_is_subclass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -429,10 +452,11 @@
     FunctionDeclaration function = unit.declarations[2] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     MethodInvocation invocation = statement.expression as MethodInvocation;
     JUnitTestCase.assertNotNull(invocation.methodName.propagatedElement);
   }
+
   void test_is_while() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -450,10 +474,11 @@
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     WhileStatement whileStatement = body.block.statements[0] as WhileStatement;
-    ReturnStatement statement = ((whileStatement.body as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (whileStatement.body as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_isNot_conditional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -473,6 +498,7 @@
     SimpleIdentifier variableName = conditional.elseExpression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_isNot_if() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -492,10 +518,11 @@
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = ((ifStatement.elseStatement as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_isNot_if_logicalOr() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -514,10 +541,11 @@
     FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = ((ifStatement.elseStatement as Block)).statements[0] as ReturnStatement;
+    ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_isNot_postConditional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -537,6 +565,7 @@
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_isNot_postIf() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -558,6 +587,7 @@
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
     JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
+
   void test_listLiteral_different() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, '1', 2];", "  return v[2];", "}"]));
     LibraryElement library = resolve(source);
@@ -570,6 +600,7 @@
     IndexExpression indexExpression = statement.expression as IndexExpression;
     JUnitTestCase.assertNull(indexExpression.propagatedType);
   }
+
   void test_listLiteral_same() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, 1, 2];", "  return v[2];", "}"]));
     LibraryElement library = resolve(source);
@@ -582,6 +613,7 @@
     IndexExpression indexExpression = statement.expression as IndexExpression;
     JUnitTestCase.assertSame(typeProvider.intType, indexExpression.propagatedType);
   }
+
   void test_mapLiteral_different() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -603,6 +635,7 @@
     JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
     JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
   }
+
   void test_mapLiteral_same() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -624,14 +657,17 @@
     JUnitTestCase.assertSame(typeProvider.stringType, typeArguments[0]);
     JUnitTestCase.assertSame(typeProvider.intType, typeArguments[1]);
   }
+
   void test_propagatedReturnType_function_hasReturnType_returnsNull() {
     String code = EngineTestCase.createSource(["String f() => null;", "main() {", "  var v = f();", "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
   }
+
   void test_propagatedReturnType_function_lessSpecificStaticReturnType() {
     String code = EngineTestCase.createSource(["Object f() => 42;", "main() {", "  var v = f();", "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
+
   void test_propagatedReturnType_function_moreSpecificStaticReturnType() {
     String code = EngineTestCase.createSource([
         "int f(v) => (v as num);",
@@ -640,6 +676,7 @@
         "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
+
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns() {
     String code = EngineTestCase.createSource([
         "f() {",
@@ -651,6 +688,7 @@
         "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
   }
+
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn() {
     String code = EngineTestCase.createSource([
         "f() {",
@@ -662,14 +700,17 @@
         "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
+
   void test_propagatedReturnType_function_noReturnTypeName_expressionBody() {
     String code = EngineTestCase.createSource(["f() => 42;", "main() {", "  var v = f();", "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
+
   void test_propagatedReturnType_localFunction() {
     String code = EngineTestCase.createSource(["main() {", "  f() => 42;", "  var v = f();", "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
+
   void test_query() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'dart:html';",
@@ -697,7 +738,7 @@
     FunctionDeclaration main = unit.declarations[0] as FunctionDeclaration;
     BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[11] as ReturnStatement;
-    NodeList<Expression> elements = ((statement.expression as ListLiteral)).elements;
+    NodeList<Expression> elements = (statement.expression as ListLiteral).elements;
     JUnitTestCase.assertEquals("AnchorElement", elements[0].propagatedType.name);
     JUnitTestCase.assertEquals("AnchorElement", elements[1].propagatedType.name);
     JUnitTestCase.assertEquals("BodyElement", elements[2].propagatedType.name);
@@ -725,6 +766,7 @@
     JUnitTestCase.assertSame(expectedStaticType, identifier.staticType);
     JUnitTestCase.assertSame(expectedPropagatedType, identifier.propagatedType);
   }
+
   static dartSuite() {
     _ut.group('TypePropagationTest', () {
       _ut.test('test_Future_then', () {
@@ -882,6 +924,7 @@
     });
   }
 }
+
 class NonErrorResolverTest extends ResolverTestCase {
   void test_ambiguousExport() {
     Source source = addSource(EngineTestCase.createSource([
@@ -894,6 +937,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_ambiguousExport_combinators_hide() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -905,6 +949,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_ambiguousExport_combinators_show() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -916,24 +961,36 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_ambiguousExport_sameDeclaration() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib.dart';", "export 'lib.dart';"]));
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class N {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    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) {",
@@ -951,6 +1008,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_fieldFormalParameterElement_member() {
     Source source = addSource(EngineTestCase.createSource([
         "class ObjectSink<T> {",
@@ -966,6 +1024,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<K> {",
@@ -977,12 +1036,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_typedef_generic() {
     Source source = addSource(EngineTestCase.createSource(["typedef A<T>(T p);", "f(A<int> a) {", "  a(1);", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_Object_Function() {
     Source source = addSource(EngineTestCase.createSource([
         "main() {",
@@ -993,6 +1054,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_typedef_local() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef A(int p1, String p2);",
@@ -1005,6 +1067,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_typedef_parameter() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef A(int p1, String p2);",
@@ -1015,12 +1078,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_assignmentToFinal_prefixNegate() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  -x;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_assignmentToFinals_importWithPrefix() {
     Source source = addSource(EngineTestCase.createSource([
         "library lib;",
@@ -1033,6 +1098,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_breakWithoutLabelInSwitch() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1047,12 +1113,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_builtInIdentifierAsType_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  dynamic x;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_caseBlockNotTerminated() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int p) {",
@@ -1079,6 +1147,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_caseBlockNotTerminated_lastCase() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int p) {",
@@ -1091,6 +1160,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_caseExpressionTypeImplementsEquals_int() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int i) {",
@@ -1103,6 +1173,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_caseExpressionTypeImplementsEquals_Object() {
     Source source = addSource(EngineTestCase.createSource([
         "class IntWrapper {",
@@ -1120,6 +1191,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_caseExpressionTypeImplementsEquals_String() {
     Source source = addSource(EngineTestCase.createSource([
         "f(String s) {",
@@ -1132,12 +1204,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_concreteClassWithAbstractMember() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_conflictingInstanceGetterAndSuperclassMember_instance() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1150,6 +1224,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1160,6 +1235,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1170,6 +1246,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constConstructorWithNonConstSuper_redirectingFactory() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1185,12 +1262,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constConstructorWithNonFinalField_finalInstanceVar() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  const A();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constConstructorWithNonFinalField_mixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1203,12 +1282,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constConstructorWithNonFinalField_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  const A();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constConstructorWithNonFinalField_syntheticField() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1220,6 +1301,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_constEval_functionTypeLiteral() {
+    Source source = addSource(EngineTestCase.createSource(["typedef F();", "const C = F;"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_constEval_propertyExtraction_fieldStatic_targetType() {
     addSource2("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'math.dart' as math;", "const C = math.PI;"]));
@@ -1227,6 +1316,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constEval_propertyExtraction_methodStatic_targetType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1238,6 +1328,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constEval_symbol() {
     addSource2("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
     Source source = addSource(EngineTestCase.createSource(["const C = #foo;", "foo() {}"]));
@@ -1245,6 +1336,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constEvalTypeBoolNumString_equal() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1273,6 +1365,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_constEvalTypeBoolNumString_notEqual() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1302,18 +1395,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constNotInitialized_field() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static const int x = 0;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constNotInitialized_local() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  const int x = 0;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constructorDeclaration_scope_signature() {
     Source source = addSource(EngineTestCase.createSource([
         "const app = 0;",
@@ -1324,6 +1420,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constWithNonConstantArgument_literals() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1334,6 +1431,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constWithTypeParameters_direct() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -1344,6 +1442,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constWithUndefinedConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1356,6 +1455,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_constWithUndefinedConstructorDefault() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1368,24 +1468,28 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_defaultValueInFunctionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef F([x]);"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_defaultValueInFunctionTypedParameter_named() {
     Source source = addSource(EngineTestCase.createSource(["f(g({p})) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_defaultValueInFunctionTypedParameter_optional() {
     Source source = addSource(EngineTestCase.createSource(["f(g([p])) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_duplicateDefinition_emptyName() {
     Source source = addSource(EngineTestCase.createSource([
         "Map _globalMap = {",
@@ -1396,30 +1500,35 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_duplicateDefinition_getter() {
     Source source = addSource(EngineTestCase.createSource(["bool get a => true;"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_dynamicIdentifier() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = dynamic;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_expectedOneListTypeArgument() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  <int> [];", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_expectedTwoMapTypeArguments() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  <int, int> {};", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_exportOfNonLibrary_libraryDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
@@ -1427,6 +1536,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_exportOfNonLibrary_libraryNotDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
     addSource2("/lib1.dart", EngineTestCase.createSource([""]));
@@ -1434,18 +1544,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_extraPositionalArguments_function() {
     Source source = addSource(EngineTestCase.createSource(["f(p1, p2) {}", "main() {", "  f(1, 2);", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_extraPositionalArguments_Function() {
     Source source = addSource(EngineTestCase.createSource(["f(Function a) {", "  a(1, 2);", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_extraPositionalArguments_typedef_local() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef A(p1, p2);",
@@ -1458,12 +1571,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_extraPositionalArguments_typedef_parameter() {
     Source source = addSource(EngineTestCase.createSource(["typedef A(p1, p2);", "f(A a) {", "  a(1, 2);", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_fieldInitializedByMultipleInitializers() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1475,30 +1590,35 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_fieldInitializedInInitializerAndDeclaration_fieldNotFinal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 0;", "  A() : x = 1 {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_fieldInitializedInInitializerAndDeclaration_finalFieldNotSet() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() : x = 1 {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_fieldInitializerOutsideConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_fieldInitializerOutsideConstructor_defaultParameters() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A([this.x]) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_fieldInitializerRedirectingConstructor_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1512,30 +1632,35 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_finalInitializedInDeclarationAndConstructor_initializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 1 {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_finalNotInitialized_atDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_finalNotInitialized_fieldFormal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_finalNotInitialized_functionTypedFieldFormal() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1546,6 +1671,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_finalNotInitialized_hasNativeClause_hasConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A native 'something' {",
@@ -1556,18 +1682,21 @@
     assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
   }
+
   void test_finalNotInitialized_hasNativeClause_noConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A native 'something' {", "  final int x;", "}"]));
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
   }
+
   void test_finalNotInitialized_initializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() : x = 0 {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_finalNotInitialized_redirectingConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1579,30 +1708,35 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_functionDeclaration_scope_returnType() {
     Source source = addSource(EngineTestCase.createSource(["int f(int) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_functionDeclaration_scope_signature() {
     Source source = addSource(EngineTestCase.createSource(["const app = 0;", "f(@app int app) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_functionTypeAlias_scope_returnType() {
     Source source = addSource(EngineTestCase.createSource(["typedef int f(int);"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_functionTypeAlias_scope_signature() {
     Source source = addSource(EngineTestCase.createSource(["const app = 0;", "typedef int f(@app int app);"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_functionWithoutCall() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A implements Function {",
@@ -1619,6 +1753,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_constructorName() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1632,6 +1767,18 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_implicitThisReferenceInInitializer_importPrefix() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'dart:async' as abstract;",
+        "class A {",
+        "  var v = new abstract.Completer();",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_implicitThisReferenceInInitializer_prefixedIdentifier() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1645,6 +1792,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_qualifiedMethodInvocation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1658,6 +1806,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_qualifiedPropertyAccess() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1671,6 +1820,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_staticField_thisClass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1682,6 +1832,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_staticGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1693,6 +1844,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_staticMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1704,6 +1856,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_topLevelField() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1715,6 +1868,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_topLevelFunction() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1726,6 +1880,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_topLevelGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1737,12 +1892,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_typeParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  var v;", "  A(p) : v = (p is T);", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_importDuplicatedLibraryName() {
     Source source = addSource(EngineTestCase.createSource([
         "library test;",
@@ -1756,6 +1913,7 @@
         HintCode.DUPLICATE_IMPORT]);
     verify([source]);
   }
+
   void test_importOfNonLibrary_libraryDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
     addSource2("/part.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
@@ -1763,6 +1921,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_importOfNonLibrary_libraryNotDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
     addSource2("/part.dart", EngineTestCase.createSource(["class A {}"]));
@@ -1770,6 +1929,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_importPrefixes_withFirstLetterDifference() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -1785,6 +1945,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_inconsistentCaseExpressionTypes() {
     Source source = addSource(EngineTestCase.createSource([
         "f(var p) {",
@@ -1799,6 +1960,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_accessors_typeParameter2() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A<E> {",
@@ -1813,6 +1975,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_accessors_typeParameters_diamond() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class F<E> extends B<E> {}",
@@ -1831,6 +1994,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_accessors_typeParameters1() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A<E> {",
@@ -1846,6 +2010,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_methods_typeParameter2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -1861,6 +2026,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_methods_typeParameters1() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -1876,6 +2042,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_simple() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -1891,12 +2058,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_initializingFormalForNonExistantField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_instanceAccessToStaticMember_fromComment() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1909,12 +2078,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_instanceAccessToStaticMember_topLevel() {
     Source source = addSource(EngineTestCase.createSource(["m() {}", "main() {", "  m();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_instanceMemberAccessFromStatic_fromComment() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1927,6 +2098,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart';",
@@ -1938,6 +2110,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart';",
@@ -1949,20 +2122,46 @@
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source]);
   }
-  void test_invalidAnnotation_constantVariable() {
+
+  void test_invalidAnnotation_constantVariable_field() {
+    Source source = addSource(EngineTestCase.createSource(["@A.C", "class A {", "  static const C = 0;", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constantVariable_field_importWithPrefix() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  static const C = 0;", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.A.C", "main() {", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constantVariable_topLevel() {
     Source source = addSource(EngineTestCase.createSource(["const C = 0;", "@C", "main() {", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
-  void test_invalidAnnotation_importWithPrefix_constantVariable() {
+
+  void test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "const C = 0;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.C", "main() {", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
-  void test_invalidAnnotation_importWithPrefix_constConstructor() {
+
+  void test_invalidAnnotation_constConstructor_importWithPrefix() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  const A(int p);", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.A(42)", "main() {", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constConstructor_named_importWithPrefix() {
     addSource2("/lib.dart", EngineTestCase.createSource([
         "library lib;",
         "class A {",
@@ -1977,12 +2176,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidAssignment() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var x;", "  var y;", "  x = y;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidAssignment_compoundAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "class byte {",
@@ -1999,30 +2200,35 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidAssignment_defaultValue_named() {
     Source source = addSource(EngineTestCase.createSource(["f({String x: '0'}) {", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidAssignment_defaultValue_optional() {
     Source source = addSource(EngineTestCase.createSource(["f([String x = '0']) {", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidAssignment_toDynamic() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var g;", "  g = () => 0;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidFactoryNameNotAClass() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidMethodOverrideNamedParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2035,6 +2241,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideDifferentDefaultValues_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2047,6 +2254,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_invalidOverrideDifferentDefaultValues_named_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "nothing() => 'nothing';",
+        "class A {",
+        "  thing(String a, {orElse : nothing}) {}",
+        "}",
+        "class B extends A {",
+        "  thing(String a, {orElse : nothing}) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_invalidOverrideDifferentDefaultValues_positional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2059,6 +2281,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideDifferentDefaultValues_positional_changedOrder() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2071,6 +2294,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_invalidOverrideDifferentDefaultValues_positional_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "nothing() => 'nothing';",
+        "class A {",
+        "  thing(String a, [orElse = nothing]) {}",
+        "}",
+        "class B extends A {",
+        "  thing(String a, [orElse = nothing]) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_invalidOverrideNamed_unorderedNamedParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2083,6 +2321,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideRequired_less() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2095,6 +2334,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideRequired_same() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2107,6 +2347,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_interface() {
     Source source = addSource2("/test.dart", EngineTestCase.createSource([
         "abstract class A {",
@@ -2119,6 +2360,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_interface2() {
     Source source = addSource2("/test.dart", EngineTestCase.createSource([
         "abstract class A {",
@@ -2133,6 +2375,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_mixin() {
     Source source = addSource2("/test.dart", EngineTestCase.createSource([
         "class A {",
@@ -2145,6 +2388,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_parameterizedTypes() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A<E> {",
@@ -2157,6 +2401,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_sameType() {
     Source source = addSource2("/test.dart", EngineTestCase.createSource([
         "class A {",
@@ -2169,6 +2414,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_superclass() {
     Source source = addSource2("/test.dart", EngineTestCase.createSource([
         "class A {",
@@ -2181,6 +2427,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_superclass2() {
     Source source = addSource2("/test.dart", EngineTestCase.createSource([
         "class A {",
@@ -2195,6 +2442,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidOverrideReturnType_returnType_void() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2207,18 +2455,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_constructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {", "    var v = this;", "  }", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_instanceMethod() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {", "    var v = this;", "  }", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidTypeArgumentForKey() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2230,6 +2481,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidTypeArgumentInConstList() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -2241,6 +2493,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invalidTypeArgumentInConstMap() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -2252,6 +2505,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_dynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2266,6 +2520,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2279,18 +2534,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var g;", "  g();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_localVariable_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  var v = f;", "  v();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_localVariable_dynamic2() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {}",
@@ -2303,30 +2561,35 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_Object() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  Object v = null;", "  v();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_listElementTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v1 = <int> [42];", "var v2 = const <int> [42];"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_mapKeyTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = <String, int > {'a' : 1};"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_memberWithClassName_setter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set A(v) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_methodDeclaration_scope_signature() {
     Source source = addSource(EngineTestCase.createSource([
         "const app = 0;",
@@ -2337,6 +2600,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_misMatchedGetterAndSetterTypes_instance_sameTypes() {
     Source source = addSource(EngineTestCase.createSource([
         "class C {",
@@ -2347,36 +2611,42 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_misMatchedGetterAndSetterTypes_instance_unspecifiedGetter() {
     Source source = addSource(EngineTestCase.createSource(["class C {", "  get x => 0;", "  set x(String v) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_misMatchedGetterAndSetterTypes_instance_unspecifiedSetter() {
     Source source = addSource(EngineTestCase.createSource(["class C {", "  int get x => 0;", "  set x(v) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_misMatchedGetterAndSetterTypes_topLevel_sameTypes() {
     Source source = addSource(EngineTestCase.createSource(["int get x => 0;", "set x(int v) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedGetter() {
     Source source = addSource(EngineTestCase.createSource(["get x => 0;", "set x(String v) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter() {
     Source source = addSource(EngineTestCase.createSource(["int get x => 0;", "set x(v) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_mixedReturnTypes_differentScopes() {
     Source source = addSource(EngineTestCase.createSource([
         "class C {",
@@ -2392,6 +2662,33 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_mixedReturnTypes_ignoreImplicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(bool p) {",
+        "  if (p) return 42;",
+        "  // implicit 'return;' is ignored",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_ignoreImplicit2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(bool p) {",
+        "  if (p) {",
+        "    return 42;",
+        "  } else {",
+        "    return 42;",
+        "  }",
+        "  // implicit 'return;' is ignored",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_mixedReturnTypes_sameKind() {
     Source source = addSource(EngineTestCase.createSource([
         "class C {",
@@ -2406,6 +2703,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_mixinDeclaresConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2416,6 +2714,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_mixinDeclaresConstructor_factory() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2426,6 +2725,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_mixinInheritsFromNotObject_classDeclaration_mixTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -2435,6 +2735,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_mixinInheritsFromNotObject_typedef_mixTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -2444,12 +2745,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_multipleSuperInitializers_no() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B() {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_multipleSuperInitializers_single() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -2460,6 +2763,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_newWithAbstractClass_factory() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -2475,6 +2779,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_newWithUndefinedConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2487,12 +2792,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_newWithUndefinedConstructorDefault() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "f() {", "  new A();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_accessor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2507,6 +2814,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2521,6 +2829,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_accessor() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -2533,6 +2842,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_method() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -2545,6 +2855,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonBoolExpression_functionType() {
     Source source = addSource(EngineTestCase.createSource([
         "bool makeAssertion() => true;",
@@ -2555,12 +2866,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonBoolExpression_interfaceType() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  assert(true);", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonBoolNegationExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "f(bool pb, pd) {",
@@ -2573,42 +2886,49 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_function_named() {
     Source source = addSource(EngineTestCase.createSource(["f({x : 2 + 3}) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_function_positional() {
     Source source = addSource(EngineTestCase.createSource(["f([x = 2 + 3]) {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_inConstructor_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A({x : 2 + 3}) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_inConstructor_positional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A([x = 2 + 3]) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_method_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m({x : 2 + 3}) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_method_positional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m([x = 2 + 3]) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstantValueInInitializer_namedArgument() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2622,6 +2942,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstCaseExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "f(Type t) {",
@@ -2637,24 +2958,28 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstMapAsExpressionStatement_const() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  const {'a' : 0, 'b' : 1};", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstMapAsExpressionStatement_notExpressionStatement() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var m = {'a' : 0, 'b' : 1};", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstMapAsExpressionStatement_typeArguments() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  <String, int> {'a' : 0, 'b' : 1};", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_binary_bool() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2668,6 +2993,7 @@
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_binary_dynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2696,6 +3022,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_nonConstValueInInitializer_binary_int() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2715,6 +3042,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_binary_num() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2744,6 +3072,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2754,6 +3083,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_redirecting() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2764,6 +3094,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2776,6 +3107,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_unary() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2788,6 +3120,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonGenerativeConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2801,6 +3134,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonTypeInCatchClause_isClass() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -2812,6 +3146,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonTypeInCatchClause_isFunctionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef F();",
@@ -2824,6 +3159,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonTypeInCatchClause_isTypeParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -2837,53 +3173,62 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonTypeInCatchClause_noType() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } catch (e) {", "  }", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonVoidReturnForOperator_no() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonVoidReturnForOperator_void() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void operator []=(a, b) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonVoidReturnForSetter_function_no() {
     Source source = addSource("set x(v) {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonVoidReturnForSetter_function_void() {
     Source source = addSource("void set x(v) {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonVoidReturnForSetter_method_no() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(v) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_nonVoidReturnForSetter_method_void() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void set x(v) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_null_callMethod() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  null.m();", "}"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_null_callOperator() {
     Source source = addSource(EngineTestCase.createSource([
         "main() {",
@@ -2894,12 +3239,14 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_optionalParameterInOperator_required() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +(p) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_prefixCollidesWithTopLevelMembers() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -2913,6 +3260,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_propagateTypeArgs_intoBounds() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A<E> {}",
@@ -2923,6 +3271,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_propagateTypeArgs_intoSupertype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -2937,10 +3286,10 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_proxy_annotation_prefixed() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
-        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "f(A a) {",
@@ -2951,17 +3300,13 @@
         "  a++;",
         "  ++a;",
         "}"]));
-    addSource2("/meta.dart", EngineTestCase.createSource([
-        "library meta;",
-        "const proxy = const _Proxy();",
-        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_proxy_annotation_prefixed2() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
-        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "class B {",
@@ -2974,17 +3319,13 @@
         "    ++a;",
         "  }",
         "}"]));
-    addSource2("/meta.dart", EngineTestCase.createSource([
-        "library meta;",
-        "const proxy = const _Proxy();",
-        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_proxy_annotation_prefixed3() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
-        "import 'meta.dart';",
         "class B {",
         "  f(A a) {",
         "    a.m();",
@@ -2997,17 +3338,13 @@
         "}",
         "@proxy",
         "class A {}"]));
-    addSource2("/meta.dart", EngineTestCase.createSource([
-        "library meta;",
-        "const proxy = const _Proxy();",
-        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_proxy_annotation_simple() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
-        "import 'meta.dart';",
         "@proxy",
         "class B {",
         "  m() {",
@@ -3017,13 +3354,10 @@
         "    var y = this + this;",
         "  }",
         "}"]));
-    addSource2("/meta.dart", EngineTestCase.createSource([
-        "library meta;",
-        "const proxy = const _Proxy();",
-        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_recursiveConstructorRedirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3035,6 +3369,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_recursiveFactoryRedirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3050,6 +3385,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_redirectToInvalidFunctionType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B {",
@@ -3062,6 +3398,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_redirectToInvalidReturnType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3074,6 +3411,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_redirectToNonConstConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3084,6 +3422,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_referenceToDeclaredVariableInInitializer_constructorName() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3096,6 +3435,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_referenceToDeclaredVariableInInitializer_methodName() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3108,6 +3448,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_referenceToDeclaredVariableInInitializer_propertyName() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3120,6 +3461,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_rethrowOutsideCatch() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3131,12 +3473,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnInGenerativeConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return; }", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnOfInvalidType_dynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "class TypeError {}",
@@ -3155,6 +3499,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnOfInvalidType_dynamicAsTypeArgument() {
     Source source = addSource(EngineTestCase.createSource([
         "class I<T> {",
@@ -3166,6 +3511,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnOfInvalidType_subtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -3175,6 +3521,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnOfInvalidType_supertype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -3184,6 +3531,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnOfInvalidType_void() {
     Source source = addSource(EngineTestCase.createSource([
         "void f1() {}",
@@ -3198,18 +3546,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnWithoutValue_noReturnType() {
     Source source = addSource(EngineTestCase.createSource(["f() { return; }"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_returnWithoutValue_void() {
     Source source = addSource(EngineTestCase.createSource(["void f() { return; }"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_reversedTypeArguments() {
     Source source = addSource(EngineTestCase.createSource([
         "class Codec<S1, T1> {",
@@ -3222,6 +3573,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_annotation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3234,6 +3586,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3247,6 +3600,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_propertyAccess_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3260,6 +3614,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_propertyAccess_propertyAccessor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3274,6 +3629,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_superInInvalidContext() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3291,12 +3647,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef B A();", "class B {", "  A a;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -3309,6 +3667,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_new() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -3319,24 +3678,28 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_typeArgumentList_0() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A<T extends A>{}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_typeArgumentList_1() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A<T extends A<A>>{}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_typeArgumentList_20() {
     Source source = addSource(EngineTestCase.createSource(["abstract class A<T extends A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A>>>>>>>>>>>>>>>>>>>>>{}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_booleanAnd_useInRight() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -3346,6 +3709,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_noAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "callMe(f()) { f(); }",
@@ -3356,12 +3720,30 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_typePromotion_conditional_issue14655() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "class C extends B {",
+        "  mc() {}",
+        "}",
+        "print(_) {}",
+        "main(A p) {",
+        "  (p is C) && (print(() => p) && (p is B)) ? p.mc() : p = null;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_typePromotion_conditional_useInThen() {
     Source source = addSource(EngineTestCase.createSource(["main(Object p) {", "  p is String ? p.length : 0;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_conditional_useInThen_accessedInClosure_noAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "callMe(f()) { f(); }",
@@ -3372,6 +3754,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_functionType_arg_ignoreIfNotMoreSpecific() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef FuncB(B b);",
@@ -3387,20 +3770,22 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_functionType_return_ignoreIfNotMoreSpecific() {
     Source source = addSource(EngineTestCase.createSource([
-        "typedef FuncDynToDyn(x);",
-        "typedef void FuncDynToVoid(x);",
         "class A {}",
-        "main(FuncDynToDyn f) {",
-        "  if (f is FuncDynToVoid) {",
-        "    A a = f(null);",
+        "typedef FuncAtoDyn(A a);",
+        "typedef FuncDynToDyn(x);",
+        "main(FuncAtoDyn f) {",
+        "  if (f is FuncDynToDyn) {",
+        "    A a = f(new A());",
         "  }",
         "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_functionType_return_voidToDynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef FuncDynToDyn(x);",
@@ -3415,6 +3800,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_accessedInClosure_noAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "callMe(f()) { f(); }",
@@ -3429,6 +3815,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_extends_moreSpecific() {
     Source source = addSource(EngineTestCase.createSource([
         "class V {}",
@@ -3447,6 +3834,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_hasAssignment_outsideAfter() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -3459,6 +3847,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_hasAssignment_outsideBefore() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p, Object p2) {",
@@ -3471,6 +3860,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_implements_moreSpecific() {
     Source source = addSource(EngineTestCase.createSource([
         "class V {}",
@@ -3489,6 +3879,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_inClosure_assignedAfter_inSameFunction() {
     Source source = addSource(EngineTestCase.createSource([
         "main() {",
@@ -3503,6 +3894,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_is_and_left() {
     Source source = addSource(EngineTestCase.createSource([
         "bool tt() => true;",
@@ -3515,6 +3907,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_is_and_right() {
     Source source = addSource(EngineTestCase.createSource([
         "bool tt() => true;",
@@ -3527,6 +3920,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_is_and_subThenSuper() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3545,6 +3939,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_is_parenthesized() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -3556,6 +3951,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typePromotion_if_is_single() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -3567,12 +3963,27 @@
     assertNoErrors(source);
     verify([source]);
   }
+
+  void test_typePromotion_parentheses() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  (p is String) ? p.length : 0;",
+        "  (p) is String ? p.length : 0;",
+        "  ((p)) is String ? p.length : 0;",
+        "  ((p) is String) ? p.length : 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_typeType_class() {
     Source source = addSource(EngineTestCase.createSource(["class C {}", "f(Type t) {}", "main() {", "  f(C);", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeType_class_prefixed() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -3585,6 +3996,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeType_functionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef F();",
@@ -3596,6 +4008,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_typeType_functionTypeAlias_prefixed() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef F();"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -3608,6 +4021,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_explicit_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3620,6 +4034,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_explicit_unnamed() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3632,6 +4047,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_hasOptionalParameters() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3644,6 +4060,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_implicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3656,6 +4073,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_implicit_typeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "class M {}",
@@ -3667,6 +4085,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_redirecting() {
     Source source = addSource(EngineTestCase.createSource([
         "class Foo {",
@@ -3680,6 +4099,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedGetter_typeSubstitution() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -3694,6 +4114,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedIdentifier_hide() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' hide a;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
@@ -3701,6 +4122,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedIdentifier_show() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' show a;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
@@ -3708,16 +4130,19 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedMethod_functionExpression_callMethod() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  (() => null).call();", "}"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedMethod_functionExpression_directCall() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  (() => null)();", "}"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedOperator_index() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3732,12 +4157,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedOperator_tilde() {
     Source source = addSource(EngineTestCase.createSource(["const A = 3;", "const B = ~((1 << A) - 1);"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedSetter_importWithPrefix() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "set y(int value) {}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as x;", "main() {", "  x.y = 0;", "}"]));
@@ -3745,6 +4172,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedSuperMethod_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3759,6 +4187,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_undefinedSuperMethod_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3773,6 +4202,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3786,16 +4216,19 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForOperator_index() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForOperator_minus() {
     check_wrongNumberOfParametersForOperator("-", "");
     check_wrongNumberOfParametersForOperator("-", "a");
   }
+
   void test_wrongNumberOfParametersForOperator1() {
     check_wrongNumberOfParametersForOperator1("<");
     check_wrongNumberOfParametersForOperator1(">");
@@ -3813,12 +4246,14 @@
     check_wrongNumberOfParametersForOperator1(">>");
     check_wrongNumberOfParametersForOperator1("[]");
   }
+
   void test_wrongNumberOfParametersForSetter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void check_wrongNumberOfParametersForOperator(String name, String parameters) {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
     resolve(source);
@@ -3826,9 +4261,11 @@
     verify([source]);
     reset();
   }
+
   void check_wrongNumberOfParametersForOperator1(String name) {
     check_wrongNumberOfParametersForOperator(name, "a");
   }
+
   static dartSuite() {
     _ut.group('NonErrorResolverTest', () {
       _ut.test('test_ambiguousExport', () {
@@ -3843,6 +4280,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_ambiguousExport_combinators_show);
       });
+      _ut.test('test_ambiguousExport_sameDeclaration', () {
+        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);
@@ -3963,6 +4404,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_notEqual);
       });
+      _ut.test('test_constEval_functionTypeLiteral', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constEval_functionTypeLiteral);
+      });
       _ut.test('test_constEval_propertyExtraction_fieldStatic_targetType', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constEval_propertyExtraction_fieldStatic_targetType);
@@ -4143,6 +4588,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_constructorName);
       });
+      _ut.test('test_implicitThisReferenceInInitializer_importPrefix', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_importPrefix);
+      });
       _ut.test('test_implicitThisReferenceInInitializer_prefixedIdentifier', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_prefixedIdentifier);
@@ -4251,17 +4700,29 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_instanceMethodNameCollidesWithSuperclassStatic_method);
       });
-      _ut.test('test_invalidAnnotation_constantVariable', () {
+      _ut.test('test_invalidAnnotation_constConstructor_importWithPrefix', () {
         final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_constantVariable);
+        runJUnitTest(__test, __test.test_invalidAnnotation_constConstructor_importWithPrefix);
       });
-      _ut.test('test_invalidAnnotation_importWithPrefix_constConstructor', () {
+      _ut.test('test_invalidAnnotation_constConstructor_named_importWithPrefix', () {
         final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_constConstructor);
+        runJUnitTest(__test, __test.test_invalidAnnotation_constConstructor_named_importWithPrefix);
       });
-      _ut.test('test_invalidAnnotation_importWithPrefix_constantVariable', () {
+      _ut.test('test_invalidAnnotation_constantVariable_field', () {
         final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_constantVariable);
+        runJUnitTest(__test, __test.test_invalidAnnotation_constantVariable_field);
+      });
+      _ut.test('test_invalidAnnotation_constantVariable_field_importWithPrefix', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_constantVariable_field_importWithPrefix);
+      });
+      _ut.test('test_invalidAnnotation_constantVariable_topLevel', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_constantVariable_topLevel);
+      });
+      _ut.test('test_invalidAnnotation_constantVariable_topLevel_importWithPrefix', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_constantVariable_topLevel_importWithPrefix);
       });
       _ut.test('test_invalidAssignment', () {
         final __test = new NonErrorResolverTest();
@@ -4295,6 +4756,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_named);
       });
+      _ut.test('test_invalidOverrideDifferentDefaultValues_named_function', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_named_function);
+      });
       _ut.test('test_invalidOverrideDifferentDefaultValues_positional', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_positional);
@@ -4303,6 +4768,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_positional_changedOrder);
       });
+      _ut.test('test_invalidOverrideDifferentDefaultValues_positional_function', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_positional_function);
+      });
       _ut.test('test_invalidOverrideNamed_unorderedNamedParameter', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidOverrideNamed_unorderedNamedParameter);
@@ -4435,6 +4904,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_mixedReturnTypes_differentScopes);
       });
+      _ut.test('test_mixedReturnTypes_ignoreImplicit', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_mixedReturnTypes_ignoreImplicit);
+      });
+      _ut.test('test_mixedReturnTypes_ignoreImplicit2', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_mixedReturnTypes_ignoreImplicit2);
+      });
       _ut.test('test_mixedReturnTypes_sameKind', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_mixedReturnTypes_sameKind);
@@ -4787,6 +5264,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_noAssignment);
       });
+      _ut.test('test_typePromotion_conditional_issue14655', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_conditional_issue14655);
+      });
       _ut.test('test_typePromotion_conditional_useInThen', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_conditional_useInThen);
@@ -4851,6 +5332,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_is_single);
       });
+      _ut.test('test_typePromotion_parentheses', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_parentheses);
+      });
       _ut.test('test_typeType_class', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typeType_class);
@@ -4954,8 +5439,8 @@
     });
   }
 }
-class LibraryTest extends EngineTestCase {
 
+class LibraryTest extends EngineTestCase {
   /**
    * The error listener to which all errors will be reported.
    */
@@ -4975,6 +5460,7 @@
    * The library used by the tests.
    */
   Library _library5;
+
   void setUp() {
     _sourceFactory = new SourceFactory.con2([new FileUriResolver()]);
     _analysisContext = new AnalysisContextImpl();
@@ -4982,24 +5468,29 @@
     _errorListener = new GatheringErrorListener();
     _library5 = library("/lib.dart");
   }
+
   void test_getExplicitlyImportsCore() {
     JUnitTestCase.assertFalse(_library5.explicitlyImportsCore);
     _errorListener.assertNoErrors();
   }
+
   void test_getExports() {
     EngineTestCase.assertLength(0, _library5.exports);
     _errorListener.assertNoErrors();
   }
+
   void test_getImports() {
     EngineTestCase.assertLength(0, _library5.imports);
     _errorListener.assertNoErrors();
   }
+
   void test_getImportsAndExports() {
     _library5.importedLibraries = <Library> [library("/imported.dart")];
     _library5.exportedLibraries = <Library> [library("/exported.dart")];
     EngineTestCase.assertLength(2, _library5.importsAndExports);
     _errorListener.assertNoErrors();
   }
+
   void test_getLibraryScope() {
     LibraryElementImpl element = new LibraryElementImpl(_analysisContext, ASTFactory.libraryIdentifier2(["lib"]));
     element.definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
@@ -5007,14 +5498,17 @@
     JUnitTestCase.assertNotNull(_library5.libraryScope);
     _errorListener.assertNoErrors();
   }
+
   void test_getLibrarySource() {
     JUnitTestCase.assertNotNull(_library5.librarySource);
   }
+
   void test_setExplicitlyImportsCore() {
     _library5.explicitlyImportsCore = true;
     JUnitTestCase.assertTrue(_library5.explicitlyImportsCore);
     _errorListener.assertNoErrors();
   }
+
   void test_setExportedLibraries() {
     Library exportLibrary = library("/exported.dart");
     _library5.exportedLibraries = <Library> [exportLibrary];
@@ -5023,6 +5517,7 @@
     JUnitTestCase.assertSame(exportLibrary, exports[0]);
     _errorListener.assertNoErrors();
   }
+
   void test_setImportedLibraries() {
     Library importLibrary = library("/imported.dart");
     _library5.importedLibraries = <Library> [importLibrary];
@@ -5031,12 +5526,15 @@
     JUnitTestCase.assertSame(importLibrary, imports[0]);
     _errorListener.assertNoErrors();
   }
+
   void test_setLibraryElement() {
     LibraryElementImpl element = new LibraryElementImpl(_analysisContext, ASTFactory.libraryIdentifier2(["lib"]));
     _library5.libraryElement = element;
     JUnitTestCase.assertSame(element, _library5.libraryElement);
   }
+
   Library library(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(_sourceFactory.contentCache, FileUtilities2.createFile(definingCompilationUnitPath)));
+
   static dartSuite() {
     _ut.group('LibraryTest', () {
       _ut.test('test_getExplicitlyImportsCore', () {
@@ -5082,6 +5580,163 @@
     });
   }
 }
+
+class DeclarationMatcherTest extends ResolverTestCase {
+  void test_compilationUnitMatches_false_topLevelVariable() {
+    assertCompilationUnitMatches(false, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "const int ZERO = 0;",
+        "class C {",
+        "  int m(int p) {",
+        "    return (p * p) + (p * p) + ZERO;",
+        "  }",
+        "}"]));
+  }
+
+  void test_compilationUnitMatches_true_different() {
+    assertCompilationUnitMatches(true, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return (p * p) + (p * p);",
+        "  }",
+        "}"]));
+  }
+
+  void test_compilationUnitMatches_true_same() {
+    String content = EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]);
+    assertCompilationUnitMatches(true, content, content);
+  }
+
+  void test_methodDeclarationMatches_false_localVariable() {
+    assertMethodMatches(false, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    int product = p * p;",
+        "    return product + product;",
+        "  }",
+        "}"]));
+  }
+
+  void test_methodDeclarationMatches_false_parameter() {
+    assertMethodMatches(false, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p, int q) {",
+        "    return (p * q) + (q * p);",
+        "  }",
+        "}"]));
+  }
+
+  void test_methodDeclarationMatches_true_different() {
+    assertMethodMatches(true, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return (p * p) + (p * p);",
+        "  }",
+        "}"]));
+  }
+
+  void test_methodDeclarationMatches_true_same() {
+    String content = EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]);
+    assertMethodMatches(true, content, content);
+  }
+
+  void assertCompilationUnitMatches(bool expectMatch, String oldContent, String newContent) {
+    Source source = addSource(oldContent);
+    LibraryElement library = resolve(source);
+    CompilationUnit oldUnit = resolveCompilationUnit(source, library);
+    AnalysisContext context = analysisContext;
+    context.setContents(source, newContent);
+    CompilationUnit newUnit = context.parseCompilationUnit(source);
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newUnit, oldUnit.element));
+  }
+
+  void assertMethodMatches(bool expectMatch, String oldContent, String newContent) {
+    Source source = addSource(oldContent);
+    LibraryElement library = resolve(source);
+    CompilationUnit oldUnit = resolveCompilationUnit(source, library);
+    MethodElement element = getMethod2(oldUnit).element as MethodElement;
+    AnalysisContext context = analysisContext;
+    context.setContents(source, newContent);
+    CompilationUnit newUnit = context.parseCompilationUnit(source);
+    MethodDeclaration newMethod = getMethod2(newUnit);
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newMethod, element));
+  }
+
+  MethodDeclaration getMethod2(CompilationUnit unit) {
+    ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
+    return classNode.members[0] as MethodDeclaration;
+  }
+
+  static dartSuite() {
+    _ut.group('DeclarationMatcherTest', () {
+      _ut.test('test_compilationUnitMatches_false_topLevelVariable', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_compilationUnitMatches_false_topLevelVariable);
+      });
+      _ut.test('test_compilationUnitMatches_true_different', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_compilationUnitMatches_true_different);
+      });
+      _ut.test('test_compilationUnitMatches_true_same', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_compilationUnitMatches_true_same);
+      });
+      _ut.test('test_methodDeclarationMatches_false_localVariable', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_false_localVariable);
+      });
+      _ut.test('test_methodDeclarationMatches_false_parameter', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_false_parameter);
+      });
+      _ut.test('test_methodDeclarationMatches_true_different', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_true_different);
+      });
+      _ut.test('test_methodDeclarationMatches_true_same', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_true_same);
+      });
+    });
+  }
+}
+
 class StaticTypeWarningCodeTest extends ResolverTestCase {
   void fail_inaccessibleSetter() {
     Source source = addSource(EngineTestCase.createSource([]));
@@ -5089,24 +5744,28 @@
     assertErrors(source, [StaticTypeWarningCode.INACCESSIBLE_SETTER]);
     verify([source]);
   }
+
   void test_expectedOneListTypeArgument() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  <int, int> [];", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
     verify([source]);
   }
+
   void test_expectedTwoMapTypeArguments_one() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  <int> {};", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
     verify([source]);
   }
+
   void test_expectedTwoMapTypeArguments_three() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  <int, int, int> {};", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_paramCount() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -5121,6 +5780,7 @@
     assertErrors(source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_paramType() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -5134,6 +5794,7 @@
     assertErrors(source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritance_returnType() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -5147,6 +5808,7 @@
     assertErrors(source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
+
   void test_instanceAccessToStaticMember_method_invocation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5159,6 +5821,7 @@
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_instanceAccessToStaticMember_method_reference() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5171,6 +5834,7 @@
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_instanceAccessToStaticMember_propertyAccess_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5183,6 +5847,7 @@
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_instanceAccessToStaticMember_propertyAccess_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5195,6 +5860,7 @@
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_instanceAccessToStaticMember_propertyAccess_setter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5207,6 +5873,7 @@
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_invalidAssignment_compoundAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "class byte {",
@@ -5223,18 +5890,21 @@
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invalidAssignment_defaultValue_named() {
     Source source = addSource(EngineTestCase.createSource(["f({String x: 0}) {", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invalidAssignment_defaultValue_optional() {
     Source source = addSource(EngineTestCase.createSource(["f([String x = 0]) {", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invalidAssignment_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5248,12 +5918,14 @@
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invalidAssignment_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  int x;", "  x = '0';", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invalidAssignment_staticVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5266,29 +5938,34 @@
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invalidAssignment_topLevelVariableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["int x = 'string';"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invalidAssignment_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 'string';", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_class() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {", "    A();", "  }", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
+
   void test_invocationOfNonFunction_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  int x;", "  return x();", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     verify([source]);
   }
+
   void test_invocationOfNonFunction_ordinaryInvocation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5302,6 +5979,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
+
   void test_invocationOfNonFunction_staticInvocation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5313,6 +5991,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
+
   void test_invocationOfNonFunction_superExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5327,36 +6006,42 @@
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     verify([source]);
   }
+
   void test_invocationOfNonFunctionExpression_literal() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  3(5);", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION]);
     verify([source]);
   }
+
   void test_nonBoolCondition_conditional() {
     Source source = addSource(EngineTestCase.createSource(["f() { return 3 ? 2 : 1; }"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
+
   void test_nonBoolCondition_do() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  do {} while (3);", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
+
   void test_nonBoolCondition_if() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  if (3) return 2; else return 1;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
+
   void test_nonBoolCondition_while() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  while (3) {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
+
   void test_nonBoolExpression_functionType() {
     Source source = addSource(EngineTestCase.createSource([
         "int makeAssertion() => 1;",
@@ -5367,42 +6052,49 @@
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
     verify([source]);
   }
+
   void test_nonBoolExpression_interfaceType() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  assert(0);", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
     verify([source]);
   }
+
   void test_nonBoolNegationExpression() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  !42;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION]);
     verify([source]);
   }
+
   void test_nonTypeAsTypeArgument_notAType() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B<E> {}", "f(B<A> b) {}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
     verify([source]);
   }
+
   void test_nonTypeAsTypeArgument_undefinedIdentifier() {
     Source source = addSource(EngineTestCase.createSource(["class B<E> {}", "f(B<A> b) {}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_expressionFunctionBody_function() {
     Source source = addSource(EngineTestCase.createSource(["int f() => '0';"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_expressionFunctionBody_getter() {
     Source source = addSource(EngineTestCase.createSource(["int get g => '0';"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_expressionFunctionBody_localFunction() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5414,30 +6106,35 @@
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_expressionFunctionBody_method() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int f() => '0';", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_expressionFunctionBody_void() {
     Source source = addSource(EngineTestCase.createSource(["void f() => 42;"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_function() {
     Source source = addSource(EngineTestCase.createSource(["int f() { return '0'; }"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_getter() {
     Source source = addSource(EngineTestCase.createSource(["int get g { return '0'; }"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_localFunction() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5449,18 +6146,21 @@
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_method() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int f() { return '0'; }", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_returnOfInvalidType_void() {
     Source source = addSource(EngineTestCase.createSource(["void f() { return 42; }"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_classTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5472,6 +6172,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_extends() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5482,6 +6183,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_fieldFormalParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5495,6 +6197,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_functionReturnType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5505,6 +6208,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_functionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5515,6 +6219,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_functionTypedFormalParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5525,6 +6230,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_implements() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5535,6 +6241,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_is() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5545,6 +6252,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_methodReturnType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5557,6 +6265,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_new() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5567,6 +6276,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5578,6 +6288,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_parameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5588,6 +6299,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_redirectingConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5600,6 +6312,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_typeArgumentList() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5611,6 +6324,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_typeParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5622,6 +6336,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5632,6 +6347,7 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_with() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5642,12 +6358,14 @@
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_typeParameterSupertypeOfItsBound() {
     Source source = addSource(EngineTestCase.createSource(["class A<T extends T> {", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND]);
     verify([source]);
   }
+
   void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated() {
     Source source = addSource(EngineTestCase.createSource([
         "callMe(f()) { f(); }",
@@ -5658,6 +6376,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_booleanAnd_useInRight_mutatedInLeft() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5666,6 +6385,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_booleanAnd_useInRight_mutatedInRight() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5674,6 +6394,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after() {
     Source source = addSource(EngineTestCase.createSource([
         "callMe(f()) { f(); }",
@@ -5684,6 +6405,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before() {
     Source source = addSource(EngineTestCase.createSource([
         "callMe(f()) { f(); }",
@@ -5694,6 +6416,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_conditional_useInThen_hasAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5702,6 +6425,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_accessedInClosure_hasAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "callMe(f()) { f(); }",
@@ -5716,6 +6440,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_and_right_hasAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5726,6 +6451,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_extends_notMoreSpecific_dynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "class V {}",
@@ -5742,6 +6468,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() {
     Source source = addSource(EngineTestCase.createSource([
         "class V {}",
@@ -5758,6 +6485,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_hasAssignment_after() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5769,6 +6497,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_hasAssignment_before() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5780,6 +6509,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5791,6 +6521,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5802,6 +6533,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_hasAssignment_inClosure_function_after() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5813,6 +6545,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_hasAssignment_inClosure_function_before() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5824,6 +6557,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_implements_notMoreSpecific_dynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "class V {}",
@@ -5840,6 +6574,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_typePromotion_if_with_notMoreSpecific_dynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "class V {}",
@@ -5856,21 +6591,25 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e) { return e.m; }"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_undefinedGetter_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "var a = A.B;"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+
   void test_undefinedMethod() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {", "    n();", "  }", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
+
   void test_undefinedMethod_assignmentExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5883,6 +6622,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
+
   void test_undefinedMethod_ignoreTypePropagation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5898,6 +6638,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
+
   void test_undefinedMethod_private() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  _foo() {}", "}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -5910,46 +6651,55 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
+
   void test_undefinedOperator_indexBoth() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0]++;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_indexGetter() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0];", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_indexSetter() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0] = 1;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_plus() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a + 1;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_postfixExpression() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a++;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_prefixExpression() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  ++a;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedSetter() {
     Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e1) { e1.m = 0; }"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
+
   void test_undefinedSetter_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f() { A.B = 0;}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
+
   void test_undefinedSuperMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5959,6 +6709,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
   }
+
   void test_unqualifiedReferenceToNonLocalStaticMember_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5973,6 +6724,7 @@
     assertErrors(source, [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_unqualifiedReferenceToNonLocalStaticMember_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -5987,6 +6739,7 @@
     assertErrors(source, [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_unqualifiedReferenceToNonLocalStaticMember_setter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -6001,18 +6754,21 @@
     assertErrors(source, [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
     verify([source]);
   }
+
   void test_wrongNumberOfTypeArguments_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["class A<E, F> {}", "A<A> a = null;"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
+
   void test_wrongNumberOfTypeArguments_tooMany() {
     Source source = addSource(EngineTestCase.createSource(["class A<E> {}", "A<A, A> a = null;"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
+
   void test_wrongNumberOfTypeArguments_typeTest_tooFew() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6024,6 +6780,7 @@
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
+
   void test_wrongNumberOfTypeArguments_typeTest_tooMany() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6035,6 +6792,7 @@
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
+
   static dartSuite() {
     _ut.group('StaticTypeWarningCodeTest', () {
       _ut.test('test_expectedOneListTypeArgument', () {
@@ -6448,6 +7206,7 @@
     });
   }
 }
+
 class HintCodeTest extends ResolverTestCase {
   void fail_isInt() {
     Source source = addSource(EngineTestCase.createSource(["var v = 1 is int;"]));
@@ -6455,78 +7214,91 @@
     assertErrors(source, [HintCode.IS_INT]);
     verify([source]);
   }
+
   void fail_isNotInt() {
     Source source = addSource(EngineTestCase.createSource(["var v = 1 is! int;"]));
     resolve(source);
     assertErrors(source, [HintCode.IS_NOT_INT]);
     verify([source]);
   }
+
   void fail_overrideEqualsButNotHashCode() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  bool operator ==(x) {}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_conditionalElse() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? 1 : 2;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_conditionalElse_nested() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? true : false && false;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_conditionalIf() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? 1 : 2;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_conditionalIf_nested() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? false && false : true;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_else() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_else_nested() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {if (false) {}}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_if() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_if_nested() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {if(false) {}}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_while() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_while_nested() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {if(false) {}}", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadCatch_catchFollowingCatch() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6537,6 +7309,7 @@
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
   }
+
   void test_deadCode_deadCatch_catchFollowingCatch_nested() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6547,6 +7320,7 @@
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
   }
+
   void test_deadCode_deadCatch_catchFollowingCatch_object() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -6556,6 +7330,7 @@
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
   }
+
   void test_deadCode_deadCatch_catchFollowingCatch_object_nested() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -6565,6 +7340,7 @@
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
   }
+
   void test_deadCode_deadCatch_onCatchSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6576,6 +7352,7 @@
     assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
     verify([source]);
   }
+
   void test_deadCode_deadCatch_onCatchSubtype_nested() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6587,30 +7364,35 @@
     assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
     verify([source]);
   }
+
   void test_deadCode_deadOperandLHS_and() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && false;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadOperandLHS_and_nested() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && (false && false);", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadOperandLHS_or() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || true;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_deadOperandLHS_or_nested() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || (false && false);", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_statementAfterReturn_function() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -6622,6 +7404,7 @@
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_statementAfterReturn_ifStatement() {
     Source source = addSource(EngineTestCase.createSource([
         "f(bool b) {",
@@ -6635,6 +7418,7 @@
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_statementAfterReturn_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -6648,6 +7432,7 @@
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_statementAfterReturn_nested() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -6659,6 +7444,7 @@
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_deadCode_statementAfterReturn_twoReturns() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -6672,6 +7458,181 @@
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
+
+  void test_deprecatedAnnotationUse_assignment() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A operator+(A a) {}",
+        "}",
+        "f(A a) {",
+        "  A b;",
+        "  a += b;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_deprecated() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  m() {}",
+        "  n() {m();}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_Deprecated() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @Deprecated('0.9')",
+        "  m() {}",
+        "  n() {m();}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_export() {
+    Source source = addSource(EngineTestCase.createSource(["export 'deprecated_library.dart';"]));
+    addSource2("/deprecated_library.dart", EngineTestCase.createSource([
+        "@deprecated",
+        "library deprecated_library;",
+        "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_getter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  get m => 1;",
+        "}",
+        "f(A a) {",
+        "  return a.m;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_import() {
+    Source source = addSource(EngineTestCase.createSource(["import 'deprecated_library.dart';", "f(A a) {}"]));
+    addSource2("/deprecated_library.dart", EngineTestCase.createSource([
+        "@deprecated",
+        "library deprecated_library;",
+        "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_indexExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  operator[](int i) {}",
+        "}",
+        "f(A a) {",
+        "  return a[1];",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_instanceCreation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A(int i) {}",
+        "}",
+        "f() {",
+        "  A a = new A(1);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_instanceCreation_namedConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A.named(int i) {}",
+        "}",
+        "f() {",
+        "  A a = new A.named(1);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_operator() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  operator+(A a) {}",
+        "}",
+        "f(A a) {",
+        "  A b;",
+        "  return a + b;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_setter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  set s(v) {}",
+        "}",
+        "f(A a) {",
+        "  return a.s = 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_superConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A() {}",
+        "}",
+        "class B extends A {",
+        "  B() : super() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_superConstructor_namedConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A.named() {}",
+        "}",
+        "class B extends A {",
+        "  B() : super.named() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
   void test_divisionOptimization_double() {
     Source source = addSource(EngineTestCase.createSource([
         "f(double x, double y) {",
@@ -6681,12 +7642,14 @@
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
   }
+
   void test_divisionOptimization_int() {
     Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = (x / y).toInt();", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
   }
+
   void test_divisionOptimization_propagatedType() {
     Source source = addSource(EngineTestCase.createSource([
         "f(x, y) {",
@@ -6698,6 +7661,7 @@
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
   }
+
   void test_divisionOptimization_wrappedBinaryExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int x, int y) {",
@@ -6707,6 +7671,7 @@
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
   }
+
   void test_duplicateImport() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -6718,6 +7683,7 @@
     assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
     verify([source]);
   }
+
   void test_duplicateImport2() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -6730,6 +7696,7 @@
     assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
     verify([source]);
   }
+
   void test_duplicateImport3() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -6741,18 +7708,21 @@
     assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
+
   void test_isDouble() {
     Source source = addSource(EngineTestCase.createSource(["var v = 1 is double;"]));
     resolve(source);
     assertErrors(source, [HintCode.IS_DOUBLE]);
     verify([source]);
   }
+
   void test_isNotDouble() {
     Source source = addSource(EngineTestCase.createSource(["var v = 1 is! double;"]));
     resolve(source);
     assertErrors(source, [HintCode.IS_NOT_DOUBLE]);
     verify([source]);
   }
+
   void test_overriddingPrivateMember_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -6764,6 +7734,7 @@
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
   }
+
   void test_overriddingPrivateMember_method() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -6775,6 +7746,7 @@
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
   }
+
   void test_overriddingPrivateMember_method2() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -6787,6 +7759,7 @@
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
   }
+
   void test_overriddingPrivateMember_setter() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -6798,18 +7771,21 @@
     assertErrors(source, [HintCode.OVERRIDDING_PRIVATE_MEMBER]);
     verify([source, source2]);
   }
+
   void test_typeCheck_type_is_Null() {
     Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Null;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.TYPE_CHECK_IS_NULL]);
     verify([source]);
   }
+
   void test_typeCheck_type_not_Null() {
     Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Null;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.TYPE_CHECK_IS_NOT_NULL]);
     verify([source]);
   }
+
   void test_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6821,9 +7797,11 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_GETTER]);
   }
+
   void test_undefinedGetter_message() {
     JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_GETTER.message, StaticWarningCode.UNDEFINED_GETTER.message);
   }
+
   void test_undefinedMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -6833,6 +7811,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_METHOD]);
   }
+
   void test_undefinedMethod_assignmentExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6846,6 +7825,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_METHOD]);
   }
+
   void test_undefinedOperator_binaryExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6857,6 +7837,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_indexBoth() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6868,6 +7849,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_indexGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6879,6 +7861,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_indexSetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6890,6 +7873,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_postfixExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6901,6 +7885,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedOperator_prefixExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6912,6 +7897,7 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
+
   void test_undefinedSetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -6923,57 +7909,67 @@
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_SETTER]);
   }
+
   void test_undefinedSetter_message() {
     JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_SETTER.message, StaticWarningCode.UNDEFINED_SETTER.message);
   }
+
   void test_unnecessaryCast_type_supertype() {
     Source source = addSource(EngineTestCase.createSource(["m(int i) {", "  var b = i as Object;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_CAST]);
     verify([source]);
   }
+
   void test_unnecessaryCast_type_type() {
     Source source = addSource(EngineTestCase.createSource(["m(num i) {", "  var b = i as num;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_CAST]);
     verify([source]);
   }
+
   void test_unnecessaryTypeCheck_null_is_Null() {
     Source source = addSource(EngineTestCase.createSource(["bool b = null is Null;"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
     verify([source]);
   }
+
   void test_unnecessaryTypeCheck_null_not_Null() {
     Source source = addSource(EngineTestCase.createSource(["bool b = null is! Null;"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
     verify([source]);
   }
+
   void test_unnecessaryTypeCheck_type_is_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is dynamic;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
     verify([source]);
   }
+
   void test_unnecessaryTypeCheck_type_is_object() {
     Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Object;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
     verify([source]);
   }
+
   void test_unnecessaryTypeCheck_type_not_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! dynamic;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
     verify([source]);
   }
+
   void test_unnecessaryTypeCheck_type_not_object() {
     Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Object;", "}"]));
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
     verify([source]);
   }
+
   void test_unusedImport() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';"]));
     Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
@@ -6982,6 +7978,7 @@
     assertNoErrors(source2);
     verify([source, source2]);
   }
+
   void test_unusedImport_as() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -6994,6 +7991,7 @@
     assertNoErrors(source2);
     verify([source, source2]);
   }
+
   void test_unusedImport_hide() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -7006,6 +8004,7 @@
     assertNoErrors(source2);
     verify([source, source2]);
   }
+
   void test_unusedImport_show() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -7018,6 +8017,7 @@
     assertNoErrors(source2);
     verify([source, source2]);
   }
+
   static dartSuite() {
     _ut.group('HintCodeTest', () {
       _ut.test('test_deadCode_deadBlock_conditionalElse', () {
@@ -7120,6 +8120,58 @@
         final __test = new HintCodeTest();
         runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_twoReturns);
       });
+      _ut.test('test_deprecatedAnnotationUse_Deprecated', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_Deprecated);
+      });
+      _ut.test('test_deprecatedAnnotationUse_assignment', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_assignment);
+      });
+      _ut.test('test_deprecatedAnnotationUse_deprecated', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_deprecated);
+      });
+      _ut.test('test_deprecatedAnnotationUse_export', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_export);
+      });
+      _ut.test('test_deprecatedAnnotationUse_getter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_getter);
+      });
+      _ut.test('test_deprecatedAnnotationUse_import', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_import);
+      });
+      _ut.test('test_deprecatedAnnotationUse_indexExpression', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_indexExpression);
+      });
+      _ut.test('test_deprecatedAnnotationUse_instanceCreation', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_instanceCreation);
+      });
+      _ut.test('test_deprecatedAnnotationUse_instanceCreation_namedConstructor', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_instanceCreation_namedConstructor);
+      });
+      _ut.test('test_deprecatedAnnotationUse_operator', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_operator);
+      });
+      _ut.test('test_deprecatedAnnotationUse_setter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_setter);
+      });
+      _ut.test('test_deprecatedAnnotationUse_superConstructor', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_superConstructor);
+      });
+      _ut.test('test_deprecatedAnnotationUse_superConstructor_namedConstructor', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_superConstructor_namedConstructor);
+      });
       _ut.test('test_divisionOptimization_double', () {
         final __test = new HintCodeTest();
         runJUnitTest(__test, __test.test_divisionOptimization_double);
@@ -7279,8 +8331,8 @@
     });
   }
 }
-class TypeResolverVisitorTest extends EngineTestCase {
 
+class TypeResolverVisitorTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
    */
@@ -7301,26 +8353,32 @@
    * The visitor used to resolve types needed to form the type hierarchy.
    */
   TypeResolverVisitor _visitor;
+
   void fail_visitConstructorDeclaration() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitFunctionDeclaration() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitFunctionTypeAlias() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitFunctionTypedFormalParameter() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitMethodDeclaration() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitVariableDeclaration() {
     JUnitTestCase.fail("Not yet tested");
     ClassElement type = ElementFactory.classElement2("A", []);
@@ -7329,6 +8387,7 @@
     JUnitTestCase.assertSame(type.type, node.name.staticType);
     _listener.assertNoErrors();
   }
+
   void setUp() {
     _listener = new GatheringErrorListener();
     SourceFactory factory = new SourceFactory.con2([new FileUriResolver()]);
@@ -7342,6 +8401,7 @@
     _typeProvider = new TestTypeProvider();
     _visitor = new TypeResolverVisitor.con1(_library, librarySource, _typeProvider);
   }
+
   void test_visitCatchClause_exception() {
     CatchClause clause = ASTFactory.catchClause("e", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
@@ -7349,6 +8409,7 @@
     resolve(clause, _typeProvider.dynamicType, null, []);
     _listener.assertNoErrors();
   }
+
   void test_visitCatchClause_exception_stackTrace() {
     CatchClause clause = ASTFactory.catchClause2("e", "s", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
@@ -7358,6 +8419,7 @@
     resolve(clause, _typeProvider.dynamicType, _typeProvider.stackTraceType, []);
     _listener.assertNoErrors();
   }
+
   void test_visitCatchClause_on_exception() {
     ClassElement exceptionElement = ElementFactory.classElement2("E", []);
     TypeName exceptionType = ASTFactory.typeName(exceptionElement, []);
@@ -7367,10 +8429,11 @@
     resolve(clause, exceptionElement.type, null, [exceptionElement]);
     _listener.assertNoErrors();
   }
+
   void test_visitCatchClause_on_exception_stackTrace() {
     ClassElement exceptionElement = ElementFactory.classElement2("E", []);
     TypeName exceptionType = ASTFactory.typeName(exceptionElement, []);
-    ((exceptionType.name as SimpleIdentifier)).staticElement = exceptionElement;
+    (exceptionType.name as SimpleIdentifier).staticElement = exceptionElement;
     CatchClause clause = ASTFactory.catchClause5(exceptionType, "e", "s", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
@@ -7379,6 +8442,7 @@
     resolve(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
     _listener.assertNoErrors();
   }
+
   void test_visitClassDeclaration() {
     ClassElement elementA = ElementFactory.classElement2("A", []);
     ClassElement elementB = ElementFactory.classElement2("B", []);
@@ -7399,6 +8463,7 @@
     JUnitTestCase.assertSame(elementD.type, interfaces[0]);
     _listener.assertNoErrors();
   }
+
   void test_visitClassTypeAlias() {
     ClassElement elementA = ElementFactory.classElement2("A", []);
     ClassElement elementB = ElementFactory.classElement2("B", []);
@@ -7418,6 +8483,7 @@
     JUnitTestCase.assertSame(elementD.type, interfaces[0]);
     _listener.assertNoErrors();
   }
+
   void test_visitFieldFormalParameter_functionType() {
     InterfaceType intType = _typeProvider.intType;
     TypeName intTypeName = ASTFactory.typeName4("int", []);
@@ -7434,6 +8500,7 @@
     EngineTestCase.assertLength(1, functionType.parameters);
     _listener.assertNoErrors();
   }
+
   void test_visitFieldFormalParameter_noType() {
     String parameterName = "p";
     FormalParameter node = ASTFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
@@ -7441,6 +8508,7 @@
     JUnitTestCase.assertSame(_typeProvider.dynamicType, resolve6(node, []));
     _listener.assertNoErrors();
   }
+
   void test_visitFieldFormalParameter_type() {
     InterfaceType intType = _typeProvider.intType;
     TypeName intTypeName = ASTFactory.typeName4("int", []);
@@ -7450,12 +8518,14 @@
     JUnitTestCase.assertSame(intType, resolve6(node, [intType.element]));
     _listener.assertNoErrors();
   }
+
   void test_visitSimpleFormalParameter_noType() {
     FormalParameter node = ASTFactory.simpleFormalParameter3("p");
     node.identifier.staticElement = new ParameterElementImpl.con1(ASTFactory.identifier3("p"));
     JUnitTestCase.assertSame(_typeProvider.dynamicType, resolve6(node, []));
     _listener.assertNoErrors();
   }
+
   void test_visitSimpleFormalParameter_type() {
     InterfaceType intType = _typeProvider.intType;
     ClassElement intElement = intType.element;
@@ -7466,6 +8536,7 @@
     JUnitTestCase.assertSame(intType, resolve6(node, [intElement]));
     _listener.assertNoErrors();
   }
+
   void test_visitTypeName_noParameters_noArguments() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     TypeName typeName = ASTFactory.typeName(classA, []);
@@ -7474,6 +8545,7 @@
     JUnitTestCase.assertSame(classA.type, typeName.type);
     _listener.assertNoErrors();
   }
+
   void test_visitTypeName_parameters_arguments() {
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     ClassElement classB = ElementFactory.classElement2("B", []);
@@ -7487,6 +8559,7 @@
     JUnitTestCase.assertSame(classB.type, resultArguments[0]);
     _listener.assertNoErrors();
   }
+
   void test_visitTypeName_parameters_noArguments() {
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     TypeName typeName = ASTFactory.typeName(classA, []);
@@ -7499,6 +8572,7 @@
     JUnitTestCase.assertSame(DynamicTypeImpl.instance, resultArguments[0]);
     _listener.assertNoErrors();
   }
+
   void test_visitTypeName_void() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     TypeName typeName = ASTFactory.typeName4("void", []);
@@ -7541,7 +8615,7 @@
    */
   Type2 resolve6(FormalParameter node, List<Element> definedElements) {
     resolveNode(node, definedElements);
-    return ((node.identifier.staticElement as ParameterElement)).type;
+    return (node.identifier.staticElement as ParameterElement).type;
   }
 
   /**
@@ -7559,6 +8633,7 @@
     }
     node.accept(_visitor);
   }
+
   static dartSuite() {
     _ut.group('TypeResolverVisitorTest', () {
       _ut.test('test_visitCatchClause_exception', () {
@@ -7624,8 +8699,8 @@
     });
   }
 }
-class ResolverTestCase extends EngineTestCase {
 
+class ResolverTestCase extends EngineTestCase {
   /**
    * The source factory used to create [Source].
    */
@@ -7635,6 +8710,7 @@
    * The analysis context used to parse the compilation units being resolved.
    */
   AnalysisContextImpl analysisContext;
+
   void setUp() {
     reset();
   }
@@ -7811,11 +8887,13 @@
     sourceFactory.setContents(source, "");
     return source;
   }
+
   static dartSuite() {
     _ut.group('ResolverTestCase', () {
     });
   }
 }
+
 class TypeProviderImplTest extends EngineTestCase {
   void test_creation() {
     InterfaceType objectType = classElement("Object", null, []).type;
@@ -7860,6 +8938,7 @@
     JUnitTestCase.assertSame(symbolType, provider.symbolType);
     JUnitTestCase.assertSame(typeType, provider.typeType);
   }
+
   ClassElement classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
     ClassElementImpl element = new ClassElementImpl(ASTFactory.identifier3(typeName));
     element.supertype = superclassType;
@@ -7880,6 +8959,7 @@
     }
     return element;
   }
+
   static dartSuite() {
     _ut.group('TypeProviderImplTest', () {
       _ut.test('test_creation', () {
@@ -7889,8 +8969,8 @@
     });
   }
 }
-class InheritanceManagerTest extends EngineTestCase {
 
+class InheritanceManagerTest extends EngineTestCase {
   /**
    * The type provider used to access the types.
    */
@@ -7910,12 +8990,14 @@
    * The number of members that Object implements (as determined by [TestTypeProvider]).
    */
   int _numOfMembersInObject = 0;
+
   void setUp() {
     _typeProvider = new TestTypeProvider();
     _inheritanceManager = createInheritanceManager();
     InterfaceType objectType = _typeProvider.objectType;
     _numOfMembersInObject = objectType.methods.length + objectType.accessors.length;
   }
+
   void test_getMapOfMembersInheritedFromClasses_accessor_extends() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -7930,6 +9012,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromClasses_accessor_implements() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -7945,6 +9028,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromClasses_accessor_with() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -7960,6 +9044,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromClasses_method_extends() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -7975,6 +9060,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromClasses_method_implements() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -7990,6 +9076,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromClasses_method_with() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8005,6 +9092,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8019,6 +9107,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8034,6 +9123,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromInterfaces_accessor_with() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8049,6 +9139,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromInterfaces_method_extends() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8063,6 +9154,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromInterfaces_method_implements() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8078,6 +9170,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_getMapOfMembersInheritedFromInterfaces_method_with() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8093,6 +9186,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_interface_getter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8104,6 +9198,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_interface_method() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8115,6 +9210,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_interface_setter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -8126,11 +9222,12 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_interface_staticMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ((methodM as MethodElementImpl)).static = true;
+    (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
@@ -8138,12 +9235,14 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_interfaces_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classA.type];
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
     assertNoErrors(classA);
   }
+
   void test_lookupInheritance_interfaces_infiniteLoop2() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -8153,6 +9252,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_interfaces_STWC_inconsistentMethodInheritance() {
     ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
     String methodName = "m";
@@ -8168,6 +9268,7 @@
     assertNoErrors(classI2);
     assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
+
   void test_lookupInheritance_interfaces_SWC_inconsistentMethodInheritance() {
     ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
     String methodName = "m";
@@ -8183,6 +9284,7 @@
     assertNoErrors(classI2);
     assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
   }
+
   void test_lookupInheritance_interfaces_union1() {
     ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
     String methodName1 = "m1";
@@ -8200,6 +9302,7 @@
     assertNoErrors(classI2);
     assertNoErrors(classA);
   }
+
   void test_lookupInheritance_interfaces_union2() {
     ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
     String methodName1 = "m1";
@@ -8218,6 +9321,7 @@
     assertNoErrors(classI2);
     assertNoErrors(classA);
   }
+
   void test_lookupInheritance_mixin_getter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8229,6 +9333,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_mixin_method() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8240,6 +9345,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_mixin_setter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -8251,11 +9357,12 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_mixin_staticMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ((methodM as MethodElementImpl)).static = true;
+    (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
@@ -8263,11 +9370,13 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "a"));
     assertNoErrors(classA);
   }
+
   void test_lookupInheritance_superclass_getter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8278,12 +9387,14 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_superclass_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.supertype = classA.type;
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
     assertNoErrors(classA);
   }
+
   void test_lookupInheritance_superclass_infiniteLoop2() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
@@ -8293,6 +9404,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_superclass_method() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8303,6 +9415,7 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_superclass_setter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -8313,17 +9426,19 @@
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupInheritance_superclass_staticMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ((methodM as MethodElementImpl)).static = true;
+    (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
+
   void test_lookupMember_getter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8332,6 +9447,7 @@
     JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupMember(classA, getterName));
     assertNoErrors(classA);
   }
+
   void test_lookupMember_getter_static() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -8340,6 +9456,7 @@
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, getterName));
     assertNoErrors(classA);
   }
+
   void test_lookupMember_method() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -8348,20 +9465,23 @@
     JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupMember(classA, methodName));
     assertNoErrors(classA);
   }
+
   void test_lookupMember_method_static() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ((methodM as MethodElementImpl)).static = true;
+    (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement> [methodM];
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, methodName));
     assertNoErrors(classA);
   }
+
   void test_lookupMember_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, "a"));
     assertNoErrors(classA);
   }
+
   void test_lookupMember_setter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -8370,6 +9490,7 @@
     JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupMember(classA, "${setterName}="));
     assertNoErrors(classA);
   }
+
   void test_lookupMember_setter_static() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -8378,6 +9499,7 @@
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, setterName));
     assertNoErrors(classA);
   }
+
   void assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
@@ -8388,6 +9510,7 @@
     }
     errorListener.assertErrors2(expectedErrorCodes);
   }
+
   void assertNoErrors(ClassElement classElt) {
     assertErrors(classElt, []);
   }
@@ -8406,6 +9529,7 @@
     _definingLibrary.definingCompilationUnit = definingCompilationUnit;
     return new InheritanceManager(_definingLibrary);
   }
+
   static dartSuite() {
     _ut.group('InheritanceManagerTest', () {
       _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_extends', () {
@@ -8571,6 +9695,7 @@
     });
   }
 }
+
 class CompileTimeErrorCodeTest extends ResolverTestCase {
   void fail_compileTimeConstantRaisesException() {
     Source source = addSource(EngineTestCase.createSource([]));
@@ -8578,6 +9703,7 @@
     assertErrors(source, [CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION]);
     verify([source]);
   }
+
   void fail_constEvalThrowsException() {
     Source source = addSource(EngineTestCase.createSource([
         "class C {",
@@ -8588,6 +9714,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
     verify([source]);
   }
+
   void fail_mixinDeclaresConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8598,18 +9725,21 @@
     assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
     verify([source]);
   }
+
   void fail_mixinOfNonClass() {
     Source source = addSource(EngineTestCase.createSource(["var A;", "class B extends Object mixin A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
+
   void fail_objectCannotExtendAnotherClass() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
     verify([source]);
   }
+
   void fail_recursiveCompileTimeConstant() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8620,18 +9750,21 @@
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
     verify([source]);
   }
+
   void fail_recursiveCompileTimeConstant_cycle() {
     Source source = addSource(EngineTestCase.createSource(["const x = y + 1;", "const y = x + 1;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
     verify([source]);
   }
+
   void fail_superInitializerInObject() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
     verify([source]);
   }
+
   void test_ambiguousExport() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -8643,6 +9776,7 @@
     assertErrors(source, [CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
     verify([source]);
   }
+
   void test_ambiguousImport_function() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -8655,6 +9789,7 @@
         StaticWarningCode.AMBIGUOUS_IMPORT,
         CompileTimeErrorCode.UNDEFINED_FUNCTION]);
   }
+
   void test_argumentDefinitionTestNonParameter() {
     Source source = addSource(EngineTestCase.createSource(["f() {", " var v = 0;", " return ?v;", "}"]));
     resolve(source);
@@ -8663,48 +9798,56 @@
         CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER]);
     verify([source]);
   }
+
   void test_builtInIdentifierAsMixinName_classTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class as = A with B;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
     verify([source]);
   }
+
   void test_builtInIdentifierAsType_formalParameter_field() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(static this.x);", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
+
   void test_builtInIdentifierAsType_formalParameter_simple() {
     Source source = addSource(EngineTestCase.createSource(["f(static x) {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
+
   void test_builtInIdentifierAsType_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  typedef x;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
+
   void test_builtInIdentifierAsTypedefName_functionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef bool as();"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
     verify([source]);
   }
+
   void test_builtInIdentifierAsTypeName() {
     Source source = addSource(EngineTestCase.createSource(["class as {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
     verify([source]);
   }
+
   void test_builtInIdentifierAsTypeParameterName() {
     Source source = addSource(EngineTestCase.createSource(["class A<as> {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME]);
     verify([source]);
   }
+
   void test_caseExpressionTypeImplementsEquals() {
     Source source = addSource(EngineTestCase.createSource([
         "class IntWrapper {",
@@ -8726,22 +9869,25 @@
     assertErrors(source, [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
+
   void test_conflictingConstructorNameAndMember_field() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.x() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
     verify([source]);
   }
+
   void test_conflictingConstructorNameAndMember_method() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.x();", "  void x() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
     verify([source]);
   }
+
   void test_conflictingGetterAndMethod_field_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
-        "  int m;",
+        "  final int m = 0;",
         "}",
         "class B extends A {",
         "  m() {}",
@@ -8750,6 +9896,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
     verify([source]);
   }
+
   void test_conflictingGetterAndMethod_getter_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8762,6 +9909,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
     verify([source]);
   }
+
   void test_conflictingGetterAndMethod_method_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8774,6 +9922,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
     verify([source]);
   }
+
   void test_conflictingGetterAndMethod_method_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8786,42 +9935,49 @@
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
     verify([source]);
   }
+
   void test_conflictingTypeVariableAndClass() {
     Source source = addSource(EngineTestCase.createSource(["class T<T> {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS]);
     verify([source]);
   }
+
   void test_conflictingTypeVariableAndMember_field() {
     Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  var T;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
+
   void test_conflictingTypeVariableAndMember_getter() {
     Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  get T => null;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
+
   void test_conflictingTypeVariableAndMember_method() {
     Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  T() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
+
   void test_conflictingTypeVariableAndMember_method_static() {
     Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  static T() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
+
   void test_conflictingTypeVariableAndMember_setter() {
     Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  set T(x) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
+
   void test_constConstructorWithNonConstSuper_explicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8834,6 +9990,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
     verify([source]);
   }
+
   void test_constConstructorWithNonConstSuper_implicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8846,6 +10003,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
     verify([source]);
   }
+
   void test_constConstructorWithNonFinalField_mixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8858,6 +10016,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
     verify([source]);
   }
+
   void test_constConstructorWithNonFinalField_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8872,18 +10031,21 @@
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
     verify([source]);
   }
+
   void test_constConstructorWithNonFinalField_this() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  const A();", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
     verify([source]);
   }
+
   void test_constEval_newInstance_constConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "const a = new A();"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
+
   void test_constEval_propertyExtraction_targetNotConst() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8896,40 +10058,48 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
+
   void test_constEvalThrowsException_binaryMinus_null() {
     check_constEvalThrowsException_binary_null("null - 5", false);
     check_constEvalThrowsException_binary_null("5 - null", true);
   }
+
   void test_constEvalThrowsException_binaryPlus_null() {
     check_constEvalThrowsException_binary_null("null + 5", false);
     check_constEvalThrowsException_binary_null("5 + null", true);
   }
+
   void test_constEvalThrowsException_divisionByZero() {
     Source source = addSource("const C = 1 ~/ 0;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE]);
     verify([source]);
   }
+
   void test_constEvalThrowsException_unaryBitNot_null() {
     Source source = addSource("const C = ~null;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
   }
+
   void test_constEvalThrowsException_unaryNegated_null() {
     Source source = addSource("const C = -null;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
   }
+
   void test_constEvalThrowsException_unaryNot_null() {
     Source source = addSource("const C = !null;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
     verify([source]);
   }
+
   void test_constEvalTypeBool_binary() {
     check_constEvalTypeBool_withParameter_binary("p && ''");
     check_constEvalTypeBool_withParameter_binary("p || ''");
   }
+
   void test_constEvalTypeBool_binary_leftTrue() {
     Source source = addSource("const C = (true || 0);");
     resolve(source);
@@ -8938,6 +10108,7 @@
         HintCode.DEAD_CODE]);
     verify([source]);
   }
+
   void test_constEvalTypeBoolNumString_equal() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8951,6 +10122,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
     verify([source]);
   }
+
   void test_constEvalTypeBoolNumString_notEqual() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -8964,6 +10136,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
     verify([source]);
   }
+
   void test_constEvalTypeInt_binary() {
     check_constEvalTypeInt_withParameter_binary("p ^ ''");
     check_constEvalTypeInt_withParameter_binary("p & ''");
@@ -8971,6 +10144,7 @@
     check_constEvalTypeInt_withParameter_binary("p >> ''");
     check_constEvalTypeInt_withParameter_binary("p << ''");
   }
+
   void test_constEvalTypeNum_binary() {
     check_constEvalTypeNum_withParameter_binary("p + ''");
     check_constEvalTypeNum_withParameter_binary("p - ''");
@@ -8983,48 +10157,56 @@
     check_constEvalTypeNum_withParameter_binary("p <= ''");
     check_constEvalTypeNum_withParameter_binary("p % ''");
   }
+
   void test_constEvalTypeNum_plus_String() {
     Source source = addSource("const C = 'a' + 'b';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_NUM]);
     verify([source]);
   }
+
   void test_constFormalParameter_fieldFormalParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(const this.x) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
     verify([source]);
   }
+
   void test_constFormalParameter_simpleFormalParameter() {
     Source source = addSource(EngineTestCase.createSource(["f(const x) {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
     verify([source]);
   }
+
   void test_constInitializedWithNonConstValue() {
     Source source = addSource(EngineTestCase.createSource(["f(p) {", "  const C = p;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
+
   void test_constInitializedWithNonConstValue_missingConstInListLiteral() {
     Source source = addSource("const List L = [0];");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
+
   void test_constInitializedWithNonConstValue_missingConstInMapLiteral() {
     Source source = addSource("const Map M = {'a' : 0};");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
+
   void test_constInstanceField() {
     Source source = addSource(EngineTestCase.createSource(["class C {", "  const int f = 0;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
     verify([source]);
   }
+
   void test_constMapKeyTypeImplementsEquals_direct() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9038,6 +10220,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
+
   void test_constMapKeyTypeImplementsEquals_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9054,6 +10237,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
+
   void test_constWithInvalidTypeParameters() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9064,6 +10248,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
+
   void test_constWithInvalidTypeParameters_tooFew() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -9077,6 +10262,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
+
   void test_constWithInvalidTypeParameters_tooMany() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -9090,6 +10276,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
+
   void test_constWithNonConst() {
     Source source = addSource(EngineTestCase.createSource([
         "class T {",
@@ -9100,6 +10287,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONST]);
     verify([source]);
   }
+
   void test_constWithNonConstantArgument_annotation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9113,6 +10301,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
     verify([source]);
   }
+
   void test_constWithNonConstantArgument_instanceCreation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9123,12 +10312,14 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
     verify([source]);
   }
+
   void test_constWithNonType() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "f() {", "  return const A();", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
     verify([source]);
   }
+
   void test_constWithNonType_fromLibrary() {
     Source source1 = addSource2("lib.dart", "");
     Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
@@ -9141,6 +10332,7 @@
     assertErrors(source2, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
     verify([source1]);
   }
+
   void test_constWithTypeParameters_direct() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -9153,6 +10345,7 @@
         StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_constWithTypeParameters_indirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -9165,6 +10358,7 @@
         StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_constWithUndefinedConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9176,6 +10370,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
   }
+
   void test_constWithUndefinedConstructorDefault() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9188,24 +10383,28 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
     verify([source]);
   }
+
   void test_defaultValueInFunctionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource(["typedef F([x = 0]);"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]);
     verify([source]);
   }
+
   void test_defaultValueInFunctionTypedParameter_named() {
     Source source = addSource(EngineTestCase.createSource(["f(g({p: null})) {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
     verify([source]);
   }
+
   void test_defaultValueInFunctionTypedParameter_optional() {
     Source source = addSource(EngineTestCase.createSource(["f(g([p = null])) {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
     verify([source]);
   }
+
   void test_defaultValueInRedirectingFactoryConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9219,6 +10418,7 @@
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_duplicateConstructorName_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() {}", "  A.a() {}", "}"]));
     resolve(source);
@@ -9227,6 +10427,7 @@
         CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME]);
     verify([source]);
   }
+
   void test_duplicateConstructorName_unnamed() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "  A() {}", "}"]));
     resolve(source);
@@ -9235,12 +10436,14 @@
         CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT]);
     verify([source]);
   }
+
   void test_duplicateDefinition() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  int m = 0;", "  m(a) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+
   void test_duplicateDefinition_acrossLibraries() {
     Source librarySource = addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';", "part 'b.dart';"]));
     Source sourceA = addSource2("/a.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
@@ -9249,24 +10452,28 @@
     assertErrors(sourceB, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([librarySource, sourceA, sourceB]);
   }
+
   void test_duplicateDefinition_classMembers_fields() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int a;", "  int a;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+
   void test_duplicateDefinition_classMembers_fields_oneStatic() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  static int x;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+
   void test_duplicateDefinition_classMembers_methods() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "  m() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+
   void test_duplicateDefinition_localFields() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9279,18 +10486,21 @@
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+
   void test_duplicateDefinition_parameterWithFunctionName_local() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+
   void test_duplicateDefinition_parameterWithFunctionName_topLevel() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+
   void test_duplicateDefinitionInheritance_instanceGetter_staticGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9303,6 +10513,7 @@
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
+
   void test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -9315,6 +10526,7 @@
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
+
   void test_duplicateDefinitionInheritance_instanceMethod_staticMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9327,6 +10539,7 @@
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
+
   void test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -9339,6 +10552,7 @@
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
+
   void test_duplicateDefinitionInheritance_instanceSetter_staticSetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9351,6 +10565,7 @@
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
+
   void test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -9363,18 +10578,21 @@
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
+
   void test_duplicateNamedArgument() {
     Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(a: 1, a: 2);", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT]);
     verify([source]);
   }
+
   void test_exportInternalLibrary() {
     Source source = addSource(EngineTestCase.createSource(["export 'dart:_interceptors';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY]);
     verify([source]);
   }
+
   void test_exportOfNonLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["part of lib;"]));
@@ -9382,6 +10600,7 @@
     assertErrors(source, [CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
     verify([source]);
   }
+
   void test_extendsDisallowedClass_bool() {
     Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
     resolve(source);
@@ -9390,6 +10609,7 @@
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_extendsDisallowedClass_double() {
     Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
     resolve(source);
@@ -9398,6 +10618,7 @@
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_extendsDisallowedClass_int() {
     Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
     resolve(source);
@@ -9406,6 +10627,7 @@
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_extendsDisallowedClass_Null() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Null {}"]));
     resolve(source);
@@ -9414,6 +10636,7 @@
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_extendsDisallowedClass_num() {
     Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
     resolve(source);
@@ -9422,6 +10645,7 @@
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_extendsDisallowedClass_String() {
     Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
     resolve(source);
@@ -9430,18 +10654,21 @@
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_extendsNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
     verify([source]);
   }
+
   void test_extendsNonClass_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["class B extends dynamic {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
     verify([source]);
   }
+
   void test_extraPositionalArguments_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9454,6 +10681,7 @@
     assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
+
   void test_extraPositionalArguments_const_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9466,12 +10694,14 @@
     assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
+
   void test_fieldInitializedByMultipleInitializers() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = 0, x = 1 {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
+
   void test_fieldInitializedByMultipleInitializers_multipleInits() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9484,6 +10714,7 @@
         CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
+
   void test_fieldInitializedByMultipleInitializers_multipleNames() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9497,18 +10728,21 @@
         CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
+
   void test_fieldInitializedInParameterAndInitializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) : x = 1 {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
     verify([source]);
   }
+
   void test_fieldInitializerFactoryConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  factory A(this.x) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_fieldInitializerNotAssignable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9519,6 +10753,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_fieldInitializerOutsideConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m(this.x) {}", "}"]));
     resolve(source);
@@ -9527,12 +10762,14 @@
         CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_fieldInitializerOutsideConstructor_defaultParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m([this.x]) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_fieldInitializerRedirectingConstructor_afterRedirection() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9544,6 +10781,7 @@
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_fieldInitializerRedirectingConstructor_beforeRedirection() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9555,6 +10793,7 @@
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_fieldInitializingFormalRedirectingConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9566,6 +10805,7 @@
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_finalInitializedMultipleTimes_initializers() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 0, x = 0 {}", "}"]));
     resolve(source);
@@ -9587,96 +10827,112 @@
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
     verify([source]);
   }
+
   void test_finalInitializedMultipleTimes_initializingFormals() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x, this.x) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]);
     verify([source]);
   }
+
   void test_finalNotInitialized_instanceField_const_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static const F;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_finalNotInitialized_library_const() {
     Source source = addSource(EngineTestCase.createSource(["const F;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_finalNotInitialized_local_const() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  const int x;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_getterAndMethodWithSameName() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  x(y) {}", "  get x => 0;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
     verify([source]);
   }
+
   void test_implementsDisallowedClass_bool() {
     Source source = addSource(EngineTestCase.createSource(["class A implements bool {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_implementsDisallowedClass_double() {
     Source source = addSource(EngineTestCase.createSource(["class A implements double {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_implementsDisallowedClass_int() {
     Source source = addSource(EngineTestCase.createSource(["class A implements int {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_implementsDisallowedClass_Null() {
     Source source = addSource(EngineTestCase.createSource(["class A implements Null {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_implementsDisallowedClass_num() {
     Source source = addSource(EngineTestCase.createSource(["class A implements num {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_implementsDisallowedClass_String() {
     Source source = addSource(EngineTestCase.createSource(["class A implements String {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_implementsDynamic() {
     Source source = addSource(EngineTestCase.createSource(["class A implements dynamic {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DYNAMIC]);
     verify([source]);
   }
+
   void test_implementsNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B implements A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
     verify([source]);
   }
+
   void test_implementsNonClass_typeAlias() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "int B;", "class C = A implements B;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
     verify([source]);
   }
+
   void test_implementsRepeated() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B implements A, A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
     verify([source]);
   }
+
   void test_implementsRepeated_3times() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {} class C{}",
@@ -9688,18 +10944,21 @@
         CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
     verify([source]);
   }
+
   void test_implementsSuperClass() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A implements A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
     verify([source]);
   }
+
   void test_implementsSuperClass_Object() {
     Source source = addSource(EngineTestCase.createSource(["class A implements Object {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9711,12 +10970,14 @@
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_field2() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  final y = x;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_invocation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9728,12 +10989,14 @@
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_invocationInStatic() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static var F = m();", "  m() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9745,6 +11008,7 @@
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_implicitThisReferenceInInitializer_superConstructorInvocation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9758,6 +11022,7 @@
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_importInternalLibrary() {
     Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
     resolve(source);
@@ -9766,6 +11031,7 @@
         HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
+
   void test_importInternalLibrary_collection() {
     Source source = addSource(EngineTestCase.createSource(["import 'dart:_collection-dev';"]));
     resolve(source);
@@ -9774,6 +11040,7 @@
         HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
+
   void test_importOfNonLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
     addSource2("/part.dart", EngineTestCase.createSource(["part of lib;", "class A{}"]));
@@ -9781,6 +11048,7 @@
     assertErrors(source, [CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
     verify([source]);
   }
+
   void test_inconsistentCaseExpressionTypes() {
     Source source = addSource(EngineTestCase.createSource([
         "f(var p) {",
@@ -9795,6 +11063,7 @@
     assertErrors(source, [CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
     verify([source]);
   }
+
   void test_inconsistentCaseExpressionTypes_repeated() {
     Source source = addSource(EngineTestCase.createSource([
         "f(var p) {",
@@ -9813,23 +11082,27 @@
         CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
     verify([source]);
   }
+
   void test_initializerForNonExistant_initializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : x = 0 {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD]);
   }
+
   void test_initializerForStaticField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A() : x = 0 {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD]);
     verify([source]);
   }
+
   void test_initializingFormalForNonExistantField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A(this.x) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
     verify([source]);
   }
+
   void test_initializingFormalForNonExistantField_notInEnclosingClass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9842,24 +11115,28 @@
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
     verify([source]);
   }
+
   void test_initializingFormalForNonExistantField_optional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A([this.x]) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
     verify([source]);
   }
+
   void test_initializingFormalForNonExistantField_synthetic() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 1;", "  A(this.x) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
     verify([source]);
   }
+
   void test_initializingFormalForStaticField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A([this.x]) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD]);
     verify([source]);
   }
+
   void test_instanceMemberAccessFromStatic_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9872,6 +11149,7 @@
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
     verify([source]);
   }
+
   void test_instanceMemberAccessFromStatic_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9884,6 +11162,7 @@
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
     verify([source]);
   }
+
   void test_instanceMemberAccessFromStatic_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9896,12 +11175,14 @@
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
     verify([source]);
   }
+
   void test_invalidAnnotation_getter() {
     Source source = addSource(EngineTestCase.createSource(["get V => 0;", "@V", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+
   void test_invalidAnnotation_importWithPrefix_getter() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "get V => 0;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
@@ -9909,6 +11190,7 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+
   void test_invalidAnnotation_importWithPrefix_notConstantVariable() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "final V = 0;"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
@@ -9916,6 +11198,7 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+
   void test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef V();"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
@@ -9923,18 +11206,21 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+
   void test_invalidAnnotation_notConstantVariable() {
     Source source = addSource(EngineTestCase.createSource(["final V = 0;", "@V", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+
   void test_invalidAnnotation_notVariableOrConstructorInvocation() {
     Source source = addSource(EngineTestCase.createSource(["typedef V();", "@V", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+
   void test_invalidAnnotation_staticMethodReference() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9947,16 +11233,19 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
+
   void test_invalidAnnotation_unresolved_identifier() {
     Source source = addSource(EngineTestCase.createSource(["@unresolved", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
+
   void test_invalidAnnotation_unresolved_invocation() {
     Source source = addSource(EngineTestCase.createSource(["@Unresolved()", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
+
   void test_invalidAnnotation_unresolved_prefixedIdentifier() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'dart:math' as p;",
@@ -9966,57 +11255,67 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
+
   void test_invalidConstructorName_notEnclosingClassName_defined() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}", "class B {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
   }
+
   void test_invalidConstructorName_notEnclosingClassName_undefined() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
   }
+
   void test_invalidFactoryNameNotAClass_notClassName() {
     Source source = addSource(EngineTestCase.createSource(["int B;", "class A {", "  factory B() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
     verify([source]);
   }
+
   void test_invalidFactoryNameNotAClass_notEnclosingClassName() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  factory B() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
   }
+
   void test_invalidReferenceToThis_factoryConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() { return this; }", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "  A() : f = this;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var f = this;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_staticMethod() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() { return this; }", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_staticVariableInitializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static A f = this;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_superInitializer() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10029,18 +11328,21 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_topLevelFunction() {
     Source source = addSource("f() { return this; }");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidReferenceToThis_variableInitializer() {
     Source source = addSource("int x = this;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+
   void test_invalidTypeArgumentInConstList() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -10052,6 +11354,7 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
     verify([source]);
   }
+
   void test_invalidTypeArgumentInConstMap() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -10063,21 +11366,25 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
     verify([source]);
   }
+
   void test_invalidUri_export() {
     Source source = addSource(EngineTestCase.createSource(["export 'ht:';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
   }
+
   void test_invalidUri_import() {
     Source source = addSource(EngineTestCase.createSource(["import 'ht:';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
   }
+
   void test_invalidUri_part() {
     Source source = addSource(EngineTestCase.createSource(["part 'ht:';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
   }
+
   void test_labelInOuterScope() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10092,6 +11399,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE]);
   }
+
   void test_labelUndefined_break() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -10102,6 +11410,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
   }
+
   void test_labelUndefined_continue() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -10112,50 +11421,59 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
   }
+
   void test_listElementTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = const <String> [42];"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_mapKeyTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = const <String, int > {1 : 2};"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_mapValueTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = const <String, String> {'a' : 2};"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_memberWithClassName_field() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int A = 0;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
     verify([source]);
   }
+
   void test_memberWithClassName_field2() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int z, A, b = 0;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
     verify([source]);
   }
+
   void test_memberWithClassName_getter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  get A => 0;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
     verify([source]);
   }
+
   void test_memberWithClassName_method() {
   }
+
   void test_methodAndGetterWithSameName() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  get x => 0;", "  x(y) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME]);
     verify([source]);
   }
+
   void test_mixinDeclaresConstructor_classDeclaration() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10166,12 +11484,14 @@
     assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_mixinDeclaresConstructor_typeAlias() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B = Object with A;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_mixinInheritsFromNotObject_classDeclaration_extends() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -10181,6 +11501,7 @@
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
+
   void test_mixinInheritsFromNotObject_classDeclaration_with() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -10190,6 +11511,7 @@
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
+
   void test_mixinInheritsFromNotObject_typeAlias_extends() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -10199,6 +11521,7 @@
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
+
   void test_mixinInheritsFromNotObject_typeAlias_with() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -10208,54 +11531,63 @@
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
+
   void test_mixinOfDisallowedClass_bool() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Object with bool {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_mixinOfDisallowedClass_double() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Object with double {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_mixinOfDisallowedClass_int() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Object with int {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_mixinOfDisallowedClass_Null() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Object with Null {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_mixinOfDisallowedClass_num() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Object with num {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_mixinOfDisallowedClass_String() {
     Source source = addSource(EngineTestCase.createSource(["class A extends Object with String {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
+
   void test_mixinOfNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object with A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
+
   void test_mixinOfNonClass_typeAlias() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "int B;", "class C = A with B;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
+
   void test_mixinReferencesSuper() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10266,18 +11598,21 @@
     assertErrors(source, [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
     verify([source]);
   }
+
   void test_mixinWithNonClassSuperclass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C extends A with B {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
     verify([source]);
   }
+
   void test_mixinWithNonClassSuperclass_typeAlias() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C = A with B;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
     verify([source]);
   }
+
   void test_multipleRedirectingConstructorInvocations() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10289,6 +11624,7 @@
     assertErrors(source, [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS]);
     verify([source]);
   }
+
   void test_multipleSuperInitializers() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -10299,30 +11635,35 @@
     assertErrors(source, [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
     verify([source]);
   }
+
   void test_nativeClauseInNonSDKCode() {
     Source source = addSource(EngineTestCase.createSource(["class A native 'string' {}"]));
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
   }
+
   void test_nativeFunctionBodyInNonSDKCode_function() {
     Source source = addSource(EngineTestCase.createSource(["int m(a) native 'string';"]));
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
     verify([source]);
   }
+
   void test_nativeFunctionBodyInNonSDKCode_method() {
     Source source = addSource(EngineTestCase.createSource(["class A{", "  static int m(a) native 'string';", "}"]));
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
     verify([source]);
   }
+
   void test_noAnnotationConstructorArguments() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "@A", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS]);
     verify([source]);
   }
+
   void test_noDefaultSuperConstructorExplicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10335,18 +11676,21 @@
     assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
     verify([source]);
   }
+
   void test_noDefaultSuperConstructorImplicit_superHasParameters() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p);", "}", "class B extends A {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_noDefaultSuperConstructorImplicit_superOnlyNamed() {
     Source source = addSource(EngineTestCase.createSource(["class A { A.named() {} }", "class B extends A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
+
   void test_nonConstantAnnotationConstructor_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10359,48 +11703,56 @@
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_nonConstantAnnotationConstructor_unnamed() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "@A()", "main() {", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_function_named() {
     Source source = addSource(EngineTestCase.createSource(["int y;", "f({x : y}) {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_function_positional() {
     Source source = addSource(EngineTestCase.createSource(["int y;", "f([x = y]) {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_inConstructor_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A({x : y}) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_inConstructor_positional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A([x = y]) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_method_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m({x : y}) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
+
   void test_nonConstantDefaultValue_method_positional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m([x = y]) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
+
   void test_nonConstCaseExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int p, int q) {",
@@ -10413,36 +11765,42 @@
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION]);
     verify([source]);
   }
+
   void test_nonConstListElement() {
     Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const [a];", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
     verify([source]);
   }
+
   void test_nonConstMapAsExpressionStatement_begin() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1}.length;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
+
   void test_nonConstMapAsExpressionStatement_only() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1};", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
+
   void test_nonConstMapKey() {
     Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {a : 0};", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
     verify([source]);
   }
+
   void test_nonConstMapValue() {
     Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {'a' : a};", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_binary_notBool_left() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10453,6 +11811,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_binary_notBool_right() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10463,6 +11822,7 @@
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_binary_notInt() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10475,6 +11835,7 @@
         StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_binary_notNum() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10487,6 +11848,7 @@
         StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10498,6 +11860,7 @@
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_redirecting() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10509,6 +11872,7 @@
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_nonConstValueInInitializer_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10522,6 +11886,7 @@
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
     verify([source]);
   }
+
   void test_nonGenerativeConstructor_explicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10534,6 +11899,7 @@
     assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_nonGenerativeConstructor_implicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10546,6 +11912,7 @@
     assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_nonGenerativeConstructor_implicit2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10557,6 +11924,7 @@
     assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_notEnoughRequiredArguments_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10569,6 +11937,7 @@
     assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
+
   void test_notEnoughRequiredArguments_const_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10581,18 +11950,21 @@
     assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
+
   void test_optionalParameterInOperator_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +({p}) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
     verify([source]);
   }
+
   void test_optionalParameterInOperator_positional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +([p]) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
     verify([source]);
   }
+
   void test_partOfNonPart() {
     Source source = addSource(EngineTestCase.createSource(["library l1;", "part 'l2.dart';"]));
     addSource2("/l2.dart", EngineTestCase.createSource(["library l2;"]));
@@ -10600,6 +11972,7 @@
     assertErrors(source, [CompileTimeErrorCode.PART_OF_NON_PART]);
     verify([source]);
   }
+
   void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "typedef p();", "p.A a;"]));
@@ -10607,6 +11980,7 @@
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
+
   void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "p() {}", "p.A a;"]));
@@ -10614,6 +11988,7 @@
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
+
   void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "var p = null;", "p.A a;"]));
@@ -10621,6 +11996,7 @@
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
+
   void test_prefixCollidesWithTopLevelMembers_type() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "class p {}", "p.A a;"]));
@@ -10628,24 +12004,28 @@
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
+
   void test_privateOptionalParameter() {
     Source source = addSource(EngineTestCase.createSource(["f({var _p}) {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
     verify([source]);
   }
+
   void test_privateOptionalParameter_fieldFormal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var _p;", "  A({this._p: 0});", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
     verify([source]);
   }
+
   void test_privateOptionalParameter_withDefaultValue() {
     Source source = addSource(EngineTestCase.createSource(["f({_p : 0}) {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
     verify([source]);
   }
+
   void test_recursiveConstructorRedirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10658,12 +12038,14 @@
         CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
     verify([source]);
   }
+
   void test_recursiveConstructorRedirect_directSelfReference() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this();", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
     verify([source]);
   }
+
   void test_recursiveFactoryRedirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B {",
@@ -10685,12 +12067,14 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveFactoryRedirect_directSelfReference() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() = A;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
     verify([source]);
   }
+
   void test_recursiveFactoryRedirect_generic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> implements B<T> {",
@@ -10712,6 +12096,7 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveFactoryRedirect_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B {",
@@ -10757,6 +12142,7 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritance_extends() {
     Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B extends A {}"]));
     resolve(source);
@@ -10765,6 +12151,7 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritance_extends_implements() {
     Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B implements A {}"]));
     resolve(source);
@@ -10773,6 +12160,7 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritance_implements() {
     Source source = addSource(EngineTestCase.createSource(["class A implements B {}", "class B implements A {}"]));
     resolve(source);
@@ -10781,6 +12169,7 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritance_tail() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A implements A {}",
@@ -10789,6 +12178,7 @@
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritance_tail2() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A implements B {}",
@@ -10800,6 +12190,7 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritance_tail3() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A implements B {}",
@@ -10813,18 +12204,21 @@
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritanceBaseCaseExtends() {
     Source source = addSource(EngineTestCase.createSource(["class A extends A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritanceBaseCaseImplements() {
     Source source = addSource(EngineTestCase.createSource(["class A implements A {}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
     verify([source]);
   }
+
   void test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -10834,6 +12228,7 @@
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
     verify([source]);
   }
+
   void test_redirectToMissingConstructor_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B{",
@@ -10845,6 +12240,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
+
   void test_redirectToMissingConstructor_unnamed() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B{",
@@ -10856,18 +12252,21 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
+
   void test_redirectToNonClass_notAType() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B {", "  const factory B() = A;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
+
   void test_redirectToNonClass_undefinedIdentifier() {
     Source source = addSource(EngineTestCase.createSource(["class B {", "  const factory B() = A;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
+
   void test_redirectToNonConstConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10878,6 +12277,7 @@
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_referencedBeforeDeclaration_hideInBlock_function() {
     Source source = addSource(EngineTestCase.createSource([
         "var v = 1;",
@@ -10889,6 +12289,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
+
   void test_referencedBeforeDeclaration_hideInBlock_local() {
     Source source = addSource(EngineTestCase.createSource([
         "var v = 1;",
@@ -10900,6 +12301,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
+
   void test_referencedBeforeDeclaration_hideInBlock_subBlock() {
     Source source = addSource(EngineTestCase.createSource([
         "var v = 1;",
@@ -10913,29 +12315,46 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
+
+  void test_referencedBeforeDeclaration_inInitializer_closure() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = () => v;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_inInitializer_directly() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = v;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
   void test_rethrowOutsideCatch() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  rethrow;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH]);
     verify([source]);
   }
+
   void test_returnInGenerativeConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return 0; }", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_returnInGenerativeConstructor_expressionFunctionBody() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() => null;", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_superInInvalidContext_binaryExpression() {
     Source source = addSource(EngineTestCase.createSource(["var v = super + 0;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInInvalidContext_constructorFieldInitializer() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10948,6 +12367,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInInvalidContext_factoryConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10961,6 +12381,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInInvalidContext_instanceVariableInitializer() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10972,6 +12393,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInInvalidContext_staticMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10983,6 +12405,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInInvalidContext_staticVariableInitializer() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -10994,16 +12417,19 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInInvalidContext_topLevelFunction() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  super.f();", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInInvalidContext_topLevelVariableInitializer() {
     Source source = addSource(EngineTestCase.createSource(["var v = super.y;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
   }
+
   void test_superInRedirectingConstructor_redirectionSuper() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -11015,6 +12441,7 @@
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_superInRedirectingConstructor_superRedirection() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -11026,30 +12453,35 @@
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_parameterType_named() {
     Source source = addSource(EngineTestCase.createSource(["typedef A({A a});"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_parameterType_positional() {
     Source source = addSource(EngineTestCase.createSource(["typedef A([A a]);"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_parameterType_required() {
     Source source = addSource(EngineTestCase.createSource(["typedef A(A a);"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_parameterType_typeArgument() {
     Source source = addSource(EngineTestCase.createSource(["typedef A(List<A> a);"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef C A();",
@@ -11061,12 +12493,14 @@
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_returnType() {
     Source source = addSource(EngineTestCase.createSource(["typedef A A();"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_returnType_indirect() {
     Source source = addSource(EngineTestCase.createSource(["typedef B A();", "typedef A B();"]));
     resolve(source);
@@ -11075,18 +12509,21 @@
         CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotReferenceItself_typeVariableBounds() {
     Source source = addSource(EngineTestCase.createSource(["typedef A<T extends A>();"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotRereferenceItself_mixin_direct() {
     Source source = addSource(EngineTestCase.createSource(["class M = Object with M;"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeAliasCannotRereferenceItself_mixin_indirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class M1 = Object with M2;",
@@ -11097,6 +12534,7 @@
         CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+
   void test_typeArgumentNotMatchingBounds_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -11109,12 +12547,14 @@
     assertErrors(source, [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
+
   void test_undefinedClass_const() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  return const A();", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CLASS]);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_explicit_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -11124,6 +12564,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
   }
+
   void test_undefinedConstructorInInitializer_explicit_unnamed() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11136,6 +12577,7 @@
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
     verify([source]);
   }
+
   void test_undefinedConstructorInInitializer_implicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11148,17 +12590,20 @@
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
     verify([source]);
   }
+
   void test_undefinedFunction() {
     Source source = addSource(EngineTestCase.createSource(["void f() {", "  g();", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_FUNCTION]);
   }
+
   void test_undefinedFunction_hasImportPrefix() {
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as f;", "main() { return f(); }"]));
     addSource2("/lib.dart", "library lib;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_FUNCTION]);
   }
+
   void test_undefinedFunction_inCatch() {
     Source source = addSource(EngineTestCase.createSource([
         "void f() {",
@@ -11170,6 +12615,7 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_FUNCTION]);
   }
+
   void test_undefinedNamedParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11181,21 +12627,25 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER]);
   }
+
   void test_uriDoesNotExist_export() {
     Source source = addSource(EngineTestCase.createSource(["export 'unknown.dart';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
+
   void test_uriDoesNotExist_import() {
     Source source = addSource(EngineTestCase.createSource(["import 'unknown.dart';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
+
   void test_uriDoesNotExist_part() {
     Source source = addSource(EngineTestCase.createSource(["part 'unknown.dart';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
+
   void test_uriWithInterpolation_constant() {
     Source source = addSource(EngineTestCase.createSource(["import 'stuff_\$platform.dart';"]));
     resolve(source);
@@ -11203,11 +12653,13 @@
         CompileTimeErrorCode.URI_WITH_INTERPOLATION,
         StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_uriWithInterpolation_nonConstant() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "part '\${'a'}.dart';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
   }
+
   void test_wrongNumberOfParametersForOperator_minus() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator -(a, b) {}", "}"]));
     resolve(source);
@@ -11215,10 +12667,12 @@
     verify([source]);
     reset();
   }
+
   void test_wrongNumberOfParametersForOperator_tilde() {
     check_wrongNumberOfParametersForOperator("~", "a");
     check_wrongNumberOfParametersForOperator("~", "a, b");
   }
+
   void test_wrongNumberOfParametersForOperator1() {
     check_wrongNumberOfParametersForOperator1("<");
     check_wrongNumberOfParametersForOperator1(">");
@@ -11236,54 +12690,63 @@
     check_wrongNumberOfParametersForOperator1(">>");
     check_wrongNumberOfParametersForOperator1("[]");
   }
+
   void test_wrongNumberOfParametersForSetter_function_named() {
     Source source = addSource("set x({p}) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForSetter_function_optional() {
     Source source = addSource("set x([p]) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForSetter_function_tooFew() {
     Source source = addSource("set x() {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForSetter_function_tooMany() {
     Source source = addSource("set x(a, b) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForSetter_method_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set x({p}) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForSetter_method_optional() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set x([p]) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForSetter_method_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set x() {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void test_wrongNumberOfParametersForSetter_method_tooMany() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a, b) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
+
   void check_constEvalThrowsException_binary_null(String expr, bool resolved) {
     Source source = addSource("const C = ${expr};");
     resolve(source);
@@ -11295,6 +12758,7 @@
     }
     reset();
   }
+
   void check_constEvalTypeBool_withParameter_binary(String expr) {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11306,6 +12770,7 @@
     verify([source]);
     reset();
   }
+
   void check_constEvalTypeInt_withParameter_binary(String expr) {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11319,6 +12784,7 @@
     verify([source]);
     reset();
   }
+
   void check_constEvalTypeNum_withParameter_binary(String expr) {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11332,6 +12798,7 @@
     verify([source]);
     reset();
   }
+
   void check_wrongNumberOfParametersForOperator(String name, String parameters) {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
     resolve(source);
@@ -11339,10 +12806,12 @@
     verify([source]);
     reset();
   }
+
   void check_wrongNumberOfParametersForOperator1(String name) {
     check_wrongNumberOfParametersForOperator(name, "");
     check_wrongNumberOfParametersForOperator(name, "a, b");
   }
+
   static dartSuite() {
     _ut.group('CompileTimeErrorCodeTest', () {
       _ut.test('test_ambiguousExport', () {
@@ -12433,6 +13902,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_subBlock);
       });
+      _ut.test('test_referencedBeforeDeclaration_inInitializer_closure', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_inInitializer_closure);
+      });
+      _ut.test('test_referencedBeforeDeclaration_inInitializer_directly', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_inInitializer_directly);
+      });
       _ut.test('test_rethrowOutsideCatch', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_rethrowOutsideCatch);
@@ -12628,12 +14105,12 @@
     });
   }
 }
+
 /**
  * Instances of the class `StaticTypeVerifier` verify that all of the nodes in an AST
  * structure that should have a static type associated with them do have a static type.
  */
 class StaticTypeVerifier extends GeneralizingASTVisitor<Object> {
-
   /**
    * A list containing all of the AST Expression nodes that were not resolved.
    */
@@ -12730,10 +14207,15 @@
       JUnitTestCase.fail(writer.toString());
     }
   }
+
   Object visitBreakStatement(BreakStatement node) => null;
+
   Object visitCommentReference(CommentReference node) => null;
+
   Object visitContinueStatement(ContinueStatement node) => null;
+
   Object visitExportDirective(ExportDirective node) => null;
+
   Object visitExpression(Expression node) {
     node.visitChildren(this);
     Type2 staticType = node.staticType;
@@ -12751,32 +14233,38 @@
     }
     return null;
   }
+
   Object visitImportDirective(ImportDirective node) => null;
+
   Object visitLabel(Label node) => null;
+
   Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (node.staticType == null && identical(node.prefix.staticType, DynamicTypeImpl.instance)) {
       return null;
     }
     return super.visitPrefixedIdentifier(node);
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     ASTNode parent = node.parent;
-    if (parent is MethodInvocation && identical(node, ((parent as MethodInvocation)).methodName)) {
+    if (parent is MethodInvocation && identical(node, (parent as MethodInvocation).methodName)) {
       return null;
-    } else if (parent is RedirectingConstructorInvocation && identical(node, ((parent as RedirectingConstructorInvocation)).constructorName)) {
+    } else if (parent is RedirectingConstructorInvocation && identical(node, (parent as RedirectingConstructorInvocation).constructorName)) {
       return null;
-    } else if (parent is SuperConstructorInvocation && identical(node, ((parent as SuperConstructorInvocation)).constructorName)) {
+    } else if (parent is SuperConstructorInvocation && identical(node, (parent as SuperConstructorInvocation).constructorName)) {
       return null;
-    } else if (parent is ConstructorName && identical(node, ((parent as ConstructorName)).name)) {
+    } else if (parent is ConstructorName && identical(node, (parent as ConstructorName).name)) {
       return null;
-    } else if (parent is ConstructorFieldInitializer && identical(node, ((parent as ConstructorFieldInitializer)).fieldName)) {
+    } else if (parent is ConstructorFieldInitializer && identical(node, (parent as ConstructorFieldInitializer).fieldName)) {
       return null;
     } else if (node.staticElement is PrefixElement) {
       return null;
     }
     return super.visitSimpleIdentifier(node);
   }
+
   Object visitTypeName(TypeName node) {
     if (node.type == null) {
       _unresolvedTypes.add(node);
@@ -12785,6 +14273,7 @@
     }
     return null;
   }
+
   String getFileName(ASTNode node) {
     if (node != null) {
       ASTNode root = node.root;
@@ -12802,6 +14291,7 @@
     return "<unknown file- ASTNode is null>";
   }
 }
+
 /**
  * The class `StrictModeTest` contains tests to ensure that the correct errors and warnings
  * are reported when the analysis engine is run in strict mode.
@@ -12818,6 +14308,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
@@ -12825,6 +14316,7 @@
     options.hint = false;
     analysisContext.analysisOptions = options;
   }
+
   void test_assert_is() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12834,6 +14326,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_conditional_and_is() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12842,6 +14335,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_conditional_is() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12850,6 +14344,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_conditional_isNot() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12858,6 +14353,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_conditional_or_is() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12866,6 +14362,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_forEach() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(List<int> list) {",
@@ -12877,6 +14374,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_if_and_is() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12888,6 +14386,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_if_is() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12899,6 +14398,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_if_isNot() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12911,6 +14411,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_if_isNot_abrupt() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12922,6 +14423,7 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_if_or_is() {
     Source source = addSource(EngineTestCase.createSource([
         "int f(num n) {",
@@ -12934,11 +14436,13 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   void test_localVar() {
     Source source = addSource(EngineTestCase.createSource(["int f() {", "  num n = 1234;", "  return n & 0x0F;", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
+
   static dartSuite() {
     _ut.group('StrictModeTest', () {
       _ut.test('test_assert_is', () {
@@ -12992,8 +14496,8 @@
     });
   }
 }
-class ElementResolverTest extends EngineTestCase {
 
+class ElementResolverTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
    */
@@ -13018,22 +14522,26 @@
    * The resolver being used to resolve the test cases.
    */
   ElementResolver _resolver;
+
   void fail_visitExportDirective_combinators() {
     JUnitTestCase.fail("Not yet tested");
     ExportDirective directive = ASTFactory.exportDirective2(null, [ASTFactory.hideCombinator2(["A"])]);
     resolveNode(directive, []);
     _listener.assertNoErrors();
   }
+
   void fail_visitFunctionExpressionInvocation() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitImportDirective_combinators_noPrefix() {
     JUnitTestCase.fail("Not yet tested");
     ImportDirective directive = ASTFactory.importDirective2(null, null, [ASTFactory.showCombinator2(["A"])]);
     resolveNode(directive, []);
     _listener.assertNoErrors();
   }
+
   void fail_visitImportDirective_combinators_prefix() {
     JUnitTestCase.fail("Not yet tested");
     String prefixName = "p";
@@ -13044,15 +14552,18 @@
     resolveNode(directive, []);
     _listener.assertNoErrors();
   }
+
   void fail_visitRedirectingConstructorInvocation() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void setUp() {
     _listener = new GatheringErrorListener();
     _typeProvider = new TestTypeProvider();
     _resolver = createResolver();
   }
+
   void test_lookUpMethodInInterfaces() {
     InterfaceType intType = _typeProvider.intType;
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -13069,6 +14580,7 @@
     JUnitTestCase.assertSame(operator, resolve5(expression, []));
     _listener.assertNoErrors();
   }
+
   void test_visitAssignmentExpression_compound() {
     InterfaceType intType = _typeProvider.intType;
     SimpleIdentifier leftHandSide = ASTFactory.identifier3("a");
@@ -13078,12 +14590,14 @@
     JUnitTestCase.assertSame(getMethod(_typeProvider.numType, "+"), assignment.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitAssignmentExpression_simple() {
     AssignmentExpression expression = ASTFactory.assignmentExpression(ASTFactory.identifier3("x"), TokenType.EQ, ASTFactory.integer(0));
     resolveNode(expression, []);
     JUnitTestCase.assertNull(expression.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression() {
     InterfaceType numType = _typeProvider.numType;
     SimpleIdentifier left = ASTFactory.identifier3("i");
@@ -13093,6 +14607,7 @@
     JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitBreakStatement_withLabel() {
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(ASTFactory.identifier3(label), false, false);
@@ -13100,31 +14615,35 @@
     JUnitTestCase.assertSame(labelElement, resolve(statement, labelElement));
     _listener.assertNoErrors();
   }
+
   void test_visitBreakStatement_withoutLabel() {
     BreakStatement statement = ASTFactory.breakStatement();
     resolveStatement(statement, null);
     _listener.assertNoErrors();
   }
+
   void test_visitConstructorName_named() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = "a";
-    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     resolveNode(name, []);
     JUnitTestCase.assertSame(constructor, name.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitConstructorName_unnamed() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = null;
-    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     resolveNode(name, []);
     JUnitTestCase.assertSame(constructor, name.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitContinueStatement_withLabel() {
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(ASTFactory.identifier3(label), false, false);
@@ -13132,17 +14651,20 @@
     JUnitTestCase.assertSame(labelElement, resolve3(statement, labelElement));
     _listener.assertNoErrors();
   }
+
   void test_visitContinueStatement_withoutLabel() {
     ContinueStatement statement = ASTFactory.continueStatement();
     resolveStatement(statement, null);
     _listener.assertNoErrors();
   }
+
   void test_visitExportDirective_noCombinators() {
     ExportDirective directive = ASTFactory.exportDirective2(null, []);
     directive.element = ElementFactory.exportFor(ElementFactory.library(_definingLibrary.context, "lib"), []);
     resolveNode(directive, []);
     _listener.assertNoErrors();
   }
+
   void test_visitFieldFormalParameter() {
     InterfaceType intType = _typeProvider.intType;
     String fieldName = "f";
@@ -13153,12 +14675,14 @@
     resolveInClass(parameter, classA);
     JUnitTestCase.assertSame(intType, parameter.element.type);
   }
+
   void test_visitImportDirective_noCombinators_noPrefix() {
     ImportDirective directive = ASTFactory.importDirective2(null, null, []);
     directive.element = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), null, []);
     resolveNode(directive, []);
     _listener.assertNoErrors();
   }
+
   void test_visitImportDirective_noCombinators_prefix() {
     String prefixName = "p";
     ImportElement importElement = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), ElementFactory.prefix(prefixName), []);
@@ -13168,6 +14692,7 @@
     resolveNode(directive, []);
     _listener.assertNoErrors();
   }
+
   void test_visitIndexExpression_get() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType intType = _typeProvider.intType;
@@ -13179,6 +14704,7 @@
     JUnitTestCase.assertSame(getter, resolve5(expression, []));
     _listener.assertNoErrors();
   }
+
   void test_visitIndexExpression_set() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType intType = _typeProvider.intType;
@@ -13191,10 +14717,11 @@
     JUnitTestCase.assertSame(setter, resolve5(expression, []));
     _listener.assertNoErrors();
   }
+
   void test_visitInstanceCreationExpression_named() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = "a";
-    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     name.staticElement = constructor;
@@ -13203,10 +14730,11 @@
     JUnitTestCase.assertSame(constructor, creation.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitInstanceCreationExpression_unnamed() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = null;
-    ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     name.staticElement = constructor;
@@ -13215,10 +14743,11 @@
     JUnitTestCase.assertSame(constructor, creation.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitInstanceCreationExpression_unnamed_namedParameter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String constructorName = null;
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(classA, constructorName);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classA, constructorName, []);
     String parameterName = "a";
     ParameterElement parameter = ElementFactory.namedParameter(parameterName);
     constructor.parameters = <ParameterElement> [parameter];
@@ -13228,9 +14757,10 @@
     InstanceCreationExpression creation = ASTFactory.instanceCreationExpression(Keyword.NEW, name, [ASTFactory.namedExpression2(parameterName, ASTFactory.integer(0))]);
     resolveNode(creation, []);
     JUnitTestCase.assertSame(constructor, creation.staticElement);
-    JUnitTestCase.assertSame(parameter, ((creation.argumentList.arguments[0] as NamedExpression)).name.label.staticElement);
+    JUnitTestCase.assertSame(parameter, (creation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitMethodInvocation() {
     InterfaceType numType = _typeProvider.numType;
     SimpleIdentifier left = ASTFactory.identifier3("i");
@@ -13241,6 +14771,7 @@
     JUnitTestCase.assertSame(getMethod(numType, methodName), invocation.methodName.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitMethodInvocation_namedParameter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -13254,9 +14785,10 @@
     MethodInvocation invocation = ASTFactory.methodInvocation(left, methodName, [ASTFactory.namedExpression2(parameterName, ASTFactory.integer(0))]);
     resolveNode(invocation, []);
     JUnitTestCase.assertSame(method, invocation.methodName.staticElement);
-    JUnitTestCase.assertSame(parameter, ((invocation.argumentList.arguments[0] as NamedExpression)).name.label.staticElement);
+    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitPostfixExpression() {
     InterfaceType numType = _typeProvider.numType;
     SimpleIdentifier operand = ASTFactory.identifier3("i");
@@ -13266,6 +14798,7 @@
     JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixedIdentifier_dynamic() {
     Type2 dynamicType = _typeProvider.dynamicType;
     SimpleIdentifier target = ASTFactory.identifier3("a");
@@ -13279,6 +14812,7 @@
     JUnitTestCase.assertNull(identifier.identifier.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixedIdentifier_nonDynamic() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "b";
@@ -13295,6 +14829,7 @@
     JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixExpression() {
     InterfaceType numType = _typeProvider.numType;
     SimpleIdentifier operand = ASTFactory.identifier3("i");
@@ -13304,6 +14839,7 @@
     JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitPropertyAccess_getter_identifier() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "b";
@@ -13316,6 +14852,7 @@
     JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitPropertyAccess_getter_super() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "b";
@@ -13329,6 +14866,7 @@
     JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitPropertyAccess_setter_this() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "b";
@@ -13342,6 +14880,7 @@
     JUnitTestCase.assertSame(setter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitSimpleIdentifier_classScope() {
     InterfaceType doubleType = _typeProvider.doubleType;
     String fieldName = "NAN";
@@ -13350,6 +14889,7 @@
     JUnitTestCase.assertEquals(getGetter(doubleType, fieldName), node.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitSimpleIdentifier_dynamic() {
     SimpleIdentifier node = ASTFactory.identifier3("dynamic");
     resolve4(node, []);
@@ -13357,12 +14897,14 @@
     JUnitTestCase.assertSame(_typeProvider.typeType, node.staticType);
     _listener.assertNoErrors();
   }
+
   void test_visitSimpleIdentifier_lexicalScope() {
     SimpleIdentifier node = ASTFactory.identifier3("i");
     VariableElementImpl element = ElementFactory.localVariableElement(node);
     JUnitTestCase.assertSame(element, resolve4(node, [element]));
     _listener.assertNoErrors();
   }
+
   void test_visitSimpleIdentifier_lexicalScope_field_setter() {
     InterfaceType intType = _typeProvider.intType;
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -13375,35 +14917,37 @@
     resolveInClass(node, classA);
     Element element = node.staticElement;
     EngineTestCase.assertInstanceOf(PropertyAccessorElement, element);
-    JUnitTestCase.assertTrue(((element as PropertyAccessorElement)).isSetter);
+    JUnitTestCase.assertTrue((element as PropertyAccessorElement).isSetter);
     _listener.assertNoErrors();
   }
+
   void test_visitSuperConstructorInvocation() {
     ClassElementImpl superclass = ElementFactory.classElement2("A", []);
-    ConstructorElementImpl superConstructor = ElementFactory.constructorElement(superclass, null);
+    ConstructorElementImpl superConstructor = ElementFactory.constructorElement2(superclass, null, []);
     superclass.constructors = <ConstructorElement> [superConstructor];
     ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
-    ConstructorElementImpl subConstructor = ElementFactory.constructorElement(subclass, null);
+    ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = ASTFactory.superConstructorInvocation([]);
     resolveInClass(invocation, subclass);
     JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
     _listener.assertNoErrors();
   }
+
   void test_visitSuperConstructorInvocation_namedParameter() {
     ClassElementImpl superclass = ElementFactory.classElement2("A", []);
-    ConstructorElementImpl superConstructor = ElementFactory.constructorElement(superclass, null);
+    ConstructorElementImpl superConstructor = ElementFactory.constructorElement2(superclass, null, []);
     String parameterName = "p";
     ParameterElement parameter = ElementFactory.namedParameter(parameterName);
     superConstructor.parameters = <ParameterElement> [parameter];
     superclass.constructors = <ConstructorElement> [superConstructor];
     ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
-    ConstructorElementImpl subConstructor = ElementFactory.constructorElement(subclass, null);
+    ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = ASTFactory.superConstructorInvocation([ASTFactory.namedExpression2(parameterName, ASTFactory.integer(0))]);
     resolveInClass(invocation, subclass);
     JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
-    JUnitTestCase.assertSame(parameter, ((invocation.argumentList.arguments[0] as NamedExpression)).name.label.staticElement);
+    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
     _listener.assertNoErrors();
   }
 
@@ -13565,6 +15109,7 @@
       throw new IllegalArgumentException("Could not resolve node", exception);
     }
   }
+
   static dartSuite() {
     _ut.group('ElementResolverTest', () {
       _ut.test('test_lookUpMethodInInterfaces', () {
@@ -13706,6 +15251,7 @@
     });
   }
 }
+
 class TypeOverrideManagerTest extends EngineTestCase {
   void test_exitScope_noScopes() {
     TypeOverrideManager manager = new TypeOverrideManager();
@@ -13715,6 +15261,7 @@
     } on IllegalStateException catch (exception) {
     }
   }
+
   void test_exitScope_oneScope() {
     TypeOverrideManager manager = new TypeOverrideManager();
     manager.enterScope();
@@ -13725,6 +15272,7 @@
     } on IllegalStateException catch (exception) {
     }
   }
+
   void test_exitScope_twoScopes() {
     TypeOverrideManager manager = new TypeOverrideManager();
     manager.enterScope();
@@ -13737,6 +15285,7 @@
     } on IllegalStateException catch (exception) {
     }
   }
+
   void test_getType_enclosedOverride() {
     TypeOverrideManager manager = new TypeOverrideManager();
     LocalVariableElementImpl element = ElementFactory.localVariableElement2("v");
@@ -13746,6 +15295,7 @@
     manager.enterScope();
     JUnitTestCase.assertSame(type, manager.getType(element));
   }
+
   void test_getType_immediateOverride() {
     TypeOverrideManager manager = new TypeOverrideManager();
     LocalVariableElementImpl element = ElementFactory.localVariableElement2("v");
@@ -13754,15 +15304,18 @@
     manager.setType(element, type);
     JUnitTestCase.assertSame(type, manager.getType(element));
   }
+
   void test_getType_noOverride() {
     TypeOverrideManager manager = new TypeOverrideManager();
     manager.enterScope();
     JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
   }
+
   void test_getType_noScope() {
     TypeOverrideManager manager = new TypeOverrideManager();
     JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
   }
+
   static dartSuite() {
     _ut.group('TypeOverrideManagerTest', () {
       _ut.test('test_exitScope_noScopes', () {
@@ -13796,12 +15349,14 @@
     });
   }
 }
+
 class PubSuggestionCodeTest extends ResolverTestCase {
   void test_import_package() {
     Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/other.dart';"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
+
   void test_import_packageWithDotDot() {
     Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/../other.dart';"]));
     resolve(source);
@@ -13809,6 +15364,7 @@
         CompileTimeErrorCode.URI_DOES_NOT_EXIST,
         PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
   }
+
   void test_import_packageWithLeadingDotDot() {
     Source source = addSource(EngineTestCase.createSource(["import 'package:../other.dart';"]));
     resolve(source);
@@ -13816,6 +15372,7 @@
         CompileTimeErrorCode.URI_DOES_NOT_EXIST,
         PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
   }
+
   void test_import_referenceIntoLibDirectory() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/other.dart", "");
@@ -13823,12 +15380,14 @@
     resolve(source);
     assertErrors(source, [PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
   }
+
   void test_import_referenceIntoLibDirectory_no_pubspec() {
     cacheSource("/myproj/lib/other.dart", "");
     Source source = addSource2("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_import_referenceOutOfLibDirectory() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/web/other.dart", "");
@@ -13836,12 +15395,14 @@
     resolve(source);
     assertErrors(source, [PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
   }
+
   void test_import_referenceOutOfLibDirectory_no_pubspec() {
     cacheSource("/myproj/web/other.dart", "");
     Source source = addSource2("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_import_valid_inside_lib1() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/other.dart", "");
@@ -13849,6 +15410,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_import_valid_inside_lib2() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/bar/other.dart", "");
@@ -13856,6 +15418,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_import_valid_outside_lib() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/web/other.dart", "");
@@ -13863,6 +15426,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   static dartSuite() {
     _ut.group('PubSuggestionCodeTest', () {
       _ut.test('test_import_package', () {
@@ -13908,6 +15472,7 @@
     });
   }
 }
+
 class StaticWarningCodeTest extends ResolverTestCase {
   void fail_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource([]));
@@ -13915,6 +15480,7 @@
     assertErrors(source, [StaticWarningCode.UNDEFINED_GETTER]);
     verify([source]);
   }
+
   void fail_undefinedIdentifier_commentReference() {
     Source source = addSource(EngineTestCase.createSource(["/** [m] xxx [new B.c] */", "class A {", "}"]));
     resolve(source);
@@ -13922,24 +15488,14 @@
         StaticWarningCode.UNDEFINED_IDENTIFIER,
         StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void fail_undefinedSetter() {
     Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  C.m = 0;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_SETTER]);
     verify([source]);
   }
-  void fail_undefinedStaticMethodOrGetter_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m);", "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER]);
-    verify([source]);
-  }
-  void fail_undefinedStaticMethodOrGetter_method() {
-    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m());", "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER]);
-    verify([source]);
-  }
+
   void test_ambiguousImport_as() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -13950,6 +15506,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_extends() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -13962,6 +15519,7 @@
         StaticWarningCode.AMBIGUOUS_IMPORT,
         CompileTimeErrorCode.EXTENDS_NON_CLASS]);
   }
+
   void test_ambiguousImport_implements() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -13974,6 +15532,7 @@
         StaticWarningCode.AMBIGUOUS_IMPORT,
         CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
   }
+
   void test_ambiguousImport_inPart() {
     Source source = addSource(EngineTestCase.createSource([
         "library lib;",
@@ -13988,6 +15547,7 @@
         StaticWarningCode.AMBIGUOUS_IMPORT,
         CompileTimeErrorCode.EXTENDS_NON_CLASS]);
   }
+
   void test_ambiguousImport_instanceCreation() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -13999,6 +15559,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_is() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -14009,6 +15570,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_qualifier() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -14019,6 +15581,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_typeAnnotation() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -14043,6 +15606,7 @@
         StaticWarningCode.AMBIGUOUS_IMPORT,
         StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_typeArgument_annotation() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -14054,6 +15618,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_typeArgument_instanceCreation() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -14065,6 +15630,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_varRead() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -14076,6 +15642,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_ambiguousImport_varWrite() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -14086,6 +15653,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+
   void test_argumentTypeNotAssignable_annotation_namedConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14098,6 +15666,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_annotation_unnamedConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14110,6 +15679,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_binary() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14122,6 +15692,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_cascadeSEcond() {
     Source source = addSource(EngineTestCase.createSource([
         "// filler filler filler filler filler filler filler filler filler filler",
@@ -14140,6 +15711,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14152,6 +15724,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_const_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14164,12 +15737,14 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_functionExpressionInvocation_required() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} ('');", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_index() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14182,6 +15757,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_callParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14194,6 +15770,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_callVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14207,12 +15784,14 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_functionParameter() {
     Source source = addSource(EngineTestCase.createSource(["a(b(int p)) {", "  b('0');", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<K, V> {",
@@ -14224,6 +15803,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_functionTypes_optional() {
     Source source = addSource(EngineTestCase.createSource([
         "void acceptFunNumOptBool(void funNumOptBool([bool b])) {}",
@@ -14235,6 +15815,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_generic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -14247,30 +15828,35 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_named() {
     Source source = addSource(EngineTestCase.createSource(["f({String p}) {}", "main() {", "  f(p: 42);", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_optional() {
     Source source = addSource(EngineTestCase.createSource(["f([String p]) {}", "main() {", "  f(42);", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_required() {
     Source source = addSource(EngineTestCase.createSource(["f(String p) {}", "main() {", "  f(42);", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_typedef_generic() {
     Source source = addSource(EngineTestCase.createSource(["typedef A<T>(T p);", "f(A<int> a) {", "  a('1');", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_typedef_local() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef A(int p);",
@@ -14283,12 +15869,14 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_invocation_typedef_parameter() {
     Source source = addSource(EngineTestCase.createSource(["typedef A(int p);", "f(A a) {", "  a('1');", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_new_generic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -14301,6 +15889,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_new_optional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14313,6 +15902,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_argumentTypeNotAssignable_new_required() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14325,6 +15915,7 @@
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_assignmentToConst_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14337,12 +15928,14 @@
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
     verify([source]);
   }
+
   void test_assignmentToConst_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  const x = 0;", "  x = 1;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
     verify([source]);
   }
+
   void test_assignmentToFinal_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14356,24 +15949,28 @@
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToFinal_localVariable() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x = 1;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToFinal_prefixMinusMinus() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  --x;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToFinal_prefixPlusPlus() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  ++x;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToFinal_propertyAccess() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14389,24 +15986,28 @@
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToFinal_suffixMinusMinus() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x--;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToFinal_suffixPlusPlus() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x++;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToFinal_topLevelVariable() {
     Source source = addSource(EngineTestCase.createSource(["final x = 0;", "f() { x = 1; }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
+
   void test_assignmentToMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14419,6 +16020,7 @@
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_METHOD]);
     verify([source]);
   }
+
   void test_caseBlockNotTerminated() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int p) {",
@@ -14433,18 +16035,21 @@
     assertErrors(source, [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
     verify([source]);
   }
+
   void test_castToNonType() {
     Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(String s) { var x = s as A; }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.CAST_TO_NON_TYPE]);
     verify([source]);
   }
+
   void test_concreteClassWithAbstractMember() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m();", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER]);
     verify([source]);
   }
+
   void test_conflictingDartImport() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib.dart';",
@@ -14455,19 +16060,21 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_DART_IMPORT]);
   }
-  void test_conflictingInstanceGetterAndSuperclassMember_direct_field() {
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
-        "  static int v;",
+        "  static set v(x) {}",
         "}",
         "class B extends A {",
-        "  get v => 0;",
+        "  var v;",
         "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
-  void test_conflictingInstanceGetterAndSuperclassMember_direct_getter() {
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  static get v => 0;",
@@ -14479,7 +16086,8 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
-  void test_conflictingInstanceGetterAndSuperclassMember_direct_method() {
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  static v() {}",
@@ -14491,7 +16099,8 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
-  void test_conflictingInstanceGetterAndSuperclassMember_direct_setter() {
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  static set v(x) {}",
@@ -14503,7 +16112,8 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
-  void test_conflictingInstanceGetterAndSuperclassMember_indirect() {
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_indirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  static int v;",
@@ -14516,7 +16126,8 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
-  void test_conflictingInstanceGetterAndSuperclassMember_mixin() {
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_mixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class M {",
         "  static int v;",
@@ -14528,6 +16139,53 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_direct_field() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static int v;",
+        "}",
+        "class B extends A {",
+        "  get v => 0;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceMethodSetter_sameClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  foo() {}", "  set foo(a) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceMethodSetter_setterInInterface() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  set foo(a);",
+        "}",
+        "abstract class B implements A {",
+        "  foo() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceMethodSetter_setterInSuper() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  set foo(a) {}",
+        "}",
+        "class B extends A {",
+        "  foo() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
+    verify([source]);
+  }
+
   void test_conflictingInstanceSetterAndSuperclassMember() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14540,6 +16198,7 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
+
   void test_conflictingStaticGetterAndInstanceSetter_mixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14552,6 +16211,7 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
     verify([source]);
   }
+
   void test_conflictingStaticGetterAndInstanceSetter_superClass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14564,6 +16224,7 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
     verify([source]);
   }
+
   void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14574,6 +16235,7 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
     verify([source]);
   }
+
   void test_conflictingStaticSetterAndInstanceMember_thisClass_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14584,12 +16246,14 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
     verify([source]);
   }
+
   void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  x() {}", "  static set x(int p) {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
     verify([source]);
   }
+
   void test_constWithAbstractClass() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -14602,12 +16266,14 @@
     assertErrors(source, [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS]);
     verify([source]);
   }
+
   void test_equalKeysInMap() {
     Source source = addSource(EngineTestCase.createSource(["var m = {'a' : 0, 'b' : 1, 'a' : 2};"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
     verify([source]);
   }
+
   void test_exportDuplicatedLibraryName() {
     Source source = addSource(EngineTestCase.createSource([
         "library test;",
@@ -14619,18 +16285,21 @@
     assertErrors(source, [StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME]);
     verify([source]);
   }
+
   void test_extraPositionalArguments() {
     Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  f(0, 1, '2');", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
+
   void test_extraPositionalArguments_functionExpression() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} (0, 1);", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
+
   void test_fieldInitializedInInitializerAndDeclaration_final() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14641,12 +16310,14 @@
     assertErrors(source, [StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
     verify([source]);
   }
+
   void test_fieldInitializerNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = '';", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_fieldInitializingFormalNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(String this.x) {}", "}"]));
     resolve(source);
@@ -14669,48 +16340,56 @@
     assertErrors(source, [StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
     verify([source]);
   }
+
   void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A(this.x) {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR]);
     verify([source]);
   }
+
   void test_finalNotInitialized_inConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_finalNotInitialized_instanceField_final() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final F;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_finalNotInitialized_instanceField_final_static() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  static final F;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_finalNotInitialized_library_final() {
     Source source = addSource(EngineTestCase.createSource(["final F;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_finalNotInitialized_local_final() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  final int x;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
+
   void test_functionWithoutCall_direct() {
     Source source = addSource(EngineTestCase.createSource(["class A implements Function {", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
     verify([source]);
   }
+
   void test_functionWithoutCall_indirect_extends() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A implements Function {",
@@ -14721,6 +16400,7 @@
     assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
     verify([source]);
   }
+
   void test_functionWithoutCall_indirect_implements() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A implements Function {",
@@ -14731,6 +16411,7 @@
     assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
     verify([source]);
   }
+
   void test_importDuplicatedLibraryName() {
     Source source = addSource(EngineTestCase.createSource([
         "library test;",
@@ -14745,6 +16426,7 @@
         HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
+
   void test_inconsistentMethodInheritanceGetterAndMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -14759,6 +16441,7 @@
     assertErrors(source, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14771,6 +16454,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_field2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14785,6 +16469,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14797,6 +16482,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_getter2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14811,6 +16497,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14823,6 +16510,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_method2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14837,6 +16525,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_setter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14849,6 +16538,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_instanceMethodNameCollidesWithSuperclassStatic_setter2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14863,6 +16553,7 @@
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
+
   void test_invalidGetterOverrideReturnType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14875,6 +16566,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_invalidGetterOverrideReturnType_implicit() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14889,6 +16581,7 @@
         StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideNamedParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14901,6 +16594,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideNormalParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14913,6 +16607,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideOptionalParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14925,6 +16620,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideReturnType_interface() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14937,6 +16633,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideReturnType_interface2() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -14951,6 +16648,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideReturnType_mixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14963,6 +16661,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideReturnType_superclass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14975,6 +16674,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideReturnType_superclass2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -14989,6 +16689,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_invalidMethodOverrideReturnType_void() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15001,6 +16702,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_invalidOverrideDifferentDefaultValues_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15013,6 +16715,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED]);
     verify([source]);
   }
+
   void test_invalidOverrideDifferentDefaultValues_positional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15025,6 +16728,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL]);
     verify([source]);
   }
+
   void test_invalidOverrideNamed_fewerNamedParameters() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15037,6 +16741,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
     verify([source]);
   }
+
   void test_invalidOverrideNamed_missingNamedParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15049,6 +16754,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
     verify([source]);
   }
+
   void test_invalidOverridePositional_optional() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15061,6 +16767,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     verify([source]);
   }
+
   void test_invalidOverridePositional_optionalAndRequired() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15073,6 +16780,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     verify([source]);
   }
+
   void test_invalidOverridePositional_optionalAndRequired2() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15085,6 +16793,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     verify([source]);
   }
+
   void test_invalidOverrideRequired() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15097,6 +16806,7 @@
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_REQUIRED]);
     verify([source]);
   }
+
   void test_invalidSetterOverrideNormalParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15109,24 +16819,28 @@
     assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
+
   void test_listElementTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = <String> [42];"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_mapKeyTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = <String, int > {1 : 2};"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_mapValueTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = <String, String> {'a' : 2};"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_mismatchedAccessorTypes_class() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15137,6 +16851,7 @@
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
+
   void test_mismatchedAccessorTypes_getterAndSuperSetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15149,6 +16864,7 @@
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE]);
     verify([source]);
   }
+
   void test_mismatchedAccessorTypes_setterAndSuperGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15161,12 +16877,14 @@
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE]);
     verify([source]);
   }
+
   void test_mismatchedAccessorTypes_topLevel() {
     Source source = addSource(EngineTestCase.createSource(["int get g { return 0; }", "set g(String v) {}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
+
   void test_mixedReturnTypes_localFunction() {
     Source source = addSource(EngineTestCase.createSource([
         "class C {",
@@ -15183,6 +16901,7 @@
     assertErrors(source, [StaticWarningCode.MIXED_RETURN_TYPES]);
     verify([source]);
   }
+
   void test_mixedReturnTypes_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class C {",
@@ -15197,6 +16916,7 @@
     assertErrors(source, [StaticWarningCode.MIXED_RETURN_TYPES]);
     verify([source]);
   }
+
   void test_mixedReturnTypes_topLevelFunction() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int x) {",
@@ -15209,6 +16929,7 @@
     assertErrors(source, [StaticWarningCode.MIXED_RETURN_TYPES]);
     verify([source]);
   }
+
   void test_newWithAbstractClass() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {}",
@@ -15219,12 +16940,14 @@
     assertErrors(source, [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS]);
     verify([source]);
   }
+
   void test_newWithInvalidTypeParameters() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f() { return new A<A>(); }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
+
   void test_newWithInvalidTypeParameters_tooFew() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -15236,6 +16959,7 @@
     assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
+
   void test_newWithInvalidTypeParameters_tooMany() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -15247,12 +16971,14 @@
     assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
+
   void test_newWithNonType() {
     Source source = addSource(EngineTestCase.createSource(["var A = 0;", "void f() {", "  var a = new A();", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_NON_TYPE]);
     verify([source]);
   }
+
   void test_newWithNonType_fromLibrary() {
     Source source1 = addSource2("lib.dart", "class B {}");
     Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
@@ -15266,6 +16992,7 @@
     assertErrors(source2, [StaticWarningCode.NEW_WITH_NON_TYPE]);
     verify([source1]);
   }
+
   void test_newWithUndefinedConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15277,6 +17004,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR]);
   }
+
   void test_newWithUndefinedConstructorDefault() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15289,6 +17017,7 @@
     assertErrors(source, [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberFivePlus() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15304,6 +17033,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberFour() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15318,6 +17048,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface() {
     Source source = addSource(EngineTestCase.createSource([
         "class I {",
@@ -15329,6 +17060,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15340,6 +17072,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface() {
     Source source = addSource(EngineTestCase.createSource([
         "class I {",
@@ -15351,6 +17084,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15362,6 +17096,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15376,6 +17111,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface() {
     Source source = addSource(EngineTestCase.createSource([
         "class I {",
@@ -15387,6 +17123,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15398,6 +17135,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15412,6 +17150,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberThree() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15425,6 +17164,7 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE]);
     verify([source]);
   }
+
   void test_nonAbstractClassInheritsAbstractMemberTwo() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -15437,12 +17177,14 @@
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO]);
     verify([source]);
   }
+
   void test_nonTypeInCatchClause_noElement() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } on T catch (e) {", "  }", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
     verify([source]);
   }
+
   void test_nonTypeInCatchClause_notType() {
     Source source = addSource(EngineTestCase.createSource([
         "var T = 0;",
@@ -15455,18 +17197,21 @@
     assertErrors(source, [StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
     verify([source]);
   }
+
   void test_nonVoidReturnForOperator() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int operator []=(a, b) {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR]);
     verify([source]);
   }
+
   void test_nonVoidReturnForSetter_function() {
     Source source = addSource(EngineTestCase.createSource(["int set x(int v) {", "  return 42;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
     verify([source]);
   }
+
   void test_nonVoidReturnForSetter_method() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15478,24 +17223,28 @@
     assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
     verify([source]);
   }
+
   void test_notAType() {
     Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  f v = null;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_A_TYPE]);
     verify([source]);
   }
+
   void test_notEnoughRequiredArguments() {
     Source source = addSource(EngineTestCase.createSource(["f(int a, String b) {}", "main() {", "  f();", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
+
   void test_notEnoughRequiredArguments_functionExpression() {
     Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} ();", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
+
   void test_partOfDifferentLibrary() {
     Source source = addSource(EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
     addSource2("/part.dart", EngineTestCase.createSource(["part of lub;"]));
@@ -15503,6 +17252,7 @@
     assertErrors(source, [StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]);
     verify([source]);
   }
+
   void test_redirectToInvalidFunctionType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B {",
@@ -15515,6 +17265,7 @@
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE]);
     verify([source]);
   }
+
   void test_redirectToInvalidReturnType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15527,6 +17278,7 @@
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE]);
     verify([source]);
   }
+
   void test_redirectToMissingConstructor_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B{",
@@ -15538,6 +17290,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
+
   void test_redirectToMissingConstructor_unnamed() {
     Source source = addSource(EngineTestCase.createSource([
         "class A implements B{",
@@ -15549,42 +17302,49 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
+
   void test_redirectToNonClass_notAType() {
     Source source = addSource(EngineTestCase.createSource(["class B {", "  int A;", "  factory B() = A;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
+
   void test_redirectToNonClass_undefinedIdentifier() {
     Source source = addSource(EngineTestCase.createSource(["class B {", "  factory B() = A;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
+
   void test_returnWithoutValue() {
     Source source = addSource(EngineTestCase.createSource(["int f() { return; }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_method_invocation() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "main() {", "  A.m();", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_method_reference() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "main() {", "  A.m;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_propertyAccess_field() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "}", "main() {", "  A.f;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_propertyAccess_getter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15597,6 +17357,7 @@
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
+
   void test_staticAccessToInstanceMember_propertyAccess_setter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -15609,6 +17370,7 @@
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
+
   void test_switchExpressionNotAssignable() {
     Source source = addSource(EngineTestCase.createSource([
         "f(int p) {",
@@ -15620,42 +17382,49 @@
     assertErrors(source, [StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
   void test_typeParameterReferencedByStatic_field() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K k;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_typeParameterReferencedByStatic_getter() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K get k => 0;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_typeParameterReferencedByStatic_methodBodyReference() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static m() {", "    K k;", "  }", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_typeParameterReferencedByStatic_methodParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static m(K k) {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_typeParameterReferencedByStatic_methodReturn() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K m() {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_typeParameterReferencedByStatic_setter() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static set s(K k) {}", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
+
   void test_typePromotion_functionType_arg_InterToDyn() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef FuncDyn(x);",
@@ -15670,27 +17439,32 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
   }
+
   void test_typeTestNonType() {
     Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(var p) {", "  if (p is A) {", "  }", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_TEST_NON_TYPE]);
     verify([source]);
   }
+
   void test_undefinedClass_instanceCreation() {
     Source source = addSource(EngineTestCase.createSource(["f() { new C(); }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
   }
+
   void test_undefinedClass_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["f() { C c; }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
   }
+
   void test_undefinedClassBoolean_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["f() { boolean v; }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS_BOOLEAN]);
   }
+
   void test_undefinedGetter_fromLibrary() {
     Source source1 = addSource2("lib.dart", "");
     Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
@@ -15703,16 +17477,19 @@
     assertErrors(source2, [StaticWarningCode.UNDEFINED_GETTER]);
     verify([source1]);
   }
+
   void test_undefinedIdentifier_for() {
     Source source = addSource(EngineTestCase.createSource(["f(var l) {", "  for (e in l) {", "  }", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_undefinedIdentifier_function() {
     Source source = addSource(EngineTestCase.createSource(["int a() => b;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_undefinedIdentifier_function_prefix() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "int a() => b;", "b.C c;"]));
@@ -15720,22 +17497,26 @@
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
     verify([source]);
   }
+
   void test_undefinedIdentifier_initializer() {
     Source source = addSource(EngineTestCase.createSource(["var a = b;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_undefinedIdentifier_initializer_prefix() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
     Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "var a = b;", "b.C c;"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_undefinedIdentifier_methodInvocation() {
     Source source = addSource(EngineTestCase.createSource(["f() { C.m(); }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_undefinedIdentifier_private_getter() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -15748,6 +17529,7 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_undefinedIdentifier_private_setter() {
     addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
     Source source = addSource(EngineTestCase.createSource([
@@ -15760,11 +17542,13 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+
   void test_undefinedNamedParameter() {
     Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(c: 1);", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_NAMED_PARAMETER]);
   }
+
   void test_undefinedSetter() {
     Source source1 = addSource2("lib.dart", "");
     Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
@@ -15776,6 +17560,58 @@
     resolve(source2);
     assertErrors(source2, [StaticWarningCode.UNDEFINED_SETTER]);
   }
+
+  void test_undefinedStaticMethodOrGetter_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m);", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_getter_inSuperclass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class S {",
+        "  static int get g => 0;",
+        "}",
+        "class C extends S {}",
+        "f(var p) {",
+        "  f(C.g);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_method() {
+    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m());", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_method_inSuperclass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class S {",
+        "  static m() {}",
+        "}",
+        "class C extends S {}",
+        "f(var p) {",
+        "  f(C.m());",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_setter_inSuperclass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class S {",
+        "  static set s(int i) {}",
+        "}",
+        "class C extends S {}",
+        "f(var p) {",
+        "  f(C.s = 1);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+  }
+
   static dartSuite() {
     _ut.group('StaticWarningCodeTest', () {
       _ut.test('test_ambiguousImport_as', () {
@@ -15978,29 +17814,45 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_conflictingDartImport);
       });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_declGetter_indirect', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_declGetter_indirect);
+      });
+      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_declGetter_mixin', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_declGetter_mixin);
+      });
       _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_field', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_field);
       });
-      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_getter', () {
+      _ut.test('test_conflictingInstanceMethodSetter_sameClass', () {
         final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_getter);
+        runJUnitTest(__test, __test.test_conflictingInstanceMethodSetter_sameClass);
       });
-      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_method', () {
+      _ut.test('test_conflictingInstanceMethodSetter_setterInInterface', () {
         final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_method);
+        runJUnitTest(__test, __test.test_conflictingInstanceMethodSetter_setterInInterface);
       });
-      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_direct_setter', () {
+      _ut.test('test_conflictingInstanceMethodSetter_setterInSuper', () {
         final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_direct_setter);
-      });
-      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_indirect', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_indirect);
-      });
-      _ut.test('test_conflictingInstanceGetterAndSuperclassMember_mixin', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_mixin);
+        runJUnitTest(__test, __test.test_conflictingInstanceMethodSetter_setterInSuper);
       });
       _ut.test('test_conflictingInstanceSetterAndSuperclassMember', () {
         final __test = new StaticWarningCodeTest();
@@ -16514,9 +18366,30 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedSetter);
       });
+      _ut.test('test_undefinedStaticMethodOrGetter_getter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedStaticMethodOrGetter_getter);
+      });
+      _ut.test('test_undefinedStaticMethodOrGetter_getter_inSuperclass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedStaticMethodOrGetter_getter_inSuperclass);
+      });
+      _ut.test('test_undefinedStaticMethodOrGetter_method', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedStaticMethodOrGetter_method);
+      });
+      _ut.test('test_undefinedStaticMethodOrGetter_method_inSuperclass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedStaticMethodOrGetter_method_inSuperclass);
+      });
+      _ut.test('test_undefinedStaticMethodOrGetter_setter_inSuperclass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedStaticMethodOrGetter_setter_inSuperclass);
+      });
     });
   }
 }
+
 class ErrorResolverTest extends ResolverTestCase {
   void test_breakLabelOnSwitchMember() {
     Source source = addSource(EngineTestCase.createSource([
@@ -16534,6 +18407,7 @@
     assertErrors(source, [ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER]);
     verify([source]);
   }
+
   void test_continueLabelOnSwitch() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -16548,6 +18422,7 @@
     assertErrors(source, [ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH]);
     verify([source]);
   }
+
   static dartSuite() {
     _ut.group('ErrorResolverTest', () {
       _ut.test('test_breakLabelOnSwitchMember', () {
@@ -16561,12 +18436,12 @@
     });
   }
 }
+
 /**
  * Instances of the class `TestTypeProvider` implement a type provider that can be used by
  * tests without creating the element model for the core library.
  */
 class TestTypeProvider implements TypeProvider {
-
   /**
    * The type representing the built-in type 'bool'.
    */
@@ -16583,6 +18458,11 @@
   InterfaceType _doubleType;
 
   /**
+   * The type representing the built-in type 'deprecated'.
+   */
+  InterfaceType _deprecatedType;
+
+  /**
    * The type representing the built-in type 'dynamic'.
    */
   Type2 _dynamicType;
@@ -16651,42 +18531,58 @@
    * The type representing the built-in type 'Type'.
    */
   InterfaceType _typeType;
+
   InterfaceType get boolType {
     if (_boolType == null) {
       _boolType = ElementFactory.classElement2("bool", []).type;
     }
     return _boolType;
   }
+
   Type2 get bottomType {
     if (_bottomType == null) {
       _bottomType = BottomTypeImpl.instance;
     }
     return _bottomType;
   }
+
+  InterfaceType get deprecatedType {
+    if (_deprecatedType == null) {
+      ClassElementImpl deprecatedElement = ElementFactory.classElement2("Deprecated", []);
+      deprecatedElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(deprecatedElement, null, true, [stringType])];
+      _deprecatedType = deprecatedElement.type;
+    }
+    return _deprecatedType;
+  }
+
   InterfaceType get doubleType {
     if (_doubleType == null) {
       initializeNumericTypes();
     }
     return _doubleType;
   }
+
   Type2 get dynamicType {
     if (_dynamicType == null) {
       _dynamicType = DynamicTypeImpl.instance;
     }
     return _dynamicType;
   }
+
   InterfaceType get functionType {
     if (_functionType == null) {
       _functionType = ElementFactory.classElement2("Function", []).type;
     }
     return _functionType;
   }
+
   InterfaceType get intType {
     if (_intType == null) {
       initializeNumericTypes();
     }
     return _intType;
   }
+
   InterfaceType get iterableType {
     if (_iterableType == null) {
       ClassElementImpl iterableElement = ElementFactory.classElement2("Iterable", ["E"]);
@@ -16699,6 +18595,7 @@
     }
     return _iterableType;
   }
+
   InterfaceType get iteratorType {
     if (_iteratorType == null) {
       ClassElementImpl iteratorElement = ElementFactory.classElement2("Iterator", ["E"]);
@@ -16709,10 +18606,11 @@
     }
     return _iteratorType;
   }
+
   InterfaceType get listType {
     if (_listType == null) {
       ClassElementImpl listElement = ElementFactory.classElement2("List", ["E"]);
-      listElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(listElement, null)];
+      listElement.constructors = <ConstructorElement> [ElementFactory.constructorElement2(listElement, null, [])];
       _listType = listElement.type;
       Type2 eType = listElement.typeParameters[0].type;
       InterfaceType iterableType = this.iterableType.substitute4(<Type2> [eType]);
@@ -16726,6 +18624,7 @@
     }
     return _listType;
   }
+
   InterfaceType get mapType {
     if (_mapType == null) {
       ClassElementImpl mapElement = ElementFactory.classElement2("Map", ["K", "V"]);
@@ -16735,23 +18634,26 @@
     }
     return _mapType;
   }
+
   InterfaceType get nullType {
     if (_nullType == null) {
       _nullType = ElementFactory.classElement2("Null", []).type;
     }
     return _nullType;
   }
+
   InterfaceType get numType {
     if (_numType == null) {
       initializeNumericTypes();
     }
     return _numType;
   }
+
   InterfaceType get objectType {
     if (_objectType == null) {
       ClassElementImpl objectElement = ElementFactory.object;
       _objectType = objectElement.type;
-      objectElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(objectElement, null)];
+      objectElement.constructors = <ConstructorElement> [ElementFactory.constructorElement2(objectElement, null, [])];
       objectElement.methods = <MethodElement> [
           ElementFactory.methodElement("toString", stringType, []),
           ElementFactory.methodElement("==", boolType, [_objectType]),
@@ -16762,12 +18664,14 @@
     }
     return _objectType;
   }
+
   InterfaceType get stackTraceType {
     if (_stackTraceType == null) {
       _stackTraceType = ElementFactory.classElement2("StackTrace", []).type;
     }
     return _stackTraceType;
   }
+
   InterfaceType get stringType {
     if (_stringType == null) {
       _stringType = ElementFactory.classElement2("String", []).type;
@@ -16783,12 +18687,14 @@
     }
     return _stringType;
   }
+
   InterfaceType get symbolType {
     if (_symbolType == null) {
       _symbolType = ElementFactory.classElement2("Symbol", []).type;
     }
     return _symbolType;
   }
+
   InterfaceType get typeType {
     if (_typeType == null) {
       _typeType = ElementFactory.classElement2("Type", []).type;
@@ -16902,12 +18808,12 @@
     }
   }
 }
+
 /**
  * The class `AnalysisContextFactory` defines utility methods used to create analysis contexts
  * for testing purposes.
  */
 class AnalysisContextFactory {
-
   /**
    * Create an analysis context that has a fake core library already resolved.
    *
@@ -16923,6 +18829,7 @@
     coreUnit.source = coreSource;
     coreUnit.types = <ClassElement> [
         provider.boolType.element,
+        provider.deprecatedType.element,
         provider.doubleType.element,
         provider.functionType.element,
         provider.intType.element,
@@ -16936,6 +18843,14 @@
         provider.symbolType.element,
         provider.typeType.element];
     coreUnit.functions = <FunctionElement> [ElementFactory.functionElement3("identical", provider.boolType.element, <ClassElement> [provider.objectType.element, provider.objectType.element], null)];
+    TopLevelVariableElement proxyTopLevelVariableElt = ElementFactory.topLevelVariableElement3("proxy", true, false, ElementFactory.classElement2("_Proxy", []).type);
+    TopLevelVariableElement deprecatedTopLevelVariableElt = ElementFactory.topLevelVariableElement3("deprecated", true, false, provider.deprecatedType);
+    coreUnit.accessors = <PropertyAccessorElement> [
+        proxyTopLevelVariableElt.getter,
+        proxyTopLevelVariableElt.setter,
+        deprecatedTopLevelVariableElt.getter,
+        deprecatedTopLevelVariableElt.setter];
+    coreUnit.topLevelVariables = <TopLevelVariableElement> [proxyTopLevelVariableElt, deprecatedTopLevelVariableElt];
     LibraryElementImpl coreLibrary = new LibraryElementImpl(sdkContext, ASTFactory.libraryIdentifier2(["dart", "core"]));
     coreLibrary.definingCompilationUnit = coreUnit;
     CompilationUnitElementImpl htmlUnit = new CompilationUnitElementImpl("html_dartium.dart");
@@ -16958,7 +18873,7 @@
         ElementFactory.classElement("InputElement", elementType, []),
         ElementFactory.classElement("SelectElement", elementType, [])];
     htmlUnit.functions = <FunctionElement> [ElementFactory.functionElement3("query", elementElement, <ClassElement> [provider.stringType.element], ClassElementImpl.EMPTY_ARRAY)];
-    TopLevelVariableElementImpl document = ElementFactory.topLevelVariableElement3("document", true, htmlDocumentElement.type);
+    TopLevelVariableElementImpl document = ElementFactory.topLevelVariableElement3("document", false, true, htmlDocumentElement.type);
     htmlUnit.topLevelVariables = <TopLevelVariableElement> [document];
     htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
     LibraryElementImpl htmlLibrary = new LibraryElementImpl(sdkContext, ASTFactory.libraryIdentifier2(["dart", "dom", "html"]));
@@ -16966,7 +18881,7 @@
     Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
     elementMap[coreSource] = coreLibrary;
     elementMap[htmlSource] = htmlLibrary;
-    ((sdkContext as AnalysisContextImpl)).recordLibraryElements(elementMap);
+    (sdkContext as AnalysisContextImpl).recordLibraryElements(elementMap);
     AnalysisContextImpl context = new DelegatingAnalysisContextImpl();
     sourceFactory = new SourceFactory.con2([
         new DartUriResolver(sdkContext.sourceFactory.dartSdk),
@@ -16975,6 +18890,7 @@
     return context;
   }
 }
+
 class LibraryImportScopeTest extends ResolverTestCase {
   void test_conflictingImports() {
     AnalysisContext context = new AnalysisContextImpl();
@@ -16986,10 +18902,10 @@
     ClassElement typeB2 = ElementFactory.classElement2(typeNameB, []);
     ClassElement typeC = ElementFactory.classElement2(typeNameC, []);
     LibraryElement importedLibrary1 = createTestLibrary2(context, "imported1", []);
-    ((importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [typeA, typeB1];
+    (importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB1];
     ImportElementImpl import1 = ElementFactory.importFor(importedLibrary1, null, []);
     LibraryElement importedLibrary2 = createTestLibrary2(context, "imported2", []);
-    ((importedLibrary2.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [typeB2, typeC];
+    (importedLibrary2.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeB2, typeC];
     ImportElementImpl import2 = ElementFactory.importFor(importedLibrary2, null, []);
     LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
     importingLibrary.imports = <ImportElement> [import1, import2];
@@ -17003,7 +18919,7 @@
       Element element = scope.lookup(ASTFactory.identifier3(typeNameB), importingLibrary);
       errorListener.assertErrors2([StaticWarningCode.AMBIGUOUS_IMPORT]);
       EngineTestCase.assertInstanceOf(MultiplyDefinedElement, element);
-      List<Element> conflictingElements = ((element as MultiplyDefinedElement)).conflictingElements;
+      List<Element> conflictingElements = (element as MultiplyDefinedElement).conflictingElements;
       EngineTestCase.assertLength(2, conflictingElements);
       if (identical(conflictingElements[0], typeB1)) {
         JUnitTestCase.assertSame(typeB2, conflictingElements[1]);
@@ -17023,17 +18939,19 @@
       EngineTestCase.assertInstanceOf(MultiplyDefinedElement, element);
     }
   }
+
   void test_creation_empty() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     new LibraryImportScope(definingLibrary, errorListener);
   }
+
   void test_creation_nonEmpty() {
     AnalysisContext context = new AnalysisContextImpl();
     String importedTypeName = "A";
     ClassElement importedType = new ClassElementImpl(ASTFactory.identifier3(importedTypeName));
     LibraryElement importedLibrary = createTestLibrary2(context, "imported", []);
-    ((importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [importedType];
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
     LibraryElementImpl definingLibrary = createTestLibrary2(context, "importing", []);
     ImportElementImpl importElement = new ImportElementImpl();
     importElement.importedLibrary = importedLibrary;
@@ -17042,18 +18960,20 @@
     Scope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
+
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
+
   void test_nonConflictingImports_fromSdk() {
     AnalysisContext context = AnalysisContextFactory.contextWithCore();
     String typeName = "List";
     ClassElement type = ElementFactory.classElement2(typeName, []);
     LibraryElement importedLibrary = createTestLibrary2(context, "lib", []);
-    ((importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [type];
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [type];
     ImportElementImpl importCore = ElementFactory.importFor(context.getLibraryElement(context.sourceFactory.forUri("dart:core")), null, []);
     ImportElementImpl importLib = ElementFactory.importFor(importedLibrary, null, []);
     LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
@@ -17063,6 +18983,7 @@
     JUnitTestCase.assertEquals(type, scope.lookup(ASTFactory.identifier3(typeName), importingLibrary));
     errorListener.assertErrors2([StaticWarningCode.CONFLICTING_DART_IMPORT]);
   }
+
   void test_nonConflictingImports_sameElement() {
     AnalysisContext context = new AnalysisContextImpl();
     String typeNameA = "A";
@@ -17070,7 +18991,7 @@
     ClassElement typeA = ElementFactory.classElement2(typeNameA, []);
     ClassElement typeB = ElementFactory.classElement2(typeNameB, []);
     LibraryElement importedLibrary = createTestLibrary2(context, "imported", []);
-    ((importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [typeA, typeB];
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB];
     ImportElementImpl import1 = ElementFactory.importFor(importedLibrary, null, []);
     ImportElementImpl import2 = ElementFactory.importFor(importedLibrary, null, []);
     LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
@@ -17082,6 +19003,7 @@
     JUnitTestCase.assertEquals(typeB, scope.lookup(ASTFactory.identifier3(typeNameB), importingLibrary));
     errorListener.assertNoErrors();
   }
+
   void test_prefixedAndNonPrefixed() {
     AnalysisContext context = new AnalysisContextImpl();
     String typeName = "C";
@@ -17089,10 +19011,10 @@
     ClassElement prefixedType = ElementFactory.classElement2(typeName, []);
     ClassElement nonPrefixedType = ElementFactory.classElement2(typeName, []);
     LibraryElement prefixedLibrary = createTestLibrary2(context, "import.prefixed", []);
-    ((prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [prefixedType];
+    (prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [prefixedType];
     ImportElementImpl prefixedImport = ElementFactory.importFor(prefixedLibrary, ElementFactory.prefix(prefixName), []);
     LibraryElement nonPrefixedLibrary = createTestLibrary2(context, "import.nonPrefixed", []);
-    ((nonPrefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [nonPrefixedType];
+    (nonPrefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [nonPrefixedType];
     ImportElementImpl nonPrefixedImport = ElementFactory.importFor(nonPrefixedLibrary, null, []);
     LibraryElementImpl importingLibrary = createTestLibrary2(context, "importing", []);
     importingLibrary.imports = <ImportElement> [prefixedImport, nonPrefixedImport];
@@ -17105,6 +19027,7 @@
     errorListener.assertNoErrors();
     JUnitTestCase.assertSame(nonPrefixedType, nonPrefixedElement);
   }
+
   static dartSuite() {
     _ut.group('LibraryImportScopeTest', () {
       _ut.test('test_conflictingImports', () {
@@ -17138,12 +19061,54 @@
     });
   }
 }
+
+class IncrementalResolverTest extends ResolverTestCase {
+  void test_resolve() {
+    MethodDeclaration method = resolveMethod(EngineTestCase.createSource([
+        "class C {",
+        "  int m(int a) {",
+        "    return a + a;",
+        "  }",
+        "}"]));
+    BlockFunctionBody body = method.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
+    BinaryExpression expression = statement.expression as BinaryExpression;
+    SimpleIdentifier left = expression.leftOperand as SimpleIdentifier;
+    Element leftElement = left.staticElement;
+    SimpleIdentifier right = expression.rightOperand as SimpleIdentifier;
+    Element rightElement = right.staticElement;
+    JUnitTestCase.assertNotNull(leftElement);
+    JUnitTestCase.assertSame(leftElement, rightElement);
+  }
+
+  MethodDeclaration resolveMethod(String content) {
+    Source source = addSource(content);
+    LibraryElement library = resolve(source);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
+    MethodDeclaration method = classNode.members[0] as MethodDeclaration;
+    method.body.accept(new ResolutionEraser());
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    IncrementalResolver resolver = new IncrementalResolver(library, source, typeProvider, errorListener);
+    resolver.resolve(method.body);
+    return method;
+  }
+
+  static dartSuite() {
+    _ut.group('IncrementalResolverTest', () {
+      _ut.test('test_resolve', () {
+        final __test = new IncrementalResolverTest();
+        runJUnitTest(__test, __test.test_resolve);
+      });
+    });
+  }
+}
+
 /**
  * Instances of the class `ResolutionVerifier` verify that all of the nodes in an AST
  * structure that should have been resolved were resolved.
  */
 class ResolutionVerifier extends RecursiveASTVisitor<Object> {
-
   /**
    * A set containing nodes that are known to not be resolvable and should therefore not cause the
    * test to fail.
@@ -17200,6 +19165,7 @@
       JUnitTestCase.fail(writer.toString());
     }
   }
+
   Object visitBinaryExpression(BinaryExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
@@ -17211,12 +19177,16 @@
     }
     return checkResolved2(node, node.staticElement, MethodElement);
   }
+
   Object visitCommentReference(CommentReference node) => null;
+
   Object visitCompilationUnit(CompilationUnit node) {
     node.visitChildren(this);
     return checkResolved2(node, node.element, CompilationUnitElement);
   }
+
   Object visitExportDirective(ExportDirective node) => checkResolved2(node, node.element, ExportElement);
+
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     node.visitChildren(this);
     if (node.element is LibraryElement) {
@@ -17224,10 +19194,12 @@
     }
     return null;
   }
+
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.visitChildren(this);
     return null;
   }
+
   Object visitImportDirective(ImportDirective node) {
     checkResolved2(node, node.element, ImportElement);
     SimpleIdentifier prefix = node.prefix;
@@ -17236,6 +19208,7 @@
     }
     return checkResolved2(prefix, prefix.staticElement, PrefixElement);
   }
+
   Object visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
     Type2 targetType = node.realTarget.staticType;
@@ -17244,10 +19217,15 @@
     }
     return checkResolved2(node, node.staticElement, MethodElement);
   }
+
   Object visitLibraryDirective(LibraryDirective node) => checkResolved2(node, node.element, LibraryElement);
+
   Object visitNamedExpression(NamedExpression node) => node.expression.accept(this);
+
   Object visitPartDirective(PartDirective node) => checkResolved2(node, node.element, CompilationUnitElement);
+
   Object visitPartOfDirective(PartOfDirective node) => checkResolved2(node, node.element, LibraryElement);
+
   Object visitPostfixExpression(PostfixExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
@@ -17259,6 +19237,7 @@
     }
     return checkResolved2(node, node.staticElement, MethodElement);
   }
+
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     prefix.accept(this);
@@ -17268,6 +19247,7 @@
     }
     return checkResolved(node, node.staticElement);
   }
+
   Object visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
@@ -17279,6 +19259,7 @@
     }
     return checkResolved2(node, node.staticElement, MethodElement);
   }
+
   Object visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
     target.accept(this);
@@ -17288,6 +19269,7 @@
     }
     return node.propertyName.accept(this);
   }
+
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.name == "void") {
       return null;
@@ -17305,7 +19287,9 @@
     }
     return checkResolved(node, node.staticElement);
   }
+
   Object checkResolved(ASTNode node, Element element) => checkResolved2(node, element, null);
+
   Object checkResolved2(ASTNode node, Element element, Type expectedClass) {
     if (element == null) {
       if (_knownExceptions == null || !_knownExceptions.contains(node)) {
@@ -17318,6 +19302,7 @@
     }
     return null;
   }
+
   String getFileName(ASTNode node) {
     if (node != null) {
       ASTNode root = node.root;
@@ -17334,6 +19319,7 @@
     }
     return "<unknown file- ASTNode is null>";
   }
+
   void printNodes(PrintStringWriter writer, List<ASTNode> nodes) {
     for (ASTNode identifier in nodes) {
       writer.print("  ");
@@ -17346,15 +19332,17 @@
     }
   }
 }
-class MemberMapTest extends JUnitTestCase {
 
+class MemberMapTest extends JUnitTestCase {
   /**
    * The null type.
    */
   InterfaceType _nullType;
+
   void setUp() {
     _nullType = new TestTypeProvider().nullType;
   }
+
   void test_MemberMap_copyConstructor() {
     MethodElement m1 = ElementFactory.methodElement("m1", _nullType, []);
     MethodElement m2 = ElementFactory.methodElement("m2", _nullType, []);
@@ -17369,6 +19357,7 @@
     JUnitTestCase.assertEquals(m2, copy.get(m2.name));
     JUnitTestCase.assertEquals(m3, copy.get(m3.name));
   }
+
   void test_MemberMap_override() {
     MethodElement m1 = ElementFactory.methodElement("m", _nullType, []);
     MethodElement m2 = ElementFactory.methodElement("m", _nullType, []);
@@ -17378,6 +19367,7 @@
     JUnitTestCase.assertEquals(1, map.size);
     JUnitTestCase.assertEquals(m2, map.get("m"));
   }
+
   void test_MemberMap_put() {
     MethodElement m1 = ElementFactory.methodElement("m1", _nullType, []);
     MemberMap map = new MemberMap();
@@ -17386,6 +19376,7 @@
     JUnitTestCase.assertEquals(1, map.size);
     JUnitTestCase.assertEquals(m1, map.get("m1"));
   }
+
   static dartSuite() {
     _ut.group('MemberMapTest', () {
       _ut.test('test_MemberMap_copyConstructor', () {
@@ -17403,18 +19394,20 @@
     });
   }
 }
+
 class LibraryScopeTest extends ResolverTestCase {
   void test_creation_empty() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     new LibraryScope(definingLibrary, errorListener);
   }
+
   void test_creation_nonEmpty() {
     AnalysisContext context = new AnalysisContextImpl();
     String importedTypeName = "A";
     ClassElement importedType = new ClassElementImpl(ASTFactory.identifier3(importedTypeName));
     LibraryElement importedLibrary = createTestLibrary2(context, "imported", []);
-    ((importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)).types = <ClassElement> [importedType];
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
     LibraryElementImpl definingLibrary = createTestLibrary2(context, "importing", []);
     ImportElementImpl importElement = new ImportElementImpl();
     importElement.importedLibrary = importedLibrary;
@@ -17423,12 +19416,14 @@
     Scope scope = new LibraryScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
+
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
+
   static dartSuite() {
     _ut.group('LibraryScopeTest', () {
       _ut.test('test_creation_empty', () {
@@ -17446,8 +19441,8 @@
     });
   }
 }
-class StaticTypeAnalyzerTest extends EngineTestCase {
 
+class StaticTypeAnalyzerTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
    */
@@ -17467,33 +19462,40 @@
    * The type provider used to access the types.
    */
   TestTypeProvider _typeProvider;
+
   void fail_visitFunctionExpressionInvocation() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitMethodInvocation() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void fail_visitSimpleIdentifier() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
+
   void setUp() {
     _listener = new GatheringErrorListener();
     _typeProvider = new TestTypeProvider();
     _analyzer = createAnalyzer();
   }
+
   void test_visitAdjacentStrings() {
     Expression node = ASTFactory.adjacentStrings([resolvedString("a"), resolvedString("b")]);
     JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitArgumentDefinitionTest() {
     Expression node = ASTFactory.argumentDefinitionTest("p");
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitAsExpression() {
     ClassElement superclass = ElementFactory.classElement2("A", []);
     InterfaceType superclassType = superclass.type;
@@ -17502,6 +19504,7 @@
     JUnitTestCase.assertSame(subclass.type, analyze2(node, superclassType));
     _listener.assertNoErrors();
   }
+
   void test_visitAssignmentExpression_compound() {
     InterfaceType numType = _typeProvider.numType;
     SimpleIdentifier identifier = resolvedVariable(_typeProvider.intType, "i");
@@ -17511,50 +19514,59 @@
     JUnitTestCase.assertSame(numType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitAssignmentExpression_simple() {
     InterfaceType intType = _typeProvider.intType;
     Expression node = ASTFactory.assignmentExpression(resolvedVariable(intType, "i"), TokenType.EQ, resolvedInteger(0));
     JUnitTestCase.assertSame(intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_equals() {
     Expression node = ASTFactory.binaryExpression(resolvedInteger(2), TokenType.EQ_EQ, resolvedInteger(3));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_logicalAnd() {
     Expression node = ASTFactory.binaryExpression(ASTFactory.booleanLiteral(false), TokenType.AMPERSAND_AMPERSAND, ASTFactory.booleanLiteral(true));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_logicalOr() {
     Expression node = ASTFactory.binaryExpression(ASTFactory.booleanLiteral(false), TokenType.BAR_BAR, ASTFactory.booleanLiteral(true));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_notEquals() {
     Expression node = ASTFactory.binaryExpression(resolvedInteger(2), TokenType.BANG_EQ, resolvedInteger(3));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_plusID() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
     node.staticElement = getMethod(_typeProvider.numType, "+");
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_plusII() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedInteger(2));
     node.staticElement = getMethod(_typeProvider.numType, "+");
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_slash() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(2), TokenType.SLASH, resolvedInteger(2));
     node.staticElement = getMethod(_typeProvider.numType, "/");
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_star_notSpecial() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
@@ -17565,42 +19577,50 @@
     JUnitTestCase.assertSame(typeA, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBinaryExpression_starID() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
     node.staticElement = getMethod(_typeProvider.numType, "*");
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBooleanLiteral_false() {
     Expression node = ASTFactory.booleanLiteral(false);
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitBooleanLiteral_true() {
     Expression node = ASTFactory.booleanLiteral(true);
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitCascadeExpression() {
     Expression node = ASTFactory.cascadeExpression(resolvedString("a"), [ASTFactory.propertyAccess2(null, "length")]);
     JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitConditionalExpression_differentTypes() {
     Expression node = ASTFactory.conditionalExpression(ASTFactory.booleanLiteral(true), resolvedDouble(1.0), resolvedInteger(0));
     JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitConditionalExpression_sameTypes() {
     Expression node = ASTFactory.conditionalExpression(ASTFactory.booleanLiteral(true), resolvedInteger(1), resolvedInteger(0));
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitDoubleLiteral() {
     Expression node = ASTFactory.doubleLiteral(4.33);
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_named_block() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("p1"), resolvedInteger(0));
@@ -17617,6 +19637,7 @@
     assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_named_expression() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p = ASTFactory.namedFormalParameter(ASTFactory.simpleFormalParameter3("p"), resolvedInteger(0));
@@ -17629,6 +19650,7 @@
     assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_normal_block() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = ASTFactory.simpleFormalParameter3("p1");
@@ -17642,6 +19664,7 @@
     assertFunctionType(dynamicType, <Type2> [dynamicType, dynamicType], null, null, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_normal_expression() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p = ASTFactory.simpleFormalParameter3("p");
@@ -17652,6 +19675,7 @@
     assertFunctionType(_typeProvider.intType, <Type2> [dynamicType], null, null, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_normalAndNamed_block() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = ASTFactory.simpleFormalParameter3("p1");
@@ -17666,6 +19690,7 @@
     assertFunctionType(dynamicType, <Type2> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_normalAndNamed_expression() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = ASTFactory.simpleFormalParameter3("p1");
@@ -17680,6 +19705,7 @@
     assertFunctionType(_typeProvider.intType, <Type2> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_normalAndPositional_block() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = ASTFactory.simpleFormalParameter3("p1");
@@ -17693,6 +19719,7 @@
     assertFunctionType(dynamicType, <Type2> [dynamicType], <Type2> [dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_normalAndPositional_expression() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = ASTFactory.simpleFormalParameter3("p1");
@@ -17706,6 +19733,7 @@
     assertFunctionType(_typeProvider.intType, <Type2> [dynamicType], <Type2> [dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_positional_block() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("p1"), resolvedInteger(0));
@@ -17719,6 +19747,7 @@
     assertFunctionType(dynamicType, null, <Type2> [dynamicType, dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitFunctionExpression_positional_expression() {
     Type2 dynamicType = _typeProvider.dynamicType;
     FormalParameter p = ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("p"), resolvedInteger(0));
@@ -17729,6 +19758,7 @@
     assertFunctionType(_typeProvider.intType, null, <Type2> [dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitIndexExpression_getter() {
     InterfaceType listType = _typeProvider.listType;
     SimpleIdentifier identifier = resolvedVariable(listType, "a");
@@ -17738,6 +19768,7 @@
     JUnitTestCase.assertSame(listType.typeArguments[0], analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitIndexExpression_setter() {
     InterfaceType listType = _typeProvider.listType;
     SimpleIdentifier identifier = resolvedVariable(listType, "a");
@@ -17748,6 +19779,7 @@
     JUnitTestCase.assertSame(listType.typeArguments[0], analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitIndexExpression_typeParameters() {
     InterfaceType intType = _typeProvider.intType;
     InterfaceType listType = _typeProvider.listType;
@@ -17761,6 +19793,7 @@
     JUnitTestCase.assertSame(intType, analyze(indexExpression));
     _listener.assertNoErrors();
   }
+
   void test_visitIndexExpression_typeParameters_inSetterContext() {
     InterfaceType intType = _typeProvider.intType;
     InterfaceType listType = _typeProvider.listType;
@@ -17775,10 +19808,11 @@
     JUnitTestCase.assertSame(intType, analyze(indexExpression));
     _listener.assertNoErrors();
   }
+
   void test_visitInstanceCreationExpression_named() {
     ClassElementImpl classElement = ElementFactory.classElement2("C", []);
     String constructorName = "m";
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(classElement, constructorName);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classElement, constructorName, []);
     constructor.returnType = classElement.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
     constructor.type = constructorType;
@@ -17788,10 +19822,11 @@
     JUnitTestCase.assertSame(classElement.type, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitInstanceCreationExpression_typeParameters() {
     ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]);
     ClassElementImpl elementI = ElementFactory.classElement2("I", []);
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(elementC, null);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(elementC, null, []);
     elementC.constructors = <ConstructorElement> [constructor];
     constructor.returnType = elementC.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
@@ -17806,9 +19841,10 @@
     JUnitTestCase.assertEquals(elementI.type, typeArgs[0]);
     _listener.assertNoErrors();
   }
+
   void test_visitInstanceCreationExpression_unnamed() {
     ClassElementImpl classElement = ElementFactory.classElement2("C", []);
-    ConstructorElementImpl constructor = ElementFactory.constructorElement(classElement, null);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classElement, null, []);
     constructor.returnType = classElement.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
     constructor.type = constructorType;
@@ -17818,75 +19854,89 @@
     JUnitTestCase.assertSame(classElement.type, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitIntegerLiteral() {
     Expression node = resolvedInteger(42);
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitIsExpression_negated() {
     Expression node = ASTFactory.isExpression(resolvedString("a"), true, ASTFactory.typeName4("String", []));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitIsExpression_notNegated() {
     Expression node = ASTFactory.isExpression(resolvedString("a"), false, ASTFactory.typeName4("String", []));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitListLiteral_empty() {
     Expression node = ASTFactory.listLiteral([]);
     Type2 resultType = analyze(node);
     assertType2(_typeProvider.listType.substitute4(<Type2> [_typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitListLiteral_nonEmpty() {
     Expression node = ASTFactory.listLiteral([resolvedInteger(0)]);
     Type2 resultType = analyze(node);
     assertType2(_typeProvider.listType.substitute4(<Type2> [_typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitMapLiteral_empty() {
     Expression node = ASTFactory.mapLiteral2([]);
     Type2 resultType = analyze(node);
     assertType2(_typeProvider.mapType.substitute4(<Type2> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitMapLiteral_nonEmpty() {
     Expression node = ASTFactory.mapLiteral2([ASTFactory.mapLiteralEntry("k", resolvedInteger(0))]);
     Type2 resultType = analyze(node);
     assertType2(_typeProvider.mapType.substitute4(<Type2> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
+
   void test_visitMethodInvocation_then() {
     Expression node = ASTFactory.methodInvocation(null, "then", []);
     analyze(node);
     _listener.assertNoErrors();
   }
+
   void test_visitNamedExpression() {
     Expression node = ASTFactory.namedExpression2("n", resolvedString("a"));
     JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitNullLiteral() {
     Expression node = ASTFactory.nullLiteral();
     JUnitTestCase.assertSame(_typeProvider.bottomType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitParenthesizedExpression() {
     Expression node = ASTFactory.parenthesizedExpression(resolvedInteger(0));
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPostfixExpression_minusMinus() {
     PostfixExpression node = ASTFactory.postfixExpression(resolvedInteger(0), TokenType.MINUS_MINUS);
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPostfixExpression_plusPlus() {
     PostfixExpression node = ASTFactory.postfixExpression(resolvedInteger(0), TokenType.PLUS_PLUS);
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixedIdentifier_getter() {
     Type2 boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
@@ -17895,6 +19945,7 @@
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixedIdentifier_setter() {
     Type2 boolType = _typeProvider.boolType;
     FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
@@ -17904,6 +19955,7 @@
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixedIdentifier_variable() {
     VariableElementImpl variable = ElementFactory.localVariableElement2("b");
     variable.type = _typeProvider.boolType;
@@ -17912,11 +19964,13 @@
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixExpression_bang() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.BANG, resolvedInteger(0));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixExpression_minus() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.MINUS, resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
@@ -17924,6 +19978,7 @@
     JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixExpression_minusMinus() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.MINUS_MINUS, resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
@@ -17931,11 +19986,13 @@
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixExpression_not() {
     Expression node = ASTFactory.prefixExpression(TokenType.BANG, ASTFactory.booleanLiteral(true));
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixExpression_plusPlus() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, resolvedInteger(0));
     MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
@@ -17943,6 +20000,7 @@
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPrefixExpression_tilde() {
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.TILDE, resolvedInteger(0));
     MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
@@ -17950,6 +20008,7 @@
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPropertyAccess_getter() {
     Type2 boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
@@ -17958,6 +20017,7 @@
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitPropertyAccess_setter() {
     Type2 boolType = _typeProvider.boolType;
     FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
@@ -17967,11 +20027,13 @@
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitSimpleStringLiteral() {
     Expression node = resolvedString("a");
     JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitStringInterpolation() {
     Expression node = ASTFactory.string([
         ASTFactory.interpolationString("a", "a"),
@@ -17980,6 +20042,7 @@
     JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitSuperExpression() {
     InterfaceType superType = ElementFactory.classElement2("A", []).type;
     InterfaceType thisType = ElementFactory.classElement("B", superType, []).type;
@@ -17987,20 +20050,24 @@
     JUnitTestCase.assertSame(thisType, analyze2(node, thisType));
     _listener.assertNoErrors();
   }
+
   void test_visitSymbolLiteral() {
     JUnitTestCase.assertSame(_typeProvider.symbolType, analyze(ASTFactory.symbolLiteral(["a"])));
   }
+
   void test_visitThisExpression() {
     InterfaceType thisType = ElementFactory.classElement("B", ElementFactory.classElement2("A", []).type, []).type;
     Expression node = ASTFactory.thisExpression();
     JUnitTestCase.assertSame(thisType, analyze2(node, thisType));
     _listener.assertNoErrors();
   }
+
   void test_visitThrowExpression_withoutValue() {
     Expression node = ASTFactory.throwExpression();
     JUnitTestCase.assertSame(_typeProvider.bottomType, analyze(node));
     _listener.assertNoErrors();
   }
+
   void test_visitThrowExpression_withValue() {
     Expression node = ASTFactory.throwExpression2(resolvedInteger(0));
     JUnitTestCase.assertSame(_typeProvider.bottomType, analyze(node));
@@ -18043,7 +20110,7 @@
    */
   Type2 analyze3(FormalParameter node) {
     node.accept(_analyzer);
-    return ((node.identifier.staticElement as ParameterElement)).type;
+    return (node.identifier.staticElement as ParameterElement).type;
   }
 
   /**
@@ -18089,6 +20156,7 @@
     }
     JUnitTestCase.assertSame(expectedReturnType, functionType.returnType);
   }
+
   void assertType(InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
     JUnitTestCase.assertEquals(expectedType.displayName, actualType.displayName);
     JUnitTestCase.assertEquals(expectedType.element, actualType.element);
@@ -18100,6 +20168,7 @@
       assertType2(expectedArguments[i], actualArguments[i]);
     }
   }
+
   void assertType2(Type2 expectedType, Type2 actualType) {
     if (expectedType is InterfaceTypeImpl) {
       EngineTestCase.assertInstanceOf(InterfaceTypeImpl, actualType);
@@ -18224,8 +20293,9 @@
       element = new ParameterElementImpl.con1(identifier);
       identifier.staticElement = element;
     }
-    ((element as ParameterElementImpl)).type = type;
+    (element as ParameterElementImpl).type = type;
   }
+
   static dartSuite() {
     _ut.group('StaticTypeAnalyzerTest', () {
       _ut.test('test_visitAdjacentStrings', () {
@@ -18503,6 +20573,7 @@
     });
   }
 }
+
 class NonHintCodeTest extends ResolverTestCase {
   void test_deadCode_deadBlock_conditionalElse_debugConst() {
     Source source = addSource(EngineTestCase.createSource([
@@ -18514,6 +20585,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_conditionalIf_debugConst() {
     Source source = addSource(EngineTestCase.createSource([
         "const bool DEBUG = false;",
@@ -18524,6 +20596,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_else() {
     Source source = addSource(EngineTestCase.createSource([
         "const bool DEBUG = true;",
@@ -18534,6 +20607,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -18546,6 +20620,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -18562,6 +20637,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_if_debugConst_propertyAccessor() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -18578,6 +20654,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_if_debugConst_simpleIdentifier() {
     Source source = addSource(EngineTestCase.createSource([
         "const bool DEBUG = false;",
@@ -18588,6 +20665,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadBlock_while_debugConst() {
     Source source = addSource(EngineTestCase.createSource([
         "const bool DEBUG = false;",
@@ -18598,6 +20676,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadCatch_onCatchSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18609,6 +20688,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadOperandLHS_and_debugConst() {
     Source source = addSource(EngineTestCase.createSource([
         "const bool DEBUG = false;",
@@ -18619,6 +20699,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_deadCode_deadOperandLHS_or_debugConst() {
     Source source = addSource(EngineTestCase.createSource([
         "const bool DEBUG = true;",
@@ -18629,18 +20710,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_divisionOptimization() {
     Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = x / y.toInt();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_divisionOptimization_supressIfDivisionNotDefinedInCore() {
     Source source = addSource(EngineTestCase.createSource(["f(x, y) {", "  var v = (x / y).toInt();", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_divisionOptimization_supressIfDivisionOverridden() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -18653,6 +20737,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_duplicateImport_as() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -18665,6 +20750,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_duplicateImport_hide() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -18677,6 +20763,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_duplicateImport_show() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -18689,6 +20776,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_overriddingPrivateMember_sameLibrary() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -18701,6 +20789,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_overrideEqualsButNotHashCode() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -18711,10 +20800,10 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_proxy_annotation_prefixed() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
-        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "f(var a) {",
@@ -18726,17 +20815,13 @@
         "  a++;",
         "  ++a;",
         "}"]));
-    addSource2("/meta.dart", EngineTestCase.createSource([
-        "library meta;",
-        "const proxy = const _Proxy();",
-        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_proxy_annotation_prefixed2() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
-        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "class B {",
@@ -18750,17 +20835,13 @@
         "    ++a;",
         "  }",
         "}"]));
-    addSource2("/meta.dart", EngineTestCase.createSource([
-        "library meta;",
-        "const proxy = const _Proxy();",
-        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_proxy_annotation_prefixed3() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
-        "import 'meta.dart';",
         "class B {",
         "  f(var a) {",
         "    a = new A();",
@@ -18774,13 +20855,10 @@
         "}",
         "@proxy",
         "class A {}"]));
-    addSource2("/meta.dart", EngineTestCase.createSource([
-        "library meta;",
-        "const proxy = const _Proxy();",
-        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedGetter_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18795,6 +20873,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedMethod_assignmentExpression_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18809,6 +20888,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedMethod_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18822,6 +20902,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedOperator_binaryExpression_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18836,6 +20917,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedOperator_indexBoth_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18850,6 +20932,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedOperator_indexGetter_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18864,6 +20947,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedOperator_indexSetter_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18878,6 +20962,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedOperator_postfixExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18892,6 +20977,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedOperator_prefixExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18906,6 +20992,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_undefinedSetter_inSubtype() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -18920,6 +21007,7 @@
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_unnecessaryCast_13855_parameter_A() {
     Source source = addSource(EngineTestCase.createSource([
         "class A{",
@@ -18935,18 +21023,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unnecessaryCast_dynamic_type() {
     Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = v as Object;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unnecessaryCast_type_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = Object as dynamic;", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unusedImport_annotationOnDirective() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "@A()", "import 'lib1.dart';"]));
     Source source2 = addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A() {}", "}"]));
@@ -18954,12 +21045,14 @@
     assertErrors(source, []);
     verify([source, source2]);
   }
+
   void test_unusedImport_core_library() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'dart:core';"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unusedImport_export() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
@@ -18968,6 +21061,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unusedImport_export_infiniteLoop() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
@@ -18977,6 +21071,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unusedImport_export2() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Three three;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
@@ -18986,6 +21081,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_unusedImport_prefix_topLevelFunction() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -19002,6 +21098,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   static dartSuite() {
     _ut.group('NonHintCodeTest', () {
       _ut.test('test_deadCode_deadBlock_conditionalElse_debugConst', () {
@@ -19171,10 +21268,11 @@
     });
   }
 }
+
 class EnclosedScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
     GatheringErrorListener errorListener2 = new GatheringErrorListener();
-    Scope rootScope = new Scope_21(errorListener2);
+    Scope rootScope = new Scope_22(errorListener2);
     EnclosedScope scope = new EnclosedScope(rootScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -19182,9 +21280,10 @@
     scope.define(element2);
     errorListener2.assertErrors3([ErrorSeverity.ERROR]);
   }
+
   void test_define_normal() {
     GatheringErrorListener errorListener3 = new GatheringErrorListener();
-    Scope rootScope = new Scope_22(errorListener3);
+    Scope rootScope = new Scope_23(errorListener3);
     EnclosedScope outerScope = new EnclosedScope(rootScope);
     EnclosedScope innerScope = new EnclosedScope(outerScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -19193,6 +21292,7 @@
     innerScope.define(element2);
     errorListener3.assertNoErrors();
   }
+
   static dartSuite() {
     _ut.group('EnclosedScopeTest', () {
       _ut.test('test_define_duplicate', () {
@@ -19206,27 +21306,37 @@
     });
   }
 }
-class Scope_21 extends Scope {
-  GatheringErrorListener errorListener2;
-  Scope_21(this.errorListener2) : super();
-  AnalysisErrorListener get errorListener => errorListener2;
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
-}
-class Scope_22 extends Scope {
-  GatheringErrorListener errorListener3;
-  Scope_22(this.errorListener3) : super();
-  AnalysisErrorListener get errorListener => errorListener3;
-  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
-}
-class LibraryElementBuilderTest extends EngineTestCase {
 
+class Scope_22 extends Scope {
+  GatheringErrorListener errorListener2;
+
+  Scope_22(this.errorListener2) : super();
+
+  AnalysisErrorListener get errorListener => errorListener2;
+
+  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
+}
+
+class Scope_23 extends Scope {
+  GatheringErrorListener errorListener3;
+
+  Scope_23(this.errorListener3) : super();
+
+  AnalysisErrorListener get errorListener => errorListener3;
+
+  Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
+}
+
+class LibraryElementBuilderTest extends EngineTestCase {
   /**
    * The source factory used to create [Source].
    */
   SourceFactory _sourceFactory;
+
   void setUp() {
     _sourceFactory = new SourceFactory.con2([new FileUriResolver()]);
   }
+
   void test_accessorsAcrossFiles() {
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
         "library lib;",
@@ -19244,6 +21354,7 @@
     EngineTestCase.assertLength(1, secondAccessors);
     JUnitTestCase.assertSame(firstAccessors[0].variable, secondAccessors[0].variable);
   }
+
   void test_empty() {
     Source librarySource = addSource("/lib.dart", "library lib;");
     LibraryElement element = buildLibrary(librarySource, []);
@@ -19265,23 +21376,27 @@
     EngineTestCase.assertLength(0, unit.types);
     EngineTestCase.assertLength(0, unit.topLevelVariables);
   }
+
   void test_invalidUri_part() {
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part '\${'a'}.dart';"]));
     LibraryElement element = buildLibrary(librarySource, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
     JUnitTestCase.assertNotNull(element);
   }
+
   void test_missingLibraryDirectiveWithPart() {
     addSource("/a.dart", EngineTestCase.createSource(["part of lib;"]));
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["part 'a.dart';"]));
     LibraryElement element = buildLibrary(librarySource, [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
     JUnitTestCase.assertNotNull(element);
   }
+
   void test_missingPartOfDirective() {
     addSource("/a.dart", "class A {}");
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';"]));
     LibraryElement element = buildLibrary(librarySource, [CompileTimeErrorCode.PART_OF_NON_PART]);
     JUnitTestCase.assertNotNull(element);
   }
+
   void test_multipleFiles() {
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
         "library lib;",
@@ -19304,6 +21419,7 @@
       assertTypes(sourcedUnits[1], ["B"]);
     }
   }
+
   void test_singleFile() {
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "class A {}"]));
     LibraryElement element = buildLibrary(librarySource, []);
@@ -19372,6 +21488,7 @@
     listener.assertErrors2(expectedErrorCodes);
     return element;
   }
+
   static dartSuite() {
     _ut.group('LibraryElementBuilderTest', () {
       _ut.test('test_accessorsAcrossFiles', () {
@@ -19405,6 +21522,7 @@
     });
   }
 }
+
 class ScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
     GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -19415,6 +21533,7 @@
     scope.define(element2);
     errorListener.assertErrors3([ErrorSeverity.ERROR]);
   }
+
   void test_define_normal() {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
@@ -19424,17 +21543,21 @@
     scope.define(element2);
     errorListener.assertNoErrors();
   }
+
   void test_getErrorListener() {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
+
   void test_isPrivateName_nonPrivate() {
     JUnitTestCase.assertFalse(Scope.isPrivateName("Public"));
   }
+
   void test_isPrivateName_private() {
     JUnitTestCase.assertTrue(Scope.isPrivateName("_Private"));
   }
+
   static dartSuite() {
     _ut.group('ScopeTest', () {
       _ut.test('test_define_duplicate', () {
@@ -19460,21 +21583,25 @@
     });
   }
 }
+
 /**
  * A non-abstract subclass that can be used for testing purposes.
  */
 class ScopeTest_TestScope extends Scope {
-
   /**
    * The listener that is to be informed when an error is encountered.
    */
   AnalysisErrorListener _errorListener;
+
   ScopeTest_TestScope(AnalysisErrorListener errorListener) {
     this._errorListener = errorListener;
   }
+
   AnalysisErrorListener get errorListener => _errorListener;
+
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
 }
+
 class SimpleResolverTest extends ResolverTestCase {
   void fail_staticInvocation() {
     Source source = addSource(EngineTestCase.createSource([
@@ -19490,6 +21617,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_argumentResolution_required_matching() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19500,6 +21628,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, 2]);
   }
+
   void test_argumentResolution_required_tooFew() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19510,6 +21639,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1]);
   }
+
   void test_argumentResolution_required_tooMany() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19520,6 +21650,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, -1]);
   }
+
   void test_argumentResolution_requiredAndNamed_extra() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19530,6 +21661,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, 2, -1]);
   }
+
   void test_argumentResolution_requiredAndNamed_matching() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19540,6 +21672,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, 2]);
   }
+
   void test_argumentResolution_requiredAndNamed_missing() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19550,6 +21683,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, 3]);
   }
+
   void test_argumentResolution_requiredAndPositional_fewer() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19560,6 +21694,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, 2]);
   }
+
   void test_argumentResolution_requiredAndPositional_matching() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19570,6 +21705,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, 2, 3]);
   }
+
   void test_argumentResolution_requiredAndPositional_more() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19580,6 +21716,7 @@
         "}"]));
     validateArgumentResolution(source, [0, 1, 2, -1]);
   }
+
   void test_class_definesCall() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19592,6 +21729,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_class_extends_implements() {
     Source source = addSource(EngineTestCase.createSource([
         "class A extends B implements C {}",
@@ -19601,6 +21739,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_commentReference_class() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {}",
@@ -19614,6 +21753,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_commentReference_parameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19626,18 +21766,21 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_commentReference_singleLine() {
     Source source = addSource(EngineTestCase.createSource(["/// [A]", "class A {}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_empty() {
     Source source = addSource("");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_extractedMethodAsConstant() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class Comparable<T> {",
@@ -19651,12 +21794,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_fieldFormalParameter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_forEachLoops_nonConflicting() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -19668,6 +21813,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_forLoops_nonConflicting() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -19680,6 +21826,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_functionTypeAlias() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef bool P(e);",
@@ -19693,6 +21840,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_getterAndSetterWithDifferentTypes() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19706,6 +21854,7 @@
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
+
   void test_hasReferenceToSuper() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {toString() => super.toString();}"]));
     LibraryElement library = resolve(source);
@@ -19719,6 +21868,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_import_hide() {
     addSource2("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}", "class A {}"]));
     addSource2("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
@@ -19734,6 +21884,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_import_prefix() {
     addSource2("/two.dart", EngineTestCase.createSource(["library two;", "f(int x) {", "  return x * x;", "}"]));
     Source source = addSource2("/one.dart", EngineTestCase.createSource([
@@ -19746,6 +21897,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_import_spaceInUri() {
     addSource2("sub folder/lib.dart", EngineTestCase.createSource(["library lib;", "foo() {}"]));
     Source source = addSource2("app.dart", EngineTestCase.createSource([
@@ -19758,6 +21910,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_indexExpression_typeParameters() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -19772,12 +21925,14 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_indexExpression_typeParameters_invalidAssignmentWarning() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  List<List<int>> b;", "  b[0][0] = 'hi';", "}"]));
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+
   void test_indirectOperatorThroughCall() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19799,6 +21954,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_invoke_dynamicThroughGetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19811,6 +21967,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_isValidMixin_badSuperclass() {
     Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B {}"]));
     LibraryElement library = resolve(source);
@@ -19823,6 +21980,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_isValidMixin_constructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}"]));
     LibraryElement library = resolve(source);
@@ -19835,6 +21993,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_isValidMixin_super() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19852,6 +22011,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_isValidMixin_valid() {
     Source source = addSource(EngineTestCase.createSource(["class A {}"]));
     LibraryElement library = resolve(source);
@@ -19864,6 +22024,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_labels_switch() {
     Source source = addSource(EngineTestCase.createSource([
         "void doSwitch(int target) {",
@@ -19881,6 +22042,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_metadata_class() {
     Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A class C {}"]));
     LibraryElement library = resolve(source);
@@ -19894,6 +22056,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_metadata_field() {
     Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A int f;", "}"]));
     LibraryElement library = resolve(source);
@@ -19908,6 +22071,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_metadata_libraryDirective() {
     Source source = addSource(EngineTestCase.createSource(["@A library lib;", "const A = null;"]));
     LibraryElement library = resolve(source);
@@ -19917,6 +22081,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_metadata_method() {
     Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A void m() {}", "}"]));
     LibraryElement library = resolve(source);
@@ -19931,6 +22096,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_method_fromMixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class B {",
@@ -19948,6 +22114,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_method_fromSuperclassMixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19964,6 +22131,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_methodCascades() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19979,6 +22147,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_methodCascades_withSetter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -19996,11 +22165,13 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_resolveAgainstNull() {
     Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  return null == p;", "}"]));
     resolve(source);
     assertNoErrors(source);
   }
+
   void test_setter_inherited() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -20015,6 +22186,7 @@
     assertNoErrors(source);
     verify([source]);
   }
+
   void test_setter_static() {
     Source source = addSource(EngineTestCase.createSource(["set s(x) {", "}", "", "main() {", "  s = 123;", "}"]));
     resolve(source);
@@ -20052,7 +22224,7 @@
     JUnitTestCase.assertNotNull(unit);
     ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
     MethodDeclaration methodDeclaration = classDeclaration.members[0] as MethodDeclaration;
-    Block block = ((methodDeclaration.body as BlockFunctionBody)).block;
+    Block block = (methodDeclaration.body as BlockFunctionBody).block;
     ExpressionStatement statement = block.statements[0] as ExpressionStatement;
     MethodInvocation invocation = statement.expression as MethodInvocation;
     NodeList<Expression> arguments = invocation.argumentList.arguments;
@@ -20069,6 +22241,7 @@
       }
     }
   }
+
   static dartSuite() {
     _ut.group('SimpleResolverTest', () {
       _ut.test('test_argumentResolution_requiredAndNamed_extra', () {
@@ -20254,8 +22427,8 @@
     });
   }
 }
-class SubtypeManagerTest extends EngineTestCase {
 
+class SubtypeManagerTest extends EngineTestCase {
   /**
    * The inheritance manager being tested.
    */
@@ -20265,6 +22438,7 @@
    * The compilation unit element containing all of the types setup in each test.
    */
   CompilationUnitElementImpl _definingCompilationUnit;
+
   void test_computeAllSubtypes_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -20275,6 +22449,7 @@
     EngineTestCase.assertSize3(2, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
   }
+
   void test_computeAllSubtypes_manyRecursiveSubtypes() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -20291,12 +22466,14 @@
     EngineTestCase.assertSize3(3, subtypesOfB);
     EngineTestCase.assertContains(arraySubtypesOfB, [classC, classD, classE]);
   }
+
   void test_computeAllSubtypes_noSubtypes() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     _definingCompilationUnit.types = <ClassElement> [classA];
     Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     EngineTestCase.assertSize3(0, subtypesOfA);
   }
+
   void test_computeAllSubtypes_oneSubtype() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -20306,6 +22483,7 @@
     EngineTestCase.assertSize3(1, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
   }
+
   void setUp() {
     super.setUp();
     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
@@ -20316,6 +22494,7 @@
     definingLibrary.definingCompilationUnit = _definingCompilationUnit;
     _subtypeManager = new SubtypeManager();
   }
+
   static dartSuite() {
     _ut.group('SubtypeManagerTest', () {
       _ut.test('test_computeAllSubtypes_infiniteLoop', () {
@@ -20337,8 +22516,240 @@
     });
   }
 }
+
+class ScopeBuilderTest extends EngineTestCase {
+  void test_scopeFor_ClassDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedClassDeclaration(), listener);
+    EngineTestCase.assertInstanceOf(LibraryScope, scope);
+  }
+
+  void test_scopeFor_ClassTypeAlias() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedClassTypeAlias(), listener);
+    EngineTestCase.assertInstanceOf(LibraryScope, scope);
+  }
+
+  void test_scopeFor_CompilationUnit() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedCompilationUnit(), listener);
+    EngineTestCase.assertInstanceOf(LibraryScope, scope);
+  }
+
+  void test_scopeFor_ConstructorDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedConstructorDeclaration(), listener);
+    EngineTestCase.assertInstanceOf(ClassScope, scope);
+  }
+
+  void test_scopeFor_ConstructorDeclaration_parameters() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedConstructorDeclaration().parameters, listener);
+    EngineTestCase.assertInstanceOf(FunctionScope, scope);
+  }
+
+  void test_scopeFor_FunctionDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionDeclaration(), listener);
+    EngineTestCase.assertInstanceOf(LibraryScope, scope);
+  }
+
+  void test_scopeFor_FunctionDeclaration_parameters() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionDeclaration().functionExpression.parameters, listener);
+    EngineTestCase.assertInstanceOf(FunctionScope, scope);
+  }
+
+  void test_scopeFor_FunctionTypeAlias() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionTypeAlias(), listener);
+    EngineTestCase.assertInstanceOf(LibraryScope, scope);
+  }
+
+  void test_scopeFor_FunctionTypeAlias_parameters() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionTypeAlias().parameters, listener);
+    EngineTestCase.assertInstanceOf(FunctionTypeScope, scope);
+  }
+
+  void test_scopeFor_MethodDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedMethodDeclaration(), listener);
+    EngineTestCase.assertInstanceOf(ClassScope, scope);
+  }
+
+  void test_scopeFor_MethodDeclaration_body() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(createResolvedMethodDeclaration().body, listener);
+    EngineTestCase.assertInstanceOf(FunctionScope, scope);
+  }
+
+  void test_scopeFor_notInCompilationUnit() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    try {
+      ScopeBuilder.scopeFor(ASTFactory.identifier3("x"), listener);
+      JUnitTestCase.fail("Expected AnalysisException");
+    } on AnalysisException catch (exception) {
+    }
+  }
+
+  void test_scopeFor_null() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    try {
+      ScopeBuilder.scopeFor(null, listener);
+      JUnitTestCase.fail("Expected AnalysisException");
+    } on AnalysisException catch (exception) {
+    }
+  }
+
+  void test_scopeFor_unresolved() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    try {
+      ScopeBuilder.scopeFor(ASTFactory.compilationUnit(), listener);
+      JUnitTestCase.fail("Expected AnalysisException");
+    } on AnalysisException catch (exception) {
+    }
+  }
+
+  ClassDeclaration createResolvedClassDeclaration() {
+    CompilationUnit unit = createResolvedCompilationUnit();
+    String className = "C";
+    ClassDeclaration classNode = ASTFactory.classDeclaration(null, className, ASTFactory.typeParameterList([]), null, null, null, []);
+    unit.declarations.add(classNode);
+    ClassElement classElement = ElementFactory.classElement2(className, []);
+    classNode.name.staticElement = classElement;
+    (unit.element as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    return classNode;
+  }
+
+  ClassTypeAlias createResolvedClassTypeAlias() {
+    CompilationUnit unit = createResolvedCompilationUnit();
+    String className = "C";
+    ClassTypeAlias classNode = ASTFactory.classTypeAlias(className, ASTFactory.typeParameterList([]), null, null, null, null);
+    unit.declarations.add(classNode);
+    ClassElement classElement = ElementFactory.classElement2(className, []);
+    classNode.name.staticElement = classElement;
+    (unit.element as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    return classNode;
+  }
+
+  CompilationUnit createResolvedCompilationUnit() {
+    CompilationUnit unit = ASTFactory.compilationUnit();
+    LibraryElementImpl library = ElementFactory.library(AnalysisContextFactory.contextWithCore(), "lib");
+    unit.element = library.definingCompilationUnit;
+    return unit;
+  }
+
+  ConstructorDeclaration createResolvedConstructorDeclaration() {
+    ClassDeclaration classNode = createResolvedClassDeclaration();
+    String constructorName = "f";
+    ConstructorDeclaration constructorNode = ASTFactory.constructorDeclaration(ASTFactory.identifier3(constructorName), null, ASTFactory.formalParameterList([]), null);
+    classNode.members.add(constructorNode);
+    ConstructorElement constructorElement = ElementFactory.constructorElement2(classNode.element, null, []);
+    constructorNode.element = constructorElement;
+    (classNode.element as ClassElementImpl).constructors = <ConstructorElement> [constructorElement];
+    return constructorNode;
+  }
+
+  FunctionDeclaration createResolvedFunctionDeclaration() {
+    CompilationUnit unit = createResolvedCompilationUnit();
+    String functionName = "f";
+    FunctionDeclaration functionNode = ASTFactory.functionDeclaration(null, null, functionName, ASTFactory.functionExpression());
+    unit.declarations.add(functionNode);
+    FunctionElement functionElement = ElementFactory.functionElement(functionName);
+    functionNode.name.staticElement = functionElement;
+    (unit.element as CompilationUnitElementImpl).functions = <FunctionElement> [functionElement];
+    return functionNode;
+  }
+
+  FunctionTypeAlias createResolvedFunctionTypeAlias() {
+    CompilationUnit unit = createResolvedCompilationUnit();
+    FunctionTypeAlias aliasNode = ASTFactory.typeAlias(ASTFactory.typeName4("A", []), "F", ASTFactory.typeParameterList([]), ASTFactory.formalParameterList([]));
+    unit.declarations.add(aliasNode);
+    SimpleIdentifier aliasName = aliasNode.name;
+    FunctionTypeAliasElement aliasElement = new FunctionTypeAliasElementImpl(aliasName);
+    aliasName.staticElement = aliasElement;
+    (unit.element as CompilationUnitElementImpl).typeAliases = <FunctionTypeAliasElement> [aliasElement];
+    return aliasNode;
+  }
+
+  MethodDeclaration createResolvedMethodDeclaration() {
+    ClassDeclaration classNode = createResolvedClassDeclaration();
+    String methodName = "f";
+    MethodDeclaration methodNode = ASTFactory.methodDeclaration(null, null, null, null, ASTFactory.identifier3(methodName), ASTFactory.formalParameterList([]));
+    classNode.members.add(methodNode);
+    MethodElement methodElement = ElementFactory.methodElement(methodName, null, []);
+    methodNode.name.staticElement = methodElement;
+    (classNode.element as ClassElementImpl).methods = <MethodElement> [methodElement];
+    return methodNode;
+  }
+
+  static dartSuite() {
+    _ut.group('ScopeBuilderTest', () {
+      _ut.test('test_scopeFor_ClassDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ClassDeclaration);
+      });
+      _ut.test('test_scopeFor_ClassTypeAlias', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ClassTypeAlias);
+      });
+      _ut.test('test_scopeFor_CompilationUnit', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_CompilationUnit);
+      });
+      _ut.test('test_scopeFor_ConstructorDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ConstructorDeclaration);
+      });
+      _ut.test('test_scopeFor_ConstructorDeclaration_parameters', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ConstructorDeclaration_parameters);
+      });
+      _ut.test('test_scopeFor_FunctionDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionDeclaration);
+      });
+      _ut.test('test_scopeFor_FunctionDeclaration_parameters', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionDeclaration_parameters);
+      });
+      _ut.test('test_scopeFor_FunctionTypeAlias', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionTypeAlias);
+      });
+      _ut.test('test_scopeFor_FunctionTypeAlias_parameters', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionTypeAlias_parameters);
+      });
+      _ut.test('test_scopeFor_MethodDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_MethodDeclaration);
+      });
+      _ut.test('test_scopeFor_MethodDeclaration_body', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_MethodDeclaration_body);
+      });
+      _ut.test('test_scopeFor_notInCompilationUnit', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_notInCompilationUnit);
+      });
+      _ut.test('test_scopeFor_null', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_null);
+      });
+      _ut.test('test_scopeFor_unresolved', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_unresolved);
+      });
+    });
+  }
+}
+
 main() {
+//  DeclarationMatcherTest.dartSuite();
 //  ElementResolverTest.dartSuite();
+//  IncrementalResolverTest.dartSuite();
 //  InheritanceManagerTest.dartSuite();
 //  LibraryElementBuilderTest.dartSuite();
 //  LibraryTest.dartSuite();
@@ -20350,6 +22761,7 @@
 //  EnclosedScopeTest.dartSuite();
 //  LibraryImportScopeTest.dartSuite();
 //  LibraryScopeTest.dartSuite();
+//  ScopeBuilderTest.dartSuite();
 //  ScopeTest.dartSuite();
 //  CompileTimeErrorCodeTest.dartSuite();
 //  ErrorResolverTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 8702c38..d70eec5 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -1,6 +1,8 @@
 // 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 engine.scanner_test;
+
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -9,6 +11,7 @@
 import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap;
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
+
 class KeywordStateTest extends JUnitTestCase {
   void test_KeywordState() {
     List<Keyword> keywords = Keyword.values;
@@ -41,6 +44,7 @@
       }
     }
   }
+
   static dartSuite() {
     _ut.group('KeywordStateTest', () {
       _ut.test('test_KeywordState', () {
@@ -50,6 +54,7 @@
     });
   }
 }
+
 class CharSequenceReaderTest extends JUnitTestCase {
   void test_advance() {
     CharSequenceReader reader = new CharSequenceReader(new CharSequence("x"));
@@ -57,9 +62,11 @@
     JUnitTestCase.assertEquals(-1, reader.advance());
     JUnitTestCase.assertEquals(-1, reader.advance());
   }
+
   void test_creation() {
     JUnitTestCase.assertNotNull(new CharSequenceReader(new CharSequence("x")));
   }
+
   void test_getOffset() {
     CharSequenceReader reader = new CharSequenceReader(new CharSequence("x"));
     JUnitTestCase.assertEquals(-1, reader.offset);
@@ -68,12 +75,14 @@
     reader.advance();
     JUnitTestCase.assertEquals(0, reader.offset);
   }
+
   void test_getString() {
     CharSequenceReader reader = new CharSequenceReader(new CharSequence("xyzzy"));
     reader.offset = 3;
     JUnitTestCase.assertEquals("yzz", reader.getString(1, 0));
     JUnitTestCase.assertEquals("zzy", reader.getString(2, 1));
   }
+
   void test_peek() {
     CharSequenceReader reader = new CharSequenceReader(new CharSequence("xy"));
     JUnitTestCase.assertEquals(0x78, reader.peek());
@@ -85,11 +94,13 @@
     JUnitTestCase.assertEquals(-1, reader.peek());
     JUnitTestCase.assertEquals(-1, reader.peek());
   }
+
   void test_setOffset() {
     CharSequenceReader reader = new CharSequenceReader(new CharSequence("xyz"));
     reader.offset = 2;
     JUnitTestCase.assertEquals(2, reader.offset);
   }
+
   static dartSuite() {
     _ut.group('CharSequenceReaderTest', () {
       _ut.test('test_advance', () {
@@ -119,6 +130,7 @@
     });
   }
 }
+
 class TokenTypeTest extends EngineTestCase {
   void test_isOperator() {
     JUnitTestCase.assertTrue(TokenType.AMPERSAND.isOperator);
@@ -162,6 +174,7 @@
     JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isOperator);
     JUnitTestCase.assertTrue(TokenType.TILDE_SLASH_EQ.isOperator);
   }
+
   void test_isUserDefinableOperator() {
     JUnitTestCase.assertTrue(TokenType.AMPERSAND.isUserDefinableOperator);
     JUnitTestCase.assertTrue(TokenType.BAR.isUserDefinableOperator);
@@ -183,6 +196,7 @@
     JUnitTestCase.assertTrue(TokenType.TILDE.isUserDefinableOperator);
     JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isUserDefinableOperator);
   }
+
   static dartSuite() {
     _ut.group('TokenTypeTest', () {
       _ut.test('test_isOperator', () {
@@ -196,21 +210,25 @@
     });
   }
 }
+
 /**
  * The class `TokenFactory` defines utility methods that can be used to create tokens.
  */
 class TokenFactory {
   static Token token(Keyword keyword) => new KeywordToken(keyword, 0);
+
   static Token token2(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
+
   static Token token3(TokenType type) => new Token(type, 0);
+
   static Token token4(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
 }
+
 /**
  * Instances of the class `TokenStreamValidator` are used to validate the correct construction
  * of a stream of tokens.
  */
 class TokenStreamValidator {
-
   /**
    * Validate that the stream of tokens that starts with the given token is correct.
    *
@@ -223,6 +241,7 @@
       JUnitTestCase.fail(builder.toString());
     }
   }
+
   void validateStream(JavaStringBuilder builder, Token token) {
     if (token == null) {
       return;
@@ -255,6 +274,7 @@
       currentToken = currentToken.next;
     }
   }
+
   void writeToken(JavaStringBuilder builder, Token token) {
     builder.append("[");
     builder.append(token.type);
@@ -267,292 +287,388 @@
     builder.append("]");
   }
 }
+
 class ScannerTest extends JUnitTestCase {
   void test_ampersand() {
     assertToken(TokenType.AMPERSAND, "&");
   }
+
   void test_ampersand_ampersand() {
     assertToken(TokenType.AMPERSAND_AMPERSAND, "&&");
   }
+
   void test_ampersand_eq() {
     assertToken(TokenType.AMPERSAND_EQ, "&=");
   }
+
   void test_at() {
     assertToken(TokenType.AT, "@");
   }
+
   void test_backping() {
     assertToken(TokenType.BACKPING, "`");
   }
+
   void test_backslash() {
     assertToken(TokenType.BACKSLASH, "\\");
   }
+
   void test_bang() {
     assertToken(TokenType.BANG, "!");
   }
+
   void test_bang_eq() {
     assertToken(TokenType.BANG_EQ, "!=");
   }
+
   void test_bar() {
     assertToken(TokenType.BAR, "|");
   }
+
   void test_bar_bar() {
     assertToken(TokenType.BAR_BAR, "||");
   }
+
   void test_bar_eq() {
     assertToken(TokenType.BAR_EQ, "|=");
   }
+
   void test_caret() {
     assertToken(TokenType.CARET, "^");
   }
+
   void test_caret_eq() {
     assertToken(TokenType.CARET_EQ, "^=");
   }
+
   void test_close_curly_bracket() {
     assertToken(TokenType.CLOSE_CURLY_BRACKET, "}");
   }
+
   void test_close_paren() {
     assertToken(TokenType.CLOSE_PAREN, ")");
   }
+
   void test_close_quare_bracket() {
     assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]");
   }
+
   void test_colon() {
     assertToken(TokenType.COLON, ":");
   }
+
   void test_comma() {
     assertToken(TokenType.COMMA, ",");
   }
+
   void test_comment_multi() {
     assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */");
   }
+
   void test_comment_multi_unterminated() {
     assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x");
   }
+
   void test_comment_nested() {
     assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comment */");
   }
+
   void test_comment_single() {
     assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment");
   }
+
   void test_double_both_e() {
     assertToken(TokenType.DOUBLE, "0.123e4");
   }
+
   void test_double_both_E() {
     assertToken(TokenType.DOUBLE, "0.123E4");
   }
+
   void test_double_fraction() {
     assertToken(TokenType.DOUBLE, ".123");
   }
+
   void test_double_fraction_e() {
     assertToken(TokenType.DOUBLE, ".123e4");
   }
+
   void test_double_fraction_E() {
     assertToken(TokenType.DOUBLE, ".123E4");
   }
+
   void test_double_missingDigitInExponent() {
     assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e");
   }
+
   void test_double_whole_e() {
     assertToken(TokenType.DOUBLE, "12e4");
   }
+
   void test_double_whole_E() {
     assertToken(TokenType.DOUBLE, "12E4");
   }
+
   void test_eq() {
     assertToken(TokenType.EQ, "=");
   }
+
   void test_eq_eq() {
     assertToken(TokenType.EQ_EQ, "==");
   }
+
   void test_gt() {
     assertToken(TokenType.GT, ">");
   }
+
   void test_gt_eq() {
     assertToken(TokenType.GT_EQ, ">=");
   }
+
   void test_gt_gt() {
     assertToken(TokenType.GT_GT, ">>");
   }
+
   void test_gt_gt_eq() {
     assertToken(TokenType.GT_GT_EQ, ">>=");
   }
+
   void test_hash() {
     assertToken(TokenType.HASH, "#");
   }
+
   void test_hexidecimal() {
     assertToken(TokenType.HEXADECIMAL, "0x1A2B3C");
   }
+
   void test_hexidecimal_missingDigit() {
     assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x");
   }
+
   void test_identifier() {
     assertToken(TokenType.IDENTIFIER, "result");
   }
+
   void test_illegalChar_cyrillicLetter_middle() {
     assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "Shche\u0433lov");
   }
+
   void test_illegalChar_cyrillicLetter_start() {
     assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429");
   }
+
   void test_illegalChar_nbsp() {
     assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0");
   }
+
   void test_illegalChar_notLetter() {
     assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312");
   }
+
   void test_index() {
     assertToken(TokenType.INDEX, "[]");
   }
+
   void test_index_eq() {
     assertToken(TokenType.INDEX_EQ, "[]=");
   }
+
   void test_int() {
     assertToken(TokenType.INT, "123");
   }
+
   void test_int_initialZero() {
     assertToken(TokenType.INT, "0123");
   }
+
   void test_keyword_abstract() {
     assertKeywordToken("abstract");
   }
+
   void test_keyword_as() {
     assertKeywordToken("as");
   }
+
   void test_keyword_assert() {
     assertKeywordToken("assert");
   }
+
   void test_keyword_break() {
     assertKeywordToken("break");
   }
+
   void test_keyword_case() {
     assertKeywordToken("case");
   }
+
   void test_keyword_catch() {
     assertKeywordToken("catch");
   }
+
   void test_keyword_class() {
     assertKeywordToken("class");
   }
+
   void test_keyword_const() {
     assertKeywordToken("const");
   }
+
   void test_keyword_continue() {
     assertKeywordToken("continue");
   }
+
   void test_keyword_default() {
     assertKeywordToken("default");
   }
+
   void test_keyword_do() {
     assertKeywordToken("do");
   }
+
   void test_keyword_dynamic() {
     assertKeywordToken("dynamic");
   }
+
   void test_keyword_else() {
     assertKeywordToken("else");
   }
+
   void test_keyword_enum() {
     assertKeywordToken("enum");
   }
+
   void test_keyword_export() {
     assertKeywordToken("export");
   }
+
   void test_keyword_extends() {
     assertKeywordToken("extends");
   }
+
   void test_keyword_factory() {
     assertKeywordToken("factory");
   }
+
   void test_keyword_false() {
     assertKeywordToken("false");
   }
+
   void test_keyword_final() {
     assertKeywordToken("final");
   }
+
   void test_keyword_finally() {
     assertKeywordToken("finally");
   }
+
   void test_keyword_for() {
     assertKeywordToken("for");
   }
+
   void test_keyword_get() {
     assertKeywordToken("get");
   }
+
   void test_keyword_if() {
     assertKeywordToken("if");
   }
+
   void test_keyword_implements() {
     assertKeywordToken("implements");
   }
+
   void test_keyword_import() {
     assertKeywordToken("import");
   }
+
   void test_keyword_in() {
     assertKeywordToken("in");
   }
+
   void test_keyword_is() {
     assertKeywordToken("is");
   }
+
   void test_keyword_library() {
     assertKeywordToken("library");
   }
+
   void test_keyword_new() {
     assertKeywordToken("new");
   }
+
   void test_keyword_null() {
     assertKeywordToken("null");
   }
+
   void test_keyword_operator() {
     assertKeywordToken("operator");
   }
+
   void test_keyword_part() {
     assertKeywordToken("part");
   }
+
   void test_keyword_rethrow() {
     assertKeywordToken("rethrow");
   }
+
   void test_keyword_return() {
     assertKeywordToken("return");
   }
+
   void test_keyword_set() {
     assertKeywordToken("set");
   }
+
   void test_keyword_static() {
     assertKeywordToken("static");
   }
+
   void test_keyword_super() {
     assertKeywordToken("super");
   }
+
   void test_keyword_switch() {
     assertKeywordToken("switch");
   }
+
   void test_keyword_this() {
     assertKeywordToken("this");
   }
+
   void test_keyword_throw() {
     assertKeywordToken("throw");
   }
+
   void test_keyword_true() {
     assertKeywordToken("true");
   }
+
   void test_keyword_try() {
     assertKeywordToken("try");
   }
+
   void test_keyword_typedef() {
     assertKeywordToken("typedef");
   }
+
   void test_keyword_var() {
     assertKeywordToken("var");
   }
+
   void test_keyword_void() {
     assertKeywordToken("void");
   }
+
   void test_keyword_while() {
     assertKeywordToken("while");
   }
+
   void test_keyword_with() {
     assertKeywordToken("with");
   }
+
   void test_lineInfo_multilineComment() {
     String source = "/*\r *\r */";
     assertLineInfo(source, [
@@ -560,6 +676,7 @@
         new ScannerTest_ExpectedLocation(4, 2, 2),
         new ScannerTest_ExpectedLocation(source.length - 1, 3, 3)]);
   }
+
   void test_lineInfo_multilineString() {
     String source = "'''a\r\nbc\r\nd'''";
     assertLineInfo(source, [
@@ -567,6 +684,7 @@
         new ScannerTest_ExpectedLocation(7, 2, 2),
         new ScannerTest_ExpectedLocation(source.length - 1, 3, 4)]);
   }
+
   void test_lineInfo_simpleClass() {
     String source = "class Test {\r\n    String s = '...';\r\n    int get x => s.MISSING_GETTER;\r\n}";
     assertLineInfo(source, [
@@ -574,60 +692,78 @@
         new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20),
         new ScannerTest_ExpectedLocation(source.length - 1, 4, 1)]);
   }
+
   void test_lineInfo_slashN() {
     String source = "class Test {\n}";
     assertLineInfo(source, [
         new ScannerTest_ExpectedLocation(0, 1, 1),
         new ScannerTest_ExpectedLocation(source.indexOf("}"), 2, 1)]);
   }
+
   void test_lt() {
     assertToken(TokenType.LT, "<");
   }
+
   void test_lt_eq() {
     assertToken(TokenType.LT_EQ, "<=");
   }
+
   void test_lt_lt() {
     assertToken(TokenType.LT_LT, "<<");
   }
+
   void test_lt_lt_eq() {
     assertToken(TokenType.LT_LT_EQ, "<<=");
   }
+
   void test_minus() {
     assertToken(TokenType.MINUS, "-");
   }
+
   void test_minus_eq() {
     assertToken(TokenType.MINUS_EQ, "-=");
   }
+
   void test_minus_minus() {
     assertToken(TokenType.MINUS_MINUS, "--");
   }
+
   void test_open_curly_bracket() {
     assertToken(TokenType.OPEN_CURLY_BRACKET, "{");
   }
+
   void test_open_paren() {
     assertToken(TokenType.OPEN_PAREN, "(");
   }
+
   void test_open_square_bracket() {
     assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
   }
+
   void test_openSquareBracket() {
     assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
   }
+
   void test_percent() {
     assertToken(TokenType.PERCENT, "%");
   }
+
   void test_percent_eq() {
     assertToken(TokenType.PERCENT_EQ, "%=");
   }
+
   void test_period() {
     assertToken(TokenType.PERIOD, ".");
   }
+
   void test_period_period() {
     assertToken(TokenType.PERIOD_PERIOD, "..");
   }
+
   void test_period_period_period() {
     assertToken(TokenType.PERIOD_PERIOD_PERIOD, "...");
   }
+
   void test_periodAfterNumberNotIncluded_identifier() {
     assertTokens("42.isEven()", [
         new StringToken(TokenType.INT, "42", 0),
@@ -636,6 +772,7 @@
         new Token(TokenType.OPEN_PAREN, 9),
         new Token(TokenType.CLOSE_PAREN, 10)]);
   }
+
   void test_periodAfterNumberNotIncluded_period() {
     assertTokens("42..isEven()", [
         new StringToken(TokenType.INT, "42", 0),
@@ -644,30 +781,39 @@
         new Token(TokenType.OPEN_PAREN, 10),
         new Token(TokenType.CLOSE_PAREN, 11)]);
   }
+
   void test_plus() {
     assertToken(TokenType.PLUS, "+");
   }
+
   void test_plus_eq() {
     assertToken(TokenType.PLUS_EQ, "+=");
   }
+
   void test_plus_plus() {
     assertToken(TokenType.PLUS_PLUS, "++");
   }
+
   void test_question() {
     assertToken(TokenType.QUESTION, "?");
   }
+
   void test_scriptTag_withArgs() {
     assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug");
   }
+
   void test_scriptTag_withoutSpace() {
     assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart");
   }
+
   void test_scriptTag_withSpace() {
     assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart");
   }
+
   void test_semicolon() {
     assertToken(TokenType.SEMICOLON, ";");
   }
+
   void test_setSourceStart() {
     int offsetDelta = 42;
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -679,18 +825,23 @@
     JUnitTestCase.assertEquals(3, lineStarts.length);
     JUnitTestCase.assertEquals(33, lineStarts[2]);
   }
+
   void test_slash() {
     assertToken(TokenType.SLASH, "/");
   }
+
   void test_slash_eq() {
     assertToken(TokenType.SLASH_EQ, "/=");
   }
+
   void test_star() {
     assertToken(TokenType.STAR, "*");
   }
+
   void test_star_eq() {
     assertToken(TokenType.STAR_EQ, "*=");
   }
+
   void test_startAndEnd() {
     Token token = scan("a");
     Token previous = token.previous;
@@ -700,15 +851,19 @@
     JUnitTestCase.assertEquals(next, next.next);
     JUnitTestCase.assertEquals(token, next.previous);
   }
+
   void test_string_multi_double() {
     assertToken(TokenType.STRING, "\"\"\"line1\nline2\"\"\"");
   }
+
   void test_string_multi_embeddedQuotes() {
     assertToken(TokenType.STRING, "\"\"\"line1\n\"\"\nline2\"\"\"");
   }
+
   void test_string_multi_embeddedQuotes_escapedChar() {
     assertToken(TokenType.STRING, "\"\"\"a\"\"\\tb\"\"\"");
   }
+
   void test_string_multi_interpolation_block() {
     assertTokens("\"Hello \${name}!\"", [
         new StringToken(TokenType.STRING, "\"Hello ", 0),
@@ -717,6 +872,7 @@
         new Token(TokenType.CLOSE_CURLY_BRACKET, 13),
         new StringToken(TokenType.STRING, "!\"", 14)]);
   }
+
   void test_string_multi_interpolation_identifier() {
     assertTokens("\"Hello \$name!\"", [
         new StringToken(TokenType.STRING, "\"Hello ", 0),
@@ -724,42 +880,55 @@
         new StringToken(TokenType.IDENTIFIER, "name", 8),
         new StringToken(TokenType.STRING, "!\"", 12)]);
   }
+
   void test_string_multi_single() {
     assertToken(TokenType.STRING, "'''string'''");
   }
+
   void test_string_multi_slashEnter() {
     assertToken(TokenType.STRING, "'''\\\n'''");
   }
+
   void test_string_multi_unterminated() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
   }
+
   void test_string_raw_multi_double() {
     assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\"");
   }
+
   void test_string_raw_multi_single() {
     assertToken(TokenType.STRING, "r'''string'''");
   }
+
   void test_string_raw_multi_unterminated() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string");
   }
+
   void test_string_raw_simple_double() {
     assertToken(TokenType.STRING, "r\"string\"");
   }
+
   void test_string_raw_simple_single() {
     assertToken(TokenType.STRING, "r'string'");
   }
+
   void test_string_raw_simple_unterminated_eof() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string");
   }
+
   void test_string_raw_simple_unterminated_eol() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n");
   }
+
   void test_string_simple_double() {
     assertToken(TokenType.STRING, "\"string\"");
   }
+
   void test_string_simple_escapedDollar() {
     assertToken(TokenType.STRING, "'a\\\$b'");
   }
+
   void test_string_simple_interpolation_adjacentIdentifiers() {
     assertTokens("'\$a\$b'", [
         new StringToken(TokenType.STRING, "'", 0),
@@ -770,6 +939,7 @@
         new StringToken(TokenType.IDENTIFIER, "b", 4),
         new StringToken(TokenType.STRING, "'", 5)]);
   }
+
   void test_string_simple_interpolation_block() {
     assertTokens("'Hello \${name}!'", [
         new StringToken(TokenType.STRING, "'Hello ", 0),
@@ -778,6 +948,7 @@
         new Token(TokenType.CLOSE_CURLY_BRACKET, 13),
         new StringToken(TokenType.STRING, "!'", 14)]);
   }
+
   void test_string_simple_interpolation_blockWithNestedMap() {
     assertTokens("'a \${f({'b' : 'c'})} d'", [
         new StringToken(TokenType.STRING, "'a ", 0),
@@ -793,6 +964,7 @@
         new Token(TokenType.CLOSE_CURLY_BRACKET, 19),
         new StringToken(TokenType.STRING, " d'", 20)]);
   }
+
   void test_string_simple_interpolation_firstAndLast() {
     assertTokens("'\$greeting \$name'", [
         new StringToken(TokenType.STRING, "'", 0),
@@ -803,6 +975,7 @@
         new StringToken(TokenType.IDENTIFIER, "name", 12),
         new StringToken(TokenType.STRING, "'", 16)]);
   }
+
   void test_string_simple_interpolation_identifier() {
     assertTokens("'Hello \$name!'", [
         new StringToken(TokenType.STRING, "'Hello ", 0),
@@ -810,6 +983,7 @@
         new StringToken(TokenType.IDENTIFIER, "name", 8),
         new StringToken(TokenType.STRING, "!'", 12)]);
   }
+
   void test_string_simple_interpolation_missingIdentifier() {
     assertTokens("'\$x\$'", [
         new StringToken(TokenType.STRING, "'", 0),
@@ -819,34 +993,43 @@
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
         new StringToken(TokenType.STRING, "'", 4)]);
   }
+
   void test_string_simple_interpolation_nonIdentifier() {
     assertTokens("'\$1'", [
         new StringToken(TokenType.STRING, "'", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
         new StringToken(TokenType.STRING, "1'", 2)]);
   }
+
   void test_string_simple_single() {
     assertToken(TokenType.STRING, "'string'");
   }
+
   void test_string_simple_unterminated_eof() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string");
   }
+
   void test_string_simple_unterminated_eol() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r");
   }
+
   void test_tilde() {
     assertToken(TokenType.TILDE, "~");
   }
+
   void test_tilde_slash() {
     assertToken(TokenType.TILDE_SLASH, "~/");
   }
+
   void test_tilde_slash_eq() {
     assertToken(TokenType.TILDE_SLASH_EQ, "~/=");
   }
+
   void test_unclosedPairInInterpolation() {
     GatheringErrorListener listener = new GatheringErrorListener();
     scan2("'\${(}'", listener);
   }
+
   void assertComment(TokenType commentType, String source) {
     Token token = scan(source);
     JUnitTestCase.assertNotNull(token);
@@ -896,7 +1079,7 @@
     JUnitTestCase.assertEquals(source, token.lexeme);
     Object value = token.value();
     JUnitTestCase.assertTrue(value is Keyword);
-    JUnitTestCase.assertEquals(source, ((value as Keyword)).syntax);
+    JUnitTestCase.assertEquals(source, (value as Keyword).syntax);
     token = scan(" ${source} ");
     JUnitTestCase.assertNotNull(token);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type);
@@ -905,9 +1088,10 @@
     JUnitTestCase.assertEquals(source, token.lexeme);
     value = token.value();
     JUnitTestCase.assertTrue(value is Keyword);
-    JUnitTestCase.assertEquals(source, ((value as Keyword)).syntax);
+    JUnitTestCase.assertEquals(source, (value as Keyword).syntax);
     JUnitTestCase.assertEquals(TokenType.EOF, token.next.type);
   }
+
   void assertLineInfo(String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
     GatheringErrorListener listener = new GatheringErrorListener();
     scan2(source, listener);
@@ -989,18 +1173,21 @@
     }
     JUnitTestCase.assertEquals(TokenType.EOF, token.type);
   }
+
   Token scan(String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
     Token token = scan2(source, listener);
     listener.assertNoErrors();
     return token;
   }
+
   Token scan2(String source, GatheringErrorListener listener) {
     Scanner scanner = new Scanner(null, new CharSequenceReader(new CharSequence(source)), listener);
     Token result = scanner.tokenize();
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
     return result;
   }
+
   static dartSuite() {
     _ut.group('ScannerTest', () {
       _ut.test('test_ampersand', () {
@@ -1654,127 +1841,189 @@
     });
   }
 }
+
 /**
  * Instances of the class `ExpectedLocation` encode information about the expected location
  * of a given offset in source code.
  */
 class ScannerTest_ExpectedLocation {
   int _offset = 0;
+
   int _lineNumber = 0;
+
   int _columnNumber = 0;
+
   ScannerTest_ExpectedLocation(int offset, int lineNumber, int columnNumber) {
     this._offset = offset;
     this._lineNumber = lineNumber;
     this._columnNumber = columnNumber;
   }
 }
+
 class IncrementalScannerTest extends EngineTestCase {
+  /**
+   * The first token from the token stream resulting from parsing the original source, or
+   * `null` if [scan] has not been invoked.
+   */
   Token _originalTokens;
-  void test_rescan_addedBeforeIdentifier1() {
-    IncrementalScanner scanner = assertTokens("a + b;", "xa + b;");
-    JUnitTestCase.assertEquals("xa", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("xa", scanner.lastToken.lexeme);
+
+  /**
+   * The scanner used to perform incremental scanning, or `null` if [scan] has not been
+   * invoked.
+   */
+  IncrementalScanner _incrementalScanner;
+
+  /**
+   * The first token from the token stream resulting from performing an incremental scan, or
+   * `null` if [scan] has not been invoked.
+   */
+  Token _incrementalTokens;
+
+  void fail_delete_identifier_beginning() {
+    scan("", "ab", "", "s + b;");
+    assertTokens(0, 0, ["s", "+", "b", ";"]);
   }
-  void test_rescan_addedBeforeIdentifier2() {
-    IncrementalScanner scanner = assertTokens("a + b;", "a + xb;");
-    JUnitTestCase.assertEquals("xb", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("xb", scanner.lastToken.lexeme);
+
+  void fail_delete_mergeTokens() {
+    scan("a", " + b + ", "", "c;");
+    assertTokens(0, 0, ["ac", ";"]);
   }
-  void test_rescan_addedNewIdentifier1() {
-    IncrementalScanner scanner = assertTokens("a;  c;", "a; b c;");
-    JUnitTestCase.assertEquals("b", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("b", scanner.lastToken.lexeme);
+
+  void fail_replace_multiple_partialFirstAndLast() {
+    scan("a", "a + b", "b * a", "b;");
+    assertTokens(0, 2, ["ab", "*", "ab", ";"]);
   }
-  void test_rescan_addedNewIdentifier2() {
-    IncrementalScanner scanner = assertTokens("a;  c;", "a;b  c;");
-    JUnitTestCase.assertEquals("b", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("b", scanner.lastToken.lexeme);
-    Token oldToken = _originalTokens.next;
-    JUnitTestCase.assertSame(TokenType.SEMICOLON, oldToken.type);
-    Token newToken = scanner.tokenMap.get(oldToken);
-    JUnitTestCase.assertNotNull(newToken);
-    JUnitTestCase.assertEquals(TokenType.SEMICOLON, newToken.type);
-    JUnitTestCase.assertNotSame(oldToken, newToken);
+
+  void test_delete_identifier_end() {
+    scan("a", "bs", "", " + b;");
+    assertTokens(0, 0, ["a", "+", "b", ";"]);
   }
-  void test_rescan_addedToIdentifier1() {
-    IncrementalScanner scanner = assertTokens("a + b;", "abs + b;");
-    JUnitTestCase.assertEquals("abs", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("abs", scanner.lastToken.lexeme);
-    Token oldToken = _originalTokens.next;
-    JUnitTestCase.assertEquals(TokenType.PLUS, oldToken.type);
-    Token newToken = scanner.tokenMap.get(oldToken);
-    JUnitTestCase.assertNotNull(newToken);
-    JUnitTestCase.assertEquals(TokenType.PLUS, newToken.type);
-    JUnitTestCase.assertNotSame(oldToken, newToken);
+
+  void test_delete_identifier_middle() {
+    scan("a", "b", "", "s + b;");
+    assertTokens(0, 0, ["as", "+", "b", ";"]);
   }
-  void test_rescan_addedToIdentifier2() {
-    IncrementalScanner scanner = assertTokens("a + b;", "a + by;");
-    JUnitTestCase.assertEquals("by", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("by", scanner.lastToken.lexeme);
+
+  void test_insert_afterIdentifier1() {
+    scan("a", "", "bs", " + b;");
+    assertTokens(0, 0, ["abs", "+", "b", ";"]);
+    assertReplaced(1, "+");
   }
-  void test_rescan_appendWhitespace1() {
-    IncrementalScanner scanner = assertTokens("a + b;", "a + b; ");
-    JUnitTestCase.assertNull(scanner.firstToken);
-    JUnitTestCase.assertNull(scanner.lastToken);
+
+  void test_insert_afterIdentifier2() {
+    scan("a + b", "", "y", ";");
+    assertTokens(2, 2, ["a", "+", "by", ";"]);
   }
-  void test_rescan_appendWhitespace2() {
-    IncrementalScanner scanner = assertTokens("a + b; ", "a + b;  ");
-    JUnitTestCase.assertNull(scanner.firstToken);
-    JUnitTestCase.assertNull(scanner.lastToken);
+
+  void test_insert_beforeIdentifier() {
+    scan("a + ", "", "x", "b;");
+    assertTokens(2, 2, ["a", "+", "xb", ";"]);
   }
-  void test_rescan_insertedPeriod() {
-    IncrementalScanner scanner = assertTokens("a + b;", "a + b.;");
-    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+
+  void test_insert_beforeIdentifier_firstToken() {
+    scan("", "", "x", "a + b;");
+    assertTokens(0, 0, ["xa", "+", "b", ";"]);
   }
-  void test_rescan_insertedPeriodBetweenIdentifiers1() {
-    IncrementalScanner scanner = assertTokens("a b;", "a. b;");
-    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+
+  void test_insert_convertOneFunctionToTwo() {
+    scan("f()", "", " => 0; g()", " {}");
+    assertTokens(3, 8, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
   }
-  void test_rescan_insertedPeriodBetweenIdentifiers2() {
-    IncrementalScanner scanner = assertTokens("a b;", "a .b;");
-    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+
+  void test_insert_newIdentifier1() {
+    scan("a; ", "", "b", " c;");
+    assertTokens(2, 2, ["a", ";", "b", "c", ";"]);
   }
-  void test_rescan_insertedPeriodBetweenIdentifiers3() {
-    IncrementalScanner scanner = assertTokens("a  b;", "a . b;");
-    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+
+  void test_insert_newIdentifier2() {
+    scan("a;", "", "b", "  c;");
+    assertTokens(2, 2, ["a", ";", "b", "c", ";"]);
+    assertReplaced(1, ";");
   }
-  void test_rescan_insertedPeriodIdentifier() {
-    IncrementalScanner scanner = assertTokens("a + b;", "a + b.x;");
-    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("x", scanner.lastToken.lexeme);
+
+  void test_insert_period() {
+    scan("a + b", "", ".", ";");
+    assertTokens(3, 3, ["a", "+", "b", ".", ";"]);
   }
-  void test_rescan_insertedPeriodInsideExistingIdentifier() {
-    IncrementalScanner scanner = assertTokens("ab;", "a.b;");
-    JUnitTestCase.assertEquals("a", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals("b", scanner.lastToken.lexeme);
+
+  void test_insert_period_betweenIdentifiers1() {
+    scan("a", "", ".", " b;");
+    assertTokens(1, 1, ["a", ".", "b", ";"]);
   }
-  void test_rescan_insertLeadingWhitespace() {
-    IncrementalScanner scanner = assertTokens("a + b;", " a + b;");
-    JUnitTestCase.assertNull(scanner.firstToken);
-    JUnitTestCase.assertNull(scanner.lastToken);
+
+  void test_insert_period_betweenIdentifiers2() {
+    scan("a ", "", ".", "b;");
+    assertTokens(1, 1, ["a", ".", "b", ";"]);
   }
-  void test_rescan_insertWhitespace() {
-    IncrementalScanner scanner = assertTokens("a + b;", "a  + b;");
-    JUnitTestCase.assertNull(scanner.firstToken);
-    JUnitTestCase.assertNull(scanner.lastToken);
+
+  void test_insert_period_betweenIdentifiers3() {
+    scan("a ", "", ".", " b;");
+    assertTokens(1, 1, ["a", ".", "b", ";"]);
   }
-  void test_rescan_insertWhitespaceWithMultipleComments() {
-    IncrementalScanner scanner = assertTokens(EngineTestCase.createSource(["//comment", "//comment2", "a + b;"]), EngineTestCase.createSource(["//comment", "//comment2", "a  + b;"]));
-    JUnitTestCase.assertNull(scanner.firstToken);
-    JUnitTestCase.assertNull(scanner.lastToken);
+
+  void test_insert_period_insideExistingIdentifier() {
+    scan("a", "", ".", "b;");
+    assertTokens(0, 2, ["a", ".", "b", ";"]);
   }
-  void test_rescan_oneFunctionToTwo() {
-    IncrementalScanner scanner = assertTokens("f() {}", "f() => 0; g() {}");
-    JUnitTestCase.assertEquals("=>", scanner.firstToken.lexeme);
-    JUnitTestCase.assertEquals(")", scanner.lastToken.lexeme);
+
+  void test_insert_periodAndIdentifier() {
+    scan("a + b", "", ".x", ";");
+    assertTokens(3, 4, ["a", "+", "b", ".", "x", ";"]);
   }
+
+  void test_insert_whitespace_beginning_beforeToken() {
+    scan("", "", " ", "a + b;");
+    assertTokens(-1, -1, ["a", "+", "b", ";"]);
+  }
+
+  void test_insert_whitespace_betweenTokens() {
+    scan("a ", "", " ", "+ b;");
+    assertTokens(-1, -1, ["a", "+", "b", ";"]);
+  }
+
+  void test_insert_whitespace_end_afterToken() {
+    scan("a + b;", "", " ", "");
+    assertTokens(-1, -1, ["a", "+", "b", ";"]);
+  }
+
+  void test_insert_whitespace_end_afterWhitespace() {
+    scan("a + b; ", "", " ", "");
+    assertTokens(-1, -1, ["a", "+", "b", ";"]);
+  }
+
+  void test_insert_whitespace_withMultipleComments() {
+    scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
+    assertTokens(-1, -1, ["a", "+", "b", ";"]);
+  }
+
+  void test_replace_identifier_beginning() {
+    scan("", "b", "f", "ell + b;");
+    assertTokens(0, 0, ["fell", "+", "b", ";"]);
+  }
+
+  void test_replace_identifier_end() {
+    scan("bel", "l", "t", " + b;");
+    assertTokens(0, 0, ["belt", "+", "b", ";"]);
+  }
+
+  void test_replace_identifier_middle() {
+    scan("f", "ir", "ro", "st + b;");
+    assertTokens(0, 0, ["frost", "+", "b", ";"]);
+  }
+
+  void test_replace_operator_oneForMany() {
+    scan("a ", "+", "* c -", " b;");
+    assertTokens(1, 3, ["a", "*", "c", "-", "b", ";"]);
+  }
+
+  void test_replace_operator_oneForOne() {
+    scan("a ", "+", "*", " b;");
+    assertTokens(1, 1, ["a", "*", "b", ";"]);
+  }
+
   void test_tokenMap() {
-    IncrementalScanner scanner = assertTokens("main() {a + b;}", "main() { a + b;}");
-    TokenMap tokenMap = scanner.tokenMap;
+    scan("main() {", "", " ", "a + b;}");
+    TokenMap tokenMap = _incrementalScanner.tokenMap;
     Token oldToken = _originalTokens;
     while (oldToken.type != TokenType.EOF) {
       Token newToken = tokenMap.get(oldToken);
@@ -1784,19 +2033,58 @@
       oldToken = oldToken.next;
     }
   }
-  IncrementalScanner assertTokens(String originalContents, String modifiedContents) {
-    int originalLength = originalContents.length;
-    int modifiedLength = modifiedContents.length;
-    int replaceStart = 0;
-    while (replaceStart < originalLength && replaceStart < modifiedLength && originalContents.codeUnitAt(replaceStart) == modifiedContents.codeUnitAt(replaceStart)) {
-      replaceStart++;
+
+  void assertReplaced(int tokenOffset, String lexeme) {
+    Token oldToken = _originalTokens;
+    for (int i = 0; i < tokenOffset; i++) {
+      oldToken = oldToken.next;
     }
-    int originalEnd = originalLength - 1;
-    int modifiedEnd = modifiedLength - 1;
-    while (originalEnd >= replaceStart && modifiedEnd >= replaceStart && originalContents.codeUnitAt(originalEnd) == modifiedContents.codeUnitAt(modifiedEnd)) {
-      originalEnd--;
-      modifiedEnd--;
+    JUnitTestCase.assertEquals(lexeme, oldToken.lexeme);
+    Token newToken = _incrementalScanner.tokenMap.get(oldToken);
+    JUnitTestCase.assertNotNull(newToken);
+    JUnitTestCase.assertEquals(lexeme, newToken.lexeme);
+    JUnitTestCase.assertNotSame(oldToken, newToken);
+  }
+
+  void assertTokens(int firstIndex, int lastIndex, List<String> lexemes) {
+    Token firstToken = null;
+    Token lastToken = null;
+    int count = lexemes.length;
+    Token token = _incrementalTokens;
+    for (int i = 0; i < count; i++) {
+      JUnitTestCase.assertEquals(lexemes[i], token.lexeme);
+      if (i == firstIndex) {
+        firstToken = token;
+      }
+      if (i == lastIndex) {
+        lastToken = token;
+      }
+      token = token.next;
     }
+    JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, token.type);
+    if (firstIndex >= 0) {
+      JUnitTestCase.assertNotNull(firstToken);
+    }
+    JUnitTestCase.assertSame(firstToken, _incrementalScanner.firstToken);
+    if (lastIndex >= 0) {
+      JUnitTestCase.assertNotNull(lastToken);
+    }
+    JUnitTestCase.assertSame(lastToken, _incrementalScanner.lastToken);
+  }
+
+  /**
+   * Given a description of the original and modified contents, perform an incremental scan of the
+   * two pieces of text.
+   *
+   * @param prefix the unchanged text before the edit region
+   * @param removed the text that was removed from the original contents
+   * @param added the text that was added to the modified contents
+   * @param suffix the unchanged text after the edit region
+   */
+  void scan(String prefix, String removed, String added, String suffix) {
+    String originalContents = "${prefix}${removed}${suffix}";
+    String modifiedContents = "${prefix}${added}${suffix}";
+    int replaceStart = prefix.length;
     Source source = new TestSource();
     GatheringErrorListener originalListener = new GatheringErrorListener();
     Scanner originalScanner = new Scanner(source, new CharSequenceReader(new CharSequence(originalContents)), originalListener);
@@ -1807,9 +2095,9 @@
     Token modifiedTokens = modifiedScanner.tokenize();
     JUnitTestCase.assertNotNull(modifiedTokens);
     GatheringErrorListener incrementalListener = new GatheringErrorListener();
-    IncrementalScanner incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), incrementalListener);
-    Token incrementalTokens = incrementalScanner.rescan(_originalTokens, replaceStart, originalEnd - replaceStart + 1, modifiedEnd - replaceStart + 1);
-    Token incrementalToken = incrementalTokens;
+    _incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(new CharSequence(modifiedContents)), incrementalListener);
+    _incrementalTokens = _incrementalScanner.rescan(_originalTokens, replaceStart, removed.length, added.length);
+    Token incrementalToken = _incrementalTokens;
     JUnitTestCase.assertNotNull(incrementalToken);
     while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
       JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
@@ -1821,81 +2109,109 @@
     }
     JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
     JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
-    return incrementalScanner;
   }
+
   static dartSuite() {
     _ut.group('IncrementalScannerTest', () {
-      _ut.test('test_rescan_addedBeforeIdentifier1', () {
+      _ut.test('test_delete_identifier_end', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedBeforeIdentifier1);
+        runJUnitTest(__test, __test.test_delete_identifier_end);
       });
-      _ut.test('test_rescan_addedBeforeIdentifier2', () {
+      _ut.test('test_delete_identifier_middle', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedBeforeIdentifier2);
+        runJUnitTest(__test, __test.test_delete_identifier_middle);
       });
-      _ut.test('test_rescan_addedNewIdentifier1', () {
+      _ut.test('test_insert_afterIdentifier1', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedNewIdentifier1);
+        runJUnitTest(__test, __test.test_insert_afterIdentifier1);
       });
-      _ut.test('test_rescan_addedNewIdentifier2', () {
+      _ut.test('test_insert_afterIdentifier2', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedNewIdentifier2);
+        runJUnitTest(__test, __test.test_insert_afterIdentifier2);
       });
-      _ut.test('test_rescan_addedToIdentifier1', () {
+      _ut.test('test_insert_beforeIdentifier', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedToIdentifier1);
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier);
       });
-      _ut.test('test_rescan_addedToIdentifier2', () {
+      _ut.test('test_insert_beforeIdentifier_firstToken', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedToIdentifier2);
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier_firstToken);
       });
-      _ut.test('test_rescan_appendWhitespace1', () {
+      _ut.test('test_insert_convertOneFunctionToTwo', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_appendWhitespace1);
+        runJUnitTest(__test, __test.test_insert_convertOneFunctionToTwo);
       });
-      _ut.test('test_rescan_appendWhitespace2', () {
+      _ut.test('test_insert_newIdentifier1', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_appendWhitespace2);
+        runJUnitTest(__test, __test.test_insert_newIdentifier1);
       });
-      _ut.test('test_rescan_insertLeadingWhitespace', () {
+      _ut.test('test_insert_newIdentifier2', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertLeadingWhitespace);
+        runJUnitTest(__test, __test.test_insert_newIdentifier2);
       });
-      _ut.test('test_rescan_insertWhitespace', () {
+      _ut.test('test_insert_period', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertWhitespace);
+        runJUnitTest(__test, __test.test_insert_period);
       });
-      _ut.test('test_rescan_insertWhitespaceWithMultipleComments', () {
+      _ut.test('test_insert_periodAndIdentifier', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertWhitespaceWithMultipleComments);
+        runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
       });
-      _ut.test('test_rescan_insertedPeriod', () {
+      _ut.test('test_insert_period_betweenIdentifiers1', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertedPeriod);
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers1);
       });
-      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers1', () {
+      _ut.test('test_insert_period_betweenIdentifiers2', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers1);
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
       });
-      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers2', () {
+      _ut.test('test_insert_period_betweenIdentifiers3', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers2);
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
       });
-      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers3', () {
+      _ut.test('test_insert_period_insideExistingIdentifier', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers3);
+        runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
       });
-      _ut.test('test_rescan_insertedPeriodIdentifier', () {
+      _ut.test('test_insert_whitespace_beginning_beforeToken', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertedPeriodIdentifier);
+        runJUnitTest(__test, __test.test_insert_whitespace_beginning_beforeToken);
       });
-      _ut.test('test_rescan_insertedPeriodInsideExistingIdentifier', () {
+      _ut.test('test_insert_whitespace_betweenTokens', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_insertedPeriodInsideExistingIdentifier);
+        runJUnitTest(__test, __test.test_insert_whitespace_betweenTokens);
       });
-      _ut.test('test_rescan_oneFunctionToTwo', () {
+      _ut.test('test_insert_whitespace_end_afterToken', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_oneFunctionToTwo);
+        runJUnitTest(__test, __test.test_insert_whitespace_end_afterToken);
+      });
+      _ut.test('test_insert_whitespace_end_afterWhitespace', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_end_afterWhitespace);
+      });
+      _ut.test('test_insert_whitespace_withMultipleComments', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_withMultipleComments);
+      });
+      _ut.test('test_replace_identifier_beginning', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_identifier_beginning);
+      });
+      _ut.test('test_replace_identifier_end', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_identifier_end);
+      });
+      _ut.test('test_replace_identifier_middle', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_identifier_middle);
+      });
+      _ut.test('test_replace_operator_oneForMany', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForMany);
+      });
+      _ut.test('test_replace_operator_oneForOne', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForOne);
       });
       _ut.test('test_tokenMap', () {
         final __test = new IncrementalScannerTest();
@@ -1904,6 +2220,7 @@
     });
   }
 }
+
 main() {
   CharSequenceReaderTest.dartSuite();
   IncrementalScannerTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index ac118a1..06954e6 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -1,6 +1,8 @@
 // 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 engine.test_support;
+
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -10,12 +12,12 @@
 import 'package:analyzer/src/generated/element.dart' show InterfaceType, MethodElement, PropertyAccessorElement;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl, RecordingErrorListener;
 import 'package:unittest/unittest.dart' as _ut;
+
 /**
  * Instances of the class `GatheringErrorListener` implement an error listener that collects
  * all of the errors passed to it for later examination.
  */
 class GatheringErrorListener implements AnalysisErrorListener {
-
   /**
    * The source being parsed.
    */
@@ -247,6 +249,7 @@
    * @return `true` if at least one error has been gathered
    */
   bool hasErrors() => errors.length > 0;
+
   void onError(AnalysisError error) {
     if (_rawSource != null) {
       int left = error.offset;
@@ -384,6 +387,7 @@
     return true;
   }
 }
+
 /**
  * The class `EngineTestCase` defines utility methods for making assertions.
  */
@@ -605,10 +609,10 @@
     JUnitTestCase.assertEquals(expectedToken.type, actualToken.type);
     if (expectedToken is KeywordToken) {
       assertInstanceOf(KeywordToken, actualToken);
-      JUnitTestCase.assertEquals(((expectedToken as KeywordToken)).keyword, ((actualToken as KeywordToken)).keyword);
+      JUnitTestCase.assertEquals((expectedToken as KeywordToken).keyword, (actualToken as KeywordToken).keyword);
     } else if (expectedToken is StringToken) {
       assertInstanceOf(StringToken, actualToken);
-      JUnitTestCase.assertEquals(((expectedToken as StringToken)).lexeme, ((actualToken as StringToken)).lexeme);
+      JUnitTestCase.assertEquals((expectedToken as StringToken).lexeme, (actualToken as StringToken).lexeme);
     }
   }
 
@@ -701,6 +705,7 @@
     ASTNode node = new NodeLocator.con1(offset).searchWithin(root);
     return node.getAncestor(clazz);
   }
+
   static void assertContains2(List<Object> array, List<bool> found, Object element) {
     if (element == null) {
       for (int i = 0; i < array.length; i++) {
@@ -746,6 +751,7 @@
     }
     return diffPos;
   }
+
   AnalysisContextImpl createAnalysisContext() {
     AnalysisContextImpl context = new AnalysisContextImpl();
     context.sourceFactory = new SourceFactory.con2([]);
@@ -785,11 +791,13 @@
     JUnitTestCase.fail("Could not find method named ${methodName} in ${type.displayName}");
     return null;
   }
+
   static dartSuite() {
     _ut.group('EngineTestCase', () {
     });
   }
 }
+
 main() {
 }
 
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index ea7f231..7f524df 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -240,7 +240,7 @@
  * To display the help, use the ArgParser getUsage() method:
  *
  *     print(parser.getUsage());
- * 
+ *
  * The resulting string looks something like this:
  *
  *     --mode            The compiler configuration
@@ -261,7 +261,7 @@
  */
 library args;
 
-import 'package:unmodifiable_collection/unmodifiable_collection.dart';
+import 'package:collection_helpers/wrappers.dart';
 
 import 'src/parser.dart';
 import 'src/usage.dart';
diff --git a/pkg/args/lib/src/options.dart b/pkg/args/lib/src/options.dart
index f47bd61..0b8b404 100644
--- a/pkg/args/lib/src/options.dart
+++ b/pkg/args/lib/src/options.dart
@@ -1,6 +1,6 @@
 library options;
 
-import 'package:unmodifiable_collection/unmodifiable_collection.dart';
+import 'package:collection_helpers/wrappers.dart';
 
 /**
  * A command-line option. Includes both flags and options which take a value.
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index 2d7a086..0ff36a8 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -8,7 +8,7 @@
  a set of options and values using GNU and POSIX style options.
 
 dependencies:
-  unmodifiable_collection: ">=0.9.0 <0.10.0"
+  collection_helpers: ">=0.9.0 <0.10.0"
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
 environment:
diff --git a/pkg/barback/LICENSE b/pkg/barback/LICENSE
new file mode 100644
index 0000000..ee99930
--- /dev/null
+++ b/pkg/barback/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/barback/README.md b/pkg/barback/README.md
new file mode 100644
index 0000000..314b832
--- /dev/null
+++ b/pkg/barback/README.md
@@ -0,0 +1,12 @@
+Barback is an asset build system. It is the library underlying
+[pub](http://pub.dartlang.org/doc/)'s asset transformers in `pub build` and
+`pub serve`.
+
+Given a set of input files and a set of transformations (think compilers,
+preprocessors and the like), it will automatically apply the appropriate
+transforms and generate output files. When inputs are modified, it automatically
+runs the transforms that are affected.
+
+To learn more, see [here][].
+
+[here]: http://pub.dartlang.org/doc/assets-and-transformers.html
diff --git a/pkg/barback/lib/src/asset.dart b/pkg/barback/lib/src/asset.dart
index fda8133..5f05059 100644
--- a/pkg/barback/lib/src/asset.dart
+++ b/pkg/barback/lib/src/asset.dart
@@ -5,41 +5,36 @@
 library barback.asset;
 
 import 'dart:async';
-import 'dart:convert';
 import 'dart:io';
+import 'dart:convert';
 
 import 'asset_id.dart';
-import 'file_pool.dart';
-import 'stream_replayer.dart';
-import 'utils.dart';
+import 'internal_asset.dart';
 
 /// A blob of content.
 ///
 /// Assets may come from the file system, or as the output of a [Transformer].
 /// They are identified by [AssetId].
+///
+/// Custom implementations of [Asset] are not currently supported.
 abstract class Asset {
   /// The ID for this asset.
   final AssetId id;
 
-  Asset(this.id);
-
   factory Asset.fromBytes(AssetId id, List<int> bytes) =>
-      new _BinaryAsset(id, bytes);
+      new BinaryAsset(id, bytes);
 
   factory Asset.fromFile(AssetId id, File file) =>
-      new _FileAsset(id, file);
+      new FileAsset(id, file.path);
 
   factory Asset.fromString(AssetId id, String content) =>
-      new _StringAsset(id, content);
+      new StringAsset(id, content);
 
   factory Asset.fromPath(AssetId id, String path) =>
-      new _FileAsset(id, new File(path));
+      new FileAsset(id, path);
 
-  /// Creates an asset from a stream.
-  ///
-  /// This immediately starts draining [stream].
   factory Asset.fromStream(AssetId id, Stream<List<int>> stream) =>
-      new _StreamAsset(id, stream);
+      new StreamAsset(id, stream);
 
   /// Returns the contents of the asset as a string.
   ///
@@ -53,122 +48,3 @@
   /// If the asset was created from a [String], this returns its UTF-8 encoding.
   Stream<List<int>> read();
 }
-
-/// An asset whose data is stored in a list of bytes.
-class _BinaryAsset extends Asset {
-  final List<int> _contents;
-
-  _BinaryAsset(AssetId id, this._contents)
-      : super(id);
-
-  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 extends Asset {
-  /// 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 File _file;
-  _FileAsset(AssetId id, this._file)
-      : super(id);
-
-  Future<String> readAsString({Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return _pool.readAsString(_file, encoding);
-  }
-
-  Stream<List<int>> read() => _pool.openRead(_file);
-
-  String toString() => 'File "${_file.path}"';
-}
-
-/// An asset whose data is stored in a string.
-class _StringAsset extends Asset {
-  final String _contents;
-
-  _StringAsset(AssetId id, this._contents)
-      : super(id);
-
-  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 extends Asset {
-  /// A stream replayer that records and replays the contents of the input
-  /// stream.
-  final StreamReplayer<List<int>> _replayer;
-
-  _StreamAsset(AssetId id, Stream<List<int>> stream)
-      : _replayer = new StreamReplayer(stream),
-        super(id);
-
-  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/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index 848d0a2..df98f1d 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -266,7 +266,7 @@
       // TODO(rnystrom): Put some useful data in here.
       _resultsController.add(
           new BuildResult(_accumulatedErrors));
-    }).catchError((error) {
+    }).catchError((error, stackTrace) {
       // If we get here, it's an unexpected error. Runtime errors like missing
       // assets should be handled earlier. Errors from transformers or other
       // external code that barback calls into should be caught at that API
@@ -275,7 +275,7 @@
       // On the off chance we get here, pipe the error to the results stream
       // as an error. That will let applications handle it without it appearing
       // in the same path as "normal" errors that get reported.
-      _resultsController.addError(error);
+      _resultsController.addError(error, stackTrace);
     }).whenComplete(() {
       _processDone = null;
       _accumulatedErrors = null;
diff --git a/pkg/barback/lib/src/file_pool.dart b/pkg/barback/lib/src/file_pool.dart
index b8dcc6a..31d32ed 100644
--- a/pkg/barback/lib/src/file_pool.dart
+++ b/pkg/barback/lib/src/file_pool.dart
@@ -26,36 +26,36 @@
   /// substantial additional throughput.
   final Pool _pool = new Pool(32, timeout: new Duration(seconds: 60));
 
-  /// Opens [file] for reading.
+  /// Opens the file at [path] for reading.
   ///
   /// When the returned stream is listened to, if there are too many files
   /// open, this will wait for a previously opened file to be closed and then
   /// try again.
-  Stream<List<int>> openRead(File file) {
+  Stream<List<int>> openRead(String path) {
     return futureStream(_pool.request().then((resource) {
-      return file.openRead().transform(new StreamTransformer.fromHandlers(
-          handleDone: (sink) {
+      return new File(path).openRead().transform(
+          new StreamTransformer.fromHandlers(handleDone: (sink) {
         sink.close();
         resource.release();
       }));
     }));
   }
 
-  /// Reads [file] as a string using [encoding].
+  /// Reads [path] as a string using [encoding].
   ///
   /// If there are too many files open and the read fails, this will wait for
   /// a previously opened file to be closed and then try again.
-  Future<String> readAsString(File file, Encoding encoding) {
-    return _readAsBytes(file).then(encoding.decode);
+  Future<String> readAsString(String path, Encoding encoding) {
+    return _readAsBytes(path).then(encoding.decode);
   }
 
-  /// Reads [file] as a list of bytes, using [openRead] to retry if there are
+  /// Reads [path] as a list of bytes, using [openRead] to retry if there are
   /// failures.
-  Future<List<int>> _readAsBytes(File file) {
+  Future<List<int>> _readAsBytes(String path) {
     var completer = new Completer<List<int>>();
     var builder = new BytesBuilder();
 
-    openRead(file).listen(builder.add, onDone: () {
+    openRead(path).listen(builder.add, onDone: () {
       completer.complete(builder.takeBytes());
     }, onError: completer.completeError, cancelOnError: true);
 
diff --git a/pkg/barback/lib/src/internal_asset.dart b/pkg/barback/lib/src/internal_asset.dart
new file mode 100644
index 0000000..6b3c9fb
--- /dev/null
+++ b/pkg/barback/lib/src/internal_asset.dart
@@ -0,0 +1,188 @@
+// 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.internal_asset;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+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";
+}
diff --git a/pkg/barback/lib/src/serialize.dart b/pkg/barback/lib/src/serialize.dart
new file mode 100644
index 0000000..fa5adea
--- /dev/null
+++ b/pkg/barback/lib/src/serialize.dart
@@ -0,0 +1,139 @@
+// 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.serialize;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'asset_id.dart';
+import 'utils.dart';
+
+/// Converts [id] into a serializable map.
+Map serializeId(AssetId id) => {'package': id.package, 'path': id.path};
+
+/// Converts [stream] into a [SendPort] with which another isolate can request
+/// the data from [stream].
+SendPort serializeStream(Stream stream) {
+  var receivePort = new ReceivePort();
+  receivePort.first.then((sendPort) {
+    stream.listen((data) => sendPort.send({'type': 'data', 'data': data}),
+        onDone: () => sendPort.send({'type': 'done'}),
+        onError: (error, stackTrace) {
+      sendPort.send({
+        'type': 'error',
+        'error': CrossIsolateException.serialize(error, stackTrace)
+      });
+    });
+  });
+
+  return receivePort.sendPort;
+}
+
+/// Converts a serializable map into an [AssetId].
+AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']);
+
+/// Convert a [SendPort] whose opposite is waiting to send us a stream into a
+/// [Stream].
+///
+/// No stream data will actually be sent across the isolate boundary until
+/// someone subscribes to the returned stream.
+Stream deserializeStream(SendPort sendPort) {
+  return callbackStream(() {
+    var receivePort = new ReceivePort();
+    sendPort.send(receivePort.sendPort);
+    // TODO(nweiz): use a const constructor for StreamTransformer when issue
+    // 14971 is fixed.
+    return receivePort.transform(
+        new StreamTransformer(_deserializeTransformer));
+  });
+}
+
+/// The body of a [StreamTransformer] that deserializes the values in a stream
+/// sent by [serializeStream].
+StreamSubscription _deserializeTransformer(Stream input, bool cancelOnError) {
+  var subscription;
+  var transformed = input.transform(new StreamTransformer.fromHandlers(
+      handleData: (data, sink) {
+    if (data['type'] == 'data') {
+      sink.add(data['data']);
+    } else if (data['type'] == 'error') {
+      var exception = new CrossIsolateException.deserialize(data['error']);
+      sink.addError(exception, exception.stackTrace);
+    } else {
+      assert(data['type'] == 'done');
+      sink.close();
+      subscription.cancel();
+    }
+  }));
+  subscription = transformed.listen(null, cancelOnError: cancelOnError);
+  return subscription;
+}
+
+/// An exception that was originally raised in another isolate.
+///
+/// Exception objects can't cross isolate boundaries in general, so this class
+/// wraps as much information as can be consistently serialized.
+class CrossIsolateException implements Exception {
+  /// The name of the type of exception thrown.
+  ///
+  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
+  /// that objects in different libraries may have the same type name.
+  final String type;
+
+  /// The exception's message, or its [toString] if it didn't expose a `message`
+  /// property.
+  final String message;
+
+  /// The exception's stack trace, or `null` if no stack trace was available.
+  final Trace stackTrace;
+
+  /// Loads a [CrossIsolateException] from a serialized representation.
+  ///
+  /// [error] should be the result of [CrossIsolateException.serialize].
+  factory CrossIsolateException.deserialize(Map error) {
+    var type = error['type'];
+    var message = error['message'];
+    var stackTrace = error['stack'] == null ? null :
+            new Trace.parse(error['stack']);
+    return new CrossIsolateException._(type, message, stackTrace);
+  }
+
+  /// Loads a [CrossIsolateException] from a serialized representation.
+  ///
+  /// [error] should be the result of [CrossIsolateException.serialize].
+  CrossIsolateException._(this.type, this.message, this.stackTrace);
+
+  /// Serializes [error] to an object that can safely be passed across isolate
+  /// boundaries.
+  static Map serialize(error, [StackTrace stack]) {
+    if (stack == null && error is Error) stack = error.stackTrace;
+    return {
+      'type': error.runtimeType.toString(),
+      'message': _getErrorMessage(error),
+      'stack': stack == null ? null : stack.toString()
+    };
+  }
+
+  String toString() => "$message\n$stackTrace";
+}
+
+// Get a string description of an exception.
+//
+// Most exception types have a "message" property. We prefer this since
+// it skips the "Exception:", "HttpException:", etc. prefix that calling
+// toString() adds. But, alas, "message" isn't actually defined in the
+// base Exception type so there's no easy way to know if it's available
+// short of a giant pile of type tests for each known exception type.
+//
+// So just try it. If it throws, default to toString().
+String _getErrorMessage(error) {
+  try {
+    return error.message;
+  } on NoSuchMethodError catch (_) {
+    return error.toString();
+  }
+}
diff --git a/pkg/barback/lib/src/utils.dart b/pkg/barback/lib/src/utils.dart
index 53ef822..71576ff 100644
--- a/pkg/barback/lib/src/utils.dart
+++ b/pkg/barback/lib/src/utils.dart
@@ -5,6 +5,7 @@
 library barback.utils;
 
 import 'dart:async';
+import 'dart:typed_data';
 
 /// A pair of values.
 class Pair<E, F> {
@@ -79,6 +80,18 @@
   return DIGITS[(byte ~/ 16) % 16] + DIGITS[byte % 16];
 }
 
+/// Converts [input] into a [Uint8List].
+///
+/// If [input] is a [TypedData], this just returns a view on [input].
+Uint8List toUint8List(List<int> input) {
+  if (input is Uint8List) return input;
+  if (input is TypedData) {
+    // TODO(nweiz): remove "as" when issue 11080 is fixed.
+    return new Uint8List.view((input as TypedData).buffer);
+  }
+  return new Uint8List.fromList(input);
+}
+
 /// Group the elements in [iter] by the value returned by [fn].
 ///
 /// This returns a map whose keys are the return values of [fn] and whose values
@@ -181,18 +194,67 @@
 Future newFuture(callback()) => new Future.value().then((_) => callback());
 
 /// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes. If [future] completes to an
-/// error, the return value will emit that error and then close.
-Stream futureStream(Future<Stream> future) {
-  var controller = new StreamController(sync: true);
-  future.then((stream) {
-    stream.listen(
-        controller.add,
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+  var subscription;
+  var controller;
+
+  future = future.catchError((e, stackTrace) {
+    // Since [controller] is synchronous, it's likely that emitting an error
+    // will cause it to be cancelled before we call close.
+    if (controller != null) controller.addError(e, stackTrace);
+    if (controller != null) controller.close();
+    controller = null;
+  });
+
+  onListen() {
+    future.then((stream) {
+      if (controller == null) return;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: controller.close);
+    });
+  }
+
+  onCancel() {
+    if (subscription != null) subscription.cancel();
+    subscription = null;
+    controller = null;
+  }
+
+  if (broadcast) {
+    controller = new StreamController.broadcast(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  } else {
+    controller = new StreamController(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  }
+  return controller.stream;
+}
+
+/// Returns a [Stream] that will emit the same values as the stream returned by
+/// [callback].
+///
+/// [callback] will only be called when the returned [Stream] gets a subscriber.
+Stream callbackStream(Stream callback()) {
+  var subscription;
+  var controller;
+  controller = new StreamController(onListen: () {
+    subscription = callback().listen(controller.add,
         onError: controller.addError,
         onDone: controller.close);
-  }).catchError((e, stackTrace) {
-    controller.addError(e, stackTrace);
-    controller.close();
-  });
+  },
+      onCancel: () => subscription.cancel(),
+      onPause: () => subscription.pause(),
+      onResume: () => subscription.resume(),
+      sync: true);
   return controller.stream;
 }
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 3c51019..93604ed 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -19,5 +19,14 @@
 dev_dependencies:
   scheduled_test: ">=0.9.0 <0.10.0"
   unittest: ">=0.9.0 <0.10.0"
+
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  # Barback is tightly coupled to the SDK because pub contains code that is run
+  # against the user's version of barback. We need to ensure that that version
+  # of barback is compatible with the user's version of pub.
+  #
+  # Since the SDK itself can't place constraints on barback, we do a reverse
+  # constraint and have barback itself only allow specific SDK versions.
+  # This ensures that for each SDK version, there is a single known good version
+  # of barback that will be used with it.
+  sdk: "$SDK_CONSTRAINT$"
diff --git a/pkg/barback/test/asset_test.dart b/pkg/barback/test/asset_test.dart
index 74f459e..9312fb0 100644
--- a/pkg/barback/test/asset_test.dart
+++ b/pkg/barback/test/asset_test.dart
@@ -7,8 +7,10 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+import 'dart:isolate';
 
 import 'package:barback/barback.dart';
+import 'package:barback/src/internal_asset.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:unittest/unittest.dart';
 
@@ -215,4 +217,52 @@
       });
     });
   });
+
+  group("across isolates", () {
+    getBytesFromIsolate(Asset asset) {
+      var port = new ReceivePort();
+      return Isolate.spawn(_getAssetBytes, {
+        'asset': serializeAsset(asset),
+        'replyTo': port.sendPort
+      }).then((_) => port.first);
+    }
+
+    test("gets the UTF-8-encoded string for a string asset", () {
+      var asset = new Asset.fromString(id, "çøñ†éℵ™");
+      expect(getBytesFromIsolate(asset),
+          completion(equals(UTF8.encode("çøñ†éℵ™"))));
+    });
+
+    test("gets the raw bytes for a byte asset", () {
+      var asset = new Asset.fromBytes(id, binaryContents);
+      expect(getBytesFromIsolate(asset),
+          completion(equals(binaryContents)));
+    });
+
+    test("gets the raw bytes for a binary file", () {
+      var asset = new Asset.fromPath(id, binaryFilePath);
+      expect(getBytesFromIsolate(asset),
+          completion(equals(binaryContents)));
+    });
+
+    test("gets the raw bytes for a text file", () {
+      var asset = new Asset.fromPath(id, textFilePath);
+      expect(getBytesFromIsolate(asset),
+          completion(equals(UTF8.encode("çøñ†éℵ™"))));
+    });
+
+    test("gets the raw bytes for a stream", () {
+      var asset = new Asset.fromStream(id,
+          new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™"))));
+      expect(getBytesFromIsolate(asset),
+          completion(equals(UTF8.encode("çøñ†éℵ™"))));
+    });
+  });
+}
+
+void _getAssetBytes(message) {
+  var asset = deserializeAsset(message['asset']);
+  var builder = asset.read().fold(new BytesBuilder(),
+      (builder, chunk) => builder..add(chunk));
+  builder.then((builder) => message['replyTo'].send(builder.takeBytes()));
 }
diff --git a/pkg/collection_helpers/README.md b/pkg/collection_helpers/README.md
new file mode 100644
index 0000000..742cc16
--- /dev/null
+++ b/pkg/collection_helpers/README.md
@@ -0,0 +1,55 @@
+Helper libraries for working with collections.
+
+The `collection_helpers` package contains a number of separate libraries
+with utility functions and classes that makes working with collections easier.
+
+## Using
+
+The `collection_helpers` library can be imported as separate libraries, or
+in totality:
+
+    import 'package:collection_helpers/equality.dart';
+    import 'package:collection_helpers/algorithms.dart';
+    import 'package:collection_helpers/wrappers.dart';
+
+or
+
+    import 'package:collection_helpers/all.dart';
+
+## Equality
+
+The equality library gives a way to specify equality of elements and
+collections.
+
+Collections in Dart have no inherent equality. Two sets are not equal, even
+if they contain exactly the same objects as elements.
+
+The equality library provides a way to say define such an equality. In this
+case, for example, `const SetEquality(const IdentityEquality())` is an equality
+that considers two sets equal exactly if they contain identical elements.
+
+The library provides ways to define equalities on `Iterable`s, `List`s, `Set`s, and
+`Map`s, as well as combinations of these, such as:
+
+    const MapEquality(const IdentityEquality(), const ListEquality());
+
+This equality considers maps equal if they have identical keys, and the corresponding values are lists with equal (`operator==`) values.
+
+## Algorithms
+
+The algorithms library contains functions that operate on lists.
+
+It contains ways to shuffle a `List`, do binary search on a sorted `List`, and
+some different sorting algorithms.
+
+
+## Wrappers
+
+The wrappers library contains classes that "wrap" a collection.
+
+A wrapper class contains an object of the same type, and it forwards all
+methods to the wrapped object.
+
+Wrapper classes can be used in various ways, for example to restrict the type
+of an object to that of a supertype, or to change the behavior of selected
+functions on an existing object.
diff --git a/pkg/collection_helpers/lib/algorithms.dart b/pkg/collection_helpers/lib/algorithms.dart
index c5229b3..057111a 100644
--- a/pkg/collection_helpers/lib/algorithms.dart
+++ b/pkg/collection_helpers/lib/algorithms.dart
@@ -5,7 +5,7 @@
 /**
  * Operations on collections.
  */
-library dart.collection_helper.algorithms;
+library dart.collection_helpers.algorithms;
 
 import "dart:math" show Random;
 
diff --git a/pkg/collection_helpers/lib/all.dart b/pkg/collection_helpers/lib/all.dart
index 66571e9..3658cf1 100644
--- a/pkg/collection_helpers/lib/all.dart
+++ b/pkg/collection_helpers/lib/all.dart
@@ -6,13 +6,17 @@
  * Exports all the individual parts of the collection-helper library.
  *
  * The sub-libraries of this package are:
+ *
  * - `algorithms.dart`: Algorithms that work on lists (shuffle, binary search
- *   and various sorting algorithms).
- * - `wrappers.dart`: Wrapper classes that delegate to a collection object.
+ *                      and various sorting algorithms).
  * - `equality.dart`: Different notions of equality of collections.
+ * - `typed_buffers.dart`: Growable typed data lists.
+ * - `wrappers.dart`: Wrapper classes that delegate to a collection object.
+ *                    Includes unmodifiable views of collections.
  */
 library dart.collection_helper;
 
 export "algorithms.dart";
+export "equality.dart";
+export "typed_buffers.dart";
 export "wrappers.dart";
-export "equality.dart";
\ No newline at end of file
diff --git a/pkg/collection_helpers/lib/equality.dart b/pkg/collection_helpers/lib/equality.dart
index 3b5f3b4..2b46266 100644
--- a/pkg/collection_helpers/lib/equality.dart
+++ b/pkg/collection_helpers/lib/equality.dart
@@ -5,7 +5,7 @@
 /**
  * Defines equality relations on collections.
  */
-library dart.collection_helper.equality;
+library dart.collection_helpers.equality;
 
 import "dart:collection";
 
diff --git a/pkg/collection_helpers/lib/typed_buffers.dart b/pkg/collection_helpers/lib/typed_buffers.dart
new file mode 100644
index 0000000..2f331e7
--- /dev/null
+++ b/pkg/collection_helpers/lib/typed_buffers.dart
@@ -0,0 +1,235 @@
+// 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.
+
+/**
+ * Growable typed-data lists.
+ *
+ * These lists works just as a typed-data list, except that they are growable.
+ * They use an underlying buffer, and when that buffer becomes too small, it
+ * is replaced by a new buffer.
+ *
+ * That means that using the [TypedDataView.buffer] getter is not guaranteed
+ * to return the same result each time it is used, and that the buffer may
+ * be larger than what the list is using.
+ */
+library dart.collection_helpers.typed_buffers;
+
+import "dart:collection" show ListBase;
+import "dart:typed_data";
+
+abstract class _TypedDataBuffer<E> extends ListBase<E> {
+  static const int INITIAL_LENGTH = 8;
+
+  /// This is a Uint8List for Uint8Buffer. It's both a List<E> and a TypedData,
+  /// which we don't have a type for here.
+  var _buffer;
+  /// The length of the list being built.
+  int _length;
+
+  _TypedDataBuffer(List<E> buffer)
+      : this._buffer = buffer, this._length = buffer.length;
+
+  int get length => _length;
+  E operator[](int index) {
+    if (index >= length) throw new RangeError.range(index, 0, length - 1);
+    return _buffer[index];
+  }
+
+  void operator[]=(int index, E value) {
+    if (index >= length) throw new RangeError.range(index, 0, length - 1);
+    _buffer[index] = value;
+  }
+
+  void set length(int newLength) {
+    if (newLength < _length) {
+      E defaultValue = _defaultValue;
+      for (int i = newLength; i < _length; i++) {
+        _buffer[i] = defaultValue;
+      }
+    } else if (newLength > _buffer.length) {
+      List<E> newBuffer;
+      if (_buffer.length == 0) {
+        newBuffer = _createBuffer(newLength);
+      } else {
+        newBuffer = _createBiggerBuffer(newLength);
+      }
+      newBuffer.setRange(0, _length, _buffer);
+      _buffer = newBuffer;
+    }
+    _length = newLength;
+  }
+
+  void _add(E value) {
+    if (_length == _buffer.length) _grow();
+    _buffer[_length++] = value;
+  }
+
+  // We override the default implementation of `add` and `addAll` because
+  // they grow by setting the length in increments of one. We want to grow
+  // by doubling capacity in most cases.
+  void add(E value) { _add(value); }
+
+  void addAll(Iterable<E> values) {
+    for (E value in values) _add(value);
+  }
+
+  void insert(int index, E element) {
+    if (index < 0 || index > _length) {
+      throw new RangeError.range(index, 0, _length);
+    }
+    if (_length < _buffer.length) {
+      _buffer.setRange(index + 1, _length + 1, _buffer, index);
+      _buffer[index] = element;
+      _length++;
+      return;
+    }
+    List<E> newBuffer = _createBiggerBuffer(null);
+    newBuffer.setRange(0, index, _buffer);
+    newBuffer.setRange(index + 1, _length + 1, _buffer, index);
+    newBuffer[index] = element;
+    _length++;
+    _buffer = newBuffer;
+  }
+
+  /**
+   * Create a bigger buffer.
+   *
+   * This method determines how much bigger a bigger buffer should
+   * be. If [requiredLength] is not null, it will be at least that
+   * size. It will always have at least have double the capacity of
+   * the current buffer.
+   */
+  List<E> _createBiggerBuffer(int requiredLength) {
+    int newLength = _buffer.length * 2;
+    if (requiredLength != null && newLength < requiredLength) {
+      newLength = requiredLength;
+    } else if (newLength < INITIAL_LENGTH) {
+      newLength = INITIAL_LENGTH;
+    }
+    return _createBuffer(newLength);
+  }
+
+  void _grow() {
+    _buffer = _createBiggerBuffer(null)..setRange(0, _length, _buffer);
+  }
+
+  void setRange(int start, int end, Iterable<E> source, [int skipCount = 0]) {
+    if (end > _length) throw new RangeError.range(end, 0, _length);
+    if (source is _TypedDataBuffer<E>) {
+      _buffer.setRange(start, end, source._buffer, skipCount);
+    } else {
+      _buffer.setRange(start, end, source, skipCount);
+    }
+  }
+
+  // TypedData.
+
+  int get elementSizeInBytes => _buffer.elementSizeInBytes;
+
+  int get lengthInBytes => _length * _buffer.elementSizeInBytes;
+
+  int get offsetInBytes => _buffer.offsetInBytes;
+
+  /**
+    * Returns the underlying [ByteBuffer].
+    *
+    * The returned buffer may be replaced by operations that change the [length]
+    * of this list.
+    *
+    * The buffer may be larger than [lengthInBytes] bytes, but never smaller.
+    */
+  ByteBuffer get buffer => _buffer.buffer;
+
+  // Specialization for the specific type.
+
+  // Return zero for integers, 0.0 for floats, etc.
+  // Used to fill buffer when changing length.
+  E get _defaultValue;
+
+  // Create a new typed list to use as buffer.
+  List<E> _createBuffer(int size);
+}
+
+abstract class _IntBuffer extends _TypedDataBuffer<int> {
+  _IntBuffer(buffer): super(buffer);
+  int get _defaultValue => 0;
+}
+
+abstract class _FloatBuffer extends _TypedDataBuffer<double> {
+  _FloatBuffer(buffer): super(buffer);
+  double get _defaultValue => 0.0;
+}
+
+class Uint8Buffer extends _IntBuffer {
+  Uint8Buffer([int initialLength = 0]) : super(new Uint8List(initialLength));
+  Uint8List _createBuffer(int size) => new Uint8List(size);
+}
+
+class Int8Buffer extends _IntBuffer {
+  Int8Buffer([int initialLength = 0]) : super(new Int8List(initialLength));
+  Int8List _createBuffer(int size) => new Int8List(size);
+}
+
+class Uint8ClampedBuffer extends _IntBuffer {
+  Uint8ClampedBuffer([int initialLength = 0])
+      : super(new Uint8ClampedList(initialLength));
+  Uint8ClampedList _createBuffer(int size) => new Uint8ClampedList(size);
+}
+
+class Uint16Buffer extends _IntBuffer {
+  Uint16Buffer([int initialLength = 0]) : super(new Uint16List(initialLength));
+  Uint16List _createBuffer(int size) => new Uint16List(size);
+}
+
+class Int16Buffer extends _IntBuffer {
+  Int16Buffer([int initialLength = 0]) : super(new Int16List(initialLength));
+  Int16List _createBuffer(int size) => new Int16List(size);
+}
+
+class Uint32Buffer extends _IntBuffer {
+  Uint32Buffer([int initialLength = 0]) : super(new Uint32List(initialLength));
+  Uint32List _createBuffer(int size) => new Uint32List(size);
+}
+
+class Int32Buffer extends _IntBuffer {
+  Int32Buffer([int initialLength = 0]) : super(new Int32List(initialLength));
+  Int32List _createBuffer(int size) => new Int32List(size);
+}
+
+class Uint64Buffer extends _IntBuffer {
+  Uint64Buffer([int initialLength = 0]) : super(new Uint64List(initialLength));
+  Uint64List _createBuffer(int size) => new Uint64List(size);
+}
+
+class Int64Buffer extends _IntBuffer {
+  Int64Buffer([int initialLength = 0]) : super(new Int64List(initialLength));
+  Int64List _createBuffer(int size) => new Int64List(size);
+}
+
+class Float32Buffer extends _FloatBuffer {
+  Float32Buffer([int initialLength = 0])
+      : super(new Float32List(initialLength));
+  Float32List _createBuffer(int size) => new Float32List(size);
+}
+
+class Float64Buffer extends _FloatBuffer {
+  Float64Buffer([int initialLength = 0])
+      : super(new Float64List(initialLength));
+  Float64List _createBuffer(int size) => new Float64List(size);
+}
+
+class Int32x4Buffer extends _TypedDataBuffer<Int32x4> {
+  static Int32x4 _zero = new Int32x4(0, 0, 0, 0);
+  Int32x4Buffer([int initialLength = 0])
+      : super(new Int32x4List(initialLength));
+  Int32x4 get _defaultValue => _zero;
+  Int32x4List _createBuffer(int size) => new Int32x4List(size);
+}
+
+class Float32x4Buffer extends _TypedDataBuffer<Float32x4> {
+  Float32x4Buffer([int initialLength = 0])
+      : super(new Float32x4List(initialLength));
+  Float32x4 get _defaultValue => new Float32x4.zero();
+  Float32x4List _createBuffer(int size) => new Float32x4List(size);
+}
diff --git a/pkg/collection_helpers/lib/unmodifiable_wrappers.dart b/pkg/collection_helpers/lib/unmodifiable_wrappers.dart
new file mode 100644
index 0000000..b44337f
--- /dev/null
+++ b/pkg/collection_helpers/lib/unmodifiable_wrappers.dart
@@ -0,0 +1,251 @@
+// 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.
+
+/**
+ * Wrappers that prevent a List, Set, or Map object from being modified.
+ *
+ * The [Set] and [Map] wrappers allow reading from the wrapped collection,
+ * but prohibit writing.
+ *
+ * The [List] wrapper prevents changes to the length of the wrapped list,
+ * but allows changes to the contents.
+ */
+part of dart.collection_helpers.wrappers;
+
+/**
+ * A fixed-length list.
+ *
+ * A `NonGrowableListView` contains a [List] object and ensures that
+ * its length does not change.
+ * Methods that would change the length of the list,
+ * such as [add] and [remove], throw an [UnsupportedError].
+ * All other methods work directly on the underlying list.
+ *
+ * This class _does_ allow changes to the contents of the wrapped list.
+ * You can, for example, [sort] the list.
+ * Permitted operations defer to the wrapped list.
+ */
+class NonGrowableListView<E> extends DelegatingList<E>
+                             with NonGrowableListMixin<E> {
+  NonGrowableListView(List<E> listBase) : super(listBase);
+}
+
+/**
+ * Mixin class that implements a throwing version of all list operations that
+ * change the List's length.
+ */
+abstract class NonGrowableListMixin<E> implements List<E> {
+  static void _throw() {
+    throw new UnsupportedError(
+        "Cannot change the length of a fixed-length list");
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void set length(int newLength) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  bool add(E value) {
+    _throw();
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void addAll(Iterable<E> iterable) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void insert(int index, E element) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void insertAll(int index, Iterable<E> iterable) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  bool remove(Object value) { _throw(); }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  E removeAt(int index) { _throw(); }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  E removeLast() { _throw(); }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void removeWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void retainWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void removeRange(int start, int end) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void replaceRange(int start, int end, Iterable<E> iterable) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void clear() => _throw();
+}
+
+/**
+ * An unmodifiable set.
+ *
+ * An UnmodifiableSetView contains a [Set] object and ensures
+ * that it does not change.
+ * Methods that would change the set,
+ * such as [add] and [remove], throw an [UnsupportedError].
+ * Permitted operations defer to the wrapped set.
+ */
+class UnmodifiableSetView<E> extends DelegatingSet<E>
+                             with UnmodifiableSetMixin<E> {
+  UnmodifiableSetView(Set<E> setBase) : super(setBase);
+}
+
+/**
+ * Mixin class that implements a throwing version of all set operations that
+ * change the Set.
+ */
+abstract class UnmodifiableSetMixin<E> implements Set<E> {
+  void _throw() {
+    throw new UnsupportedError("Cannot modify an unmodifiable Set");
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  bool add(E value) {
+    _throw();
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void addAll(Iterable<E> elements) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  bool remove(Object value) { _throw(); }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void removeAll(Iterable elements) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void retainAll(Iterable elements) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void removeWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void retainWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void clear() => _throw();
+}
+
+/**
+ * An unmodifiable map.
+ *
+ * An UnmodifiableMapView contains a [Map] object and ensures
+ * that it does not change.
+ * Methods that would change the map,
+ * such as [addAll] and [remove], throw an [UnsupportedError].
+ * Permitted operations defer to the wrapped map.
+ */
+class UnmodifiableMapView<K, V> extends DelegatingMap<K, V>
+                                with UnmodifiableMapMixin<K, V> {
+  UnmodifiableMapView(Map<K, V> baseMap) : super(baseMap);
+}
+
+/**
+ * Mixin class that implements a throwing version of all map operations that
+ * change the Map.
+ */
+abstract class UnmodifiableMapMixin<K, V> implements Map<K, V> {
+  static void _throw() {
+    throw new UnsupportedError("Cannot modify an unmodifiable Map");
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  void operator []=(K key, V value) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  V putIfAbsent(K key, V ifAbsent()) { _throw(); }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  void addAll(Map<K, V> other) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  V remove(K key) { _throw(); }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  void clear() => _throw();
+}
diff --git a/pkg/collection_helpers/lib/wrappers.dart b/pkg/collection_helpers/lib/wrappers.dart
index 36b9b03..3576cc0 100644
--- a/pkg/collection_helpers/lib/wrappers.dart
+++ b/pkg/collection_helpers/lib/wrappers.dart
@@ -4,12 +4,20 @@
 
 /**
  * Delegating wrappers for [Iterable], [List], [Set], [Queue] and [Map].
+ *
+ * Also adds unmodifiable views for `Set` and `Map`, and a fixed length
+ * view for `List`. The unmodifable list view from `dart:collection` is exported
+ * as well, just for completeness.
  */
-library dart.collection_helper.wrappers;
+library dart.collection_helpers.wrappers;
 
 import "dart:collection";
 import "dart:math" show Random;
 
+export "dart:collection" show UnmodifiableListView;
+
+part "unmodifiable_wrappers.dart";
+
 /**
  * Creates an [Iterable] that delegates all operations to a base iterable.
  *
@@ -268,6 +276,10 @@
 
   bool remove(Object object) => _baseQueue.remove(object);
 
+  void removeWhere(bool test(E element)) { _baseQueue.removeWhere(test); }
+
+  void retainWhere(bool test(E element)) { _baseQueue.retainWhere(test); }
+
   E removeFirst() => _baseQueue.removeFirst();
 
   E removeLast() => _baseQueue.removeLast();
diff --git a/pkg/collection_helpers/pubspec.yaml b/pkg/collection_helpers/pubspec.yaml
index a9a23cf..30e95d4 100644
--- a/pkg/collection_helpers/pubspec.yaml
+++ b/pkg/collection_helpers/pubspec.yaml
@@ -1,5 +1,5 @@
 name: collection_helpers
-version: 0.9.0
+version: 0.9.2
 author: '"Dart Team <misc@dartlang.org>"'
 description: Utility functions and classes for working with collections.
 homepage: http://www.dartlang.org
diff --git a/pkg/collection_helpers/test/typed_buffers_test.dart b/pkg/collection_helpers/test/typed_buffers_test.dart
new file mode 100644
index 0000000..d8ba5d0
--- /dev/null
+++ b/pkg/collection_helpers/test/typed_buffers_test.dart
@@ -0,0 +1,421 @@
+// 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.
+
+// Tests typed-data buffer classes.
+
+import "package:collection_helpers/all.dart";
+import "package:unittest/unittest.dart";
+import "dart:typed_data";
+
+main() {
+  testUint(8, (l) => new Uint8Buffer(l));
+  testInt(8, (l) => new Int8Buffer(l));
+  test("Uint8ClampedBuffer", () {
+    testIntBuffer(8, 0, 255, (l) => new Uint8ClampedBuffer(l), clampUint8);
+  });
+  testUint(16, (l) => new Uint16Buffer(l));
+  testInt(16, (l) => new Int16Buffer(l));
+  testUint(32, (l) => new Uint32Buffer(l));  /// 01: ok
+  testInt(32, (l) => new Int32Buffer(l));
+  testUint(64, (l) => new Uint64Buffer(l));  /// 01: continued
+  testInt(64, (l) => new Int64Buffer(l));    /// 01: continued
+
+  testInt32x4Buffer(intSamples);
+
+  List roundedFloatSamples = floatSamples.map(roundToFloat).toList();
+  testFloatBuffer(32, roundedFloatSamples,
+                  () => new Float32Buffer(),
+                  roundToFloat);
+  testFloatBuffer(64, doubleSamples, () => new Float64Buffer(), (x) => x);
+
+  testFloat32x4Buffer(roundedFloatSamples);
+}
+
+double roundToFloat(double value) {
+  return (new Float32List(1)..[0] = value)[0];
+}
+
+typedef int Rounder(int value);
+
+Rounder roundUint(bits) {
+  int halfbits = (1 << (bits ~/ 2)) - 1;
+  int mask = halfbits | (halfbits << (bits ~/ 2));
+  return (int x) => x & mask;
+}
+
+Rounder roundInt(bits) {
+  int highBit = 1 << (bits - 1);
+  int mask = highBit - 1;
+  return (int x) => (x & mask) - (x & highBit);
+}
+
+int clampUint8(x) => x < 0 ? 0 : x > 255 ? 255 : x;
+
+void testUint(int bits, var buffer) {
+  int min = 0;
+  Function round = roundUint(bits);
+  int max = round(-1);
+  test("Uint${bits}Buffer", () {
+    testIntBuffer(bits, min, max, buffer, round);
+  });
+}
+
+void testInt(int bits, var buffer) {
+  int min = -(1 << (bits - 1));
+  int max = -(min + 1);
+  test("Int${bits}Buffer", () {
+    testIntBuffer(bits, min, max, buffer, roundInt(bits));
+  });
+}
+
+const List<int> intSamples = const [
+  0x10000000000000001,
+  0x10000000000000000,  // 2^64
+  0x0ffffffffffffffff,
+  0xaaaaaaaaaaaaaaaa,
+  0x8000000000000001,
+  0x8000000000000000,   // 2^63
+  0x7fffffffffffffff,
+  0x5555555555555555,
+  0x100000001,
+  0x100000000,  // 2^32
+  0x0ffffffff,
+  0xaaaaaaaa,
+  0x80000001,
+  0x80000000,   // 2^31
+  0x7fffffff,
+  0x55555555,
+  0x10001,
+  0x10000,      // 2^16
+  0x0ffff,
+  0xaaaa,
+  0x8001,
+  0x8000,       // 2^15
+  0x7fff,
+  0x5555,
+  0x101,
+  0x100,        // 2^8
+  0x0ff,
+  0xaa,
+  0x81,
+  0x80,         // 2^7
+  0x7f,
+  0x55,
+  0x02,
+  0x01,
+  0x00
+];
+
+// Takes bit-size, min value, max value, function to create a buffer, and
+// the rounding that is applied when storing values outside the valid range
+// into the buffer.
+void testIntBuffer(int bits, int min, int max,
+                   create(int length),
+                   int round(int)) {
+  assert(round(min) == min);
+  assert(round(max) == max);
+  // All int buffers default to the value 0.
+  var buffer = create(0);
+  List<int> list = buffer;  // Check the type.
+  expect(buffer.length, equals(0));
+  var bytes = bits ~/ 8;
+
+  expect(buffer.elementSizeInBytes, equals(bytes));
+  expect(buffer.lengthInBytes, equals(0));
+  expect(buffer.offsetInBytes, equals(0));
+
+  buffer.add(min);
+  expect(buffer.length, equals(1));
+  expect(buffer[0], equals(min));
+
+  expect(buffer.elementSizeInBytes, equals(bytes));
+  expect(buffer.lengthInBytes, equals(bytes));
+  expect(buffer.offsetInBytes, equals(0));
+
+  buffer.length = 0;
+  expect(buffer.length, equals(0));
+
+  List samples = intSamples.toList()..addAll(intSamples.map((x) => -x));
+  for (int value in samples) {
+    int length = buffer.length;
+    buffer.add(value);
+    expect(buffer.length, equals(length + 1));
+    expect(buffer[length], equals(round(value)));
+  }
+  buffer.addAll(samples);  // Add all the values at once.
+  for (int i = 0; i < samples.length; i++) {
+    expect(buffer[samples.length + i], equals(buffer[i]));
+  }
+
+  // Remove range works and changes length.
+  buffer.removeRange(samples.length, buffer.length);
+  expect(buffer.length, equals(samples.length));
+
+  // Both values are in `samples`, but equality is performed without rounding.
+  expect(buffer.contains(min - 1), isFalse);
+  expect(buffer.contains(max + 1), isFalse);
+  expect(buffer.contains(round(min - 1)), isTrue);
+  expect(buffer.contains(round(max + 1)), isTrue);
+
+  // Accessing the underlying buffer works.
+  buffer.length = 2;
+  buffer[0] = min;
+  buffer[1] = max;
+  var byteBuffer = new Uint8List.view(buffer.buffer);
+  int byteSize = buffer.elementSizeInBytes;
+  for (int i = 0; i < byteSize; i++) {
+    int tmp = byteBuffer[i];
+    byteBuffer[i] = byteBuffer[byteSize + i];
+    byteBuffer[byteSize + i] = tmp;
+  }
+  expect(buffer[0], equals(max));
+  expect(buffer[1], equals(min));
+}
+
+const List doubleSamples = const [
+  0.0,
+  5e-324,                    // Minimal denormal value.
+  2.225073858507201e-308,    // Maximal denormal value.
+  2.2250738585072014e-308,   // Minimal normal value.
+  0.9999999999999999,        // Maximum value < 1.
+  1.0,
+  1.0000000000000002,        // Minimum value > 1.
+  4294967295.0,              // 2^32 -1.
+  4294967296.0,              // 2^32.
+  4503599627370495.5,        // Maximal fractional value.
+  9007199254740992.0,        // Maximal exact value (adding one gets lost).
+  1.7976931348623157e+308,   // Maximal value.
+  1.0/0.0,                   // Infinity.
+  0.0/0.0,                   // NaN.
+  0.49999999999999994,       // Round-traps 1-3 (adding 0.5 and rounding towards
+  4503599627370497.0,        // minus infinity will not be the same as rounding
+  9007199254740991.0         // to nearest with 0.5 rounding up).
+];
+
+const List floatSamples = const [
+  0.0,
+  1.4e-45,          // Minimal denormal value.
+  1.1754942E-38,    // Maximal denormal value.
+  1.17549435E-38,   // Minimal normal value.
+  0.99999994,       // Maximal value < 1.
+  1.0,
+  1.0000001,        // Minimal value > 1.
+  8388607.5,        // Maximal fractional value.
+  16777216.0,       // Maximal exact value.
+  3.4028235e+38,    // Maximal value.
+  1.0/0.0,          // Infinity.
+  0.0/0.0,          // NaN.
+  0.99999994,       // Round traps 1-3.
+  8388609.0,
+  16777215.0
+];
+
+void doubleEqual(x, y) {
+  if (y.isNaN) {
+    expect(x.isNaN, isTrue);
+  } else {
+    if (x != y) {
+    }
+    expect(x, equals(y));
+  }
+}
+
+testFloatBuffer(int bitSize, List samples, create(), double round(double v)) {
+  test("Float${bitSize}Buffer", () {
+    var buffer = create();
+    List<double> list = buffer;  // Test type.
+    int byteSize = bitSize ~/ 8;
+
+    expect(buffer.length, equals(0));
+    buffer.add(0.0);
+    expect(buffer.length, equals(1));
+    expect(buffer.removeLast(), equals(0.0));
+    expect(buffer.length, equals(0));
+
+    for (double value in samples) {
+      buffer.add(value);
+      doubleEqual(buffer[buffer.length - 1], round(value));
+    }
+    expect(buffer.length, equals(samples.length));
+
+    buffer.addAll(samples);
+    expect(buffer.length, equals(samples.length * 2));
+    for (int i = 0; i < samples.length; i++) {
+      doubleEqual(buffer[i], buffer[samples.length + i]);
+    }
+
+    buffer.removeRange(samples.length, buffer.length);
+    expect(buffer.length, equals(samples.length));
+
+    buffer.insertAll(0, samples);
+    expect(buffer.length, equals(samples.length * 2));
+    for (int i = 0; i < samples.length; i++) {
+      doubleEqual(buffer[i], buffer[samples.length + i]);
+    }
+
+    buffer.length = samples.length;
+    expect(buffer.length, equals(samples.length));
+
+    // TypedData.
+    expect(buffer.elementSizeInBytes, equals(byteSize));
+    expect(buffer.lengthInBytes, equals(byteSize * buffer.length));
+    expect(buffer.offsetInBytes, equals(0));
+
+    // Accessing the buffer works.
+    // Accessing the underlying buffer works.
+    buffer.length = 2;
+    buffer[0] = samples[0];
+    buffer[1] = samples[1];
+    var bytes = new Uint8List.view(buffer.buffer);
+    for (int i = 0; i < byteSize; i++) {
+      int tmp = bytes[i];
+      bytes[i] = bytes[byteSize + i];
+      bytes[byteSize + i] = tmp;
+    }
+    doubleEqual(buffer[0], round(samples[1]));
+    doubleEqual(buffer[1], round(samples[0]));
+  });
+}
+
+testFloat32x4Buffer(List floatSamples) {
+  List float4Samples = [];
+  for (int i = 0; i < floatSamples.length - 3; i++) {
+    float4Samples.add(new Float32x4(floatSamples[i],
+                                    floatSamples[i + 1],
+                                    floatSamples[i + 2],
+                                    floatSamples[i + 3]));
+  }
+
+  void floatEquals(x, y) {
+    if (y.isNaN) {
+      expect(x.isNaN, isTrue);
+    } else {
+      expect(x, equals(y));
+    }
+  }
+
+  void x4Equals(Float32x4 x, Float32x4 y) {
+    floatEquals(x.x, y.x);
+    floatEquals(x.y, y.y);
+    floatEquals(x.z, y.z);
+    floatEquals(x.w, y.w);
+  }
+
+  test("Float32x4Buffer", () {
+    var buffer = new Float32x4Buffer(5);
+    List<Float32x4> list = buffer;
+
+    expect(buffer.length, equals(5));
+    expect(buffer.elementSizeInBytes, equals(128 ~/ 8));
+    expect(buffer.lengthInBytes, equals(5 * 128 ~/ 8));
+    expect(buffer.offsetInBytes, equals(0));
+
+    x4Equals(buffer[0], new Float32x4.zero());
+    buffer.length = 0;
+    expect(buffer.length, equals(0));
+
+    for (var sample in float4Samples) {
+      buffer.add(sample);
+      x4Equals(buffer[buffer.length - 1], sample);
+    }
+    expect(buffer.length, equals(float4Samples.length));
+
+    buffer.addAll(float4Samples);
+    expect(buffer.length, equals(float4Samples.length * 2));
+    for (int i = 0; i < float4Samples.length; i++) {
+      x4Equals(buffer[i], buffer[float4Samples.length + i]);
+    }
+
+    buffer.removeRange(4, 4 + float4Samples.length);
+    for (int i = 0; i < float4Samples.length; i++) {
+      x4Equals(buffer[i], float4Samples[i]);
+    }
+
+    // Test underlying buffer.
+    buffer.length = 1;
+    buffer[0] = float4Samples[0];  // Does not contain NaN.
+
+    Float32List floats = new Float32List.view(buffer.buffer);
+    expect(floats[0], equals(buffer[0].x));
+    expect(floats[1], equals(buffer[0].y));
+    expect(floats[2], equals(buffer[0].z));
+    expect(floats[3], equals(buffer[0].w));
+  });
+}
+
+void testInt32x4Buffer(intSamples) {
+  test("Int32x4Buffer", () {
+    Function round = roundInt(32);
+    int bits = 128;
+    int bytes = 128 ~/ 8;
+    Matcher equals32x4(Int32x4 expected) => new MatchesInt32x4(expected);
+
+    var buffer = new Int32x4Buffer(0);
+    List<Int32x4> list = buffer;     // It's a List.
+    expect(buffer.length, equals(0));
+
+    expect(buffer.elementSizeInBytes, equals(bytes));
+    expect(buffer.lengthInBytes, equals(0));
+    expect(buffer.offsetInBytes, equals(0));
+
+    Int32x4 sample = new Int32x4(-0x80000000, -1, 0, 0x7fffffff);
+    buffer.add(sample);
+    expect(buffer.length, equals(1));
+    expect(buffer[0], equals32x4(sample));
+
+    expect(buffer.elementSizeInBytes, equals(bytes));
+    expect(buffer.lengthInBytes, equals(bytes));
+    expect(buffer.offsetInBytes, equals(0));
+
+    buffer.length = 0;
+    expect(buffer.length, equals(0));
+
+    var samples = intSamples
+        .where((value) => value == round(value))   // Issue 15130
+        .map((value) => new Int32x4(value, -value, ~value, ~-value))
+        .toList();
+    for (Int32x4 value in samples) {
+      int length = buffer.length;
+      buffer.add(value);
+      expect(buffer.length, equals(length + 1));
+      expect(buffer[length], equals32x4(value));
+    }
+
+    buffer.addAll(samples);  // Add all the values at once.
+    for (int i = 0; i < samples.length; i++) {
+      expect(buffer[samples.length + i], equals32x4(buffer[i]));
+    }
+
+    // Remove range works and changes length.
+    buffer.removeRange(samples.length, buffer.length);
+    expect(buffer.length, equals(samples.length));
+
+    // Accessing the underlying buffer works.
+    buffer.length = 2;
+    buffer[0] = new Int32x4(-80000000, 0x7fffffff, 0, -1);
+    var byteBuffer = new Uint8List.view(buffer.buffer);
+    int halfBytes = bytes ~/ 2;
+    for (int i = 0; i < halfBytes; i++) {
+      int tmp = byteBuffer[i];
+      byteBuffer[i] = byteBuffer[halfBytes + i];
+      byteBuffer[halfBytes + i] = tmp;
+    }
+    var result = new Int32x4(0, -1, -80000000, 0x7fffffff);
+    expect(buffer[0], equals32x4(result));
+  });
+}
+
+class MatchesInt32x4 extends Matcher {
+  Int32x4 result;
+  MatchesInt32x4(this.result);
+  bool matches(item, Map matchState) {
+    if (item is! Int32x4) return false;
+    Int32x4 value = item;
+    return result.x == value.x && result.y == value.y &&
+           result.z == value.z && result.w == value.w;
+  }
+
+  Description describe(Description description) =>
+      description.add('Int32x4.==');
+}
diff --git a/pkg/unmodifiable_collection/test/unmodifiable_collection_test.dart b/pkg/collection_helpers/test/unmodifiable_collection_test.dart
similarity index 99%
rename from pkg/unmodifiable_collection/test/unmodifiable_collection_test.dart
rename to pkg/collection_helpers/test/unmodifiable_collection_test.dart
index 7e6d3fc..ac5bb07 100644
--- a/pkg/unmodifiable_collection/test/unmodifiable_collection_test.dart
+++ b/pkg/collection_helpers/test/unmodifiable_collection_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:unmodifiable_collection/unmodifiable_collection.dart";
+import "package:collection_helpers/wrappers.dart";
 import "package:unittest/unittest.dart";
 
 // Test unmodifiable collection views.
diff --git a/pkg/csslib/README.md b/pkg/csslib/README.md
index b84dae4..e64fd9b 100644
--- a/pkg/csslib/README.md
+++ b/pkg/csslib/README.md
@@ -4,8 +4,6 @@
 This is a pure [Dart][dart] [CSS parser][cssparse]. Since it's 100%
 Dart you can use it safely from a script or server side app.
 
-[![Build Status](https://drone.io/github.com/dart-lang/csslib/status.png)](https://drone.io/github.com/dart-lang/csslib/latest)
-
 Installation
 ------------
 
diff --git a/pkg/csslib/bin/css.dart b/pkg/csslib/bin/css.dart
index 08f2930..f64faac 100644
--- a/pkg/csslib/bin/css.dart
+++ b/pkg/csslib/bin/css.dart
@@ -5,4 +5,4 @@
 
 import 'package:csslib/css.dart' as css;
 
-void main() => css.main();
+void main(List<String> args) => css.main(args);
diff --git a/pkg/csslib/lib/parser.dart b/pkg/csslib/lib/parser.dart
index 92f1652..840b9f23 100644
--- a/pkg/csslib/lib/parser.dart
+++ b/pkg/csslib/lib/parser.dart
@@ -30,7 +30,7 @@
       : super(tokenizer);
 }
 
-void _createMessages({List errors, List options}) {
+void _createMessages({List<Message> errors, List<String> options}) {
   if (errors == null) errors = [];
 
   if (options == null) {
@@ -45,8 +45,11 @@
 
 // TODO(terry): Remove nested name parameter.
 /** Parse and analyze the CSS file. */
-StyleSheet compile(var input, {List errors, List options, bool nested: true,
-    bool polyfill: false, List<StyleSheet> includes: null}) {
+StyleSheet compile(var input, {List<Message> errors, List<String> options,
+    bool nested: true,
+    bool polyfill: false,
+    List<StyleSheet> includes: null}) {
+
   if (includes == null) {
     includes = [];
   }
@@ -70,7 +73,9 @@
 }
 
 /** Analyze the CSS file. */
-void analyze(List<StyleSheet> styleSheets,  {List errors, List options}) {
+void analyze(List<StyleSheet> styleSheets,
+    {List<Message> errors, List<String> options}) {
+
   _createMessages(errors: errors, options: options);
   new Analyzer(styleSheets, messages).run();
 }
@@ -80,7 +85,7 @@
  * or [List<int>] of bytes and returns a [StyleSheet] AST.  The optional
  * [errors] list will contain each error/warning as a [Message].
  */
-StyleSheet parse(var input, {List errors, List options}) {
+StyleSheet parse(var input, {List<Message> errors, List<String> options}) {
   var source = _inputAsString(input);
 
   _createMessages(errors: errors, options: options);
@@ -95,7 +100,7 @@
  * or [List<int>] of bytes and returns a [StyleSheet] AST.  The optional
  * [errors] list will contain each error/warning as a [Message].
  */
-StyleSheet selector(var input, {List errors}) {
+StyleSheet selector(var input, {List<Message> errors}) {
   var source = _inputAsString(input);
 
   _createMessages(errors: errors);
@@ -150,7 +155,7 @@
 
 /** A simple recursive descent parser for CSS. */
 class _Parser {
-  Tokenizer tokenizer;
+  final Tokenizer tokenizer;
 
   /** Base url of CSS file. */
   final String _baseUrl;
@@ -1184,9 +1189,9 @@
   /**
    * Return list of selectors
    */
-  processSelector() {
-    List<SimpleSelectorSequence> simpleSequences = [];
-    int start = _peekToken.start;
+  Selector processSelector() {
+    var simpleSequences = <SimpleSelectorSequence>[];
+    var start = _peekToken.start;
     while (true) {
       // First item is never descendant make sure it's COMBINATOR_NONE.
       var selectorItem = simpleSelectorSequence(simpleSequences.length == 0);
@@ -1344,12 +1349,12 @@
    */
   simpleSelectorTail() {
     // Check for HASH | class | attrib | pseudo | negation
-    int start = _peekToken.start;
+    var start = _peekToken.start;
     switch (_peek()) {
       case TokenKind.HASH:
         _eat(TokenKind.HASH);
 
-        bool hasWhiteSpace = false;
+        var hasWhiteSpace = false;
         if (_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) {
           _warning("Not a valid ID selector expected #id", _makeSpan(start));
           hasWhiteSpace = true;
@@ -1395,7 +1400,7 @@
     // :pseudo-class ::pseudo-element
     // TODO(terry): '::' should be token.
     _eat(TokenKind.COLON);
-    bool pseudoElement = _maybeEat(TokenKind.COLON);
+    var pseudoElement = _maybeEat(TokenKind.COLON);
 
     // TODO(terry): If no identifier specified consider optimizing out the
     //              : or :: and making this a normal selector.  For now,
@@ -1456,7 +1461,7 @@
    *    NUMBER            {num}
    */
   processSelectorExpression() {
-    int start = _peekToken.start;
+    var start = _peekToken.start;
 
     var expression = new SelectorExpression(_makeSpan(start));
 
@@ -1467,7 +1472,7 @@
     // operator not identifier.
     tokenizer.selectorExpression = true;
 
-    bool keepParsing = true;
+    var keepParsing = true;
     while (keepParsing) {
       switch (_peek()) {
         case TokenKind.PLUS:
@@ -1539,8 +1544,8 @@
   //  SUBSTRMATCH:      '*='
   //
   //
-  processAttribute() {
-    int start = _peekToken.start;
+  AttributeSelector processAttribute() {
+    var start = _peekToken.start;
 
     if (_maybeEat(TokenKind.LBRACK)) {
       var attrName = identifier();
@@ -1593,7 +1598,7 @@
   //   *IDENT                   - IE7 or below
   //   _IDENT                   - IE6 property (automatically a valid ident)
   //
-  processDeclaration(List dartStyles) {
+  Declaration processDeclaration(List dartStyles) {
     Declaration decl;
 
     int start = _peekToken.start;
@@ -1637,7 +1642,7 @@
       var include = processInclude(span, eatSemiColon: false);
       decl = new IncludeMixinAtDeclaration(include, span);
     } else if (_peekToken.kind == TokenKind.DIRECTIVE_EXTEND) {
-      List<SimpleSelectorSequence> simpleSequences = [];
+      var simpleSequences = <TreeNode>[];
 
       _next();
       var span = _makeSpan(start);
@@ -1730,14 +1735,11 @@
     'normal' : FontWeight.normal
   };
 
-  static _findStyle(String styleName) {
-    if (_stylesToDart.containsKey(styleName)) {
-      return _stylesToDart[styleName];
-    }
-  }
+  static int _findStyle(String styleName) => _stylesToDart[styleName];
 
-  _styleForDart(Identifier property, Expressions exprs, List dartStyles) {
-    int styleType = _findStyle(property.name.toLowerCase());
+  DartStyleExpression _styleForDart(Identifier property, Expressions exprs,
+      List dartStyles) {
+    var styleType = _findStyle(property.name.toLowerCase());
     if (styleType != null) {
       return buildDartStyleNode(styleType, exprs, dartStyles);
     }
@@ -1754,7 +1756,9 @@
     return fontExpr;
   }
 
-  buildDartStyleNode(int styleType, Expressions exprs, List dartStyles) {
+  DartStyleExpression buildDartStyleNode(int styleType, Expressions exprs,
+      List dartStyles) {
+
     switch (styleType) {
       /*
        * Properties in order:
@@ -1897,7 +1901,7 @@
 
   // TODO(terry): Look at handling width of thin, thick, etc. any none numbers
   //              to convert to a number.
-  processOneNumber(Expressions exprs, int part) {
+  DartStyleExpression processOneNumber(Expressions exprs, int part) {
     var value = marginValue(exprs.expressions[0]);
     if (value != null) {
       switch (part) {
@@ -1947,7 +1951,7 @@
    *
    * The values of the margins can be a unit or unitless or auto.
    */
-  processFourNums(Expressions exprs) {
+  BoxEdge processFourNums(Expressions exprs) {
     num top;
     num right;
     num bottom;
@@ -2000,16 +2004,16 @@
   //  operator:     '/' | ','
   //  term:         (see processTerm)
   //
-  processExpr([bool ieFilter = false]) {
-    int start = _peekToken.start;
-    Expressions expressions = new Expressions(_makeSpan(start));
+  Expressions processExpr([bool ieFilter = false]) {
+    var start = _peekToken.start;
+    var expressions = new Expressions(_makeSpan(start));
 
-    bool keepGoing = true;
+    var keepGoing = true;
     var expr;
     while (keepGoing && (expr = processTerm(ieFilter)) != null) {
       var op;
 
-      int opStart = _peekToken.start;
+      var opStart = _peekToken.start;
 
       switch (_peek()) {
       case TokenKind.SLASH:
@@ -2061,7 +2065,7 @@
     return expressions;
   }
 
-  static int MAX_UNICODE = int.parse('0x10FFFF');
+  static final int MAX_UNICODE = int.parse('0x10FFFF');
 
   //  Term grammar:
   //
@@ -2085,7 +2089,7 @@
   //  function:     IDENT '(' expr ')'
   //
   processTerm([bool ieFilter = false]) {
-    int start = _peekToken.start;
+    var start = _peekToken.start;
     Token t;                          // token for term's value
     var value;                        // value of term (numeric values)
 
@@ -2193,8 +2197,8 @@
       }
 
       // Yes, process the color as an RGB value.
-      String rgbColor = TokenKind.decimalToHex(
-          TokenKind.colorValue(colorEntry), 6);
+      var rgbColor =
+          TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6);
       return _parseHex(rgbColor, _makeSpan(start));
     case TokenKind.UNICODE_RANGE:
       var first;
@@ -2248,8 +2252,8 @@
   }
 
   /** Process all dimension units. */
-  processDimension(Token t, var value, Span span) {
-    var term;
+  LiteralTerm processDimension(Token t, var value, Span span) {
+    LiteralTerm term;
     var unitType = this._peek();
 
     switch (unitType) {
@@ -2328,11 +2332,11 @@
     return term;
   }
 
-  processQuotedString([bool urlString = false]) {
-    int start = _peekToken.start;
+  String processQuotedString([bool urlString = false]) {
+    var start = _peekToken.start;
 
     // URI term sucks up everything inside of quotes(' or ") or between parens
-    int stopToken = urlString ? TokenKind.RPAREN : -1;
+    var stopToken = urlString ? TokenKind.RPAREN : -1;
     switch (_peek()) {
     case TokenKind.SINGLE_QUOTE:
       stopToken = TokenKind.SINGLE_QUOTE;
@@ -2358,13 +2362,13 @@
     }
 
     // Gobble up everything until we hit our stop token.
-    int runningStart = _peekToken.start;
+    var runningStart = _peekToken.start;
     while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) {
       var tok = _next();
     }
 
     // All characters between quotes is the string.
-    int end = _peekToken.end;
+    var end = _peekToken.end;
     var stringValue = (_peekToken.span as FileSpan).file.getText(start,
         end - 1);
 
@@ -2386,7 +2390,7 @@
    * then parse to the right paren ignoring everything in between.
    */
   processIEFilter(int startAfterProgidColon) {
-    int parens = 0;
+    var parens = 0;
 
     while (_peek() != TokenKind.END_OF_FILE) {
       switch (_peek()) {
@@ -2413,14 +2417,14 @@
   //  function:     IDENT '(' expr ')'
   //
   processFunction(Identifier func) {
-    int start = _peekToken.start;
+    var start = _peekToken.start;
 
-    String name = func.name;
+    var name = func.name;
 
     switch (name) {
     case 'url':
       // URI term sucks up everything inside of quotes(' or ") or between parens
-      String urlParam = processQuotedString(true);
+      var urlParam = processQuotedString(true);
 
       // TODO(terry): Better error messge and checking for mismatched quotes.
       if (_peek() == TokenKind.END_OF_FILE) {
@@ -2470,7 +2474,7 @@
     return null;
   }
 
-  identifier() {
+  Identifier identifier() {
     var tok = _next();
 
     if (!TokenKind.isIdentifier(tok.kind) &&
@@ -2486,7 +2490,7 @@
 
   // TODO(terry): Move this to base <= 36 and into shared code.
   static int _hexDigit(int c) {
-    if(c >= 48/*0*/ && c <= 57/*9*/) {
+    if (c >= 48/*0*/ && c <= 57/*9*/) {
       return c - 48;
     } else if (c >= 97/*a*/ && c <= 102/*f*/) {
       return c - 87;
@@ -2498,9 +2502,9 @@
   }
 
   HexColorTerm _parseHex(String hexText, Span span) {
-    int hexValue = 0;
+    var hexValue = 0;
 
-     for (int i = 0; i < hexText.length; i++) {
+     for (var i = 0; i < hexText.length; i++) {
       var digit = _hexDigit(hexText.codeUnitAt(i));
       if (digit < 0) {
         _warning('Bad hex number', span);
@@ -2535,7 +2539,7 @@
   ExpressionsProcessor(this._exprs);
 
   // TODO(terry): Only handles ##px unit.
-  processFontSize() {
+  FontExpression processFontSize() {
     /* font-size[/line-height]
      *
      * Possible size values:
@@ -2553,7 +2557,7 @@
      */
     LengthTerm size;
     LineHeight lineHt;
-    bool nextIsLineHeight = false;
+    var nextIsLineHeight = false;
     for (; _index < _exprs.expressions.length; _index++) {
       var expr = _exprs.expressions[_index];
       if (size == null && expr is LengthTerm) {
@@ -2580,14 +2584,14 @@
     return new FontExpression(_exprs.span, size: size, lineHeight: lineHt);
   }
 
-  processFontFamily() {
-    final List<String> family = <String>[];
+  FontExpression processFontFamily() {
+    var family = <String>[];
 
     /* Possible family values:
      * font-family: arial, Times new roman ,Lucida Sans Unicode,Courier;
      * font-family: "Times New Roman", arial, Lucida Sans Unicode, Courier;
      */
-    bool moreFamilies = false;
+    var moreFamilies = false;
 
     for (; _index < _exprs.expressions.length; _index++) {
       Expression expr = _exprs.expressions[_index];
@@ -2609,8 +2613,8 @@
     return new FontExpression(_exprs.span, family: family);
   }
 
-  processFont() {
-    var family;
+  FontExpression processFont() {
+    List<String> family;
 
     // Process all parts of the font expression.
     FontExpression fontSize;
@@ -2645,8 +2649,8 @@
   StringBuffer result = null;
 
   for (int i = 0; i < text.length; i++) {
-    int code = text.codeUnitAt(i);
-    var replace = null;
+    var code = text.codeUnitAt(i);
+    String replace = null;
     switch (code) {
       case 34/*'"'*/:  if (!single) replace = r'\"'; break;
       case 39/*"'"*/:  if (single) replace = r"\'"; break;
diff --git a/pkg/csslib/lib/src/analyzer.dart b/pkg/csslib/lib/src/analyzer.dart
index cd0c6fb..e0ec078 100644
--- a/pkg/csslib/lib/src/analyzer.dart
+++ b/pkg/csslib/lib/src/analyzer.dart
@@ -573,7 +573,7 @@
  * parameters.
  */
 class CallMixin extends Visitor {
-  var mixinDef;
+  final MixinDefinition mixinDef;
   List _definedArgs;
   Expressions _currExpressions;
   int _currIndex = -1;
@@ -595,7 +595,7 @@
    * Given a mixin's defined arguments return a cloned mixin defintion that has
    * replaced all defined arguments with user's supplied VarUsages.
    */
-  transform(List<TreeNode> callArgs) {
+  MixinDefinition transform(List<TreeNode> callArgs) {
     // TODO(terry): Handle default arguments and varArgs.
     // Transform mixin with callArgs.
     var index = 0;
@@ -620,7 +620,6 @@
       }
 
       var expressions = varUsages[varDef.definedName];
-      var expressionsLength = expressions.length;
       expressions.forEach((k, v) {
         for (var usagesIndex in v) {
           k.expressions.replaceRange(usagesIndex, usagesIndex + 1, callArg);
@@ -724,7 +723,7 @@
   bool _allIncludes(rulesets) =>
       rulesets.every((rule) => rule is IncludeDirective || rule is NoOp);
 
-  CallMixin _createCallDeclMixin(mixinDef) {
+  CallMixin _createCallDeclMixin(MixinDefinition mixinDef) {
     callMap.putIfAbsent(mixinDef.name, () =>
         callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs));
     return callMap[mixinDef.name];
@@ -968,8 +967,8 @@
  * Changes any selector that matches @extend.
  */
 class InheritExtends extends Visitor {
-  Messages _messages;
-  AllExtends _allExtends;
+  final Messages _messages;
+  final AllExtends _allExtends;
 
   InheritExtends(this._messages, this._allExtends);
 
diff --git a/pkg/csslib/lib/src/css_printer.dart b/pkg/csslib/lib/src/css_printer.dart
index b532544..9a80ee1 100644
--- a/pkg/csslib/lib/src/css_printer.dart
+++ b/pkg/csslib/lib/src/css_printer.dart
@@ -104,7 +104,7 @@
     emit(' ');
 
     var declsMargin = node._declsMargin;
-    int declsMarginLength = declsMargin.length;
+    var declsMarginLength = declsMargin.length;
     for (var i = 0; i < declsMarginLength; i++) {
       if (i > 0) emit(_newLine);
       emit('{$_newLine');
@@ -137,7 +137,7 @@
 
   void visitKeyFrameDirective(KeyFrameDirective node) {
     emit('$_newLine${node.keyFrameName} ');
-    node._name.visit(this);
+    node.name.visit(this);
     emit('$_sp{$_newLine');
     for (final block in node._blocks) {
       block.visit(this);
@@ -161,7 +161,7 @@
   }
 
   void visitStyletDirective(StyletDirective node) {
-    emit('/* @stylet export as ${node._dartClassName} */\n');
+    emit('/* @stylet export as ${node.dartClassName} */\n');
   }
 
   void visitNamespaceDirective(NamespaceDirective node) {
@@ -224,7 +224,7 @@
   }
 
   void visitDeclarationGroup(DeclarationGroup node) {
-    var declarations = node._declarations;
+    var declarations = node.declarations;
     var declarationsLength = declarations.length;
     for (var i = 0; i < declarationsLength; i++) {
       if (i > 0) emit(_newLine);
@@ -274,7 +274,7 @@
 
 
   void visitSelectorGroup(SelectorGroup node) {
-    var selectors = node._selectors;
+    var selectors = node.selectors;
     var selectorsLength = selectors.length;
     for (var i = 0; i < selectorsLength; i++) {
       if (i > 0) emit(',$_sp');
@@ -284,7 +284,7 @@
 
   void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
     emit('${node._combinatorToString}');
-    node._selector.visit(this);
+    node.simpleSelector.visit(this);
   }
 
   void visitSimpleSelector(SimpleSelector node) {
@@ -338,7 +338,7 @@
   }
 
   void visitSelectorExpression(SelectorExpression node) {
-    var expressions = node._expressions;
+    var expressions = node.expressions;
     var expressionsLength = expressions.length;
     for (var i = 0; i < expressionsLength; i++) {
       // Add space seperator between terms without an operator.
diff --git a/pkg/csslib/lib/src/messages.dart b/pkg/csslib/lib/src/messages.dart
index 829b419..24964ad 100644
--- a/pkg/csslib/lib/src/messages.dart
+++ b/pkg/csslib/lib/src/messages.dart
@@ -68,7 +68,7 @@
   }
 }
 
-typedef void PrintHandler(Object obj);
+typedef void PrintHandler(Message obj);
 
 /**
  * This class tracks and prints information, warnings, and errors emitted by the
diff --git a/pkg/csslib/lib/src/tree.dart b/pkg/csslib/lib/src/tree.dart
index 1de5957..f3c71eb 100644
--- a/pkg/csslib/lib/src/tree.dart
+++ b/pkg/csslib/lib/src/tree.dart
@@ -15,7 +15,7 @@
 
   Identifier clone() => new Identifier(name, span);
 
-  visit(VisitorBase visitor) => visitor.visitIdentifier(this);
+  void visit(VisitorBase visitor) => visitor.visitIdentifier(this);
 
   String toString() => name;
 }
@@ -23,19 +23,25 @@
 class Wildcard extends TreeNode {
   Wildcard(Span span): super(span);
   Wildcard clone() => new Wildcard(span);
-  visit(VisitorBase visitor) => visitor.visitWildcard(this);
+  void visit(VisitorBase visitor) => visitor.visitWildcard(this);
+
+  String get name => '*';
 }
 
 class ThisOperator extends TreeNode {
   ThisOperator(Span span): super(span);
   ThisOperator clone() => new ThisOperator(span);
-  visit(VisitorBase visitor) => visitor.visitThisOperator(this);
+  void visit(VisitorBase visitor) => visitor.visitThisOperator(this);
+
+  String get name => '&';
 }
 
 class Negation extends TreeNode {
   Negation(Span span): super(span);
   Negation clone() => new Negation(span);
-  visit(VisitorBase visitor) => visitor.visitNegation(this);
+  void visit(VisitorBase visitor) => visitor.visitNegation(this);
+
+  String get name => 'not';
 }
 
 // /*  ....   */
@@ -44,62 +50,55 @@
 
   CssComment(this.comment, Span span): super(span);
   CssComment clone() => new CssComment(comment, span);
-  visit(VisitorBase visitor) => visitor.visitCssComment(this);
+  void visit(VisitorBase visitor) => visitor.visitCssComment(this);
 }
 
 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
 class CommentDefinition extends CssComment {
   CommentDefinition(String comment, Span span): super(comment, span);
   CommentDefinition clone() => new CommentDefinition(comment, span);
-  visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
+  void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
 }
 
 class SelectorGroup extends TreeNode {
-  List<Selector> _selectors;
+  final List<Selector> selectors;
 
-  SelectorGroup(this._selectors, Span span): super(span);
+  SelectorGroup(this.selectors, Span span): super(span);
 
-  List<Selector> get selectors => _selectors;
+  SelectorGroup clone() => new SelectorGroup(selectors, span);
 
-  SelectorGroup clone() => new SelectorGroup(_selectors, span);
-
-  visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
+  void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
 }
 
 class Selector extends TreeNode {
-  final List<SimpleSelectorSequence> _simpleSelectorSequences;
+  final List<SimpleSelectorSequence> simpleSelectorSequences;
 
-  Selector(this._simpleSelectorSequences, Span span) : super(span);
+  Selector(this.simpleSelectorSequences, Span span) : super(span);
 
-  List<SimpleSelectorSequence> get simpleSelectorSequences =>
-      _simpleSelectorSequences;
+  void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq);
 
-  add(SimpleSelectorSequence seq) => _simpleSelectorSequences.add(seq);
-
-  int get length => _simpleSelectorSequences.length;
+  int get length => simpleSelectorSequences.length;
 
   Selector clone() {
-    var simpleSequences = [];
-    for (var simpleSeq in simpleSelectorSequences) {
-      simpleSequences.add(simpleSeq.clone());
-    }
+    var simpleSequences = simpleSelectorSequences
+        .map((ss) => ss.clone())
+        .toList();
+
     return new Selector(simpleSequences, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitSelector(this);
 }
 
 class SimpleSelectorSequence extends TreeNode {
   /** +, >, ~, NONE */
   int combinator;
-  final SimpleSelector _selector;
+  final SimpleSelector simpleSelector;
 
-  SimpleSelectorSequence(this._selector, Span span,
+  SimpleSelectorSequence(this.simpleSelector, Span span,
       [int combinator = TokenKind.COMBINATOR_NONE])
       : combinator = combinator, super(span);
 
-  get simpleSelector => _selector;
-
   bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE;
   bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS;
   bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER;
@@ -114,35 +113,36 @@
                   isCombinatorTilde ? ' ~ ' : '';
 
   SimpleSelectorSequence clone() =>
-      new SimpleSelectorSequence(_selector, span, combinator);
+      new SimpleSelectorSequence(simpleSelector, span, combinator);
 
-  visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
+  void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
+
+  String toString() => simpleSelector.name;
 }
 
 /* All other selectors (element, #id, .class, attribute, pseudo, negation,
  * namespace, *) are derived from this selector.
  */
-class SimpleSelector extends TreeNode {
-  final _name;
+abstract class SimpleSelector extends TreeNode {
+  final _name; // Wildcard, ThisOperator, Identifier, Negation, others?
 
   SimpleSelector(this._name, Span span) : super(span);
 
-  // Name can be an Identifier or WildCard we'll return either the name or '*'.
-  String get name => isWildcard ? '*' : isThis ? '&' : _name.name;
+  String get name => _name.name;
 
   bool get isWildcard => _name is Wildcard;
 
   bool get isThis => _name is ThisOperator;
 
-  SimpleSelector clone() => new SimpleSelector(_name, span);
-
-  visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
 }
 
 // element name
 class ElementSelector extends SimpleSelector {
   ElementSelector(name, Span span) : super(name, span);
-  visit(VisitorBase visitor) => visitor.visitElementSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitElementSelector(this);
+
+  ElementSelector clone() => new ElementSelector(_name, span);
 
   String toString() => name;
 }
@@ -162,7 +162,7 @@
 
   NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
 
-  visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
 
   String toString() => "$namespace|${nameAsSimpleSelector.name}";
 }
@@ -226,7 +226,7 @@
 
   AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span);
 
-  visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
 
   String toString() => "[$name${matchOperator()}${valueToString()}]";
 }
@@ -235,7 +235,7 @@
 class IdSelector extends SimpleSelector {
   IdSelector(Identifier name, Span span) : super(name, span);
   IdSelector clone() => new IdSelector(_name, span);
-  visit(VisitorBase visitor) => visitor.visitIdSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitIdSelector(this);
 
   String toString() => "#$_name";
 }
@@ -244,7 +244,7 @@
 class ClassSelector extends SimpleSelector {
   ClassSelector(Identifier name, Span span) : super(name, span);
   ClassSelector clone() => new ClassSelector(_name, span);
-  visit(VisitorBase visitor) => visitor.visitClassSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitClassSelector(this);
 
   String toString() => ".$_name";
 }
@@ -252,7 +252,9 @@
 // :pseudoClass
 class PseudoClassSelector extends SimpleSelector {
   PseudoClassSelector(Identifier name, Span span) : super(name, span);
-  visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
+
+  PseudoClassSelector clone() => new PseudoClassSelector(_name, span);
 
   String toString() => ":$name";
 }
@@ -260,66 +262,71 @@
 // ::pseudoElement
 class PseudoElementSelector extends SimpleSelector {
   PseudoElementSelector(Identifier name, Span span) : super(name, span);
-  visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
+
+  PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
 
   String toString() => "::$name";
 }
 
 // :pseudoClassFunction(expression)
 class PseudoClassFunctionSelector extends PseudoClassSelector {
-  SelectorExpression expression;
+  final SelectorExpression expression;
 
   PseudoClassFunctionSelector(Identifier name, this.expression, Span span)
       : super(name, span);
+
   PseudoClassFunctionSelector clone() =>
       new PseudoClassFunctionSelector(_name, expression, span);
-  visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this);
+
+  void visit(VisitorBase visitor) =>
+      visitor.visitPseudoClassFunctionSelector(this);
 }
 
 // ::pseudoElementFunction(expression)
 class PseudoElementFunctionSelector extends PseudoElementSelector {
-  SelectorExpression expression;
+  final SelectorExpression expression;
 
   PseudoElementFunctionSelector(Identifier name, this.expression, Span span)
       : super(name, span);
+
   PseudoElementFunctionSelector clone() =>
       new PseudoElementFunctionSelector(_name, expression, span);
-  visit(VisitorBase visitor) =>
+
+  void visit(VisitorBase visitor) =>
       visitor.visitPseudoElementFunctionSelector(this);
 }
 
 class SelectorExpression extends TreeNode {
-  final List<Expression> _expressions = [];
+  final List<Expression> expressions = [];
 
   SelectorExpression(Span span): super(span);
 
-  add(Expression expression) {
-    _expressions.add(expression);
+  void add(Expression expression) {
+    expressions.add(expression);
   }
 
-  List<Expression> get expressions => _expressions;
-
   SelectorExpression clone() {
     var selectorExpr = new SelectorExpression(span);
-    for (var expr in _expressions) {
+    for (var expr in expressions) {
       selectorExpr.add(expr.clone());
     }
     return selectorExpr;
   }
 
-  visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
 }
 
 // :NOT(negation_arg)
 class NegationSelector extends SimpleSelector {
-  SimpleSelector negationArg;
+  final SimpleSelector negationArg;
 
   NegationSelector(this.negationArg, Span span)
       : super(new Negation(span), span);
 
   NegationSelector clone() => new NegationSelector(negationArg, span);
 
-  visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
 }
 
 class NoOp extends TreeNode {
@@ -327,14 +334,14 @@
 
   NoOp clone() => new NoOp();
 
-  visit(VisitorBase visitor) => visitor.visitNoOp(this);
+  void visit(VisitorBase visitor) => visitor.visitNoOp(this);
 }
 
 class StyleSheet extends TreeNode {
   /**
    * Contains charset, ruleset, directives (media, page, etc.), and selectors.
    */
-  final topLevels;
+  final List<TreeNode> topLevels;
 
   StyleSheet(this.topLevels, Span span) : super(span) {
     for (final node in topLevels) {
@@ -346,18 +353,17 @@
   StyleSheet.selector(this.topLevels, Span span) : super(span);
 
   StyleSheet clone() {
-    var clonedTopLevels = [];
-    clonedTopLevels.add(topLevels.clone());
+    var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
     return new StyleSheet(clonedTopLevels, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
+  void visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
 }
 
 class TopLevelProduction extends TreeNode {
   TopLevelProduction(Span span) : super(span);
   TopLevelProduction clone() => new TopLevelProduction(span);
-  visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
+  void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
 }
 
 class RuleSet extends TopLevelProduction {
@@ -375,7 +381,7 @@
     return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitRuleSet(this);
+  void visit(VisitorBase visitor) => visitor.visitRuleSet(this);
 }
 
 class Directive extends TreeNode {
@@ -385,7 +391,7 @@
   bool get isExtension => false;    // SCSS extension?
 
   Directive clone() => new Directive(span);
-  visit(VisitorBase visitor) => visitor.visitDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitDirective(this);
 }
 
 class ImportDirective extends Directive {
@@ -405,7 +411,7 @@
     return new ImportDirective(import, cloneMediaQueries, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitImportDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitImportDirective(this);
 }
 
 /**
@@ -427,7 +433,7 @@
     return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
 }
 
 /**
@@ -464,12 +470,12 @@
     }
     return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
   }
-  visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
+  void visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
 }
 
 class MediaDirective extends Directive {
-  List<MediaQuery> mediaQueries;
-  List<RuleSet> rulesets;
+  final List<MediaQuery> mediaQueries;
+  final List<RuleSet> rulesets;
 
   MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span);
 
@@ -484,11 +490,12 @@
     }
     return new MediaDirective(cloneQueries, cloneRulesets, span);
   }
-  visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
 }
 
 class HostDirective extends Directive {
-  List<RuleSet> rulesets;
+  final List<RuleSet> rulesets;
 
   HostDirective(this.rulesets, Span span) : super(span);
 
@@ -499,13 +506,14 @@
     }
     return new HostDirective(cloneRulesets, span);
   }
-  visit(VisitorBase visitor) => visitor.visitHostDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitHostDirective(this);
 }
 
 class PageDirective extends Directive {
   final String _ident;
   final String _pseudoPage;
-  List<DeclarationGroup> _declsMargin;
+  final List<DeclarationGroup> _declsMargin;
 
   PageDirective(this._ident, this._pseudoPage, this._declsMargin,
       Span span) : super(span);
@@ -517,7 +525,8 @@
     }
     return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
   }
-  visit(VisitorBase visitor) => visitor.visitPageDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitPageDirective(this);
 
   bool get hasIdent => _ident != null && _ident.length > 0;
   bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0;
@@ -528,7 +537,7 @@
 
   CharsetDirective(this.charEncoding, Span span) : super(span);
   CharsetDirective clone() => new CharsetDirective(charEncoding, span);
-  visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
 }
 
 class KeyFrameDirective extends Directive {
@@ -536,10 +545,10 @@
    * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-.
    */
   final int _keyframeName;
-  final _name;
+  final name;
   final List<KeyFrameBlock> _blocks;
 
-  KeyFrameDirective(this._keyframeName, this._name, Span span)
+  KeyFrameDirective(this._keyframeName, this.name, Span span)
       : _blocks = [], super(span);
 
   add(KeyFrameBlock block) {
@@ -557,8 +566,6 @@
     }
   }
 
-  String get name => _name;
-
   KeyFrameDirective clone() {
     var cloneBlocks = [];
     for (var block in _blocks) {
@@ -566,7 +573,7 @@
     }
     return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
   }
-  visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
 }
 
 class KeyFrameBlock extends Expression {
@@ -578,7 +585,7 @@
 
   KeyFrameBlock clone() =>
       new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
+  void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
 }
 
 class FontFaceDirective extends Directive {
@@ -588,29 +595,27 @@
 
   FontFaceDirective clone() =>
       new FontFaceDirective(_declarations.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
 }
 
 class StyletDirective extends Directive {
-  final String _dartClassName;
-  final List<RuleSet> _rulesets;
+  final String dartClassName;
+  final List<RuleSet> rulesets;
 
-  StyletDirective(this._dartClassName, this._rulesets, Span span) : super(span);
+  StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span);
 
   bool get isBuiltIn => false;
   bool get isExtension => true;
 
-  String get dartClassName => _dartClassName;
-  List<RuleSet> get rulesets => _rulesets;
-
   StyletDirective clone() {
     var cloneRulesets = [];
-    for (var ruleset in _rulesets) {
+    for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
-    return new StyletDirective(_dartClassName, cloneRulesets, span);
+    return new StyletDirective(dartClassName, cloneRulesets, span);
   }
-  visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
 }
 
 class NamespaceDirective extends Directive {
@@ -623,7 +628,8 @@
   NamespaceDirective(this._prefix, this._uri, Span span) : super(span);
 
   NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
-  visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
 
   String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
 }
@@ -636,7 +642,8 @@
 
   VarDefinitionDirective clone() =>
       new VarDefinitionDirective(def.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
 }
 
 class MixinDefinition extends Directive {
@@ -654,7 +661,8 @@
     }
     return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
   }
-  visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
+
+  void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
 }
 
 /** Support a Sass @mixin. See http://sass-lang.com for description. */
@@ -677,7 +685,8 @@
     return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets,
         span);
   }
-  visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
 }
 
 class MixinDeclarationDirective extends MixinDefinition {
@@ -686,6 +695,7 @@
   MixinDeclarationDirective(String name, List<VarDefinitionDirective>  args,
       bool varArgs, this.declarations, Span span) :
       super(name, args, varArgs, span);
+
   MixinDeclarationDirective clone() {
     var clonedArgs = [];
     for (var arg in definedArgs) {
@@ -694,7 +704,8 @@
     return new MixinDeclarationDirective(name, clonedArgs, varArgs,
         declarations.clone(), span);
   }
-  visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
 }
 
 /** To support consuming a SASS mixin @include. */
@@ -713,21 +724,22 @@
     }
     return new IncludeDirective(name, cloneArgs, span);
   }
-  visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
 }
 
 /** To support SASS @content. */
 class ContentDirective extends Directive {
   ContentDirective(Span span) : super(span);
 
-  visit(VisitorBase visitor) => visitor.visitContentDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
 }
 
 class Declaration extends TreeNode {
   final Identifier _property;
   final Expression _expression;
   /** Style exposed to Dart. */
-  var _dart;
+  dynamic dartStyle;
   final bool important;
 
   /**
@@ -740,23 +752,20 @@
    */
   final bool isIE7;
 
-  Declaration(this._property, this._expression, this._dart, Span span,
+  Declaration(this._property, this._expression, this.dartStyle, Span span,
               {important: false, ie7: false})
       : this.important = important, this.isIE7 = ie7, super(span);
 
   String get property => isIE7 ? '*${_property.name}' : _property.name;
   Expression get expression => _expression;
 
-  bool get hasDartStyle => _dart != null;
-  get dartStyle => _dart;
-  set dartStyle(dStyle) {
-    _dart = dStyle;
-  }
+  bool get hasDartStyle => dartStyle != null;
 
   Declaration clone() =>
-      new Declaration(_property.clone(), _expression.clone(), _dart, span,
+      new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
       important: important);
-  visit(VisitorBase visitor) => visitor.visitDeclaration(this);
+
+  void visit(VisitorBase visitor) => visitor.visitDeclaration(this);
 }
 
 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
@@ -773,12 +782,11 @@
 
   String get definedName => _property.name;
 
-  set dartStyle(dStyle) { }
-
   VarDefinition clone() =>
       new VarDefinition(_property.clone(),
       expression != null ? expression.clone() : null, span);
-  visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
+
+  void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
 }
 
 /**
@@ -796,42 +804,37 @@
 
   IncludeMixinAtDeclaration clone() =>
       new IncludeMixinAtDeclaration(include.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
+
+  void visit(VisitorBase visitor) =>
+      visitor.visitIncludeMixinAtDeclaration(this);
 }
 
 class ExtendDeclaration extends Declaration {
-  List<SimpleSelectorSequence> selectors;
+  final List<TreeNode> selectors;
 
   ExtendDeclaration(this.selectors, Span span) :
       super(null, null, null, span);
 
   ExtendDeclaration clone() {
-    List<SimpleSelectorSequence> newSelector = [];
-    for (var selectorSeq in selectors) {
-      newSelector.add(selectorSeq.clone());
-    }
+    var newSelector = selectors.map((s) => s.clone()).toList();
     return new ExtendDeclaration(newSelector, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
+  void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
 }
 
 class DeclarationGroup extends TreeNode {
   /** Can be either Declaration or RuleSet (if nested selector). */
-  final List _declarations;
+  final List declarations;
 
-  DeclarationGroup(this._declarations, Span span) : super(span);
-
-  List get declarations => _declarations;
+  DeclarationGroup(this.declarations, Span span) : super(span);
 
   DeclarationGroup clone() {
-    var clonedDecls = [];
-    for (var decl in _declarations) {
-      clonedDecls.add(decl.clone());
-    }
+    var clonedDecls = declarations.map((d) => d.clone()).toList();
     return new DeclarationGroup(clonedDecls, span);
   }
-  visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
+
+  void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
 }
 
 class MarginGroup extends DeclarationGroup {
@@ -841,7 +844,7 @@
       : super(decls, span);
   MarginGroup clone() =>
     new MarginGroup(margin_sym, super.clone() as dynamic, span);
-  visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
+  void visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
 class VarUsage extends Expression {
@@ -853,35 +856,36 @@
   VarUsage clone() {
     var clonedValues = [];
     for (var expr in defaultValues) {
-      clonedValues.addd(expr.clone());
+      clonedValues.add(expr.clone());
     }
     return new VarUsage(name, clonedValues, span);
   }
-  visit(VisitorBase visitor) => visitor.visitVarUsage(this);
+
+  void visit(VisitorBase visitor) => visitor.visitVarUsage(this);
 }
 
 class OperatorSlash extends Expression {
   OperatorSlash(Span span) : super(span);
   OperatorSlash clone() => new OperatorSlash(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
 }
 
 class OperatorComma extends Expression {
   OperatorComma(Span span) : super(span);
   OperatorComma clone() => new OperatorComma(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
 }
 
 class OperatorPlus extends Expression {
   OperatorPlus(Span span) : super(span);
   OperatorPlus clone() => new OperatorPlus(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
 }
 
 class OperatorMinus extends Expression {
   OperatorMinus(Span span) : super(span);
   OperatorMinus clone() => new OperatorMinus(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
 }
 
 class UnicodeRangeTerm extends Expression {
@@ -894,41 +898,39 @@
 
   UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span);
 
-  visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
 }
 
 class LiteralTerm extends Expression {
   // TODO(terry): value and text fields can be made final once all CSS resources
   //              are copied/symlink'd in the build tool and UriVisitor in
   //              web_ui is removed.
-  var value;
+  dynamic value;
   String text;
 
   LiteralTerm(this.value, this.text, Span span) : super(span);
 
   LiteralTerm clone() => new LiteralTerm(value, text, span);
 
-  visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
 }
 
 class NumberTerm extends LiteralTerm {
   NumberTerm(value, String t, Span span) : super(value, t, span);
   NumberTerm clone() => new NumberTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
 }
 
 class UnitTerm extends LiteralTerm {
-  final int _unit;
+  final int unit;
 
-  UnitTerm(value, String t, Span span, this._unit) : super(value, t, span);
+  UnitTerm(value, String t, Span span, this.unit) : super(value, t, span);
 
-  int get unit => _unit;
+  UnitTerm clone() => new UnitTerm(value, text, span, unit);
 
-  UnitTerm clone() => new UnitTerm(value, text, span, _unit);
+  void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
 
-  visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
-
-  String unitToString() => TokenKind.unitToString(_unit);
+  String unitToString() => TokenKind.unitToString(unit);
 
   String toString() => '$text${unitToString()}';
 }
@@ -936,127 +938,127 @@
 class LengthTerm extends UnitTerm {
   LengthTerm(value, String t, Span span,
       [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(this._unit == TokenKind.UNIT_LENGTH_PX ||
-        this._unit == TokenKind.UNIT_LENGTH_CM ||
-        this._unit == TokenKind.UNIT_LENGTH_MM ||
-        this._unit == TokenKind.UNIT_LENGTH_IN ||
-        this._unit == TokenKind.UNIT_LENGTH_PT ||
-        this._unit == TokenKind.UNIT_LENGTH_PC);
+    assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
+        this.unit == TokenKind.UNIT_LENGTH_CM ||
+        this.unit == TokenKind.UNIT_LENGTH_MM ||
+        this.unit == TokenKind.UNIT_LENGTH_IN ||
+        this.unit == TokenKind.UNIT_LENGTH_PT ||
+        this.unit == TokenKind.UNIT_LENGTH_PC);
   }
-  LengthTerm clone() => new LengthTerm(value, text, span, _unit);
-  visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
+  LengthTerm clone() => new LengthTerm(value, text, span, unit);
+  void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
 }
 
 class PercentageTerm extends LiteralTerm {
   PercentageTerm(value, String t, Span span) : super(value, t, span);
   PercentageTerm clone() => new PercentageTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
 }
 
 class EmTerm extends LiteralTerm {
   EmTerm(value, String t, Span span) : super(value, t, span);
   EmTerm clone() => new EmTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitEmTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
 }
 
 class ExTerm extends LiteralTerm {
   ExTerm(value, String t, Span span) : super(value, t, span);
   ExTerm clone() => new ExTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitExTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitExTerm(this);
 }
 
 class AngleTerm extends UnitTerm {
   AngleTerm(var value, String t, Span span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(this._unit == TokenKind.UNIT_ANGLE_DEG ||
-        this._unit == TokenKind.UNIT_ANGLE_RAD ||
-        this._unit == TokenKind.UNIT_ANGLE_GRAD ||
-        this._unit == TokenKind.UNIT_ANGLE_TURN);
+    assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
+        this.unit == TokenKind.UNIT_ANGLE_RAD ||
+        this.unit == TokenKind.UNIT_ANGLE_GRAD ||
+        this.unit == TokenKind.UNIT_ANGLE_TURN);
   }
 
   AngleTerm clone() => new AngleTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
 }
 
 class TimeTerm extends UnitTerm {
   TimeTerm(var value, String t, Span span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(this._unit == TokenKind.UNIT_ANGLE_DEG ||
-        this._unit == TokenKind.UNIT_TIME_MS ||
-        this._unit == TokenKind.UNIT_TIME_S);
+    assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
+        this.unit == TokenKind.UNIT_TIME_MS ||
+        this.unit == TokenKind.UNIT_TIME_S);
   }
 
   TimeTerm clone() => new TimeTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
 }
 
 class FreqTerm extends UnitTerm {
   FreqTerm(var value, String t, Span span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ);
+    assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
   }
 
   FreqTerm clone() => new FreqTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
 }
 
 class FractionTerm extends LiteralTerm {
   FractionTerm(var value, String t, Span span) : super(value, t, span);
 
   FractionTerm clone() => new FractionTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
 }
 
 class UriTerm extends LiteralTerm {
   UriTerm(String value, Span span) : super(value, value, span);
 
   UriTerm clone() => new UriTerm(value, span);
-  visit(VisitorBase visitor) => visitor.visitUriTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
 }
 
 class ResolutionTerm extends UnitTerm {
   ResolutionTerm(var value, String t, Span span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(_unit == TokenKind.UNIT_RESOLUTION_DPI ||
-        _unit == TokenKind.UNIT_RESOLUTION_DPCM ||
-        _unit == TokenKind.UNIT_RESOLUTION_DPPX);
+    assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
+        unit == TokenKind.UNIT_RESOLUTION_DPCM ||
+        unit == TokenKind.UNIT_RESOLUTION_DPPX);
   }
 
   ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
 }
 
 class ChTerm extends UnitTerm {
   ChTerm(var value, String t, Span span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(_unit == TokenKind.UNIT_CH);
+    assert(unit == TokenKind.UNIT_CH);
   }
 
   ChTerm clone() => new ChTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitChTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitChTerm(this);
 }
 
 class RemTerm extends UnitTerm {
   RemTerm(var value, String t, Span span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(_unit == TokenKind.UNIT_REM);
+    assert(unit == TokenKind.UNIT_REM);
   }
 
   RemTerm clone() => new RemTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitRemTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
 }
 
 class ViewportTerm extends UnitTerm {
   ViewportTerm(var value, String t, Span span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
-    assert(_unit == TokenKind.UNIT_VIEWPORT_VW ||
-        _unit == TokenKind.UNIT_VIEWPORT_VH ||
-        _unit == TokenKind.UNIT_VIEWPORT_VMIN ||
-        _unit == TokenKind.UNIT_VIEWPORT_VMAX);
+    assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
+        unit == TokenKind.UNIT_VIEWPORT_VH ||
+        unit == TokenKind.UNIT_VIEWPORT_VMIN ||
+        unit == TokenKind.UNIT_VIEWPORT_VMAX);
   }
 
   ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
 }
 
 /** Type to signal a bad hex value for HexColorTerm.value. */
@@ -1066,7 +1068,7 @@
   HexColorTerm(var value, String t, Span span) : super(value, t, span);
 
   HexColorTerm clone() => new HexColorTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
 }
 
 class FunctionTerm extends LiteralTerm {
@@ -1076,7 +1078,7 @@
       : super(value, t, span);
 
   FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
 }
 
 /**
@@ -1087,7 +1089,7 @@
 class IE8Term extends LiteralTerm {
   IE8Term(Span span) : super('\\9', '\\9', span);
   IE8Term clone() => new IE8Term(span);
-  visit(VisitorBase visitor) => visitor.visitIE8Term(this);
+  void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
 }
 
 class GroupTerm extends Expression {
@@ -1095,19 +1097,19 @@
 
   GroupTerm(Span span) : _terms =  [], super(span);
 
-  add(LiteralTerm term) {
+  void add(LiteralTerm term) {
     _terms.add(term);
   }
 
   GroupTerm clone() => new GroupTerm(span);
-  visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
 }
 
 class ItemTerm extends NumberTerm {
   ItemTerm(var value, String t, Span span) : super(value, t, span);
 
   ItemTerm clone() => new ItemTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitItemTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
 }
 
 class Expressions extends Expression {
@@ -1115,7 +1117,7 @@
 
   Expressions(Span span): super(span);
 
-  add(Expression expression) {
+  void add(Expression expression) {
     expressions.add(expression);
   }
 
@@ -1126,7 +1128,7 @@
     }
     return clonedExprs;
   }
-  visit(VisitorBase visitor) => visitor.visitExpressions(this);
+  void visit(VisitorBase visitor) => visitor.visitExpressions(this);
 }
 
 class BinaryExpression extends Expression {
@@ -1138,7 +1140,7 @@
 
   BinaryExpression clone() =>
       new BinaryExpression(op, x.clone(), y.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
 }
 
 class UnaryExpression extends Expression {
@@ -1148,17 +1150,17 @@
   UnaryExpression(this.op, this.self, Span span): super(span);
 
   UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
 }
 
 abstract class DartStyleExpression extends TreeNode {
-  static final int unknownType = 0;
-  static final int fontStyle = 1;
-  static final int marginStyle = 2;
-  static final int borderStyle = 3;
-  static final int paddingStyle = 4;
-  static final int heightStyle = 5;
-  static final int widthStyle = 6;
+  static const int unknownType = 0;
+  static const int fontStyle = 1;
+  static const int marginStyle = 2;
+  static const int borderStyle = 3;
+  static const int paddingStyle = 4;
+  static const int heightStyle = 5;
+  static const int widthStyle = 6;
 
   final int _styleType;
   int priority;
@@ -1183,24 +1185,23 @@
 
   bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
 
-  visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
 }
 
 class FontExpression extends DartStyleExpression {
-  Font font;
+  final Font font;
 
   //   font-style font-variant font-weight font-size/line-height font-family
-  FontExpression(Span span, {var size, List<String>family,
-      int weight, String style, String variant, LineHeight lineHeight})
-      : super(DartStyleExpression.fontStyle, span) {
-    // TODO(terry): Only px/pt for now need to handle all possible units to
-    //              support calc expressions on units.
-    font = new Font(size : size is LengthTerm ? size.value : size,
-        family: family, weight: weight, style: style, variant: variant,
-        lineHeight: lineHeight);
-  }
+  // TODO(terry): Only px/pt for now need to handle all possible units to
+  //              support calc expressions on units.
+  FontExpression(Span span, {dynamic size, List<String> family,
+      int weight, String style, String variant, LineHeight lineHeight}) :
+        font = new Font(size : size is LengthTerm ? size.value : size,
+            family: family, weight: weight, style: style, variant: variant,
+            lineHeight: lineHeight),
+        super(DartStyleExpression.fontStyle, span);
 
-  merged(FontExpression newFontExpr) {
+  FontExpression merged(FontExpression newFontExpr) {
     if (this.isFont && newFontExpr.isFont) {
       return new FontExpression.merge(this, newFontExpr);
     }
@@ -1224,7 +1225,7 @@
         weight: font.weight, style: font.style, variant: font.variant,
         lineHeight: font.lineHeight);
 
-  visit(VisitorBase visitor) => visitor.visitFontExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitFontExpression(this);
 }
 
 abstract class BoxExpression extends DartStyleExpression {
@@ -1240,7 +1241,7 @@
    */
   merged(BoxExpression newDartExpr);
 
-  visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
 
   String get formattedBoxEdge {
     if (box.top == box.left && box.top == box.bottom &&
@@ -1288,7 +1289,7 @@
       new MarginExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
 
-  visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
 }
 
 class BorderExpression extends BoxExpression {
@@ -1324,7 +1325,7 @@
       new BorderExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
 
-  visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
 }
 
 class HeightExpression extends DartStyleExpression {
@@ -1342,7 +1343,7 @@
   }
 
   HeightExpression clone() => new HeightExpression(span, height);
-  visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
 }
 
 class WidthExpression extends DartStyleExpression {
@@ -1360,7 +1361,7 @@
   }
 
   WidthExpression clone() => new WidthExpression(span, width);
-  visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
 }
 
 class PaddingExpression extends BoxExpression {
@@ -1394,5 +1395,5 @@
   PaddingExpression clone() =>
       new PaddingExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
-  visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
 }
diff --git a/pkg/csslib/lib/src/tree_base.dart b/pkg/csslib/lib/src/tree_base.dart
index 29b955d..6dc27b1 100644
--- a/pkg/csslib/lib/src/tree_base.dart
+++ b/pkg/csslib/lib/src/tree_base.dart
@@ -9,14 +9,14 @@
  */
 abstract class TreeNode {
   /** The source code this [TreeNode] represents. */
-  Span span;
+  final Span span;
 
-  TreeNode(this.span) {}
+  TreeNode(this.span);
 
   TreeNode clone();
 
   /** Classic double-dispatch visitor for implementing passes. */
-  visit(VisitorBase visitor);
+  void visit(VisitorBase visitor);
 
   /** A multiline string showing the node and its children. */
   String toDebugString() {
@@ -36,7 +36,7 @@
 class TreeOutput {
   int depth = 0;
   final StringBuffer buf = new StringBuffer();
-  var printer;
+  VisitorBase printer;
 
   void write(String s) {
     for (int i=0; i < depth; i++) {
@@ -77,21 +77,7 @@
     writeln('${label}: ${v}');
   }
 
-  void writeList(String label, List list) {
-    write('${label}: ');
-    if (list == null) {
-      buf.write('null');
-      buf.write('\n');
-    } else {
-      for (var item in list) {
-        buf.write(item.toString());
-        buf.write(', ');
-      }
-      buf.write('\n');
-    }
-  }
-
-  void writeNodeList(String label, List list) {
+  void writeNodeList(String label, List<TreeNode> list) {
     writeln('${label} [');
     if (list != null) {
       depth += 1;
diff --git a/pkg/csslib/lib/src/tree_printer.dart b/pkg/csslib/lib/src/tree_printer.dart
index 3dc2afd..3a8b748 100644
--- a/pkg/csslib/lib/src/tree_printer.dart
+++ b/pkg/csslib/lib/src/tree_printer.dart
@@ -7,7 +7,7 @@
 // TODO(terry): Enable class for debug only; when conditional imports enabled.
 
 /** Helper function to dump the CSS AST. */
-String treeToDebugString(styleSheet, [bool useSpan = false]) {
+String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) {
   var to = new TreeOutput();
   new _TreePrinter(to, useSpan)..visitTree(styleSheet);
   return to.toString();
@@ -15,11 +15,11 @@
 
 /** Tree dump for debug output of the CSS AST. */
 class _TreePrinter extends Visitor {
-  var output;
+  final TreeOutput output;
   final bool useSpan;
   _TreePrinter(this.output, this.useSpan) { output.printer = this; }
 
-  void visitTree(tree) => visitStylesheet(tree);
+  void visitTree(StyleSheet tree) => visitStylesheet(tree);
 
   void heading(String heading, node) {
     if (useSpan) {
@@ -66,7 +66,7 @@
   }
 
   void visitMediaQueries(MediaQuery query) {
-    output.headeing('MediaQueries');
+    output.heading('MediaQueries');
     output.writeValue('unary', query.unary);
     output.writeValue('media type', query.mediaType);
     output.writeNodeList('media expressions', query.expressions);
@@ -111,7 +111,7 @@
     heading('KeyFrameDirective', node);
     output.depth++;
     output.writeValue('keyframe', node.keyFrameName);
-    output.writeValue('name', node._name);
+    output.writeValue('name', node.name);
     output.writeNodeList('blocks', node._blocks);
     output.depth--;
   }
@@ -129,9 +129,9 @@
 
   void visitStyletDirective(StyletDirective node) {
     heading('StyletDirective', node);
-    output.writeValue('dartClassName', node._dartClassName);
+    output.writeValue('dartClassName', node.dartClassName);
     output.depth++;
-    output.writeNodeList('rulesets', node._rulesets);
+    output.writeNodeList('rulesets', node.rulesets);
     output.depth--;
   }
 
@@ -172,7 +172,8 @@
    */
   void visitIncludeDirective(IncludeDirective node) {
     heading('IncludeDirective ${node.name}', node);
-    output.writeNodeList('parameters', node.args);
+    var flattened = node.args.expand((e) => e).toList();
+    output.writeNodeList('parameters', flattened);
   }
 
   void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
@@ -199,7 +200,7 @@
   void visitDeclarationGroup(DeclarationGroup node) {
     heading('DeclarationGroup', node);
     output.depth++;
-    output.writeNodeList('declarations', node._declarations);
+    output.writeNodeList('declarations', node.declarations);
     output.depth--;
   }
 
@@ -207,7 +208,7 @@
     heading('MarginGroup', node);
     output.depth++;
     output.writeValue('@directive', node.margin_sym);
-    output.writeNodeList('declarations', node._declarations);
+    output.writeNodeList('declarations', node.declarations);
     output.depth--;
   }
 
@@ -244,7 +245,7 @@
     heading('Selector', node);
     output.depth++;
     output.writeNodeList('simpleSelectorsSequences',
-        node._simpleSelectorSequences);
+        node.simpleSelectorSequences);
     output.depth--;
   }
 
diff --git a/pkg/csslib/lib/src/validate.dart b/pkg/csslib/lib/src/validate.dart
index d2301d7..d85c341 100644
--- a/pkg/csslib/lib/src/validate.dart
+++ b/pkg/csslib/lib/src/validate.dart
@@ -4,7 +4,6 @@
 
 library csslib.src.validate;
 
-import 'package:csslib/parser.dart';
 import 'package:csslib/visitor.dart';
 import 'package:source_maps/span.dart' show Span;
 
diff --git a/pkg/csslib/lib/visitor.dart b/pkg/csslib/lib/visitor.dart
index 91fa714..6c009ff 100644
--- a/pkg/csslib/lib/visitor.dart
+++ b/pkg/csslib/lib/visitor.dart
@@ -111,7 +111,7 @@
 /** Base vistor class for the style sheet AST. */
 class Visitor implements VisitorBase {
   /** Helper function to walk a list of nodes. */
-  void _visitNodeList(list) {
+  void _visitNodeList(List<TreeNode> list) {
     // Don't use iterable otherwise the list can't grow while using Visitor.
     // It certainly can't have items deleted before the index being iterated
     // but items could be added after the index.
@@ -180,7 +180,7 @@
   }
 
   void visitKeyFrameDirective(KeyFrameDirective node) {
-    visitIdentifier(node._name);
+    visitIdentifier(node.name);
     _visitNodeList(node._blocks);
   }
 
@@ -194,7 +194,7 @@
   }
 
   void visitStyletDirective(StyletDirective node) {
-    _visitNodeList(node._rulesets);
+    _visitNodeList(node.rulesets);
   }
 
   void visitNamespaceDirective(NamespaceDirective node) { }
@@ -230,7 +230,7 @@
   }
 
   void visitDeclarationGroup(DeclarationGroup node) {
-    _visitNodeList(node._declarations);
+    _visitNodeList(node.declarations);
   }
 
   void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node);
@@ -258,11 +258,11 @@
   }
 
   void visitSelector(Selector node) {
-    _visitNodeList(node._simpleSelectorSequences);
+    _visitNodeList(node.simpleSelectorSequences);
   }
 
   void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
-    var selector = node._selector;
+    var selector = node.simpleSelector;
     if (selector is NamespaceSelector) {
       visitNamespaceSelector(selector);
     } else if (selector is ElementSelector) {
@@ -329,7 +329,7 @@
       visitSimpleSelector(node);
 
   void visitSelectorExpression(SelectorExpression node) {
-    _visitNodeList(node._expressions);
+    _visitNodeList(node.expressions);
   }
 
   void visitUnicodeRangeTerm(UnicodeRangeTerm node) { }
diff --git a/pkg/csslib/test/debug_test.dart b/pkg/csslib/test/debug_test.dart
new file mode 100644
index 0000000..6cfea56
--- /dev/null
+++ b/pkg/csslib/test/debug_test.dart
@@ -0,0 +1,30 @@
+library debug;
+
+import 'package:unittest/unittest.dart';
+import 'testing.dart';
+
+void main() {
+  test("excercise debug", () {
+    var style = parseCss(_input);
+
+    var debugValue = style.toDebugString();
+    expect(debugValue, isNotNull);
+
+    var style2 = style.clone();
+
+    expect(style2.toDebugString(), debugValue);
+  });
+}
+
+const String _input = r'''
+.foo {
+background-color: #191919;
+width: 10PX;
+height: 22mM !important;
+border-width: 20cm;
+margin-width: 33%;
+border-height: 30EM;
+width: .6in;
+length: 1.2in;
+-web-stuff: -10Px;
+}''';
diff --git a/pkg/csslib/test/declaration_test.dart b/pkg/csslib/test/declaration_test.dart
index 3d6912c..fa14ed3 100644
--- a/pkg/csslib/test/declaration_test.dart
+++ b/pkg/csslib/test/declaration_test.dart
@@ -6,8 +6,6 @@
 
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
-import 'package:csslib/parser.dart';
-import 'package:csslib/visitor.dart';
 
 
 /** CSS compiler options no checks in in memory style sheet. */
diff --git a/pkg/csslib/test/error_test.dart b/pkg/csslib/test/error_test.dart
index 98acffc..935c618 100644
--- a/pkg/csslib/test/error_test.dart
+++ b/pkg/csslib/test/error_test.dart
@@ -6,8 +6,6 @@
 
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
-import 'package:csslib/parser.dart';
-import 'package:csslib/visitor.dart';
 import 'package:csslib/src/messages.dart';
 
 /**
diff --git a/pkg/csslib/test/run_all.dart b/pkg/csslib/test/run_all.dart
index f57ff3e..36020cd 100644
--- a/pkg/csslib/test/run_all.dart
+++ b/pkg/csslib/test/run_all.dart
@@ -8,27 +8,28 @@
  */
 library run_impl;
 
-import 'dart:io';
 import 'package:unittest/compact_vm_config.dart';
 import 'testing.dart';
 
+import 'big_1_test.dart' as big_1_test;
 import 'compiler_test.dart' as compiler_test;
 import 'declaration_test.dart' as declaration_test;
-import 'var_test.dart' as var_test;
-import 'nested_test.dart' as nested_test;
+import 'debug_test.dart' as debug_test;
 import 'error_test.dart' as error_test;
-import 'selector_test.dart' as selector_test;
-import 'visitor_test.dart' as visitor_test;
-import 'mixin_test.dart' as mixin_test;
 import 'extend_test.dart' as extend_test;
-import 'big_1_test.dart' as big_1_test;
+import 'mixin_test.dart' as mixin_test;
+import 'nested_test.dart' as nested_test;
+import 'selector_test.dart' as selector_test;
+import 'var_test.dart' as var_test;
+import 'visitor_test.dart' as visitor_test;
 
-main(List<String> arguments) {
+void main(List<String> arguments) {
   var pattern = new RegExp(arguments.length > 0 ? arguments[0] : '.');
 
   useCompactVMConfiguration();
   useMockMessages();
 
+  if (pattern.hasMatch('debug_test.dart')) debug_test.main();
   if (pattern.hasMatch('compiler_test.dart')) compiler_test.main();
   if (pattern.hasMatch('declaration_test.dart')) declaration_test.main();
   if (pattern.hasMatch('var_test.dart')) var_test.main();
diff --git a/pkg/csslib/test/selector_test.dart b/pkg/csslib/test/selector_test.dart
index ad015bb..f87136e 100644
--- a/pkg/csslib/test/selector_test.dart
+++ b/pkg/csslib/test/selector_test.dart
@@ -7,7 +7,6 @@
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
 import 'package:csslib/parser.dart';
-import 'package:csslib/visitor.dart';
 
 void testSelectorSuccesses() {
   var errors = [];
diff --git a/pkg/csslib/test/testing.dart b/pkg/csslib/test/testing.dart
index f15805c..002c452 100644
--- a/pkg/csslib/test/testing.dart
+++ b/pkg/csslib/test/testing.dart
@@ -9,7 +9,7 @@
 import 'package:csslib/visitor.dart';
 import 'package:csslib/src/messages.dart';
 
-useMockMessages() {
+void useMockMessages() {
   messages = new Messages(printHandler: (message) {});
 }
 
@@ -18,7 +18,8 @@
  * CSS will allow any property/value pairs regardless of validity; all of our
  * tests (by default) will ensure that the CSS is really valid.
  */
-StyleSheet parseCss(String cssInput, {List errors, List opts}) =>
+StyleSheet parseCss(String cssInput, {List<Message> errors,
+  List<String> opts}) =>
   parse(cssInput, errors: errors, options: opts == null ?
       ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts);
 
@@ -27,20 +28,21 @@
  * CSS will allow any property/value pairs regardless of validity; all of our
  * tests (by default) will ensure that the CSS is really valid.
  */
-StyleSheet compileCss(String cssInput, {List errors, List opts,
+StyleSheet compileCss(String cssInput, {List<Message> errors, List<String> opts,
     bool polyfill: false, List<StyleSheet> includes: null}) =>
   compile(cssInput, errors: errors, options: opts == null ?
       ['--no-colors', '--checked', '--warnings_as_errors', 'memory'] : opts,
       polyfill: polyfill, includes: includes);
 
-StyleSheet polyFillCompileCss(input, {List errors, List opts}) =>
+StyleSheet polyFillCompileCss(input, {List<Message> errors,
+  List<String> opts}) =>
     compileCss(input, errors: errors, polyfill: true, opts: opts);
 
 /** CSS emitter walks the style sheet tree and emits readable CSS. */
-var _emitCss = new CssPrinter();
+final _emitCss = new CssPrinter();
 
 /** Simple Visitor does nothing but walk tree. */
-var _cssVisitor = new Visitor();
+final _cssVisitor = new Visitor();
 
 /** Pretty printer for CSS. */
 String prettyPrint(StyleSheet ss) {
@@ -65,5 +67,3 @@
 }
 
 String dumpTree(StyleSheet ss) => treeToDebugString(ss);
-
-
diff --git a/pkg/csslib/test/visitor_test.dart b/pkg/csslib/test/visitor_test.dart
index 7fcde97..451b687 100644
--- a/pkg/csslib/test/visitor_test.dart
+++ b/pkg/csslib/test/visitor_test.dart
@@ -5,7 +5,6 @@
 library visitor_test;
 
 import 'package:unittest/unittest.dart';
-import 'package:csslib/parser.dart';
 import 'package:csslib/visitor.dart';
 import 'testing.dart';
 
diff --git a/pkg/docgen/README.md b/pkg/docgen/README.md
index 343d9c0..95ee68a 100644
--- a/pkg/docgen/README.md
+++ b/pkg/docgen/README.md
@@ -8,6 +8,24 @@
 about all classes, variables, functions, and methods defined in the library and 
 its imported libraries.
 
+### Quick Start: Common Commands 
+
+##### To only generate documentation, while standing in the `bin` directory:
+
+`dartdoc.py` generates all documentation and runs a local server with your html
+pages.
+
+`dartdoc.py -d` ONLY generates documentation for the SDK and all packages (no
+html pages generated and no server).
+
+`dartdoc.py -d -o package/to/document` ONLY generates documenation for the
+specified package.
+
+##### To generate documentation and view it through the webpage:
+- Install [Google App Engine SDK for Python][GAE] (one time setup) and agree to
+   add symlinks so that dev\_appserver.py can be found on your PATH.
+- Run `dartdoc.py`.
+
 ### Generating files & uploading to Cloud Storage
 
 The viewer uses YAML files generated by the docgen package as the data 
@@ -46,7 +64,7 @@
 
 ###### Output directory
 Documented libraries will be located at bin/docs in either YAML or JSON format 
-depending on options specified. There will also be a library_list.json, 
+depending on options specified. There will also be a library\_list.json, 
 containing a list of all the libraries inside the docs folder. 
 
 To get more information on how to use the outputted documentation with 
diff --git a/pkg/docgen/bin/dartdoc.py b/pkg/docgen/bin/dartdoc.py
index 7fa875b..c822cba 100644
--- a/pkg/docgen/bin/dartdoc.py
+++ b/pkg/docgen/bin/dartdoc.py
@@ -2,13 +2,12 @@
 #
 # 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. 
+# BSD-style license that can be found in the LICENSE file.
 
-""" Run this script to generate documentation for a directory and serve
-  the results to localhost for viewing in the browser.
-"""
+# Run this script to generate documentation for a directory and serve
+# the results to localhost for viewing in the browser.
 
-import argparse
+import optparse
 import os
 from os.path import join, dirname, abspath, exists
 import platform
@@ -19,55 +18,149 @@
 from upload_sdk import ExecuteCommand
 
 DIRECTORY = abspath(dirname(__file__))
-DART = join(DIRECTORY, '../../../%s/%s/dart-sdk/bin/dart'
-    % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
-    utils.GuessArchitecture())))
-PUB = join(DIRECTORY, '../../../sdk/bin/pub')
-DART2JS = join(DIRECTORY, '../../../sdk/bin/dart2js')
-PACKAGE_ROOT = join(DART[:-(len('dart'))], '../../packages/')
+DART_DIR = dirname(dirname(dirname(DIRECTORY)))
+DART_EXECUTABLE = join(DART_DIR,
+    '%s/%s/dart-sdk/bin/dart' % (utils.BUILD_ROOT[utils.GuessOS()],
+    utils.GetBuildConf('release', utils.GuessArchitecture())))
+PUB = join(DART_DIR, 'sdk/bin/pub')
+DART2JS = join(DART_DIR, 'sdk/bin/dart2js')
+PACKAGE_ROOT = join(dirname(dirname(dirname(DART_EXECUTABLE[:-(len('dart'))]))),
+    'packages/')
+EXCLUDED_PACKAGES = ['browser', 'html_import', 'mutation_observer',
+    'pkg.xcodeproj', 'shadow_dom']
+APPSERVER_EXECUTABLE = 'dev_appserver.py'
+
 
 def SetPackageRoot(path):
   global PACKAGE_ROOT
   if exists(path):
     PACKAGE_ROOT = abspath(path)
 
-def GetOptions():
-  parser = argparse.ArgumentParser(description='Runs docgen on the specified '
-    'library and displays the resulting documentation in the browser')
-  parser.add_argument('--package-root', dest='pkg_root',
-    help='The package root for dart (default is in the build directory).',
-    action='store', default=PACKAGE_ROOT)
-  docgen = [DART, '--checked', '--package-root=' + PACKAGE_ROOT,
-    join(DIRECTORY, 'docgen.dart'), '-h']
-  process = subprocess.Popen(docgen, stdout=subprocess.PIPE)
-  out, error = process.communicate()
-  parser.add_argument('--options', help=out)
-  parser.add_argument('--gae-sdk',
-    help='The path to the Google App Engine SDK.')
-  options = parser.parse_args()
+
+def ParseArgs():
+  parser = optparse.OptionParser(description='Generate documentation and '
+    'display the resulting documentation in the browser.')
+  parser.add_option('--full-docs-only', '-d', dest='just_docs',
+      action='store_true', default=False,
+      help='Only generate documentation, no html output. (If no other '
+      'options are specified, will document the SDK and all packages in the '
+      'repository.)')
+  parser.add_option('--package-root', '-p', dest='pkg_root',
+      help='The package root for dart (default is in the build directory).',
+      action='store', default=PACKAGE_ROOT)
+  parser.add_option('--docgen-options', '-o',
+      dest='docgen_options', help='Options to pass to docgen. If no file to '
+      'document is specified, by default we generate all documenation for the '
+      'SDK and all packages in the dart repository in JSON.',
+      default='--json')
+  parser.add_option('--gae-sdk',
+      help='The path to the Google App Engine SDK. Defaults to finding the '
+      'script in the PATH.', default='')
+  options, _ = parser.parse_args()
   SetPackageRoot(options.pkg_root)
   return options
 
+
+def AddUserDocgenOptions(sdk_cmd, docgen_options, all_docs=False):
+  '''Expand the command with user specified docgen options.'''
+  specified_pkg = False
+  remove_append = False
+  append = '--append'
+  for option in docgen_options:
+    if '--package-root' in option:
+      specified_pkg = True
+    if option == append and all_docs:
+      remove_append = True
+  if remove_append:
+    docgen_options.remove(append)
+  if not specified_pkg:
+    sdk_cmd.extend(['--package-root=%s' % PACKAGE_ROOT])
+  sdk_cmd.extend(docgen_options)
+  return sdk_cmd
+
+
+def GenerateAllDocs(docgen_options):
+  '''Generate all documentation for the SDK and all packages in the repository.
+  We first attempt to run the quickest path to generate all docs, but if that
+  fails, we fall back on a slower option.'''
+# TODO(alanknight): The --append option doesn't work properly. It overwrites
+# existing files with new information. Known symptom is that it loses subclasses
+# from the SDK and includes only the ones from pkg. So right now our only option
+# is to do everything in one pass.
+  doc_dir = join(DART_DIR, 'pkg')
+  cmd_lst = [DART_EXECUTABLE, '--old_gen_heap_size=1024',
+      '--package-root=%s' % PACKAGE_ROOT, 'docgen.dart', '--include-sdk' ]
+  cmd_str = ' '.join(AddUserDocgenOptions(cmd_lst, docgen_options, True))
+  # Try to run all pkg docs together at once as it's fastest.
+  (return_code, _) = ExecuteCommandString('%s %s' % (cmd_str, doc_dir))
+  if return_code != 0:
+    # We failed to run all the pkg docs, so try to generate docs for each pkg
+    # individually.
+    failed_pkgs = []
+    for directory in os.listdir(join(DART_DIR, 'pkg')):
+      doc_dir = join(DART_DIR, 'pkg', directory)
+      if (directory not in EXCLUDED_PACKAGES and
+          os.path.isdir(doc_dir)):
+        (return_code, output) = ExecuteCommandString('%s %s' % (cmd_str,
+            doc_dir))
+        if return_code != 0:
+          failed_pkgs += [directory]
+    print ('Generated documentation, but failed to generate documentation for '
+        'the following packages, please investigate: %r' % failed_pkgs)
+
+
+def ExecuteCommandString(cmd):
+  '''A variant of the ExecuteCommand function that specifically executes a
+  particular command string in the shell context. When you execute a string, you
+  must execute in the shell.'''
+  print 'Executing: %s ' % cmd
+  pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+      shell=True)
+  output = pipe.communicate()
+  return (pipe.returncode, output)
+
+
 def main():
-  options = GetOptions()
-  docgen = [DART, '--checked', '--package-root=' + PACKAGE_ROOT,
-    join(DIRECTORY, 'docgen.dart'), '--json',  '--package-root=' + PACKAGE_ROOT]
-  docgen.extend(options.options.split())
-  ExecuteCommand(docgen)
-  ExecuteCommand(['git', 'clone', '-b', 'master',
-   'git://github.com/dart-lang/dartdoc-viewer.git'])
-  ExecuteCommand(['mv', 'docs', 'dartdoc-viewer/client/local'])
-  os.chdir('dartdoc-viewer/client/')
-  subprocess.call([PUB, 'install'])
-  subprocess.call([DART, 'deploy.dart'])
-  server = subprocess.Popen(['python', 
-    join(abspath(join(dirname(__file__), options.gae_sdk)), 'dev_appserver.py'),
-    '..'])
-  print("\nPoint your browser to the address of the 'default' server below.")
-  raw_input("Press <RETURN> to terminate the server.\n\n")
-  server.terminate()
-  os.chdir('../..')
-  subprocess.call(['rm', '-rf', 'dartdoc-viewer'])
+  options = ParseArgs()
+  generate_all_docs = True
+  docgen_options = []
+  if options.docgen_options:
+    # If the user specified particular files to generate docs for, then don't
+    # generate docs for everything.
+    docgen_options = options.docgen_options.split()
+    last_option = docgen_options[-1]
+    if '=' not in last_option and exists(last_option):
+      generate_all_docs = False
+      docgen = [DART_EXECUTABLE, '--checked',
+          '--package-root=' + PACKAGE_ROOT, join(DIRECTORY, 'docgen.dart')]
+      docgen.extend(options.options.split())
+      ExecuteCommand(docgen)
+  if generate_all_docs:
+    GenerateAllDocs(docgen_options)
+  if not options.just_docs:
+    cwd = os.getcwd()
+    try:
+      ExecuteCommand(['git', 'clone', '-b', 'master',
+       'git://github.com/dart-lang/dartdoc-viewer.git'])
+      ExecuteCommand(['mv', 'docs', 'dartdoc-viewer/client/local'])
+      os.chdir('dartdoc-viewer/client/')
+      subprocess.call([PUB, 'install'])
+      subprocess.call([DART_EXECUTABLE, 'deploy.dart'])
+      if options.gae_sdk == '':
+        server = subprocess.Popen(' '.join([APPSERVER_EXECUTABLE, '..']),
+            shell=True)
+      else:
+        path_to_gae = options.gae_sdk
+        if not path_to_gae.endswith(APPSERVER_EXECUTABLE):
+          path_to_gae = join(path_to_gae, APPSERVER_EXECUTABLE)
+        server = subprocess.Popen(join(['python', path_to_gae, '..']))
+      print (
+        "\nPoint your browser to the address of the 'default' server below.")
+      raw_input("Press <RETURN> to terminate the server.\n\n")
+      server.terminate()
+    finally:
+      os.chdir(cwd)
+      subprocess.call(['rm', '-rf', 'dartdoc-viewer'])
 
 if __name__ == '__main__':
   main()
diff --git a/pkg/docgen/bin/docgen.dart b/pkg/docgen/bin/docgen.dart
index 76cb9d4..d81e5bc 100644
--- a/pkg/docgen/bin/docgen.dart
+++ b/pkg/docgen/bin/docgen.dart
@@ -10,6 +10,8 @@
 import '../lib/docgen.dart';
 import 'package:path/path.dart' as path;
 
+List<String> excludedLibraries = [];
+
 /**
  * Analyzes Dart files and generates a representation of included libraries,
  * classes, and members.
@@ -18,15 +20,21 @@
   logger.onRecord.listen((record) => print(record.message));
   var results = _initArgParser().parse(arguments);
 
+  var includeSdk = results['parse-sdk'] || results['include-sdk'];
+  var scriptDir = path.dirname(Platform.script.toFilePath());
+  var introFile =
+      path.join(path.dirname(scriptDir), 'doc', 'sdk-introduction.md');
+  var introduction = includeSdk ? introFile : results['introduction'];
   docgen(results.rest.map(path.normalize).toList(),
       packageRoot: results['package-root'],
       outputToYaml: !results['json'],
       includePrivate: results['include-private'],
-      includeSdk: results['parse-sdk'] || results['include-sdk'],
+      includeSdk: includeSdk,
       parseSdk: results['parse-sdk'],
-      append: results['append'] && new Directory('docs').existsSync(),
-      introduction: results['parse-sdk'] ?
-          'sdk-introduction.md' : results['introduction']);
+      append: results['append'] && new Directory(results['out']).existsSync(),
+      introduction: introduction,
+      out: results['out'],
+      excludeLibraries: excludedLibraries);
 }
 
 /**
@@ -69,6 +77,12 @@
   parser.addOption('introduction',
       help: 'Adds the provided markdown text file as the introduction'
         ' for the outputted documentation.', defaultsTo: '');
-
+  parser.addOption('out',
+      help: 'The name of the output directory.',
+      defaultsTo: 'docs');
+  parser.addOption('exclude-lib',
+      help: 'Exclude the library by this name from the documentation',
+      allowMultiple: true,
+      callback: (libs) => excludedLibraries.addAll(libs));
   return parser;
 }
diff --git a/pkg/docgen/bin/upload_docgen.py b/pkg/docgen/bin/upload_docgen.py
index 6a3ea08..b598394 100644
--- a/pkg/docgen/bin/upload_docgen.py
+++ b/pkg/docgen/bin/upload_docgen.py
@@ -4,13 +4,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.
 
-""" This file will run docgen.dart on the SDK libraries, and upload them to 
-  Google Cloud Storage for the documentation viewer. 
+""" This file will run docgen.dart on the SDK libraries, and upload them to
+  Google Cloud Storage for the documentation viewer.
 """
 
 import optparse
 import os
-from os.path import join, dirname, abspath, exists 
+from os.path import join, dirname, abspath, exists
 import platform
 import subprocess
 import sys
@@ -19,18 +19,18 @@
 from upload_sdk import ExecuteCommand
 
 
-DART = abspath(join(dirname(__file__), '../../../%s/%s/dart-sdk/bin/dart' 
-    % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release', 
+DART = abspath(join(dirname(__file__), '../../../%s/%s/dart-sdk/bin/dart'
+    % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
     utils.GuessArchitecture()))))
-PACKAGE_ROOT = abspath(join(dirname(__file__), '../../../%s/%s/packages/' 
-    % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release', 
+PACKAGE_ROOT = abspath(join(dirname(__file__), '../../../%s/%s/packages/'
+    % (utils.BUILD_ROOT[utils.GuessOS()], utils.GetBuildConf('release',
     utils.GuessArchitecture()))))
 GSUTIL = utils.GetBuildbotGSUtilPath()
 GS_SITE = 'gs://dartlang-docgen'
 DESCRIPTION='Runs docgen.dart on the SDK libraries, and uploads them to Google \
     Cloud Storage for the dartdoc-viewer. '
 # Allow us to override checking SVN's revision number. Useful for development
-# so we can upload docs from a branch using an SDK that was built on a 
+# so we can upload docs from a branch using an SDK that was built on a
 # revision newer than when the branch was forked.
 trustSVN = None
 
@@ -49,14 +49,14 @@
 def SetPackageRoot(path):
   global PACKAGE_ROOT
   if exists(path):
-    PACKAGE_ROOT = abspath(path) 
+    PACKAGE_ROOT = abspath(path)
 
 
 def SetGsutil():
   """ If not on buildbots, find gsutil relative to docgen. """
   global GSUTIL
   if not exists(GSUTIL):
-    GSUTIL = abspath(join(dirname(__file__), 
+    GSUTIL = abspath(join(dirname(__file__),
         '../../../third_party/gsutil/gsutil'))
 
 
@@ -73,42 +73,42 @@
   SetGsutil()
 
   # Execute Docgen.dart on the SDK.
-  ExecuteCommand(['sh', './generate_all_docs.sh'])
-  
+  ExecuteCommand(['python', 'dartdoc.py', '-d'])
+
   # Use SVN Revision to get the revision number.
   revision = None
   if trustSVN:
     revision = utils.GetSVNRevision()
 
   if revision is None:
-    # Try to find the version from the dart-sdk folder. 
-    revision_file_location = abspath(join(dirname(__file__), 
+    # Try to find the version from the dart-sdk folder.
+    revision_file_location = abspath(join(dirname(__file__),
         '../../../%s/%s/dart-sdk/revision' % (utils.BUILD_ROOT[utils.GuessOS()],
         utils.GetBuildConf('release', utils.GuessArchitecture()))))
     with open(revision_file_location, 'r') as revision_file:
       revision = revision_file.readline(5)
       revision_file.close()
-    
+
     if revision is None:
       raise Exception("Unable to find revision. ")
 
-  # Upload the all files in Docs into a folder based off Revision number on 
+  # Upload the all files in Docs into a folder based off Revision number on
   # Cloud Storage.
-  # TODO(alanknight): If we give it ./docs/* it fails to upload files in the 
+  # TODO(alanknight): If we give it ./docs/* it fails to upload files in the
   # subdirectory, probably due to escaping. Work around it by changing dir.
-  # Better, generalize this to be less dependent on the working directory. 
+  # Better, generalize this to be less dependent on the working directory.
   os.chdir('docs')
   Upload('.', GS_SITE + '/' + revision + '/')
   os.chdir('..')
 
-  # Update VERSION file in Cloud Storage. 
+  # Update VERSION file in Cloud Storage.
   with open('VERSION', 'w') as version_file:
     version_file.write(revision)
     version_file.close()
   Upload('./VERSION', GS_SITE + '/VERSION')
   Upload('./VERSION', GS_SITE + '/' + revision + '/' + 'VERSION')
 
-  # Clean up the files it creates. 
+  # Clean up the files it creates.
   ExecuteCommand(['rm', '-rf', './docs'])
   ExecuteCommand(['rm', '-f', './VERSION'])
 
diff --git a/pkg/docgen/bin/sdk-introduction.md b/pkg/docgen/doc/sdk-introduction.md
similarity index 100%
rename from pkg/docgen/bin/sdk-introduction.md
rename to pkg/docgen/doc/sdk-introduction.md
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 4c1f85d..0482da1 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -2,17 +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.
 
-/**
- * **docgen** is a tool for creating machine readable representations of Dart
- * code metadata, including: classes, members, comments and annotations.
- *
- * docgen is run on a `.dart` file or a directory containing `.dart` files.
- *
- *      $ dart docgen.dart [OPTIONS] [FILE/DIR]
- *
- * This creates files called `docs/<library_name>.yaml` in your current
- * working directory.
- */
+/// **docgen** is a tool for creating machine readable representations of Dart
+/// code metadata, including: classes, members, comments and annotations.
+///
+/// docgen is run on a `.dart` file or a directory containing `.dart` files.
+///
+///      $ dart docgen.dart [OPTIONS] [FILE/DIR]
+///
+/// This creates files called `docs/<library_name>.yaml` in your current
+/// working directory.
 library docgen;
 
 import 'dart:convert';
@@ -31,34 +29,36 @@
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart'
     as dart2js;
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart'
+    as dart2js_util;
 import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
 import '../../../sdk/lib/_internal/libraries.dart';
 
 var logger = new Logger('Docgen');
 
-const String USAGE = 'Usage: dart docgen.dart [OPTIONS] [fooDir/barFile]';
+const DEFAULT_OUTPUT_DIRECTORY = 'docs';
+
+var _outputDirectory;
+
+const String USAGE = 'Usage: dart docgen.dart [OPTIONS] fooDir/barFile';
 
 
-List<String> validAnnotations = const ['metadata.Experimental',
-    'metadata.DomName', 'metadata.Deprecated', 'metadata.Unstable',
-    'meta.deprecated', 'metadata.SupportedBrowser'];
+List<String> skippedAnnotations = const [
+    'metadata.DocsEditable', '_js_helper.JSName', '_js_helper.Creates',
+    '_js_helper.Returns'];
 
-/// Current library being documented to be used for comment links.
-LibraryMirror _currentLibrary;
+/// Set of libraries declared in the SDK, so libraries that can be accessed
+/// when running dart by default.
+Iterable<LibraryMirror> _sdkLibraries;
 
-/// Current class being documented to be used for comment links.
-ClassMirror _currentClass;
-
-/// Current member being documented to be used for comment links.
-MemberMirror _currentMember;
+/// The dart:core library, which contains all types that are always available
+/// without import.
+LibraryMirror _coreLibrary;
 
 /// Support for [:foo:]-style code comments to the markdown parser.
 List<markdown.InlineSyntax> markdownSyntaxes =
   [new markdown.CodeSyntax(r'\[:\s?((?:.|\n)*?)\s?:\]')];
 
-/// Resolves reference links in doc comments.
-markdown.Resolver linkResolver;
-
 /// Index of all indexable items. This also ensures that no class is
 /// created more than once.
 Map<String, Indexable> entityMap = new Map<String, Indexable>();
@@ -66,29 +66,36 @@
 /// This is set from the command line arguments flag --include-private
 bool _includePrivate = false;
 
+/// Library names to explicitly exclude.
+///
+///   Set from the command line option
+/// --exclude-lib.
+List<String> _excluded;
+
 // TODO(janicejl): Make MDN content generic or pluggable. Maybe move
 // MDN-specific code to its own library that is imported into the default impl?
 /// Map of all the comments for dom elements from MDN.
 Map _mdn;
 
-/**
- * Docgen constructor initializes the link resolver for markdown parsing.
- * Also initializes the command line arguments.
- *
- * [packageRoot] is the packages directory of the directory being analyzed.
- * If [includeSdk] is `true`, then any SDK libraries explicitly imported will
- * also be documented.
- * If [parseSdk] is `true`, then all Dart SDK libraries will be documented.
- * This option is useful when only the SDK libraries are needed.
- *
- * Returns `true` if docgen sucessfuly completes.
- */
+/// Docgen constructor initializes the link resolver for markdown parsing.
+/// Also initializes the command line arguments.
+///
+/// [packageRoot] is the packages directory of the directory being analyzed.
+/// If [includeSdk] is `true`, then any SDK libraries explicitly imported will
+/// also be documented.
+/// If [parseSdk] is `true`, then all Dart SDK libraries will be documented.
+/// This option is useful when only the SDK libraries are needed.
+///
+/// Returned Future completes with true if document generation is successful.
 Future<bool> docgen(List<String> files, {String packageRoot,
     bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false,
-    bool parseSdk: false, bool append: false, String introduction: ''}) {
+    bool parseSdk: false, bool append: false, String introduction: '',
+    out: DEFAULT_OUTPUT_DIRECTORY, List<String> excludeLibraries}) {
+  _excluded = excludeLibraries;
   _includePrivate = includePrivate;
+  _outputDirectory = out;
   if (!append) {
-    var dir = new Directory('docs');
+    var dir = new Directory(_outputDirectory);
     if (dir.existsSync()) dir.deleteSync(recursive: true);
   }
 
@@ -102,26 +109,32 @@
     }
   }
   logger.info('Package Root: ${packageRoot}');
-  linkResolver = (name) =>
-      fixReference(name, _currentLibrary, _currentClass, _currentMember);
+  var requestedLibraries = _listLibraries(files);
+  var allLibraries = []..addAll(requestedLibraries);
+  if (includeSdk) {
+    allLibraries.addAll(_listSdk());
+  }
 
-  return getMirrorSystem(files, packageRoot: packageRoot, parseSdk: parseSdk)
+  return getMirrorSystem(allLibraries, packageRoot: packageRoot,
+      parseSdk: parseSdk)
     .then((MirrorSystem mirrorSystem) {
       if (mirrorSystem.libraries.isEmpty) {
         throw new StateError('No library mirrors were created.');
       }
-      var librariesWeAskedFor = _listLibraries(files);
-      var librariesWeGot = mirrorSystem.libraries.values.where((each)
-          => each.uri.scheme == 'file');
-      var sdkLibraries = mirrorSystem.libraries.values.where(
+      var availableLibraries = mirrorSystem.libraries.values.where(
+          (each) => each.uri.scheme == 'file');
+      _sdkLibraries = mirrorSystem.libraries.values.where(
           (each) => each.uri.scheme == 'dart');
-      var librariesWeGotByPath = new Map.fromIterables(
-          librariesWeGot.map((each) => each.uri.toFilePath()),
-          librariesWeGot);
-      var librariesToDocument = librariesWeAskedFor.map((each) =>
-        librariesWeGotByPath
-            .putIfAbsent(each, () => throw "Missing library $each")).toList();
-      librariesToDocument.addAll((includeSdk || parseSdk) ? sdkLibraries : []);
+      _coreLibrary = _sdkLibraries.singleWhere((lib) =>
+          lib.uri.toString().startsWith('dart:core'));
+      var availableLibrariesByPath = new Map.fromIterables(
+          availableLibraries.map((each) => each.uri.toFilePath()),
+          availableLibraries);
+      var librariesToDocument = requestedLibraries.map(
+          (each) => availableLibrariesByPath.putIfAbsent(each,
+              () => throw "Missing library $each")).toList();
+      librariesToDocument.addAll((includeSdk || parseSdk) ? _sdkLibraries : []);
+      librariesToDocument.removeWhere((x) => _excluded.contains(x.simpleName));
       _documentLibraries(librariesToDocument, includeSdk: includeSdk,
           outputToYaml: outputToYaml, append: append, parseSdk: parseSdk,
           introduction: introduction);
@@ -129,23 +142,34 @@
     });
 }
 
-/// For a [library] and its corresponding [mirror] that we believe come
-/// from a package (because it has a file
-/// URI) look for the package name and set it on [library].
-void _findPackage(Library library, LibraryMirror mirror) {
-    if (mirror.uri.scheme != 'file') return;
-    var filePath = mirror.uri.toFilePath();
-    // We assume that we are documenting only libraries under package/lib
-    var rootdir = path.dirname((path.dirname(filePath)));
-    var pubspec = path.join(rootdir, 'pubspec.yaml');
-    library.packageName = _packageName(pubspec);
-    // If we are the main library in a package, associate the package readme
-    // with us.
-    // TODO(alanknight): We can't really rely on all packages having a library
-    // that matches the package name. Need a better way to store this.
-    if (library.packageName == library.name) {
-      library.packageIntro = _packageIntro(rootdir);
-    }
+/// For a library's [mirror], determine the name of the package (if any) we
+/// believe it came from (because of its file URI).
+///
+/// If [library] is specified, we set the packageName field. If no package could
+/// be determined, we return an empty string.
+String _findPackage(LibraryMirror mirror, [Library library]) {
+  if (mirror == null) return '';
+  if (library == null) {
+    library = entityMap[docName(mirror)];
+  }
+  if (library != null) {
+    if (library.hasBeenCheckedForPackage) return library.packageName;
+    library.hasBeenCheckedForPackage = true;
+  }
+  if (mirror.uri.scheme != 'file') return '';
+  var filePath = mirror.uri.toFilePath();
+  // We assume that we are documenting only libraries under package/lib
+  var rootdir = path.dirname((path.dirname(filePath)));
+  var pubspec = path.join(rootdir, 'pubspec.yaml');
+  var packageName = _packageName(pubspec);
+  if (library != null) {
+    library.packageName = packageName;
+    // Associate the package readme with all the libraries. This is a bit
+    // wasteful, but easier than trying to figure out which partial match
+    // is best.
+    library.packageIntro = _packageIntro(rootdir);
+  }
+  return packageName;
 }
 
 String _packageIntro(packageDir) {
@@ -158,13 +182,13 @@
   // If there are multiples, pick the shortest name.
   readmes.sort((a, b) => a.length.compareTo(b.length));
   var readme = readmes.first;
+  var linkResolver = (name) => fixReference(name, null, null, null);
   var contents = markdown.markdownToHtml(readme
     .readAsStringSync(), linkResolver: linkResolver,
     inlineSyntaxes: markdownSyntaxes);
   return contents;
 }
 
-
 List<String> _listLibraries(List<String> args) {
   var libraries = new List<String>();
   for (var arg in args) {
@@ -204,7 +228,7 @@
       }
     }
   });
-  return libraries;
+  return libraries.map(path.absolute).map(path.normalize).toList();
 }
 
 String _findPackageRoot(String directory) {
@@ -218,9 +242,7 @@
   return packageRoot;
 }
 
-/**
- * Read a pubspec and return the library name.
- */
+/// Read a pubspec and return the library name.
 String _packageName(String pubspecName) {
   File pubspec = new File(pubspecName);
   if (!pubspec.existsSync()) return '';
@@ -240,13 +262,10 @@
   return sdk;
 }
 
-/**
- * Analyzes set of libraries by getting a mirror system and triggers the
- * documentation of the libraries.
- */
-Future<MirrorSystem> getMirrorSystem(List<String> args, {String packageRoot,
-    bool parseSdk: false}) {
-  var libraries = !parseSdk ? _listLibraries(args) : _listSdk();
+/// Analyzes set of libraries by getting a mirror system and triggers the
+/// documentation of the libraries.
+Future<MirrorSystem> getMirrorSystem(List<String> libraries,
+    {String packageRoot, bool parseSdk: false}) {
   if (libraries.isEmpty) throw new StateError('No Libraries.');
   // Finds the root of SDK library based off the location of docgen.
 
@@ -265,10 +284,8 @@
   return root;
 }
 
-/**
- * Analyzes set of libraries and provides a mirror system which can be used
- * for static inspection of the source code.
- */
+/// Analyzes set of libraries and provides a mirror system which can be used
+/// for static inspection of the source code.
 Future<MirrorSystem> _analyzeLibraries(List<String> libraries,
       String libraryRoot, {String packageRoot}) {
   SourceFileProvider provider = new CompilerSourceFileProvider();
@@ -299,9 +316,7 @@
       });
 }
 
-/**
- * Creates documentation for filtered libraries.
- */
+/// Creates documentation for filtered libraries.
 void _documentLibraries(List<LibraryMirror> libs, {bool includeSdk: false,
     bool outputToYaml: true, bool append: false, bool parseSdk: false,
     String introduction: ''}) {
@@ -317,20 +332,21 @@
   entityMap.values.where((e) => e is Class).forEach((c) => c.makeValid());
   // Everything is a subclass of Object, therefore empty the list to avoid a
   // giant list of subclasses to be printed out.
-  if (parseSdk) (entityMap['dart-core.Object'] as Class).subclasses.clear();
+  if (includeSdk) (entityMap['dart-core.Object'] as Class).subclasses.clear();
 
   var filteredEntities = entityMap.values.where(_isVisible);
 
   // Outputs a JSON file with all libraries and their preview comments.
   // This will help the viewer know what libraries are available to read in.
   var libraryMap;
+  var linkResolver = (name) => fixReference(name, null, null, null);
   if (append) {
-    var docsDir = listDir('docs');
-    if (!docsDir.contains('docs/library_list.json')) {
+    var docsDir = listDir(_outputDirectory);
+    if (!docsDir.contains('$_outputDirectory/library_list.json')) {
       throw new StateError('No library_list.json');
     }
     libraryMap =
-        JSON.decode(new File('docs/library_list.json').readAsStringSync());
+        JSON.decode(new File('$_outputDirectory/library_list.json').readAsStringSync());
     libraryMap['libraries'].addAll(filteredEntities
         .where((e) => e is Library)
         .map((e) => e.previewMap));
@@ -355,10 +371,12 @@
     };
   }
   _writeToFile(JSON.encode(libraryMap), 'library_list.json');
+
   // Output libraries and classes to file after all information is generated.
   filteredEntities.where((e) => e is Class || e is Library).forEach((output) {
     _writeIndexableToFile(output, outputToYaml);
   });
+
   // Outputs all the qualified names documented with their type.
   // This will help generate search results.
   _writeToFile(filteredEntities.map((e) =>
@@ -369,19 +387,15 @@
       filteredEntities.map((e) => e.typeName));
   if (append) {
     var previousIndex =
-        JSON.decode(new File('docs/index.json').readAsStringSync());
+        JSON.decode(new File('$_outputDirectory/index.json').readAsStringSync());
     index.addAll(previousIndex);
   }
   _writeToFile(JSON.encode(index), 'index.json');
 }
 
 Library generateLibrary(dart2js.Dart2JsLibraryMirror library) {
-  _currentLibrary = library;
-  var result = new Library(docName(library), _commentToHtml(library),
-      _variables(library.variables),
-      _methods(library.functions),
-      _classes(library.classes), _isHidden(library));
-  _findPackage(result, library);
+  var result = new Library(library);
+  _findPackage(library, result);
   logger.fine('Generated library for ${result.name}');
   return result;
 }
@@ -399,13 +413,11 @@
   _writeToFile(output, outputFile);
 }
 
-/**
- * Returns true if a library name starts with an underscore, and false
- * otherwise.
- *
- * An example that starts with _ is _js_helper.
- * An example that contains ._ is dart._collection.dev
- */
+/// Returns true if a library name starts with an underscore, and false
+/// otherwise.
+///
+/// An example that starts with _ is _js_helper.
+/// An example that contains ._ is dart._collection.dev
 // This is because LibraryMirror.isPrivate returns `false` all the time.
 bool _isLibraryPrivate(LibraryMirror mirror) {
   var sdkLibrary = LIBRARIES[mirror.simpleName];
@@ -418,9 +430,7 @@
   return false;
 }
 
-/**
- * A declaration is private if itself is private, or the owner is private.
- */
+/// A declaration is private if itself is private, or the owner is private.
 // Issue(12202) - A declaration is public even if it's owner is private.
 bool _isHidden(DeclarationMirror mirror) {
   if (mirror is LibraryMirror) {
@@ -436,55 +446,7 @@
   return _includePrivate || !item.isPrivate;
 }
 
-/**
- * Returns a list of meta annotations assocated with a mirror.
- */
-List<Annotation> _annotations(DeclarationMirror mirror) {
-  var annotationMirrors = mirror.metadata.where((e) =>
-      e is dart2js.Dart2JsConstructedConstantMirror);
-  var annotations = [];
-  annotationMirrors.forEach((annotation) {
-    var parameterList = annotation.type.variables.values
-      .where((e) => e.isFinal)
-      .map((e) => annotation.getField(e.simpleName).reflectee)
-      .where((e) => e != null)
-      .toList();
-    if (validAnnotations.contains(docName(annotation.type))) {
-      annotations.add(new Annotation(docName(annotation.type),
-          parameterList));
-    }
-  });
-  return annotations;
-}
-
-/**
- * Returns any documentation comments associated with a mirror with
- * simple markdown converted to html.
- */
-String _commentToHtml(DeclarationMirror mirror) {
-  String commentText;
-  mirror.metadata.forEach((metadata) {
-    if (metadata is CommentInstanceMirror) {
-      CommentInstanceMirror comment = metadata;
-      if (comment.isDocComment) {
-        if (commentText == null) {
-          commentText = comment.trimmedText;
-        } else {
-          commentText = '$commentText ${comment.trimmedText}';
-        }
-      }
-    }
-  });
-
-  commentText = commentText == null ? '' :
-      markdown.markdownToHtml(commentText.trim(), linkResolver: linkResolver,
-          inlineSyntaxes: markdownSyntaxes);
-  return commentText;
-}
-
-/**
- * Generates MDN comments from database.json.
- */
+/// Generates MDN comments from database.json.
 void _mdnComment(Indexable item) {
   //Check if MDN is loaded.
   if (_mdn == null) {
@@ -493,7 +455,7 @@
     var mdnPath = path.join(root, 'utils/apidoc/mdn/database.json');
     _mdn = JSON.decode(new File(mdnPath).readAsStringSync());
   }
-  if (item.comment.isNotEmpty) return;
+  if (item is Library) return;
   var domAnnotation = item.annotations.firstWhere(
       (e) => e.qualifiedName == 'metadata.DomName', orElse: () => null);
   if (domAnnotation == null) return;
@@ -503,9 +465,7 @@
   if (parts.length == 1) item.comment = _mdnTypeComment(parts[0]);
 }
 
-/**
- * Generates the MDN Comment for variables and method DOM elements.
- */
+/// Generates the MDN Comment for variables and method DOM elements.
 String _mdnMemberComment(String type, String member) {
   var mdnType = _mdn[type];
   if (mdnType == null) return '';
@@ -517,9 +477,7 @@
   return _htmlMdn(mdnMember['help'], mdnMember['url']);
 }
 
-/**
- * Generates the MDN Comment for class DOM elements.
- */
+/// Generates the MDN Comment for class DOM elements.
 String _mdnTypeComment(String type) {
   var mdnType = _mdn[type];
   if (mdnType == null) return '';
@@ -533,169 +491,174 @@
       '<a href="' + url.trim() + '">from Mdn</a></p></div>';
 }
 
-/**
- * Converts all [foo] references in comments to <a>libraryName.foo</a>.
- */
+/// Look for the specified name starting with the current member, and
+/// progressively working outward to the current library scope.
+String findElementInScope(String name, LibraryMirror currentLibrary,
+    ClassMirror currentClass, MemberMirror currentMember) {
+  var packagePrefix = _findPackage(currentLibrary);
+  if (packagePrefix != '') packagePrefix += '/';
+
+  determineLookupFunc(name) => name.contains('.') ?
+      dart2js_util.lookupQualifiedInScope :
+      (mirror, name) => mirror.lookupInScope(name);
+  var lookupFunc = determineLookupFunc(name);
+
+  var memberScope = currentMember == null ?
+      null : lookupFunc(currentMember, name);
+  if (memberScope != null) return packagePrefix + docName(memberScope);
+
+  var classScope = currentClass;
+  while (classScope != null) {
+    var classFunc = lookupFunc(currentClass, name);
+    if (classFunc != null) return packagePrefix + docName(classFunc);
+    classScope = classScope.superclass;
+  }
+
+  var libraryScope = currentLibrary == null ?
+      null : lookupFunc(currentLibrary, name);
+  if (libraryScope != null) return packagePrefix + docName(libraryScope);
+
+  // Look in the dart core library scope.
+  var coreScope = _coreLibrary == null? null : lookupFunc(_coreLibrary, name);
+  if (coreScope != null) return packagePrefix + docName(_coreLibrary);
+
+  // If it's a reference that starts with a another library name, then it
+  // looks for a match of that library name in the other sdk libraries.
+  if(name.contains('.')) {
+    var index = name.indexOf('.');
+    var libraryName = name.substring(0, index);
+    var remainingName = name.substring(index + 1);
+    foundLibraryName(library) => library.uri.pathSegments[0] == libraryName;
+
+    if (_sdkLibraries.any(foundLibraryName)) {
+      var library = _sdkLibraries.singleWhere(foundLibraryName);
+      // Look to see if it's a fully qualified library name.
+      var scope = determineLookupFunc(remainingName)(library, remainingName);
+      if (scope != null) return packagePrefix + docName(scope);
+    }
+  }
+  return null;
+}
+
+// HTML escaped version of '<' character.
+final _LESS_THAN = '&lt;';
+
+/// Chunk the provided name into individual parts to be resolved. We take a
+/// simplistic approach to chunking, though, we break at " ", ",", "&lt;"
+/// and ">". All other characters are grouped into the name to be resolved.
+/// As a result, these characters will all be treated as part of the item to be
+/// resolved (aka the * is interpreted literally as a *, not as an indicator for
+/// bold <em>.
+List<String> _tokenizeComplexReference(String name) {
+  var tokens = [];
+  var append = false;
+  var index = 0;
+  while(index < name.length) {
+    if (name.indexOf(_LESS_THAN, index) == index) {
+      tokens.add(_LESS_THAN);
+      append = false;
+      index += _LESS_THAN.length;
+    } else if (name[index] == ' ' || name[index] == ',' ||
+        name[index] == '>') {
+      tokens.add(name[index]);
+      append = false;
+      index++;
+    } else {
+      if (append) {
+        tokens[tokens.length - 1] = tokens.last + name[index];
+      } else {
+        tokens.add(name[index]);
+        append = true;
+      }
+      index++;
+    }
+  }
+  return tokens;
+}
+
+/// This is a more complex reference. Try to break up if its of the form A<B>
+/// where A is an alphanumeric string and B is an A, a list of B ("B, B, B"),
+/// or of the form A<B>. Note: unlike other the other markdown-style links, all
+/// text inside the square brackets is treated as part of the link (aka the * is
+/// interpreted literally as a *, not as a indicator for bold <em>.
+///
+/// Example: [foo&lt;_bar_>] will produce
+/// <a>resolvedFoo</a>&lt;<a>resolved_bar_</a>> rather than an italicized
+/// version of resolvedBar.
+markdown.Node _fixComplexReference(String name, LibraryMirror currentLibrary,
+    ClassMirror currentClass, MemberMirror currentMember) {
+  // Parse into multiple elements we can try to resolve.
+  var tokens = _tokenizeComplexReference(name);
+
+  // Produce an html representation of our elements. Group unresolved and plain
+  // text are grouped into "link" elements so they display as code.
+  final textElements = [' ', ',', '>', _LESS_THAN];
+  var accumulatedHtml = '';
+
+  for (var token in tokens) {
+    bool added = false;
+    if (!textElements.contains(token)) {
+      String elementName = findElementInScope(token, currentLibrary,
+          currentClass, currentMember);
+      if (elementName != null) {
+        accumulatedHtml += markdown.renderToHtml([new markdown.Element.text(
+            'a', elementName)]);
+        added = true;
+      }
+    }
+    if (!added) {
+      accumulatedHtml += token;
+    }
+  }
+  return new markdown.Text(accumulatedHtml);
+}
+
+/// Converts all [foo] references in comments to <a>libraryName.foo</a>.
 markdown.Node fixReference(String name, LibraryMirror currentLibrary,
     ClassMirror currentClass, MemberMirror currentMember) {
-  var reference;
-  var memberScope = currentMember == null ?
-      null : currentMember.lookupInScope(name);
-  if (memberScope != null) {
-    reference = docName(memberScope);
-  } else {
-    var classScope = currentClass == null ?
-        null : currentClass.lookupInScope(name);
-    if (classScope != null) {
-      reference = docName(classScope);
+  // Attempt the look up the whole name up in the scope.
+  String elementName =
+      findElementInScope(name, currentLibrary, currentClass, currentMember);
+  if (elementName != null) {
+    return new markdown.Element.text('a', elementName);
+  }
+  return _fixComplexReference(name, currentLibrary, currentClass, currentMember);
+}
+
+markdown.Node fixReferenceWithScope(String name, DeclarationMirror scope) {
+  if (scope is LibraryMirror) return fixReference(name, scope, null, null);
+  if (scope is ClassMirror)
+      return fixReference(name, scope.library, scope, null);
+  if (scope is MemberMirror) {
+    var owner = scope.owner;
+    if (owner is ClassMirror) {
+        return fixReference(name, owner.library, owner, scope);
     } else {
-      var libraryScope = currentLibrary == null ?
-          null : currentLibrary.lookupInScope(name);
-      reference = libraryScope != null ? docName(libraryScope) : name;
+      return fixReference(name, owner, null, scope);
     }
   }
-  return new markdown.Element.text('a', reference);
+  return null;
 }
 
-/**
- * Returns a map of [Variable] objects constructed from [mirrorMap].
- */
-Map<String, Variable> _variables(Map<String, VariableMirror> mirrorMap) {
-  var data = {};
-  // TODO(janicejl): When map to map feature is created, replace the below with
-  // a filter. Issue(#9590).
-  mirrorMap.forEach((String mirrorName, VariableMirror mirror) {
-    _currentMember = mirror;
-    if (_includePrivate || !_isHidden(mirror)) {
-      entityMap[docName(mirror)] = new Variable(mirrorName, mirror.isFinal,
-         mirror.isStatic, mirror.isConst, _type(mirror.type),
-         _commentToHtml(mirror), _annotations(mirror), docName(mirror),
-         _isHidden(mirror), docName(mirror.owner));
-      data[mirrorName] = entityMap[docName(mirror)];
-    }
-  });
-  return data;
-}
-
-/**
- * Returns a map of [Method] objects constructed from [mirrorMap].
- */
-MethodGroup _methods(Map<String, MethodMirror> mirrorMap) {
-  var group = new MethodGroup();
-  mirrorMap.forEach((String mirrorName, MethodMirror mirror) {
-    if (_includePrivate || !mirror.isPrivate) {
-      group.addMethod(mirror);
-    }
-  });
-  return group;
-}
-
-/**
- * Returns the [Class] for the given [mirror] has already been created, and if
- * it does not exist, creates it.
- */
-Class _class(ClassMirror mirror) {
-  var clazz = entityMap[docName(mirror)];
-  if (clazz == null) {
-    var superclass = mirror.superclass != null ?
-        _class(mirror.superclass) : null;
-    var interfaces =
-        mirror.superinterfaces.map((interface) => _class(interface));
-    clazz = new Class(mirror.simpleName, superclass, _commentToHtml(mirror),
-        interfaces.toList(), _variables(mirror.variables),
-        _methods(mirror.methods), _annotations(mirror), _generics(mirror),
-        docName(mirror), _isHidden(mirror), docName(mirror.owner),
-        mirror.isAbstract);
-    if (superclass != null) clazz.addInherited(superclass);
-    interfaces.forEach((interface) => clazz.addInherited(interface));
-    entityMap[docName(mirror)] = clazz;
-  }
-  return clazz;
-}
-
-/**
- * Returns a map of [Class] objects constructed from [mirrorMap].
- */
-ClassGroup _classes(Map<String, ClassMirror> mirrorMap) {
-  var group = new ClassGroup();
-  mirrorMap.forEach((String mirrorName, ClassMirror mirror) {
-      group.addClass(mirror);
-  });
-  return group;
-}
-
-/**
- * Returns a map of [Parameter] objects constructed from [mirrorList].
- */
-Map<String, Parameter> _parameters(List<ParameterMirror> mirrorList) {
-  var data = {};
-  mirrorList.forEach((ParameterMirror mirror) {
-    _currentMember = mirror;
-    data[mirror.simpleName] = new Parameter(mirror.simpleName,
-        mirror.isOptional, mirror.isNamed, mirror.hasDefaultValue,
-        _type(mirror.type), mirror.defaultValue,
-        _annotations(mirror));
-  });
-  return data;
-}
-
-/**
- * Returns a map of [Generic] objects constructed from the class mirror.
- */
-Map<String, Generic> _generics(ClassMirror mirror) {
-  return new Map.fromIterable(mirror.typeVariables,
-      key: (e) => e.toString(),
-      value: (e) => new Generic(e.toString(), e.upperBound.qualifiedName));
-}
-
-/**
- * Returns a single [Type] object constructed from the Method.returnType
- * Type mirror.
- */
-Type _type(TypeMirror mirror) {
-  return new Type(docName(mirror), _typeGenerics(mirror));
-}
-
-/**
- * Returns a list of [Type] objects constructed from TypeMirrors.
- */
-List<Type> _typeGenerics(TypeMirror mirror) {
-  if (mirror is ClassMirror && !mirror.isTypedef) {
-    var innerList = [];
-    mirror.typeArguments.forEach((e) {
-      innerList.add(new Type(docName(e), _typeGenerics(e)));
-    });
-    return innerList;
-  }
-  return [];
-}
-
-/**
- * Writes text to a file in the 'docs' directory.
- */
+/// Writes text to a file in the output directory.
 void _writeToFile(String text, String filename, {bool append: false}) {
-  Directory dir = new Directory('docs');
+  if (text == null) return;
+  Directory dir = new Directory(_outputDirectory);
   if (!dir.existsSync()) {
     dir.createSync();
   }
   // We assume there's a single extra level of directory structure for packages.
   if (path.split(filename).length > 1) {
-    var subdir = new Directory(path.join('docs', path.dirname(filename)));
+    var subdir = new Directory(path.join(_outputDirectory, path.dirname(filename)));
     if (!subdir.existsSync()) {
       subdir.createSync();
     }
   }
-
-  File file = new File('docs/$filename');
-  if (!file.existsSync()) {
-    file.createSync();
-  }
+  File file = new File(path.join(_outputDirectory, filename));
   file.writeAsStringSync(text, mode: append ? FileMode.APPEND : FileMode.WRITE);
 }
 
-/**
- * Transforms the map by calling toMap on each value in it.
- */
+/// Transforms the map by calling toMap on each value in it.
 Map recurseMap(Map inputMap) {
   var outputMap = {};
   inputMap.forEach((key, value) {
@@ -708,43 +671,55 @@
   return outputMap;
 }
 
-/**
- * A class representing all programming constructs, like library or class.
- */
+/// A type for the function that generates a comment from a mirror.
+typedef String CommentGenerator(Mirror m);
+
+/// A class representing all programming constructs, like library or class.
 class Indexable {
-  String name;
   String get qualifiedName => fileName;
   bool isPrivate;
+  DeclarationMirror mirror;
+
+  Indexable(this.mirror) {
+    this.isPrivate = _isHidden(mirror);
+  }
 
   // The qualified name (for URL purposes) and the file name are the same,
   // of the form packageName/ClassName or packageName/ClassName.methodName.
   // This defines both the URL and the directory structure.
   String get fileName => packagePrefix + ownerPrefix + name;
 
-  Indexable get owningEntity {
-    var result = entityMap[owner];
-    return result;
-  }
-  String get ownerPrefix => owningEntity == null
-      ? (owner == null || owner.isEmpty ? '' : owner + '.')
-      : owningEntity.qualifiedName + '.';
+  Indexable get owningEntity => entityMap[owner];
+
+  String get ownerPrefix => owningEntity == null ?
+      (owner == null || owner.isEmpty ? '' : owner + '.') :
+      owningEntity.qualifiedName + '.';
 
   String get packagePrefix => '';
+
   /// Documentation comment with converted markdown.
-  String comment;
+  String _comment;
+
+  String get comment {
+    if (_comment != null) return _comment;
+    _comment = _commentToHtml(mirror);
+    if (_comment.isEmpty) {
+      _mdnComment(this);
+    }
+    return _comment;
+  }
+
+  set comment(x) => _comment = x;
+
+  String get name => mirror.simpleName;
 
   /// Qualified Name of the owner of this Indexable Item.
-  /// For Library, owner will be "";
-  String owner;
-
-  Indexable(this.name, this.comment, this.isPrivate, this.owner);
+  String get owner => docName(mirror.owner);
 
   /// The type of this member to be used in index.txt.
   String get typeName => '';
 
-  /**
-   * Creates a [Map] with this [Indexable]'s name and a preview comment.
-   */
+  /// Creates a [Map] with this [Indexable]'s name and a preview comment.
   Map get previewMap {
     var finalMap = { 'name' : name, 'qualifiedName' : qualifiedName };
     if (comment != '') {
@@ -754,6 +729,115 @@
     return finalMap;
   }
 
+  /// Returns any documentation comments associated with a mirror with
+  /// simple markdown converted to html.
+  ///
+  /// It's possible to have a comment that comes from one mirror applied to
+  /// another, in the case of an inherited comment.
+  String _commentToHtml(itemToDocument) {
+    String commentText;
+    mirror.metadata.forEach((metadata) {
+      if (metadata is CommentInstanceMirror) {
+        CommentInstanceMirror comment = metadata;
+        if (comment.isDocComment) {
+          if (commentText == null) {
+            commentText = comment.trimmedText;
+          } else {
+            commentText = '$commentText\n${comment.trimmedText}';
+          }
+        }
+      }
+    });
+
+    var linkResolver = (name) => fixReferenceWithScope(name, itemToDocument);
+    commentText = commentText == null ? '' :
+        markdown.markdownToHtml(commentText.trim(), linkResolver: linkResolver,
+            inlineSyntaxes: markdownSyntaxes);
+    return commentText;
+  }
+
+  /// Returns a map of [Variable] objects constructed from [mirrorMap].
+  Map<String, Variable> _createVariables(Map<String,
+      VariableMirror> mirrorMap) {
+    var data = {};
+    // TODO(janicejl): When map to map feature is created, replace the below
+    // with a filter. Issue(#9590).
+    mirrorMap.forEach((String mirrorName, VariableMirror mirror) {
+      if (_includePrivate || !_isHidden(mirror)) {
+        entityMap[docName(mirror)] = new Variable(mirrorName, mirror);
+        data[mirrorName] = entityMap[docName(mirror)];
+      }
+    });
+    return data;
+  }
+
+  /// Returns a map of [Method] objects constructed from [mirrorMap].
+  MethodGroup _createMethods(Map<String, MethodMirror> mirrorMap) {
+    var group = new MethodGroup();
+    mirrorMap.forEach((String mirrorName, MethodMirror mirror) {
+      if (_includePrivate || !mirror.isPrivate) {
+        group.addMethod(mirror);
+      }
+    });
+    return group;
+  }
+
+  /// Returns a map of [Parameter] objects constructed from [mirrorList].
+  Map<String, Parameter> _createParameters(List<ParameterMirror> mirrorList) {
+    var data = {};
+    mirrorList.forEach((ParameterMirror mirror) {
+      data[mirror.simpleName] = new Parameter(mirror.simpleName,
+          mirror.isOptional, mirror.isNamed, mirror.hasDefaultValue,
+          _createType(mirror.type), mirror.defaultValue,
+          _createAnnotations(mirror));
+    });
+    return data;
+  }
+
+  /// Returns a map of [Generic] objects constructed from the class mirror.
+  Map<String, Generic> _createGenerics(ClassMirror mirror) {
+    return new Map.fromIterable(mirror.typeVariables,
+        key: (e) => e.toString(),
+        value: (e) => new Generic(e.toString(), e.upperBound.qualifiedName));
+  }
+
+  /// Returns a single [Type] object constructed from the Method.returnType
+  /// Type mirror.
+  Type _createType(TypeMirror mirror) {
+    return new Type(docName(mirror), _createTypeGenerics(mirror));
+  }
+
+  /// Returns a list of [Type] objects constructed from TypeMirrors.
+  List<Type> _createTypeGenerics(TypeMirror mirror) {
+    if (mirror is ClassMirror && !mirror.isTypedef) {
+      var innerList = [];
+      mirror.typeArguments.forEach((e) {
+        innerList.add(new Type(docName(e), _createTypeGenerics(e)));
+      });
+      return innerList;
+    }
+    return [];
+  }
+
+  /// Returns a list of meta annotations assocated with a mirror.
+  List<Annotation> _createAnnotations(DeclarationMirror mirror) {
+    var annotationMirrors = mirror.metadata.where((e) =>
+        e is dart2js.Dart2JsConstructedConstantMirror);
+    var annotations = [];
+    annotationMirrors.forEach((annotation) {
+      var parameterList = annotation.type.variables.values
+        .where((e) => e.isFinal)
+        .map((e) => annotation.getField(e.simpleName).reflectee)
+        .where((e) => e != null)
+        .toList();
+      if (!skippedAnnotations.contains(docName(annotation.type))) {
+        annotations.add(new Annotation(docName(annotation.type),
+            parameterList));
+      }
+    });
+    return annotations;
+  }
+
   /// Return an informative [Object.toString] for debugging.
   String toString() => "${super.toString()}(${name.toString()})";
 
@@ -761,9 +845,7 @@
   Map toMap() {}
 }
 
-/**
- * A class containing contents of a Dart library.
- */
+/// A class containing contents of a Dart library.
 class Library extends Indexable {
 
   /// Top-level variables in the library.
@@ -776,13 +858,22 @@
   ClassGroup classes;
 
   String packageName = '';
-
-  String get packagePrefix => packageName == null || packageName.isEmpty
-      ? ''
-      : '$packageName/';
-
+  bool hasBeenCheckedForPackage = false;
   String packageIntro;
 
+  Library(LibraryMirror libraryMirror) : super(libraryMirror) {
+    var exported = _calcExportedItems(libraryMirror);
+    this.classes = _createClasses(
+        exported['classes']..addAll(libraryMirror.classes));
+    this.functions = _createMethods(
+        exported['methods']..addAll(libraryMirror.functions));
+    this.variables = _createVariables(
+        exported['variables']..addAll(libraryMirror.variables));
+  }
+
+  String get packagePrefix => packageName == null || packageName.isEmpty ?
+      '' : '$packageName/';
+
   Map get previewMap {
     var basic = super.previewMap;
     basic['packageName'] = packageName;
@@ -792,9 +883,80 @@
     return basic;
   }
 
-  Library(String name, String comment, this.variables,
-      this.functions, this.classes, bool isPrivate) : super(name, comment,
-          isPrivate, "");
+  String get owner => '';
+
+  String get name => docName(mirror);
+
+  /// Returns a [ClassGroup] containing error, typedef and regular classes.
+  ClassGroup _createClasses(Map<String, ClassMirror> mirrorMap) {
+    var group = new ClassGroup();
+    mirrorMap.forEach((String mirrorName, ClassMirror mirror) {
+        group.addClass(mirror);
+    });
+    return group;
+  }
+
+  /// For the given library determine what items (if any) are exported.
+  ///
+  /// Returns a Map with three keys: "classes", "methods", and "variables" the
+  /// values of which point to a map of exported name identifiers with values
+  /// corresponding to the actual DeclarationMirror.
+  Map<String, Map<String, DeclarationMirror>> _calcExportedItems(
+      LibraryMirror library) {
+    var exports = {};
+    exports['classes'] = {};
+    exports['methods'] = {};
+    exports['variables'] = {};
+
+    // Determine the classes, variables and methods that are exported for a
+    // specific dependency.
+    _populateExports(LibraryDependencyMirror export, bool showExport) {
+      if (!showExport) {
+        // Add all items, and then remove the hidden ones.
+        // Ex: "export foo hide bar"
+        exports['classes'].addAll(export.targetLibrary.classes);
+        exports['methods'].addAll(export.targetLibrary.functions);
+        exports['variables'].addAll(export.targetLibrary.variables);
+      }
+      for (CombinatorMirror combinator in export.combinators) {
+        for (String identifier in combinator.identifiers) {
+          DeclarationMirror declaration =
+              export.targetLibrary.lookupInScope(identifier);
+          if (declaration == null) {
+            // Technically this should be a bug, but some of our packages
+            // (such as the polymer package) are curently broken in this
+            // way, so we just produce a warning.
+            print('Warning identifier $identifier not found in library '
+                '${export.targetLibrary.qualifiedName}');
+          } else {
+            var subMap = exports['classes'];
+            if (declaration is MethodMirror) {
+              subMap = exports['methods'];
+            } else if (declaration is VariableMirror) {
+              subMap = exports['variables'];
+            }
+            if (showExport) {
+              subMap[identifier] = declaration;
+            } else {
+              subMap.remove(identifier);
+            }
+          }
+        }
+      }
+    }
+
+    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));
+    }
+    return exports;
+  }
 
   /// Generates a map describing the [Library] object.
   Map toMap() => {
@@ -811,16 +973,14 @@
   String get typeName => 'library';
 }
 
-/**
- * A class containing contents of a Dart class.
- */
-class Class extends Indexable {
+/// A class containing contents of a Dart class.
+class Class extends Indexable implements Comparable {
 
   /// List of the names of interfaces that this class implements.
   List<Class> interfaces = [];
 
   /// Names of classes that extends or implements this class.
-  Set<String> subclasses = new Set<String>();
+  Set<Class> subclasses = new Set<Class>();
 
   /// Top-level variables in the class.
   Map<String, Variable> variables;
@@ -843,41 +1003,67 @@
   /// List of the meta annotations on the class.
   List<Annotation> annotations;
 
-  Class(String name, this.superclass, String comment, this.interfaces,
-      this.variables, this.methods, this.annotations, this.generics,
-      String qualifiedName, bool isPrivate, String owner, this.isAbstract)
-      : super(name, comment, isPrivate, owner) {
-    _mdnComment(this);
+  /// Make sure that we don't check for inherited comments more than once.
+  bool _commentsEnsured = false;
+
+  /// Returns the [Class] for the given [mirror] if it has already been created,
+  /// else creates it.
+  factory Class(ClassMirror mirror) {
+    var clazz = entityMap[docName(mirror)];
+    if (clazz == null) {
+      clazz = new Class._(mirror);
+      entityMap[docName(mirror)] = clazz;
+    }
+    return clazz;
+  }
+
+  Class._(ClassMirror classMirror) : super(classMirror) {
+    var superclass = classMirror.superclass != null ?
+        new Class(classMirror.superclass) : null;
+    var interfaces = classMirror.superinterfaces.map(
+        (interface) => new Class(interface));
+
+    this.superclass = superclass;
+    this.interfaces = interfaces.toList();
+    this.variables = _createVariables(classMirror.variables);
+    this.methods = _createMethods(classMirror.methods);
+    this.annotations = _createAnnotations(classMirror);
+    this.generics = _createGenerics(classMirror);
+    this.isAbstract = classMirror.isAbstract;
+
+    // Tell all superclasses that you are a subclass.
+    if (!classMirror.isNameSynthetic && _isVisible(this)) {
+      parentChain().forEach((parentClass) {
+          parentClass.addSubclass(this);
+      });
+    }
+
+    if (this.superclass != null) addInherited(superclass);
+    interfaces.forEach((interface) => addInherited(interface));
   }
 
   String get typeName => 'class';
 
-  /**
-   * Returns a list of all the parent classes.
-   */
-  List<Class> parent() {
+  /// Returns a list of all the parent classes.
+  List<Class> parentChain() {
     var parent = superclass == null ? [] : [superclass];
     parent.addAll(interfaces);
     return parent;
   }
 
-  /**
-   * Add all inherited variables and methods from the provided superclass.
-   * If [_includePrivate] is true, it also adds the variables and methods from
-   * the superclass.
-   */
+  /// Add all inherited variables and methods from the provided superclass.
+  /// If [_includePrivate] is true, it also adds the variables and methods from
+  /// the superclass.
   void addInherited(Class superclass) {
     inheritedVariables.addAll(superclass.inheritedVariables);
-    inheritedVariables.addAll(superclass.variables);
+    inheritedVariables.addAll(_filterStatics(superclass.variables));
     inheritedMethods.addInherited(superclass);
   }
 
-  /**
-   * Add the subclass to the class.
-   *
-   * If [this] is private, it will add the subclass to the list of subclasses in
-   * the superclasses.
-   */
+  /// Add the subclass to the class.
+  ///
+  /// If [this] is private, it will add the subclass to the list of subclasses
+  /// in the superclasses.
   void addSubclass(Class subclass) {
     if (!_includePrivate && isPrivate) {
       if (superclass != null) superclass.addSubclass(subclass);
@@ -885,13 +1071,11 @@
         interface.addSubclass(subclass);
       });
     } else {
-      subclasses.add(subclass.qualifiedName);
+      subclasses.add(subclass);
     }
   }
 
-  /**
-   * Check if this [Class] is an error or exception.
-   */
+  /// Check if this [Class] is an error or exception.
   bool isError() {
     if (qualifiedName == 'dart-core.Error' ||
         qualifiedName == 'dart-core.Exception')
@@ -903,12 +1087,10 @@
     return superclass.isError();
   }
 
-  /**
-   * Check that the class exists in the owner library.
-   *
-   * If it does not exist in the owner library, it is a mixin applciation and
-   * should be removed.
-   */
+  /// Check that the class exists in the owner library.
+  ///
+  /// If it does not exist in the owner library, it is a mixin applciation and
+  /// should be removed.
   void makeValid() {
     var library = entityMap[owner];
     if (library != null && !library.classes.containsKey(name)) {
@@ -918,24 +1100,22 @@
       entityMap.values.where((e) => e.owner == qualifiedName)
         .forEach((element) => element.isPrivate = true);
       // Move the subclass up to the next public superclass
-      subclasses.forEach((subclass) => addSubclass(entityMap[subclass]));
+      subclasses.forEach((subclass) => addSubclass(subclass));
     }
   }
 
-  /**
-   * Makes sure that all methods with inherited equivalents have comments.
-   */
+  /// Makes sure that all methods with inherited equivalents have comments.
   void ensureComments() {
+    if (_commentsEnsured) return;
+    _commentsEnsured = true;
     inheritedMethods.forEach((qualifiedName, inheritedMethod) {
       var method = methods[qualifiedName];
       if (method != null) method.ensureCommentFor(inheritedMethod);
     });
   }
 
-  /**
-   * If a class extends a private superclass, find the closest public superclass
-   * of the private superclass.
-   */
+  /// If a class extends a private superclass, find the closest public superclass
+  /// of the private superclass.
   String validSuperclass() {
     if (superclass == null) return 'dart.core.Object';
     if (_isVisible(superclass)) return superclass.qualifiedName;
@@ -951,7 +1131,8 @@
     'superclass': validSuperclass(),
     'implements': interfaces.where(_isVisible)
         .map((e) => e.qualifiedName).toList(),
-    'subclass': subclasses.toList(),
+    'subclass': (subclasses.toList()..sort())
+        .map((x) => x.qualifiedName).toList(),
     'variables': recurseMap(variables),
     'inheritedVariables': recurseMap(inheritedVariables),
     'methods': methods.toMap(),
@@ -959,56 +1140,41 @@
     'annotations': annotations.map((a) => a.toMap()).toList(),
     'generics': recurseMap(generics)
   };
+
+  int compareTo(aClass) => name.compareTo(aClass.name);
 }
 
-/**
- * A container to categorize classes into the following groups: abstract
- * classes, regular classes, typedefs, and errors.
- */
+/// A container to categorize classes into the following groups: abstract
+/// classes, regular classes, typedefs, and errors.
 class ClassGroup {
   Map<String, Class> classes = {};
   Map<String, Typedef> typedefs = {};
   Map<String, Class> errors = {};
 
-  void addClass(ClassMirror mirror) {
-    _currentClass = mirror;
-    if (mirror.isTypedef) {
+  void addClass(ClassMirror classMirror) {
+    if (classMirror.isTypedef) {
       // This is actually a Dart2jsTypedefMirror, and it does define value,
       // but we don't have visibility to that type.
-      var mirror = _currentClass;
+      var mirror = classMirror;
       if (_includePrivate || !mirror.isPrivate) {
-        entityMap[docName(mirror)] = new Typedef(mirror.simpleName,
-            docName(mirror.value.returnType), _commentToHtml(mirror),
-            _generics(mirror), _parameters(mirror.value.parameters),
-            _annotations(mirror), docName(mirror),  _isHidden(mirror),
-            docName(mirror.owner));
+        entityMap[docName(mirror)] = new Typedef(mirror);
         typedefs[mirror.simpleName] = entityMap[docName(mirror)];
       }
     } else {
-      var clazz = _class(mirror);
-
-      // Adding inherited parent variables and methods.
-      clazz.parent().forEach((parent) {
-        if (_isVisible(clazz)) {
-          parent.addSubclass(clazz);
-        }
-      });
-
-      clazz.ensureComments();
+      var clazz = new Class(classMirror);
 
       if (clazz.isError()) {
-        errors[mirror.simpleName] = clazz;
-      } else if (mirror.isClass) {
-        classes[mirror.simpleName] = clazz;
+        errors[classMirror.simpleName] = clazz;
+      } else if (classMirror.isClass) {
+        classes[classMirror.simpleName] = clazz;
       } else {
-        throw new ArgumentError('${mirror.simpleName} - no class type match. ');
+        throw new ArgumentError(
+            '${classMirror.simpleName} - no class type match. ');
       }
     }
   }
 
-  /**
-   * Checks if the given name is a key for any of the Class Maps.
-   */
+  /// Checks if the given name is a key for any of the Class Maps.
   bool containsKey(String name) {
     return classes.containsKey(name) || errors.containsKey(name);
   }
@@ -1033,10 +1199,12 @@
   /// List of the meta annotations on the typedef.
   List<Annotation> annotations;
 
-  Typedef(String name, this.returnType, String comment, this.generics,
-      this.parameters, this.annotations,
-      String qualifiedName, bool isPrivate, String owner)
-        : super(name, comment, isPrivate, owner);
+  Typedef(mirror) : super(mirror) {
+    this.returnType = docName(mirror.value.returnType);
+    this.generics = _createGenerics(mirror);
+    this.parameters = _createParameters(mirror.value.parameters);
+    this.annotations = _createAnnotations(mirror);
+  }
 
   Map toMap() => {
     'name': name,
@@ -1051,25 +1219,28 @@
   String get typeName => 'typedef';
 }
 
-/**
- * A class containing properties of a Dart variable.
- */
+/// A class containing properties of a Dart variable.
 class Variable extends Indexable {
 
   bool isFinal;
   bool isStatic;
   bool isConst;
   Type type;
+  String _variableName;
 
   /// List of the meta annotations on the variable.
   List<Annotation> annotations;
 
-  Variable(String name, this.isFinal, this.isStatic, this.isConst, this.type,
-      String comment, this.annotations, String qualifiedName, bool isPrivate,
-      String owner) : super(name, comment, isPrivate, owner) {
-    _mdnComment(this);
+  Variable(this._variableName, VariableMirror mirror) : super(mirror) {
+    this.isFinal = mirror.isFinal;
+    this.isStatic = mirror.isStatic;
+    this.isConst = mirror.isConst;
+    this.type = _createType(mirror.type);
+    this.annotations = _createAnnotations(mirror);
   }
 
+  String get name => _variableName;
+
   /// Generates a map describing the [Variable] object.
   Map toMap() => {
     'name': name,
@@ -1083,11 +1254,18 @@
   };
 
   String get typeName => 'property';
+
+  get comment {
+    if (_comment != null) return _comment;
+    var owningClass = owningEntity;
+    if (owningClass is Class) {
+      owningClass.ensureComments();
+    }
+    return super.comment;
+  }
 }
 
-/**
- * A class containing properties of a Dart method.
- */
+/// A class containing properties of a Dart method.
 class Method extends Indexable {
 
   /// Parameters for this method.
@@ -1108,21 +1286,23 @@
   /// List of the meta annotations on the method.
   List<Annotation> annotations;
 
-  Method(String name, this.isStatic, this.isAbstract, this.isConst,
-      this.returnType, String comment, this.parameters, this.annotations,
-      String qualifiedName, bool isPrivate, String owner, this.isConstructor,
-      this.isGetter, this.isSetter, this.isOperator)
-        : super(name, comment, isPrivate, owner) {
-    _mdnComment(this);
+  Method(MethodMirror mirror) : super(mirror) {
+    this.isStatic = mirror.isStatic;
+    this.isAbstract = mirror.isAbstract;
+    this.isConst = mirror.isConstConstructor;
+    this.returnType = _createType(mirror.returnType);
+    this.parameters = _createParameters(mirror.parameters);
+    this.annotations = _createAnnotations(mirror);
+    this.isConstructor = mirror.isConstructor;
+    this.isGetter = mirror.isGetter;
+    this.isSetter = mirror.isSetter;
+    this.isOperator = mirror.isOperator;
   }
 
-  /**
-   * Makes sure that the method with an inherited equivalent have comments.
-   */
+  /// Makes sure that the method with an inherited equivalent have comments.
   void ensureCommentFor(Method inheritedMethod) {
     if (comment.isNotEmpty) return;
-    (entityMap[inheritedMethod.owner] as Class).ensureComments();
-    comment = inheritedMethod.comment;
+    comment = inheritedMethod._commentToHtml(mirror);
     commentInheritedFrom = inheritedMethod.commentInheritedFrom == '' ?
         inheritedMethod.qualifiedName : inheritedMethod.commentInheritedFrom;
   }
@@ -1144,12 +1324,19 @@
   String get typeName => isConstructor ? 'constructor' :
     isGetter ? 'getter' : isSetter ? 'setter' :
     isOperator ? 'operator' : 'method';
+
+  get comment {
+    if (_comment != null) return _comment;
+    var owningClass = owningEntity;
+    if (owningClass is Class) {
+      owningClass.ensureComments();
+    }
+    return super.comment;
+  }
 }
 
-/**
- * A container to categorize methods into the following groups: setters,
- * getters, constructors, operators, regular methods.
- */
+/// A container to categorize methods into the following groups: setters,
+/// getters, constructors, operators, regular methods.
 class MethodGroup {
   Map<String, Method> setters = {};
   Map<String, Method> getters = {};
@@ -1158,14 +1345,8 @@
   Map<String, Method> regularMethods = {};
 
   void addMethod(MethodMirror mirror) {
-    var method = new Method(mirror.simpleName, mirror.isStatic,
-        mirror.isAbstract, mirror.isConstConstructor, _type(mirror.returnType),
-        _commentToHtml(mirror), _parameters(mirror.parameters),
-        _annotations(mirror), docName(mirror), _isHidden(mirror),
-        docName(mirror.owner), mirror.isConstructor, mirror.isGetter,
-        mirror.isSetter, mirror.isOperator);
+    var method = new Method(mirror);
     entityMap[docName(mirror)] = method;
-    _currentMember = mirror;
     if (mirror.isSetter) {
       setters[mirror.simpleName] = method;
     } else if (mirror.isGetter) {
@@ -1183,13 +1364,13 @@
 
   void addInherited(Class parent) {
     setters.addAll(parent.inheritedMethods.setters);
-    setters.addAll(parent.methods.setters);
+    setters.addAll(_filterStatics(parent.methods.setters));
     getters.addAll(parent.inheritedMethods.getters);
-    getters.addAll(parent.methods.getters);
+    getters.addAll(_filterStatics(parent.methods.getters));
     operators.addAll(parent.inheritedMethods.operators);
-    operators.addAll(parent.methods.operators);
+    operators.addAll(_filterStatics(parent.methods.operators));
     regularMethods.addAll(parent.inheritedMethods.regularMethods);
-    regularMethods.addAll(parent.methods.regularMethods);
+    regularMethods.addAll(_filterStatics(parent.methods.regularMethods));
   }
 
   Map toMap() => {
@@ -1218,9 +1399,7 @@
   }
 }
 
-/**
- * A class containing properties of a Dart method/function parameter.
- */
+/// A class containing properties of a Dart method/function parameter.
 class Parameter {
 
   String name;
@@ -1248,9 +1427,7 @@
   };
 }
 
-/**
- * A class containing properties of a Generic.
- */
+/// A class containing properties of a Generic.
 class Generic {
   String name;
   String type;
@@ -1263,36 +1440,34 @@
   };
 }
 
-/**
- * Holds the name of a return type, and its generic type parameters.
- *
- * Return types are of a form [outer]<[inner]>.
- * If there is no [inner] part, [inner] will be an empty list.
- *
- * For example:
- *        int size()
- *          "return" :
- *            - "outer" : "dart-core.int"
- *              "inner" :
- *
- *        List<String> toList()
- *          "return" :
- *            - "outer" : "dart-core.List"
- *              "inner" :
- *                - "outer" : "dart-core.String"
- *                  "inner" :
- *
- *        Map<String, List<int>>
- *          "return" :
- *            - "outer" : "dart-core.Map"
- *              "inner" :
- *                - "outer" : "dart-core.String"
- *                  "inner" :
- *                - "outer" : "dart-core.List"
- *                  "inner" :
- *                    - "outer" : "dart-core.int"
- *                      "inner" :
- */
+/// Holds the name of a return type, and its generic type parameters.
+///
+/// Return types are of a form [outer]<[inner]>.
+/// If there is no [inner] part, [inner] will be an empty list.
+///
+/// For example:
+///        int size()
+///          "return" :
+///            - "outer" : "dart-core.int"
+///              "inner" :
+///
+///        List<String> toList()
+///          "return" :
+///            - "outer" : "dart-core.List"
+///              "inner" :
+///                - "outer" : "dart-core.String"
+///                  "inner" :
+///
+///        Map<String, List<int>>
+///          "return" :
+///            - "outer" : "dart-core.Map"
+///              "inner" :
+///                - "outer" : "dart-core.String"
+///                  "inner" :
+///                - "outer" : "dart-core.List"
+///                  "inner" :
+///                    - "outer" : "dart-core.int"
+///                      "inner" :
 class Type {
   String outer;
   List<Type> inner;
@@ -1305,9 +1480,7 @@
   };
 }
 
-/**
- * Holds the name of the annotation, and its parameters.
- */
+/// Holds the name of the annotation, and its parameters.
 class Annotation {
   String qualifiedName;
   List<String> parameters;
@@ -1325,7 +1498,7 @@
 /// have them replaced with hyphens.
 String docName(DeclarationMirror m) {
   if (m is LibraryMirror) {
-    return (m as LibraryMirror).qualifiedName.replaceAll('.','-');
+    return m.qualifiedName.replaceAll('.','-');
   }
   var owner = m.owner;
   if (owner == null) return m.qualifiedName;
@@ -1333,3 +1506,14 @@
   if (m.simpleName == '') return docName(owner);
   return docName(owner) + '.' + m.simpleName;
 }
+
+/// Remove statics from the map of inherited items before adding them.
+Map _filterStatics(Map items) {
+  var result = {};
+  items.forEach((name, item) {
+    if (!item.isStatic) {
+      result[name] = item;
+    }
+  });
+  return result;
+}
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index a385dd5..5afaebe 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -6,7 +6,10 @@
 dependencies:
   args: ">=0.9.0 <0.10.0"
   logging: ">=0.9.0 <0.10.0"
-  markdown: ">=0.9.0 <0.10.0"
+  markdown:
+    git:
+      ref: emilysEdits
+      url: https://github.com/efortuna/dart-markdown
   path: ">=0.9.0 <0.10.0"
   yaml: ">=0.9.0 <0.10.0"
 dev_dependencies:
diff --git a/pkg/docgen/test/single_library_test.dart b/pkg/docgen/test/single_library_test.dart
index f5e53d3..d2c94a7 100644
--- a/pkg/docgen/test/single_library_test.dart
+++ b/pkg/docgen/test/single_library_test.dart
@@ -128,7 +128,7 @@
 
           // Testing something with no reference
           var libraryDocComment = fixReference('foobar', libraryMirror,
-              classMirror, methodMirror).children.first.text;
+              classMirror, methodMirror).text;
           expect(libraryDocComment == 'foobar', isTrue);
         })).whenComplete(() => temporaryDir.deleteSync(recursive: true));
     });
diff --git a/pkg/http/lib/http.dart b/pkg/http/lib/http.dart
index 752a53b..2b76f8d 100644
--- a/pkg/http/lib/http.dart
+++ b/pkg/http/lib/http.dart
@@ -23,7 +23,7 @@
 ///     import 'package:http/http.dart' as http;
 ///
 ///     var url = "http://example.com/whatsit/create";
-///     http.post(url, fields: {"name": "doodle", "color": "blue"})
+///     http.post(url, body: {"name": "doodle", "color": "blue"})
 ///         .then((response) {
 ///       print("Response status: ${response.statusCode}");
 ///       print("Response body: ${response.body}");
@@ -38,7 +38,7 @@
 ///     var client = new http.Client();
 ///     client.post(
 ///         "http://example.com/whatsit/create",
-///         fields: {"name": "doodle", "color": "blue"})
+///         body: {"name": "doodle", "color": "blue"})
 ///       .then((response) => client.get(response.bodyFields['uri']))
 ///       .then((response) => print(response.body))
 ///       .whenComplete(client.close);
@@ -68,6 +68,7 @@
 library http;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:typed_data';
 
 import 'src/client.dart';
@@ -107,35 +108,53 @@
 Future<Response> get(url, {Map<String, String> headers}) =>
   _withClient((client) => client.get(url, headers: headers));
 
-/// Sends an HTTP POST request with the given headers and fields to the given
-/// URL, which an be a [Uri] or a [String]. If any fields are specified, the
-/// content-type is automatically set to `"application/x-www-form-urlencoded"`.
+/// Sends an HTTP POST request with the given headers and body to the given URL,
+/// which can be a [Uri] or a [String].
 ///
-/// This automatically initializes a new [Client] and closes that client once
-/// the request is complete. If you're planning on making multiple requests to
-/// the same server, you should use a single [Client] for all of those requests.
+/// [body] sets the body of the request. It can be a [String], a [List<int>] or
+/// a [Map<String, String>]. If it's a String, it's encoded using [encoding] and
+/// used as the body of the request. The content-type of the request will
+/// default to "text/plain".
+///
+/// If [body] is a List, it's used as a list of bytes for the body of the
+/// request.
+///
+/// If [body] is a Map, it's encoded as form fields using [encoding]. The
+/// content-type of the request will be set to
+/// `"application/x-www-form-urlencoded"`; this cannot be overridden.
+///
+/// [encoding] defaults to [UTF8].
 ///
 /// For more fine-grained control over the request, use [Request] or
 /// [StreamedRequest] instead.
-Future<Response> post(url,
-    {Map<String, String> headers,
-     Map<String, String> fields}) =>
-  _withClient((client) => client.post(url, headers: headers, fields: fields));
+Future<Response> post(url, {Map<String, String> headers, body,
+    Encoding encoding}) =>
+  _withClient((client) => client.post(url,
+      headers: headers, body: body, encoding: encoding));
 
-/// Sends an HTTP POST request with the given headers and fields to the given
-/// URL, which can be a [Uri] or a [String]. If any fields are specified, the
-/// content-type is automatically set to `"application/x-www-form-urlencoded"`.
+/// Sends an HTTP PUT request with the given headers and body to the given URL,
+/// which can be a [Uri] or a [String].
 ///
-/// This automatically initializes a new [Client] and closes that client once
-/// the request is complete. If you're planning on making multiple requests to
-/// the same server, you should use a single [Client] for all of those requests.
+/// [body] sets the body of the request. It can be a [String], a [List<int>] or
+/// a [Map<String, String>]. If it's a String, it's encoded using [encoding] and
+/// used as the body of the request. The content-type of the request will
+/// default to "text/plain".
+///
+/// If [body] is a List, it's used as a list of bytes for the body of the
+/// request.
+///
+/// If [body] is a Map, it's encoded as form fields using [encoding]. The
+/// content-type of the request will be set to
+/// `"application/x-www-form-urlencoded"`; this cannot be overridden.
+///
+/// [encoding] defaults to [UTF8].
 ///
 /// For more fine-grained control over the request, use [Request] or
 /// [StreamedRequest] instead.
-Future<Response> put(url,
-    {Map<String, String> headers,
-     Map<String, String> fields}) =>
-  _withClient((client) => client.put(url, headers: headers, fields: fields));
+Future<Response> put(url, {Map<String, String> headers, body,
+    Encoding encoding}) =>
+  _withClient((client) => client.put(url,
+      headers: headers, body: body, encoding: encoding));
 
 /// Sends an HTTP DELETE request with the given headers to the given URL, which
 /// can be a [Uri] or a [String].
diff --git a/pkg/http/lib/src/base_client.dart b/pkg/http/lib/src/base_client.dart
index 8c25265..86925c3 100644
--- a/pkg/http/lib/src/base_client.dart
+++ b/pkg/http/lib/src/base_client.dart
@@ -5,6 +5,7 @@
 library base_client;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
 import 'dart:typed_data';
 
@@ -33,27 +34,49 @@
   Future<Response> get(url, {Map<String, String> headers}) =>
     _sendUnstreamed("GET", url, headers);
 
-  /// Sends an HTTP POST request with the given headers and fields to the given
-  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
-  /// content-type is automatically set to
-  /// `"application/x-www-form-urlencoded"`.
+  /// Sends an HTTP POST request with the given headers and body to the given
+  /// URL, which can be a [Uri] or a [String].
+  ///
+  /// [body] sets the body of the request. It can be a [String], a [List<int>]
+  /// or a [Map<String, String>]. If it's a String, it's encoded using
+  /// [encoding] and used as the body of the request. The content-type of the
+  /// request will default to "text/plain".
+  ///
+  /// If [body] is a List, it's used as a list of bytes for the body of the
+  /// request.
+  ///
+  /// If [body] is a Map, it's encoded as form fields using [encoding]. The
+  /// content-type of the request will be set to
+  /// `"application/x-www-form-urlencoded"`; this cannot be overridden.
+  ///
+  /// [encoding] defaults to UTF-8.
   ///
   /// For more fine-grained control over the request, use [send] instead.
-  Future<Response> post(url,
-      {Map<String, String> headers,
-       Map<String, String> fields}) =>
-    _sendUnstreamed("POST", url, headers, fields);
+  Future<Response> post(url, {Map<String, String> headers, body,
+      Encoding encoding}) =>
+    _sendUnstreamed("POST", url, headers, body, encoding);
 
-  /// Sends an HTTP PUT request with the given headers and fields to the given
-  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
-  /// content-type is automatically set to
-  /// `"application/x-www-form-urlencoded"`.
+  /// Sends an HTTP PUT request with the given headers and body to the given
+  /// URL, which can be a [Uri] or a [String].
+  ///
+  /// [body] sets the body of the request. It can be a [String], a [List<int>]
+  /// or a [Map<String, String>]. If it's a String, it's encoded using
+  /// [encoding] and used as the body of the request. The content-type of the
+  /// request will default to "text/plain".
+  ///
+  /// If [body] is a List, it's used as a list of bytes for the body of the
+  /// request.
+  ///
+  /// If [body] is a Map, it's encoded as form fields using [encoding]. The
+  /// content-type of the request will be set to
+  /// `"application/x-www-form-urlencoded"`; this cannot be overridden.
+  ///
+  /// [encoding] defaults to UTF-8.
   ///
   /// For more fine-grained control over the request, use [send] instead.
-  Future<Response> put(url,
-      {Map<String, String> headers,
-       Map<String, String> fields}) =>
-    _sendUnstreamed("PUT", url, headers, fields);
+  Future<Response> put(url, {Map<String, String> headers, body,
+      Encoding encoding}) =>
+    _sendUnstreamed("PUT", url, headers, body, encoding);
 
   /// Sends an HTTP DELETE request with the given headers to the given URL,
   /// which can be a [Uri] or a [String].
@@ -103,17 +126,25 @@
   Future<StreamedResponse> send(BaseRequest request);
 
   /// Sends a non-streaming [Request] and returns a non-streaming [Response].
-  Future<Response> _sendUnstreamed(
-      String method, url, Map<String, String> headers,
-      [Map<String, String> fields]) {
-    // Wrap everything in a Future block so that synchronous validation errors
-    // are passed asynchronously through the Future chain.
-    return async.then((_) {
+  Future<Response> _sendUnstreamed(String method, url,
+      Map<String, String> headers, [body, Encoding encoding]) {
+    return new Future.sync(() {
       if (url is String) url = Uri.parse(url);
       var request = new Request(method, url);
 
       if (headers != null) request.headers.addAll(headers);
-      if (fields != null && !fields.isEmpty) request.bodyFields = fields;
+      if (encoding != null) request.encoding = encoding;
+      if (body != null) {
+        if (body is String) {
+          request.body = body;
+        } else if (body is List) {
+          request.bodyBytes = body;
+        } else if (body is Map) {
+          request.bodyFields = body;
+        } else {
+          throw new ArgumentError('Invalid request body "$body".');
+        }
+      }
 
       return send(request);
     }).then(Response.fromStream);
diff --git a/pkg/http/lib/src/byte_stream.dart b/pkg/http/lib/src/byte_stream.dart
index a154757..181d410 100644
--- a/pkg/http/lib/src/byte_stream.dart
+++ b/pkg/http/lib/src/byte_stream.dart
@@ -24,7 +24,7 @@
   /// Collects the data of this stream in a [Uint8List].
   Future<Uint8List> toBytes() {
     return fold(new BytesBuilder(), (builder, chunk) => builder..add(chunk))
-      .then((builder) => builder.takeBytes());
+        .then((builder) => builder.takeBytes());
   }
 
   /// Collect the data of this stream in a [String], decoded according to
diff --git a/pkg/http/lib/src/client.dart b/pkg/http/lib/src/client.dart
index 27626cc..1e6771f 100644
--- a/pkg/http/lib/src/client.dart
+++ b/pkg/http/lib/src/client.dart
@@ -5,6 +5,7 @@
 library client;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:typed_data';
 
 import 'base_client.dart';
@@ -39,25 +40,47 @@
   /// For more fine-grained control over the request, use [send] instead.
   Future<Response> get(url, {Map<String, String> headers});
 
-  /// Sends an HTTP POST request with the given headers and fields to the given
-  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
-  /// content-type is automatically set to
-  /// `"application/x-www-form-urlencoded"`.
+  /// Sends an HTTP POST request with the given headers and body to the given
+  /// URL, which can be a [Uri] or a [String].
+  ///
+  /// [body] sets the body of the request. It can be a [String], a [List<int>]
+  /// or a [Map<String, String>]. If it's a String, it's encoded using
+  /// [encoding] and used as the body of the request. The content-type of the
+  /// request will default to "text/plain".
+  ///
+  /// If [body] is a List, it's used as a list of bytes for the body of the
+  /// request.
+  ///
+  /// If [body] is a Map, it's encoded as form fields using [encoding]. The
+  /// content-type of the request will be set to
+  /// `"application/x-www-form-urlencoded"`; this cannot be overridden.
+  ///
+  /// [encoding] defaults to [UTF8].
   ///
   /// For more fine-grained control over the request, use [send] instead.
-  Future<Response> post(url,
-      {Map<String, String> headers,
-       Map<String, String> fields});
+  Future<Response> post(url, {Map<String, String> headers, body,
+      Encoding encoding});
 
-  /// Sends an HTTP PUT request with the given headers and fields to the given
-  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
-  /// content-type is automatically set to
-  /// `"application/x-www-form-urlencoded"`.
+  /// Sends an HTTP PUT request with the given headers and body to the given
+  /// URL, which can be a [Uri] or a [String].
+  ///
+  /// [body] sets the body of the request. It can be a [String], a [List<int>]
+  /// or a [Map<String, String>]. If it's a String, it's encoded using
+  /// [encoding] and used as the body of the request. The content-type of the
+  /// request will default to "text/plain".
+  ///
+  /// If [body] is a List, it's used as a list of bytes for the body of the
+  /// request.
+  ///
+  /// If [body] is a Map, it's encoded as form fields using [encoding]. The
+  /// content-type of the request will be set to
+  /// `"application/x-www-form-urlencoded"`; this cannot be overridden.
+  ///
+  /// [encoding] defaults to [UTF8].
   ///
   /// For more fine-grained control over the request, use [send] instead.
-  Future<Response> put(url,
-      {Map<String, String> headers,
-       Map<String, String> fields});
+  Future<Response> put(url, {Map<String, String> headers, body,
+      Encoding encoding});
 
   /// Sends an HTTP DELETE request with the given headers to the given URL,
   /// which can be a [Uri] or a [String].
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index dd3547d..8383959 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -107,17 +107,16 @@
 /// characters.
 bool isPlainAscii(String string) => _ASCII_ONLY.hasMatch(string);
 
-/// Converts [input] into a [Uint8List]. If [input] is a [TypedData], this just
-/// returns a view on [input].
+/// Converts [input] into a [Uint8List].
+///
+/// If [input] is a [TypedData], this just returns a view on [input].
 Uint8List toUint8List(List<int> input) {
   if (input is Uint8List) return input;
   if (input is TypedData) {
-    // TODO(nweiz): remove this "as" check when issue 11080 is fixed.
+    // TODO(nweiz): remove "as" when issue 11080 is fixed.
     return new Uint8List.view((input as TypedData).buffer);
   }
-  var output = new Uint8List(input.length);
-  output.setRange(0, input.length, input);
-  return output;
+  return new Uint8List.fromList(input);
 }
 
 /// If [stream] is already a [ByteStream], returns it. Otherwise, wraps it in a
@@ -216,9 +215,7 @@
 /// Configures [future] so that its result (success or exception) is passed on
 /// to [completer].
 void chainToCompleter(Future future, Completer completer) {
-  future.then((v) => completer.complete(v)).catchError((error) {
-    completer.completeError(error);
-  });
+  future.then(completer.complete, onError: completer.completeError);
 }
 
 // TOOD(nweiz): Get rid of this once https://codereview.chromium.org/11293132/
diff --git a/pkg/http/test/http_test.dart b/pkg/http/test/http_test.dart
index c6a80f2..92a14fa 100644
--- a/pkg/http/test/http_test.dart
+++ b/pkg/http/test/http_test.dart
@@ -50,8 +50,82 @@
         expect(http.post(serverUrl, headers: {
           'X-Random-Header': 'Value',
           'X-Other-Header': 'Other Value',
+          'Content-Type': 'text/plain',
           'User-Agent': 'Dart'
-        }, fields: {
+        }).then((response) {
+          expect(response.statusCode, equals(200));
+          expect(response.body, parse(equals({
+            'method': 'POST',
+            'path': '/',
+            'headers': {
+              'accept-encoding': ['gzip'],
+              'content-length': ['0'],
+              'content-type': ['text/plain'],
+              'user-agent': ['Dart'],
+              'x-random-header': ['Value'],
+              'x-other-header': ['Other Value']
+            }
+          })));
+        }), completes);
+      }), completes);
+    });
+
+    test('post with string', () {
+      expect(startServer().then((_) {
+        expect(http.post(serverUrl, headers: {
+          'X-Random-Header': 'Value',
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
+        }, body: 'request body').then((response) {
+          expect(response.statusCode, equals(200));
+          expect(response.body, parse(equals({
+            'method': 'POST',
+            'path': '/',
+            'headers': {
+              'content-type': ['text/plain; charset=utf-8'],
+              'content-length': ['12'],
+              'accept-encoding': ['gzip'],
+              'user-agent': ['Dart'],
+              'x-random-header': ['Value'],
+              'x-other-header': ['Other Value']
+            },
+            'body': 'request body'
+          })));
+        }), completes);
+      }), completes);
+    });
+
+    test('post with bytes', () {
+      expect(startServer().then((_) {
+        expect(http.post(serverUrl, headers: {
+          'X-Random-Header': 'Value',
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
+        }, body: [104, 101, 108, 108, 111]).then((response) {
+          expect(response.statusCode, equals(200));
+          expect(response.body, parse(equals({
+            'method': 'POST',
+            'path': '/',
+            'headers': {
+              'content-length': ['5'],
+              'accept-encoding': ['gzip'],
+              'user-agent': ['Dart'],
+              'x-random-header': ['Value'],
+              'x-other-header': ['Other Value']
+            },
+            'body': [104, 101, 108, 108, 111]
+          })));
+        }), completes);
+      }), completes);
+    });
+
+    test('post with fields', () {
+      expect(startServer().then((_) {
+        expect(http.post(serverUrl, headers: {
+          'X-Random-Header': 'Value',
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
+        }, body: {
           'some-field': 'value',
           'other-field': 'other value'
         }).then((response) {
@@ -75,38 +149,87 @@
       }), completes);
     });
 
-    test('post without fields', () {
-      expect(startServer().then((_) {
-        expect(http.post(serverUrl, headers: {
-          'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value',
-          'Content-Type': 'text/plain',
-          'User-Agent': 'Dart'
-        }).then((response) {
-          expect(response.statusCode, equals(200));
-          expect(response.body, parse(equals({
-            'method': 'POST',
-            'path': '/',
-            'headers': {
-              'accept-encoding': ['gzip'],
-              'content-length': ['0'],
-              'content-type': ['text/plain'],
-              'user-agent': ['Dart'],
-              'x-random-header': ['Value'],
-              'x-other-header': ['Other Value']
-            }
-          })));
-        }), completes);
-      }), completes);
-    });
-
     test('put', () {
       expect(startServer().then((_) {
         expect(http.put(serverUrl, headers: {
           'X-Random-Header': 'Value',
           'X-Other-Header': 'Other Value',
+          'Content-Type': 'text/plain',
           'User-Agent': 'Dart'
-        }, fields: {
+        }).then((response) {
+          expect(response.statusCode, equals(200));
+          expect(response.body, parse(equals({
+            'method': 'PUT',
+            'path': '/',
+            'headers': {
+              'accept-encoding': ['gzip'],
+              'content-length': ['0'],
+              'content-type': ['text/plain'],
+              'user-agent': ['Dart'],
+              'x-random-header': ['Value'],
+              'x-other-header': ['Other Value']
+            }
+          })));
+        }), completes);
+      }), completes);
+    });
+
+    test('put with string', () {
+      expect(startServer().then((_) {
+        expect(http.put(serverUrl, headers: {
+          'X-Random-Header': 'Value',
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
+        }, body: 'request body').then((response) {
+          expect(response.statusCode, equals(200));
+          expect(response.body, parse(equals({
+            'method': 'PUT',
+            'path': '/',
+            'headers': {
+              'content-type': ['text/plain; charset=utf-8'],
+              'content-length': ['12'],
+              'accept-encoding': ['gzip'],
+              'user-agent': ['Dart'],
+              'x-random-header': ['Value'],
+              'x-other-header': ['Other Value']
+            },
+            'body': 'request body'
+          })));
+        }), completes);
+      }), completes);
+    });
+
+    test('put with bytes', () {
+      expect(startServer().then((_) {
+        expect(http.put(serverUrl, headers: {
+          'X-Random-Header': 'Value',
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
+        }, body: [104, 101, 108, 108, 111]).then((response) {
+          expect(response.statusCode, equals(200));
+          expect(response.body, parse(equals({
+            'method': 'PUT',
+            'path': '/',
+            'headers': {
+              'content-length': ['5'],
+              'accept-encoding': ['gzip'],
+              'user-agent': ['Dart'],
+              'x-random-header': ['Value'],
+              'x-other-header': ['Other Value']
+            },
+            'body': [104, 101, 108, 108, 111]
+          })));
+        }), completes);
+      }), completes);
+    });
+
+    test('put with fields', () {
+      expect(startServer().then((_) {
+        expect(http.put(serverUrl, headers: {
+          'X-Random-Header': 'Value',
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
+        }, body: {
           'some-field': 'value',
           'other-field': 'other value'
         }).then((response) {
@@ -118,8 +241,8 @@
               'content-type': [
                 'application/x-www-form-urlencoded; charset=utf-8'
               ],
-              'accept-encoding': ['gzip'],
               'content-length': ['40'],
+              'accept-encoding': ['gzip'],
               'user-agent': ['Dart'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
@@ -130,31 +253,6 @@
       }), completes);
     });
 
-    test('put without fields', () {
-      expect(startServer().then((_) {
-        expect(http.put(serverUrl, headers: {
-          'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value',
-          'Content-Type': 'text/plain',
-          'User-Agent': 'Dart'
-        }).then((response) {
-          expect(response.statusCode, equals(200));
-          expect(response.body, parse(equals({
-            'method': 'PUT',
-            'path': '/',
-            'headers': {
-              'content-length': ['0'],
-              'accept-encoding': ['gzip'],
-              'content-type': ['text/plain'],
-              'user-agent': ['Dart'],
-              'x-random-header': ['Value'],
-              'x-other-header': ['Other Value']
-            }
-          })));
-        }), completes);
-      }), completes);
-    });
-
     test('delete', () {
       expect(startServer().then((_) {
         expect(http.delete(serverUrl, headers: {
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
index 07066ec..ac0eeee 100644
--- a/pkg/http/test/mock_client_test.dart
+++ b/pkg/http/test/mock_client_test.dart
@@ -22,7 +22,7 @@
           request: request, headers: {'content-type': 'application/json'}));
     });
 
-    expect(client.post("http://example.com/foo", fields: {
+    expect(client.post("http://example.com/foo", body: {
       'field1': 'value1',
       'field2': 'value2'
     }).then((response) => response.body), completion(parse(equals({
diff --git a/pkg/http/test/safe_http_server.dart b/pkg/http/test/safe_http_server.dart
index 8ce094f..5d709f9 100644
--- a/pkg/http/test/safe_http_server.dart
+++ b/pkg/http/test/safe_http_server.dart
@@ -143,5 +143,6 @@
     _inner.writeAll(objects, separator);
   void writeCharCode(int charCode) => _inner.writeCharCode(charCode);
   void writeln([Object obj = ""]) => _inner.writeln(obj);
-  void addError(error) => _inner.addError(error);
+  void addError(error, [StackTrace stackTrace]) =>
+      _inner.addError(error, stackTrace);
 }
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index f9a7381..f93ca25 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -73,7 +73,8 @@
         var requestBody;
         if (requestBodyBytes.isEmpty) {
           requestBody = null;
-        } else if (request.headers.contentType.charset != null) {
+        } else if (request.headers.contentType != null &&
+            request.headers.contentType.charset != null) {
           var encoding = requiredEncodingForCharset(
               request.headers.contentType.charset);
           requestBody = encoding.decode(requestBodyBytes);
diff --git a/pkg/logging/lib/logging.dart b/pkg/logging/lib/logging.dart
index 25213bb..37ac67d 100644
--- a/pkg/logging/lib/logging.dart
+++ b/pkg/logging/lib/logging.dart
@@ -51,7 +51,7 @@
 library logging;
 
 import 'dart:async';
-import 'package:unmodifiable_collection/unmodifiable_collection.dart';
+import 'package:collection_helpers/wrappers.dart';
 
 /**
  * Whether to allow fine-grain logging and configuration of loggers in a
diff --git a/pkg/logging/pubspec.yaml b/pkg/logging/pubspec.yaml
index 7893523..d298608 100644
--- a/pkg/logging/pubspec.yaml
+++ b/pkg/logging/pubspec.yaml
@@ -5,7 +5,7 @@
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/logging
 dependencies:
-  unmodifiable_collection: ">=0.9.0 <0.10.0"
+  collection_helpers: ">=0.9.0 <0.10.0"
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
 environment:
diff --git a/pkg/oauth2/lib/src/authorization_code_grant.dart b/pkg/oauth2/lib/src/authorization_code_grant.dart
index 266812e..c879e8c 100644
--- a/pkg/oauth2/lib/src/authorization_code_grant.dart
+++ b/pkg/oauth2/lib/src/authorization_code_grant.dart
@@ -228,7 +228,7 @@
   /// the state beforehand.
   Future<Client> _handleAuthorizationCode(String authorizationCode) {
     var startTime = new DateTime.now();
-    return _httpClient.post(this.tokenEndpoint, fields: {
+    return _httpClient.post(this.tokenEndpoint, body: {
       "grant_type": "authorization_code",
       "code": authorizationCode,
       "redirect_uri": this._redirectEndpoint.toString(),
diff --git a/pkg/oauth2/lib/src/credentials.dart b/pkg/oauth2/lib/src/credentials.dart
index 13d3320..ce4e0645 100644
--- a/pkg/oauth2/lib/src/credentials.dart
+++ b/pkg/oauth2/lib/src/credentials.dart
@@ -173,7 +173,7 @@
       };
       if (!scopes.isEmpty) fields["scope"] = scopes.join(' ');
 
-      return httpClient.post(tokenEndpoint, fields: fields);
+      return httpClient.post(tokenEndpoint, body: fields);
     }).then((response) {
       return handleAccessTokenResponse(
           response, tokenEndpoint, startTime, scopes);
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index 4d6fda6..b0d701d 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -5,7 +5,7 @@
 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.
+  OAuth2 credentials. Currently only works with dart:io.
 dependencies:
   http: ">=0.9.0 <0.10.0"
 dev_dependencies:
diff --git a/pkg/observe/lib/src/compound_path_observer.dart b/pkg/observe/lib/src/compound_path_observer.dart
index 6fee689..1594e08 100644
--- a/pkg/observe/lib/src/compound_path_observer.dart
+++ b/pkg/observe/lib/src/compound_path_observer.dart
@@ -85,6 +85,7 @@
 
   void _resolve() {
     _scheduled = false;
+    if (_observers.isEmpty) return;
     var newValue = _observers.map((o) => o.value).toList();
     if (_computeValue != null) newValue = _computeValue(newValue);
     _value = notifyPropertyChange(#value, _value, newValue);
diff --git a/pkg/observe/lib/transform.dart b/pkg/observe/lib/transform.dart
index 5e261c0..4be227f 100644
--- a/pkg/observe/lib/transform.dart
+++ b/pkg/observe/lib/transform.dart
@@ -3,413 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /**
- * Code transform for @observable. The core transformation is relatively
- * straightforward, and essentially like an editor refactoring.
+ * Code transform for @observable. This library will be removed soon, it simply
+ * reexports `observe.transformer`.
  */
+// TODO(sigmund): deprecate and delete.
 library observe.transform;
 
-import 'dart:async';
-
-import 'package:analyzer/src/generated/java_core.dart' show CharSequence;
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/scanner.dart';
-import 'package:barback/barback.dart';
-import 'package:source_maps/refactor.dart';
-import 'package:source_maps/span.dart' show SourceFile;
-
-/**
- * A [Transformer] that replaces observables based on dirty-checking with an
- * implementation based on change notifications.
- *
- * The transformation adds hooks for field setters and notifies the observation
- * system of the change.
- */
-class ObservableTransformer extends Transformer {
-
-  Future<bool> isPrimary(Asset input) {
-    if (input.id.extension != '.dart') return new Future.value(false);
-    // Note: technically we should parse the file to find accurately the
-    // observable annotation, but that seems expensive. It would require almost
-    // as much work as applying the transform. We rather have some false
-    // positives here, and then generate no outputs when we apply this
-    // transform.
-    return input.readAsString().then(
-      (c) => c.contains("@observable") || c.contains("@published"));
-  }
-
-  Future apply(Transform transform) {
-    return transform.primaryInput.readAsString().then((content) {
-      var id = transform.primaryInput.id;
-      // TODO(sigmund): improve how we compute this url
-      var url = id.path.startsWith('lib/')
-            ? 'package:${id.package}/${id.path.substring(4)}' : id.path;
-      var sourceFile = new SourceFile.text(url, content);
-      var transaction = _transformCompilationUnit(
-          content, sourceFile, transform.logger);
-      if (!transaction.hasEdits) {
-        transform.addOutput(transform.primaryInput);
-        return;
-      }
-      var printer = transaction.commit();
-      // TODO(sigmund): emit source maps when barback supports it (see
-      // dartbug.com/12340)
-      printer.build(url);
-      transform.addOutput(new Asset.fromString(id, printer.text));
-    });
-  }
-}
-
-TextEditTransaction _transformCompilationUnit(
-    String inputCode, SourceFile sourceFile, TransformLogger logger) {
-  var unit = _parseCompilationUnit(inputCode);
-  var code = new TextEditTransaction(inputCode, sourceFile);
-  for (var directive in unit.directives) {
-    if (directive is LibraryDirective && _hasObservable(directive)) {
-      logger.warning('@observable on a library no longer has any effect. '
-          'It should be placed on individual fields.',
-          span: _getSpan(sourceFile, directive));
-      break;
-    }
-  }
-
-  for (var declaration in unit.declarations) {
-    if (declaration is ClassDeclaration) {
-      _transformClass(declaration, code, sourceFile, logger);
-    } else if (declaration is TopLevelVariableDeclaration) {
-      if (_hasObservable(declaration)) {
-        logger.warning('Top-level fields can no longer be observable. '
-            'Observable fields should be put in an observable objects.',
-            span: _getSpan(sourceFile, declaration));
-      }
-    }
-  }
-  return code;
-}
-
-/** Parse [code] using analyzer. */
-CompilationUnit _parseCompilationUnit(String code) {
-  var errorListener = new _ErrorCollector();
-  var reader = new CharSequenceReader(new CharSequence(code));
-  var scanner = new Scanner(null, reader, errorListener);
-  var token = scanner.tokenize();
-  var parser = new Parser(null, errorListener);
-  return parser.parseCompilationUnit(token);
-}
-
-class _ErrorCollector extends AnalysisErrorListener {
-  final errors = <AnalysisError>[];
-  onError(error) => errors.add(error);
-}
-
-_getSpan(SourceFile file, ASTNode node) => file.span(node.offset, node.end);
-
-/** True if the node has the `@observable` or `@published` annotation. */
-// TODO(jmesserly): it is not good to be hard coding Polymer support here.
-bool _hasObservable(AnnotatedNode node) =>
-    node.metadata.any(_isObservableAnnotation);
-
-// TODO(jmesserly): this isn't correct if the annotation has been imported
-// with a prefix, or cases like that. We should technically be resolving, but
-// that is expensive in analyzer, so it isn't feasible yet.
-bool _isObservableAnnotation(Annotation node) =>
-    _isAnnotationContant(node, 'observable') ||
-    _isAnnotationContant(node, 'published') ||
-    _isAnnotationType(node, 'ObservableProperty') ||
-    _isAnnotationType(node, 'PublishedProperty');
-
-bool _isAnnotationContant(Annotation m, String name) =>
-    m.name.name == name && m.constructorName == null && m.arguments == null;
-
-bool _isAnnotationType(Annotation m, String name) => m.name == name;
-
-void _transformClass(ClassDeclaration cls, TextEditTransaction code,
-    SourceFile file, TransformLogger logger) {
-
-  if (_hasObservable(cls)) {
-    logger.warning('@observable on a class no longer has any effect. '
-        'It should be placed on individual fields.',
-        span: _getSpan(file, cls));
-  }
-
-  // We'd like to track whether observable was declared explicitly, otherwise
-  // report a warning later below. Because we don't have type analysis (only
-  // syntactic understanding of the code), we only report warnings that are
-  // known to be true.
-  var explicitObservable = false;
-  var implicitObservable = false;
-  if (cls.extendsClause != null) {
-    var id = _getSimpleIdentifier(cls.extendsClause.superclass.name);
-    if (id.name == 'Observable') {
-      code.edit(id.offset, id.end, 'ChangeNotifier');
-      explicitObservable = true;
-    } else if (id.name == 'ChangeNotifier') {
-      explicitObservable = true;
-    } else if (id.name != 'HtmlElement' && id.name != 'CustomElement'
-        && id.name != 'Object') {
-      // TODO(sigmund): this is conservative, consider using type-resolution to
-      // improve this check.
-      implicitObservable = true;
-    }
-  }
-
-  if (cls.withClause != null) {
-    for (var type in cls.withClause.mixinTypes) {
-      var id = _getSimpleIdentifier(type.name);
-      if (id.name == 'Observable') {
-        code.edit(id.offset, id.end, 'ChangeNotifier');
-        explicitObservable = true;
-        break;
-      } else if (id.name == 'ChangeNotifier') {
-        explicitObservable = true;
-        break;
-      } else {
-        // TODO(sigmund): this is conservative, consider using type-resolution
-        // to improve this check.
-        implicitObservable = true;
-      }
-    }
-  }
-
-  if (cls.implementsClause != null) {
-    // TODO(sigmund): consider adding type-resolution to give a more precise
-    // answer.
-    implicitObservable = true;
-  }
-
-  var declaresObservable = explicitObservable || implicitObservable;
-
-  // Track fields that were transformed.
-  var instanceFields = new Set<String>();
-  var getters = new List<String>();
-  var setters = new List<String>();
-
-  for (var member in cls.members) {
-    if (member is FieldDeclaration) {
-      if (member.isStatic) {
-        if (_hasObservable(member)){
-          logger.warning('Static fields can no longer be observable. '
-              'Observable fields should be put in an observable objects.',
-              span: _getSpan(file, member));
-        }
-        continue;
-      }
-      if (_hasObservable(member)) {
-        if (!declaresObservable) {
-          logger.warning('Observable fields should be put in an observable '
-              'objects. Please declare that this class extends from '
-              'Observable, includes Observable, or implements '
-              'Observable.',
-              span: _getSpan(file, member));
-        }
-        _transformFields(file, member, code, logger);
-
-        var names = member.fields.variables.map((v) => v.name.name);
-
-        getters.addAll(names);
-        if (!_isReadOnly(member.fields)) {
-          setters.addAll(names);
-          instanceFields.addAll(names);
-        }
-      }
-    }
-    // TODO(jmesserly): this is a temporary workaround until we can remove
-    // getValueWorkaround and setValueWorkaround.
-    if (member is MethodDeclaration) {
-      if (_hasKeyword(member.propertyKeyword, Keyword.GET)) {
-        getters.add(member.name.name);
-      } else if (_hasKeyword(member.propertyKeyword, Keyword.SET)) {
-        setters.add(member.name.name);
-      }
-    }
-  }
-
-  // If nothing was @observable, bail.
-  if (instanceFields.length == 0) return;
-
-  if (!explicitObservable) _mixinObservable(cls, code);
-
-  // Fix initializers, because they aren't allowed to call the setter.
-  for (var member in cls.members) {
-    if (member is ConstructorDeclaration) {
-      _fixConstructor(member, code, instanceFields);
-    }
-  }
-}
-
-/** Adds "with ChangeNotifier" and associated implementation. */
-void _mixinObservable(ClassDeclaration cls, TextEditTransaction code) {
-  // Note: we need to be careful to put the with clause after extends, but
-  // before implements clause.
-  if (cls.withClause != null) {
-    var pos = cls.withClause.end;
-    code.edit(pos, pos, ', ChangeNotifier');
-  } else if (cls.extendsClause != null) {
-    var pos = cls.extendsClause.end;
-    code.edit(pos, pos, ' with ChangeNotifier ');
-  } else {
-    var params = cls.typeParameters;
-    var pos =  params != null ? params.end : cls.name.end;
-    code.edit(pos, pos, ' extends ChangeNotifier ');
-  }
-}
-
-SimpleIdentifier _getSimpleIdentifier(Identifier id) =>
-    id is PrefixedIdentifier ? id.identifier : id;
-
-
-bool _hasKeyword(Token token, Keyword keyword) =>
-    token is KeywordToken && token.keyword == keyword;
-
-String _getOriginalCode(TextEditTransaction code, ASTNode node) =>
-    code.original.substring(node.offset, node.end);
-
-void _fixConstructor(ConstructorDeclaration ctor, TextEditTransaction code,
-    Set<String> changedFields) {
-
-  // Fix normal initializers
-  for (var initializer in ctor.initializers) {
-    if (initializer is ConstructorFieldInitializer) {
-      var field = initializer.fieldName;
-      if (changedFields.contains(field.name)) {
-        code.edit(field.offset, field.end, '__\$${field.name}');
-      }
-    }
-  }
-
-  // Fix "this." initializer in parameter list. These are tricky:
-  // we need to preserve the name and add an initializer.
-  // Preserving the name is important for named args, and for dartdoc.
-  // BEFORE: Foo(this.bar, this.baz) { ... }
-  // AFTER:  Foo(bar, baz) : __$bar = bar, __$baz = baz { ... }
-
-  var thisInit = [];
-  for (var param in ctor.parameters.parameters) {
-    if (param is DefaultFormalParameter) {
-      param = param.parameter;
-    }
-    if (param is FieldFormalParameter) {
-      var name = param.identifier.name;
-      if (changedFields.contains(name)) {
-        thisInit.add(name);
-        // Remove "this." but keep everything else.
-        code.edit(param.thisToken.offset, param.period.end, '');
-      }
-    }
-  }
-
-  if (thisInit.length == 0) return;
-
-  // TODO(jmesserly): smarter formatting with indent, etc.
-  var inserted = thisInit.map((i) => '__\$$i = $i').join(', ');
-
-  int offset;
-  if (ctor.separator != null) {
-    offset = ctor.separator.end;
-    inserted = ' $inserted,';
-  } else {
-    offset = ctor.parameters.end;
-    inserted = ' : $inserted';
-  }
-
-  code.edit(offset, offset, inserted);
-}
-
-bool _isReadOnly(VariableDeclarationList fields) {
-  return _hasKeyword(fields.keyword, Keyword.CONST) ||
-      _hasKeyword(fields.keyword, Keyword.FINAL);
-}
-
-void _transformFields(SourceFile file, FieldDeclaration member,
-    TextEditTransaction code, TransformLogger logger) {
-
-  final fields = member.fields;
-  if (_isReadOnly(fields)) return;
-
-  // Private fields aren't supported:
-  for (var field in fields.variables) {
-    final name = field.name.name;
-    if (Identifier.isPrivateName(name)) {
-      logger.warning('Cannot make private field $name observable.',
-          span: _getSpan(file, field));
-      return;
-    }
-  }
-
-  // Unfortunately "var" doesn't work in all positions where type annotations
-  // are allowed, such as "var get name". So we use "dynamic" instead.
-  var type = 'dynamic';
-  if (fields.type != null) {
-    type = _getOriginalCode(code, fields.type);
-  } else if (_hasKeyword(fields.keyword, Keyword.VAR)) {
-    // Replace 'var' with 'dynamic'
-    code.edit(fields.keyword.offset, fields.keyword.end, type);
-  }
-
-  // Note: the replacements here are a bit subtle. It needs to support multiple
-  // fields declared via the same @observable, as well as preserving newlines.
-  // (Preserving newlines is important because it allows the generated code to
-  // be debugged without needing a source map.)
-  //
-  // For example:
-  //
-  //     @observable
-  //     @otherMetaData
-  //         Foo
-  //             foo = 1, bar = 2,
-  //             baz;
-  //
-  // Will be transformed into something like:
-  //
-  //     @reflectable @observable
-  //     @OtherMetaData()
-  //         Foo
-  //             get foo => __foo; Foo __foo = 1; @reflectable set foo ...; ...
-  //             @observable @OtherMetaData() Foo get baz => __baz; Foo baz; ...
-  //
-  // Metadata is moved to the getter.
-
-  String metadata = '';
-  if (fields.variables.length > 1) {
-    metadata = member.metadata
-      .map((m) => _getOriginalCode(code, m))
-      .join(' ');
-    metadata = '@reflectable $metadata';
-  }
-
-  for (int i = 0; i < fields.variables.length; i++) {
-    final field = fields.variables[i];
-    final name = field.name.name;
-
-    var beforeInit = 'get $name => __\$$name; $type __\$$name';
-
-    // The first field is expanded differently from subsequent fields, because
-    // we can reuse the metadata and type annotation.
-    if (i == 0) {
-      final begin = member.metadata.first.offset;
-      code.edit(begin, begin, '@reflectable ');
-    } else {
-      beforeInit = '$metadata $type $beforeInit';
-    }
-
-    code.edit(field.name.offset, field.name.end, beforeInit);
-
-    // Replace comma with semicolon
-    final end = _findFieldSeperator(field.endToken.next);
-    if (end.type == TokenType.COMMA) code.edit(end.offset, end.end, ';');
-
-    code.edit(end.end, end.end, ' @reflectable set $name($type value) { '
-        '__\$$name = notifyPropertyChange(#$name, __\$$name, value); }');
-  }
-}
-
-Token _findFieldSeperator(Token token) {
-  while (token != null) {
-    if (token.type == TokenType.COMMA || token.type == TokenType.SEMICOLON) {
-      break;
-    }
-    token = token.next;
-  }
-  return token;
-}
+export 'transformer.dart';
diff --git a/pkg/observe/lib/transformer.dart b/pkg/observe/lib/transformer.dart
new file mode 100644
index 0000000..7e29672
--- /dev/null
+++ b/pkg/observe/lib/transformer.dart
@@ -0,0 +1,440 @@
+// 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.
+
+/**
+ * Code transform for @observable. The core transformation is relatively
+ * straightforward, and essentially like an editor refactoring.
+ */
+library observe.transformer;
+
+import 'dart:async';
+
+import 'package:analyzer/src/generated/java_core.dart' show CharSequence;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:barback/barback.dart';
+import 'package:source_maps/refactor.dart';
+import 'package:source_maps/span.dart' show SourceFile;
+
+/**
+ * A [Transformer] that replaces observables based on dirty-checking with an
+ * implementation based on change notifications.
+ *
+ * The transformation adds hooks for field setters and notifies the observation
+ * system of the change.
+ */
+class ObservableTransformer extends Transformer {
+
+  final List<String> _files;
+  ObservableTransformer() : _files = null;
+  ObservableTransformer.asPlugin(BarbackSettings settings)
+      : _files = _readFiles(settings.configuration['files']);
+
+  static List<String> _readFiles(value) {
+    if (value == null) return null;
+    var files = [];
+    bool error;
+    if (value is List) {
+      files = value;
+      error = value.any((e) => e is! String);
+    } else if (value is String) {
+      files = [value];
+      error = false;
+    } else {
+      error = true;
+    }
+    if (error) print('Invalid value for "files" in the observe transformer.');
+    return files;
+  }
+
+  Future<bool> isPrimary(Asset input) {
+    if (input.id.extension != '.dart' ||
+        (_files != null && !_files.contains(input.id.path))) {
+      return new Future.value(false);
+    }
+    // Note: technically we should parse the file to find accurately the
+    // observable annotation, but that seems expensive. It would require almost
+    // as much work as applying the transform. We rather have some false
+    // positives here, and then generate no outputs when we apply this
+    // transform.
+    return input.readAsString().then(
+      (c) => c.contains("@observable") || c.contains("@published"));
+  }
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((content) {
+      var id = transform.primaryInput.id;
+      // TODO(sigmund): improve how we compute this url
+      var url = id.path.startsWith('lib/')
+            ? 'package:${id.package}/${id.path.substring(4)}' : id.path;
+      var sourceFile = new SourceFile.text(url, content);
+      var transaction = _transformCompilationUnit(
+          content, sourceFile, transform.logger);
+      if (!transaction.hasEdits) {
+        transform.addOutput(transform.primaryInput);
+        return;
+      }
+      var printer = transaction.commit();
+      // TODO(sigmund): emit source maps when barback supports it (see
+      // dartbug.com/12340)
+      printer.build(url);
+      transform.addOutput(new Asset.fromString(id, printer.text));
+    });
+  }
+}
+
+TextEditTransaction _transformCompilationUnit(
+    String inputCode, SourceFile sourceFile, TransformLogger logger) {
+  var unit = _parseCompilationUnit(inputCode);
+  var code = new TextEditTransaction(inputCode, sourceFile);
+  for (var directive in unit.directives) {
+    if (directive is LibraryDirective && _hasObservable(directive)) {
+      logger.warning('@observable on a library no longer has any effect. '
+          'It should be placed on individual fields.',
+          span: _getSpan(sourceFile, directive));
+      break;
+    }
+  }
+
+  for (var declaration in unit.declarations) {
+    if (declaration is ClassDeclaration) {
+      _transformClass(declaration, code, sourceFile, logger);
+    } else if (declaration is TopLevelVariableDeclaration) {
+      if (_hasObservable(declaration)) {
+        logger.warning('Top-level fields can no longer be observable. '
+            'Observable fields should be put in an observable objects.',
+            span: _getSpan(sourceFile, declaration));
+      }
+    }
+  }
+  return code;
+}
+
+/** Parse [code] using analyzer. */
+CompilationUnit _parseCompilationUnit(String code) {
+  var errorListener = new _ErrorCollector();
+  var reader = new CharSequenceReader(new CharSequence(code));
+  var scanner = new Scanner(null, reader, errorListener);
+  var token = scanner.tokenize();
+  var parser = new Parser(null, errorListener);
+  return parser.parseCompilationUnit(token);
+}
+
+class _ErrorCollector extends AnalysisErrorListener {
+  final errors = <AnalysisError>[];
+  onError(error) => errors.add(error);
+}
+
+_getSpan(SourceFile file, ASTNode node) => file.span(node.offset, node.end);
+
+/** True if the node has the `@observable` or `@published` annotation. */
+// TODO(jmesserly): it is not good to be hard coding Polymer support here.
+bool _hasObservable(AnnotatedNode node) =>
+    node.metadata.any(_isObservableAnnotation);
+
+// TODO(jmesserly): this isn't correct if the annotation has been imported
+// with a prefix, or cases like that. We should technically be resolving, but
+// that is expensive in analyzer, so it isn't feasible yet.
+bool _isObservableAnnotation(Annotation node) =>
+    _isAnnotationContant(node, 'observable') ||
+    _isAnnotationContant(node, 'published') ||
+    _isAnnotationType(node, 'ObservableProperty') ||
+    _isAnnotationType(node, 'PublishedProperty');
+
+bool _isAnnotationContant(Annotation m, String name) =>
+    m.name.name == name && m.constructorName == null && m.arguments == null;
+
+bool _isAnnotationType(Annotation m, String name) => m.name == name;
+
+void _transformClass(ClassDeclaration cls, TextEditTransaction code,
+    SourceFile file, TransformLogger logger) {
+
+  if (_hasObservable(cls)) {
+    logger.warning('@observable on a class no longer has any effect. '
+        'It should be placed on individual fields.',
+        span: _getSpan(file, cls));
+  }
+
+  // We'd like to track whether observable was declared explicitly, otherwise
+  // report a warning later below. Because we don't have type analysis (only
+  // syntactic understanding of the code), we only report warnings that are
+  // known to be true.
+  var explicitObservable = false;
+  var implicitObservable = false;
+  if (cls.extendsClause != null) {
+    var id = _getSimpleIdentifier(cls.extendsClause.superclass.name);
+    if (id.name == 'Observable') {
+      code.edit(id.offset, id.end, 'ChangeNotifier');
+      explicitObservable = true;
+    } else if (id.name == 'ChangeNotifier') {
+      explicitObservable = true;
+    } else if (id.name != 'HtmlElement' && id.name != 'CustomElement'
+        && id.name != 'Object') {
+      // TODO(sigmund): this is conservative, consider using type-resolution to
+      // improve this check.
+      implicitObservable = true;
+    }
+  }
+
+  if (cls.withClause != null) {
+    for (var type in cls.withClause.mixinTypes) {
+      var id = _getSimpleIdentifier(type.name);
+      if (id.name == 'Observable') {
+        code.edit(id.offset, id.end, 'ChangeNotifier');
+        explicitObservable = true;
+        break;
+      } else if (id.name == 'ChangeNotifier') {
+        explicitObservable = true;
+        break;
+      } else {
+        // TODO(sigmund): this is conservative, consider using type-resolution
+        // to improve this check.
+        implicitObservable = true;
+      }
+    }
+  }
+
+  if (cls.implementsClause != null) {
+    // TODO(sigmund): consider adding type-resolution to give a more precise
+    // answer.
+    implicitObservable = true;
+  }
+
+  var declaresObservable = explicitObservable || implicitObservable;
+
+  // Track fields that were transformed.
+  var instanceFields = new Set<String>();
+  var getters = new List<String>();
+  var setters = new List<String>();
+
+  for (var member in cls.members) {
+    if (member is FieldDeclaration) {
+      if (member.isStatic) {
+        if (_hasObservable(member)){
+          logger.warning('Static fields can no longer be observable. '
+              'Observable fields should be put in an observable objects.',
+              span: _getSpan(file, member));
+        }
+        continue;
+      }
+      if (_hasObservable(member)) {
+        if (!declaresObservable) {
+          logger.warning('Observable fields should be put in an observable '
+              'objects. Please declare that this class extends from '
+              'Observable, includes Observable, or implements '
+              'Observable.',
+              span: _getSpan(file, member));
+        }
+        _transformFields(file, member, code, logger);
+
+        var names = member.fields.variables.map((v) => v.name.name);
+
+        getters.addAll(names);
+        if (!_isReadOnly(member.fields)) {
+          setters.addAll(names);
+          instanceFields.addAll(names);
+        }
+      }
+    }
+    // TODO(jmesserly): this is a temporary workaround until we can remove
+    // getValueWorkaround and setValueWorkaround.
+    if (member is MethodDeclaration) {
+      if (_hasKeyword(member.propertyKeyword, Keyword.GET)) {
+        getters.add(member.name.name);
+      } else if (_hasKeyword(member.propertyKeyword, Keyword.SET)) {
+        setters.add(member.name.name);
+      }
+    }
+  }
+
+  // If nothing was @observable, bail.
+  if (instanceFields.length == 0) return;
+
+  if (!explicitObservable) _mixinObservable(cls, code);
+
+  // Fix initializers, because they aren't allowed to call the setter.
+  for (var member in cls.members) {
+    if (member is ConstructorDeclaration) {
+      _fixConstructor(member, code, instanceFields);
+    }
+  }
+}
+
+/** Adds "with ChangeNotifier" and associated implementation. */
+void _mixinObservable(ClassDeclaration cls, TextEditTransaction code) {
+  // Note: we need to be careful to put the with clause after extends, but
+  // before implements clause.
+  if (cls.withClause != null) {
+    var pos = cls.withClause.end;
+    code.edit(pos, pos, ', ChangeNotifier');
+  } else if (cls.extendsClause != null) {
+    var pos = cls.extendsClause.end;
+    code.edit(pos, pos, ' with ChangeNotifier ');
+  } else {
+    var params = cls.typeParameters;
+    var pos =  params != null ? params.end : cls.name.end;
+    code.edit(pos, pos, ' extends ChangeNotifier ');
+  }
+}
+
+SimpleIdentifier _getSimpleIdentifier(Identifier id) =>
+    id is PrefixedIdentifier ? id.identifier : id;
+
+
+bool _hasKeyword(Token token, Keyword keyword) =>
+    token is KeywordToken && token.keyword == keyword;
+
+String _getOriginalCode(TextEditTransaction code, ASTNode node) =>
+    code.original.substring(node.offset, node.end);
+
+void _fixConstructor(ConstructorDeclaration ctor, TextEditTransaction code,
+    Set<String> changedFields) {
+
+  // Fix normal initializers
+  for (var initializer in ctor.initializers) {
+    if (initializer is ConstructorFieldInitializer) {
+      var field = initializer.fieldName;
+      if (changedFields.contains(field.name)) {
+        code.edit(field.offset, field.end, '__\$${field.name}');
+      }
+    }
+  }
+
+  // Fix "this." initializer in parameter list. These are tricky:
+  // we need to preserve the name and add an initializer.
+  // Preserving the name is important for named args, and for dartdoc.
+  // BEFORE: Foo(this.bar, this.baz) { ... }
+  // AFTER:  Foo(bar, baz) : __$bar = bar, __$baz = baz { ... }
+
+  var thisInit = [];
+  for (var param in ctor.parameters.parameters) {
+    if (param is DefaultFormalParameter) {
+      param = param.parameter;
+    }
+    if (param is FieldFormalParameter) {
+      var name = param.identifier.name;
+      if (changedFields.contains(name)) {
+        thisInit.add(name);
+        // Remove "this." but keep everything else.
+        code.edit(param.thisToken.offset, param.period.end, '');
+      }
+    }
+  }
+
+  if (thisInit.length == 0) return;
+
+  // TODO(jmesserly): smarter formatting with indent, etc.
+  var inserted = thisInit.map((i) => '__\$$i = $i').join(', ');
+
+  int offset;
+  if (ctor.separator != null) {
+    offset = ctor.separator.end;
+    inserted = ' $inserted,';
+  } else {
+    offset = ctor.parameters.end;
+    inserted = ' : $inserted';
+  }
+
+  code.edit(offset, offset, inserted);
+}
+
+bool _isReadOnly(VariableDeclarationList fields) {
+  return _hasKeyword(fields.keyword, Keyword.CONST) ||
+      _hasKeyword(fields.keyword, Keyword.FINAL);
+}
+
+void _transformFields(SourceFile file, FieldDeclaration member,
+    TextEditTransaction code, TransformLogger logger) {
+
+  final fields = member.fields;
+  if (_isReadOnly(fields)) return;
+
+  // Private fields aren't supported:
+  for (var field in fields.variables) {
+    final name = field.name.name;
+    if (Identifier.isPrivateName(name)) {
+      logger.warning('Cannot make private field $name observable.',
+          span: _getSpan(file, field));
+      return;
+    }
+  }
+
+  // Unfortunately "var" doesn't work in all positions where type annotations
+  // are allowed, such as "var get name". So we use "dynamic" instead.
+  var type = 'dynamic';
+  if (fields.type != null) {
+    type = _getOriginalCode(code, fields.type);
+  } else if (_hasKeyword(fields.keyword, Keyword.VAR)) {
+    // Replace 'var' with 'dynamic'
+    code.edit(fields.keyword.offset, fields.keyword.end, type);
+  }
+
+  // Note: the replacements here are a bit subtle. It needs to support multiple
+  // fields declared via the same @observable, as well as preserving newlines.
+  // (Preserving newlines is important because it allows the generated code to
+  // be debugged without needing a source map.)
+  //
+  // For example:
+  //
+  //     @observable
+  //     @otherMetaData
+  //         Foo
+  //             foo = 1, bar = 2,
+  //             baz;
+  //
+  // Will be transformed into something like:
+  //
+  //     @reflectable @observable
+  //     @OtherMetaData()
+  //         Foo
+  //             get foo => __foo; Foo __foo = 1; @reflectable set foo ...; ...
+  //             @observable @OtherMetaData() Foo get baz => __baz; Foo baz; ...
+  //
+  // Metadata is moved to the getter.
+
+  String metadata = '';
+  if (fields.variables.length > 1) {
+    metadata = member.metadata
+      .map((m) => _getOriginalCode(code, m))
+      .join(' ');
+    metadata = '@reflectable $metadata';
+  }
+
+  for (int i = 0; i < fields.variables.length; i++) {
+    final field = fields.variables[i];
+    final name = field.name.name;
+
+    var beforeInit = 'get $name => __\$$name; $type __\$$name';
+
+    // The first field is expanded differently from subsequent fields, because
+    // we can reuse the metadata and type annotation.
+    if (i == 0) {
+      final begin = member.metadata.first.offset;
+      code.edit(begin, begin, '@reflectable ');
+    } else {
+      beforeInit = '$metadata $type $beforeInit';
+    }
+
+    code.edit(field.name.offset, field.name.end, beforeInit);
+
+    // Replace comma with semicolon
+    final end = _findFieldSeperator(field.endToken.next);
+    if (end.type == TokenType.COMMA) code.edit(end.offset, end.end, ';');
+
+    code.edit(end.end, end.end, ' @reflectable set $name($type value) { '
+        '__\$$name = notifyPropertyChange(#$name, __\$$name, value); }');
+  }
+}
+
+Token _findFieldSeperator(Token token) {
+  while (token != null) {
+    if (token.type == TokenType.COMMA || token.type == TokenType.SEMICOLON) {
+      break;
+    }
+    token = token.next;
+  }
+  return token;
+}
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 5c6f23f..7938f6e 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,6 +1,6 @@
 name: observe
-version: 0.9.0
-author: Web UI Team <web-ui-dev@dartlang.org>
+version: 0.9.1-dev
+author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in Model-Driven-Views (MDV).
   MDV extends HTML and the DOM APIs to support a sensible separation between the
diff --git a/pkg/observe/test/transform_test.dart b/pkg/observe/test/transformer_test.dart
similarity index 99%
rename from pkg/observe/test/transform_test.dart
rename to pkg/observe/test/transformer_test.dart
index b42f578..a2f6b5b 100644
--- a/pkg/observe/test/transform_test.dart
+++ b/pkg/observe/test/transformer_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 import 'package:barback/barback.dart';
-import 'package:observe/transform.dart';
+import 'package:observe/transformer.dart';
 import 'package:unittest/compact_vm_config.dart';
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/path/README.md b/pkg/path/README.md
index eff60de..2e3eec1 100644
--- a/pkg/path/README.md
+++ b/pkg/path/README.md
@@ -7,7 +7,7 @@
 platform you run it on, including in the browser. When you use the top-level
 functions, it will assume the current platform's path style and work with
 that. If you want to explicitly work with paths of a specific style, you can
-construct a `path.Builder` for that style.
+construct a `path.Context` for that style.
 
 ## Using
 
@@ -27,10 +27,10 @@
 
 If you want to work with paths for a specific platform regardless of the
 underlying platform that the program is running on, you can create a
-[Builder] and give it an explicit [Style]:
+[Context] and give it an explicit [Style]:
 
-    var builder = new path.Builder(style: Style.windows);
-    builder.join("directory", "file.txt");
+    var context = new path.Context(style: Style.windows);
+    context.join("directory", "file.txt");
 
 This will join "directory" and "file.txt" using the Windows path separator,
 even when the program is run on a POSIX machine.
diff --git a/pkg/path/lib/path.dart b/pkg/path/lib/path.dart
index da4c935..7ff858c 100644
--- a/pkg/path/lib/path.dart
+++ b/pkg/path/lib/path.dart
@@ -37,77 +37,80 @@
 ///
 /// If you want to work with paths for a specific platform regardless of the
 /// underlying platform that the program is running on, you can create a
-/// [Builder] and give it an explicit [Style]:
+/// [Context] and give it an explicit [Style]:
 ///
-///     var builder = new path.Builder(style: Style.windows);
-///     builder.join("directory", "file.txt");
+///     var context = new path.Context(style: Style.windows);
+///     context.join("directory", "file.txt");
 ///
 /// This will join "directory" and "file.txt" using the Windows path separator,
 /// even when the program is run on a POSIX machine.
 library path;
 
-@MirrorsUsed(targets: 'dart.dom.html.window, '
-    'dart.io.Directory.current, '
-    'dart.io.Platform.operatingSystem')
-import 'dart:mirrors';
+import 'src/context.dart';
+import 'src/style.dart';
 
-/// An internal builder for the current OS so we can provide a straight
+export 'src/context.dart';
+export 'src/path_exception.dart';
+export 'src/style.dart';
+
+/// A default context for manipulating POSIX paths.
+final posix = new Context(style: Style.posix);
+
+/// A default context for manipulating Windows paths.
+final windows = new Context(style: Style.windows);
+
+/// A default context for manipulating URLs.
+final url = new Context(style: Style.url);
+
+/// The result of [Uri.base] last time the current working directory was
+/// calculated.
+///
+/// This is used to invalidate [_cachedContext] when the working directory has
+/// changed since the last time a function was called.
+Uri _lastBaseUri;
+
+/// An internal context for the current OS so we can provide a straight
 /// functional interface and not require users to create one.
-final _builder = new Builder();
+Context get _context {
+  if (_cachedContext != null && Uri.base == _lastBaseUri) return _cachedContext;
+  _lastBaseUri = Uri.base;
+  _cachedContext = new Context();
+  return _cachedContext;
+}
+Context _cachedContext;
 
-/// A default builder for manipulating POSIX paths.
-final posix = new Builder(style: Style.posix);
-
-/// A default builder for manipulating Windows paths.
-final windows = new Builder(style: Style.windows);
-
-/// A default builder for manipulating URLs.
-final url = new Builder(style: Style.url);
-
-/// Inserts [length] elements in front of the [list] and fills them with the
-/// [fillValue].
-void _growListFront(List list, int length, fillValue) =>
-  list.insertAll(0, new List.filled(length, fillValue));
-
-/// If we're running in the server-side Dart VM, this will return a
-/// [LibraryMirror] that gives access to the `dart:io` library.
+/// Returns the [Style] of the current context.
 ///
-/// If `dart:io` is not available, this returns null.
-LibraryMirror get _io => currentMirrorSystem().libraries[Uri.parse('dart:io')];
-
-// TODO(nweiz): when issue 6490 or 6943 are fixed, make this work under dart2js.
-/// If we're running in Dartium, this will return a [LibraryMirror] that gives
-/// access to the `dart:html` library.
-///
-/// If `dart:html` is not available, this returns null.
-LibraryMirror get _html =>
-  currentMirrorSystem().libraries[Uri.parse('dart:html')];
+/// This is the style that all top-level path functions will use.
+Style get style => _context.style;
 
 /// Gets the path to the current working directory.
 ///
-/// In the browser, this means the current URL. When using dart2js, this
-/// currently returns `.` due to technical constraints. In the future, it will
-/// return the current URL.
+/// In the browser, this means the current URL, without the last file segment.
 String get current {
-  if (_io != null) {
-    return (_io.declarations[#Directory] as ClassMirror)
-        .getField(#current).reflectee.path;
-  } else if (_html != null) {
-    return _html.getField(#window).reflectee.location.href;
+  var uri = Uri.base;
+  if (Style.platform == Style.url) {
+    return uri.resolve('.').toString();
   } else {
-    return '.';
+    var path = uri.toFilePath();
+    // Remove trailing '/' or '\'.
+    int lastIndex = path.length - 1;
+    assert(path[lastIndex] == '/' || path[lastIndex] == '\\');
+    return path.substring(0, lastIndex);
   }
 }
 
 /// Gets the path separator for the current platform. This is `\` on Windows
 /// and `/` on other platforms (including the browser).
-String get separator => _builder.separator;
+String get separator => _context.separator;
 
-/// Converts [path] to an absolute path by resolving it relative to the current
-/// working directory. If [path] is already an absolute path, just returns it.
+/// Creates a new path by appending the given path parts to [current].
+/// Equivalent to [join()] with [current] as the first argument. Example:
 ///
-///     path.absolute('foo/bar.txt'); // -> /your/current/dir/foo/bar.txt
-String absolute(String path) => join(current, path);
+///     path.absolute('path', 'to/foo'); // -> '/your/current/dir/path/to/foo'
+String absolute(String part1, [String part2, String part3, String part4,
+            String part5, String part6, String part7]) =>
+  _context.absolute(part1, part2, part3, part4, part5, part6, part7);
 
 /// Gets the part of [path] after the last separator.
 ///
@@ -116,8 +119,8 @@
 ///
 /// Trailing separators are ignored.
 ///
-///     builder.basename('path/to/'); // -> 'to'
-String basename(String path) => _builder.basename(path);
+///     path.basename('path/to/'); // -> 'to'
+String basename(String path) => _context.basename(path);
 
 /// Gets the part of [path] after the last separator, and without any trailing
 /// file extension.
@@ -126,9 +129,9 @@
 ///
 /// Trailing separators are ignored.
 ///
-///     builder.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo'
+///     path.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo'
 String basenameWithoutExtension(String path) =>
-    _builder.basenameWithoutExtension(path);
+    _context.basenameWithoutExtension(path);
 
 /// Gets the part of [path] before the last separator.
 ///
@@ -137,7 +140,7 @@
 ///
 /// Trailing separators are ignored.
 ///
-///     builder.dirname('path/to/'); // -> 'path'
+///     path.dirname('path/to/'); // -> 'path'
 ///
 /// If an absolute path contains no directories, only a root, then the root
 /// is returned.
@@ -149,7 +152,7 @@
 ///
 ///     path.dirname('foo');  // -> '.'
 ///     path.dirname('');  // -> '.'
-String dirname(String path) => _builder.dirname(path);
+String dirname(String path) => _context.dirname(path);
 
 /// Gets the file extension of [path]: the portion of [basename] from the last
 /// `.` to the end (including the `.` itself).
@@ -164,7 +167,7 @@
 ///
 ///     path.extension('~/.bashrc');    // -> ''
 ///     path.extension('~/.notes.txt'); // -> '.txt'
-String extension(String path) => _builder.extension(path);
+String extension(String path) => _context.extension(path);
 
 // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
 /// Returns the root of [path], if it's absolute, or the empty string if it's
@@ -182,7 +185,7 @@
 ///     path.rootPrefix('path/to/foo'); // -> ''
 ///     path.rootPrefix('http://dartlang.org/path/to/foo');
 ///       // -> 'http://dartlang.org'
-String rootPrefix(String path) => _builder.rootPrefix(path);
+String rootPrefix(String path) => _context.rootPrefix(path);
 
 /// Returns `true` if [path] is an absolute path and `false` if it is a
 /// relative path.
@@ -196,13 +199,13 @@
 /// relative to the root of the current URL. Since root-relative paths are still
 /// absolute in every other sense, [isAbsolute] will return true for them. They
 /// can be detected using [isRootRelative].
-bool isAbsolute(String path) => _builder.isAbsolute(path);
+bool isAbsolute(String path) => _context.isAbsolute(path);
 
 /// Returns `true` if [path] is a relative path and `false` if it is absolute.
 /// On POSIX systems, absolute paths start with a `/` (forward slash). On
 /// Windows, an absolute path starts with `\\`, or a drive letter followed by
 /// `:/` or `:\`.
-bool isRelative(String path) => _builder.isRelative(path);
+bool isRelative(String path) => _context.isRelative(path);
 
 /// Returns `true` if [path] is a root-relative path and `false` if it's not.
 ///
@@ -212,7 +215,7 @@
 /// can be detected using [isRootRelative].
 ///
 /// No POSIX and Windows paths are root-relative.
-bool isRootRelative(String path) => _builder.isRootRelative(path);
+bool isRootRelative(String path) => _context.isRootRelative(path);
 
 /// Joins the given path parts into a single path using the current platform's
 /// [separator]. Example:
@@ -229,7 +232,7 @@
 ///     path.join('path', '/to', 'foo'); // -> '/to/foo'
 String join(String part1, [String part2, String part3, String part4,
             String part5, String part6, String part7, String part8]) =>
-  _builder.join(part1, part2, part3, part4, part5, part6, part7, part8);
+  _context.join(part1, part2, part3, part4, part5, part6, part7, part8);
 
 /// Joins the given path parts into a single path using the current platform's
 /// [separator]. Example:
@@ -246,7 +249,7 @@
 ///     path.joinAll(['path', '/to', 'foo']); // -> '/to/foo'
 ///
 /// For a fixed number of parts, [join] is usually terser.
-String joinAll(Iterable<String> parts) => _builder.joinAll(parts);
+String joinAll(Iterable<String> parts) => _context.joinAll(parts);
 
 // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
 /// Splits [path] into its components using the current platform's [separator].
@@ -269,13 +272,13 @@
 ///     // Browser
 ///     path.split('http://dartlang.org/path/to/foo');
 ///       // -> ['http://dartlang.org', 'path', 'to', 'foo']
-List<String> split(String path) => _builder.split(path);
+List<String> split(String path) => _context.split(path);
 
 /// Normalizes [path], simplifying it by handling `..`, and `.`, and
 /// removing redundant path separators whenever possible.
 ///
 ///     path.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
-String normalize(String path) => _builder.normalize(path);
+String normalize(String path) => _context.normalize(path);
 
 /// Attempts to convert [path] to an equivalent relative path from the current
 /// directory.
@@ -305,12 +308,19 @@
 ///     path.relative('http://dartlang.org', from: 'http://pub.dartlang.org');
 ///       // -> 'http://dartlang.org'
 String relative(String path, {String from}) =>
-    _builder.relative(path, from: from);
+    _context.relative(path, from: from);
+
+/// Returns `true` if [child] is a path beneath `parent`, and `false` otherwise.
+///
+///     path.isWithin('/root/path', '/root/path/a'); // -> true
+///     path.isWithin('/root/path', '/root/other'); // -> false
+///     path.isWithin('/root/path', '/root/path') // -> false
+bool isWithin(String parent, String child) => _context.isWithin(parent, child);
 
 /// Removes a trailing extension from the last part of [path].
 ///
 ///     withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
-String withoutExtension(String path) => _builder.withoutExtension(path);
+String withoutExtension(String path) => _context.withoutExtension(path);
 
 /// Returns the path represented by [uri].
 ///
@@ -328,7 +338,7 @@
 ///     // URL
 ///     path.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
 ///       // -> 'http://dartlang.org/path/to/foo'
-String fromUri(Uri uri) => _builder.fromUri(uri);
+String fromUri(Uri uri) => _context.fromUri(uri);
 
 /// Returns the URI that represents [path].
 ///
@@ -351,856 +361,4 @@
 ///
 ///     path.toUri('path/to/foo')
 ///       // -> Uri.parse('path/to/foo')
-Uri toUri(String path) => _builder.toUri(path);
-
-/// Validates that there are no non-null arguments following a null one and
-/// throws an appropriate [ArgumentError] on failure.
-_validateArgList(String method, List<String> args) {
-  for (var i = 1; i < args.length; i++) {
-    // Ignore nulls hanging off the end.
-    if (args[i] == null || args[i - 1] != null) continue;
-
-    var numArgs;
-    for (numArgs = args.length; numArgs >= 1; numArgs--) {
-      if (args[numArgs - 1] != null) break;
-    }
-
-    // Show the arguments.
-    var message = new StringBuffer();
-    message.write("$method(");
-    message.write(args.take(numArgs)
-        .map((arg) => arg == null ? "null" : '"$arg"')
-        .join(", "));
-    message.write("): part ${i - 1} was null, but part $i was not.");
-    throw new ArgumentError(message.toString());
-  }
-}
-
-/// An instantiable class for manipulating paths. Unlike the top-level
-/// functions, this lets you explicitly select what platform the paths will use.
-class Builder {
-  /// Creates a new path builder for the given style and root directory.
-  ///
-  /// If [style] is omitted, it uses the host operating system's path style. If
-  /// only [root] is omitted, it defaults ".". If *both* [style] and [root] are
-  /// omitted, [root] defaults to the current working directory.
-  ///
-  /// On the browser, the path style is [Style.url]. In Dartium, [root] defaults
-  /// to the current URL. When using dart2js, it currently defaults to `.` due
-  /// to technical constraints.
-  factory Builder({Style style, String root}) {
-    if (root == null) {
-      if (style == null) {
-        root = current;
-      } else {
-        root = ".";
-      }
-    }
-
-    if (style == null) style = Style.platform;
-
-    return new Builder._(style, root);
-  }
-
-  Builder._(this.style, this.root);
-
-  /// The style of path that this builder works with.
-  final Style style;
-
-  /// The root directory that relative paths will be relative to.
-  final String root;
-
-  /// Gets the path separator for the builder's [style]. On Mac and Linux,
-  /// this is `/`. On Windows, it's `\`.
-  String get separator => style.separator;
-
-  /// Gets the part of [path] after the last separator on the builder's
-  /// platform.
-  ///
-  ///     builder.basename('path/to/foo.dart'); // -> 'foo.dart'
-  ///     builder.basename('path/to');          // -> 'to'
-  ///
-  /// Trailing separators are ignored.
-  ///
-  ///     builder.basename('path/to/'); // -> 'to'
-  String basename(String path) => _parse(path).basename;
-
-  /// Gets the part of [path] after the last separator on the builder's
-  /// platform, and without any trailing file extension.
-  ///
-  ///     builder.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo'
-  ///
-  /// Trailing separators are ignored.
-  ///
-  ///     builder.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo'
-  String basenameWithoutExtension(String path) =>
-    _parse(path).basenameWithoutExtension;
-
-  /// Gets the part of [path] before the last separator.
-  ///
-  ///     builder.dirname('path/to/foo.dart'); // -> 'path/to'
-  ///     builder.dirname('path/to');          // -> 'path'
-  ///
-  /// Trailing separators are ignored.
-  ///
-  ///     builder.dirname('path/to/'); // -> 'path'
-  String dirname(String path) {
-    var parsed = _parse(path);
-    parsed.removeTrailingSeparators();
-    if (parsed.parts.isEmpty) return parsed.root == null ? '.' : parsed.root;
-    if (parsed.parts.length == 1) {
-      return parsed.root == null ? '.' : parsed.root;
-    }
-    parsed.parts.removeLast();
-    parsed.separators.removeLast();
-    parsed.removeTrailingSeparators();
-    return parsed.toString();
-  }
-
-  /// Gets the file extension of [path]: the portion of [basename] from the last
-  /// `.` to the end (including the `.` itself).
-  ///
-  ///     builder.extension('path/to/foo.dart'); // -> '.dart'
-  ///     builder.extension('path/to/foo'); // -> ''
-  ///     builder.extension('path.to/foo'); // -> ''
-  ///     builder.extension('path/to/foo.dart.js'); // -> '.js'
-  ///
-  /// If the file name starts with a `.`, then it is not considered an
-  /// extension:
-  ///
-  ///     builder.extension('~/.bashrc');    // -> ''
-  ///     builder.extension('~/.notes.txt'); // -> '.txt'
-  String extension(String path) => _parse(path).extension;
-
-  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
-  /// Returns the root of [path], if it's absolute, or an empty string if it's
-  /// relative.
-  ///
-  ///     // Unix
-  ///     builder.rootPrefix('path/to/foo'); // -> ''
-  ///     builder.rootPrefix('/path/to/foo'); // -> '/'
-  ///
-  ///     // Windows
-  ///     builder.rootPrefix(r'path\to\foo'); // -> ''
-  ///     builder.rootPrefix(r'C:\path\to\foo'); // -> r'C:\'
-  ///
-  ///     // URL
-  ///     builder.rootPrefix('path/to/foo'); // -> ''
-  ///     builder.rootPrefix('http://dartlang.org/path/to/foo');
-  ///       // -> 'http://dartlang.org'
-  String rootPrefix(String path) {
-    var root = _parse(path).root;
-    return root == null ? '' : root;
-  }
-
-  /// Returns `true` if [path] is an absolute path and `false` if it is a
-  /// relative path.
-  ///
-  /// On POSIX systems, absolute paths start with a `/` (forward slash). On
-  /// Windows, an absolute path starts with `\\`, or a drive letter followed by
-  /// `:/` or `:\`. For URLs, absolute paths either start with a protocol and
-  /// optional hostname (e.g. `http://dartlang.org`, `file://`) or with a `/`.
-  ///
-  /// URLs that start with `/` are known as "root-relative", since they're
-  /// relative to the root of the current URL. Since root-relative paths are
-  /// still absolute in every other sense, [isAbsolute] will return true for
-  /// them. They can be detected using [isRootRelative].
-  bool isAbsolute(String path) => _parse(path).isAbsolute;
-
-  /// Returns `true` if [path] is a relative path and `false` if it is absolute.
-  /// On POSIX systems, absolute paths start with a `/` (forward slash). On
-  /// Windows, an absolute path starts with `\\`, or a drive letter followed by
-  /// `:/` or `:\`.
-  bool isRelative(String path) => !this.isAbsolute(path);
-
-  /// Returns `true` if [path] is a root-relative path and `false` if it's not.
-  ///
-  /// URLs that start with `/` are known as "root-relative", since they're
-  /// relative to the root of the current URL. Since root-relative paths are
-  /// still absolute in every other sense, [isAbsolute] will return true for
-  /// them. They can be detected using [isRootRelative].
-  ///
-  /// No POSIX and Windows paths are root-relative.
-  bool isRootRelative(String path) => _parse(path).isRootRelative;
-
-  /// Joins the given path parts into a single path. Example:
-  ///
-  ///     builder.join('path', 'to', 'foo'); // -> 'path/to/foo'
-  ///
-  /// If any part ends in a path separator, then a redundant separator will not
-  /// be added:
-  ///
-  ///     builder.join('path/', 'to', 'foo'); // -> 'path/to/foo
-  ///
-  /// If a part is an absolute path, then anything before that will be ignored:
-  ///
-  ///     builder.join('path', '/to', 'foo'); // -> '/to/foo'
-  ///
-  String join(String part1, [String part2, String part3, String part4,
-              String part5, String part6, String part7, String part8]) {
-    var parts = [part1, part2, part3, part4, part5, part6, part7, part8];
-    _validateArgList("join", parts);
-    return joinAll(parts.where((part) => part != null));
-  }
-
-  /// Joins the given path parts into a single path. Example:
-  ///
-  ///     builder.joinAll(['path', 'to', 'foo']); // -> 'path/to/foo'
-  ///
-  /// If any part ends in a path separator, then a redundant separator will not
-  /// be added:
-  ///
-  ///     builder.joinAll(['path/', 'to', 'foo']); // -> 'path/to/foo
-  ///
-  /// If a part is an absolute path, then anything before that will be ignored:
-  ///
-  ///     builder.joinAll(['path', '/to', 'foo']); // -> '/to/foo'
-  ///
-  /// For a fixed number of parts, [join] is usually terser.
-  String joinAll(Iterable<String> parts) {
-    var buffer = new StringBuffer();
-    var needsSeparator = false;
-    var isAbsoluteAndNotRootRelative = false;
-
-    for (var part in parts.where((part) => part != '')) {
-      if (this.isRootRelative(part) && isAbsoluteAndNotRootRelative) {
-        // If the new part is root-relative, it preserves the previous root but
-        // replaces the path after it.
-        var oldRoot = this.rootPrefix(buffer.toString());
-        buffer.clear();
-        buffer.write(oldRoot);
-        buffer.write(part);
-      } else if (this.isAbsolute(part)) {
-        isAbsoluteAndNotRootRelative = !this.isRootRelative(part);
-        // An absolute path discards everything before it.
-        buffer.clear();
-        buffer.write(part);
-      } else {
-        if (part.length > 0 && part[0].contains(style.separatorPattern)) {
-          // The part starts with a separator, so we don't need to add one.
-        } else if (needsSeparator) {
-          buffer.write(separator);
-        }
-
-        buffer.write(part);
-      }
-
-      // Unless this part ends with a separator, we'll need to add one before
-      // the next part.
-      needsSeparator = part.contains(style.needsSeparatorPattern);
-    }
-
-    return buffer.toString();
-  }
-
-  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
-  /// Splits [path] into its components using the current platform's
-  /// [separator]. Example:
-  ///
-  ///     builder.split('path/to/foo'); // -> ['path', 'to', 'foo']
-  ///
-  /// The path will *not* be normalized before splitting.
-  ///
-  ///     builder.split('path/../foo'); // -> ['path', '..', 'foo']
-  ///
-  /// If [path] is absolute, the root directory will be the first element in the
-  /// array. Example:
-  ///
-  ///     // Unix
-  ///     builder.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo']
-  ///
-  ///     // Windows
-  ///     builder.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo']
-  List<String> split(String path) {
-    var parsed = _parse(path);
-    // Filter out empty parts that exist due to multiple separators in a row.
-    parsed.parts = parsed.parts.where((part) => !part.isEmpty)
-                               .toList();
-    if (parsed.root != null) parsed.parts.insert(0, parsed.root);
-    return parsed.parts;
-  }
-
-  /// Normalizes [path], simplifying it by handling `..`, and `.`, and
-  /// removing redundant path separators whenever possible.
-  ///
-  ///     builder.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
-  String normalize(String path) {
-    var parsed = _parse(path);
-    parsed.normalize();
-    return parsed.toString();
-  }
-
-  /// Creates a new path by appending the given path parts to the [root].
-  /// Equivalent to [join()] with [root] as the first argument. Example:
-  ///
-  ///     var builder = new Builder(root: 'root');
-  ///     builder.resolve('path', 'to', 'foo'); // -> 'root/path/to/foo'
-  String resolve(String part1, [String part2, String part3, String part4,
-              String part5, String part6, String part7]) {
-    return join(root, part1, part2, part3, part4, part5, part6, part7);
-  }
-
-  /// Attempts to convert [path] to an equivalent relative path relative to
-  /// [root].
-  ///
-  ///     var builder = new Builder(root: '/root/path');
-  ///     builder.relative('/root/path/a/b.dart'); // -> 'a/b.dart'
-  ///     builder.relative('/root/other.dart'); // -> '../other.dart'
-  ///
-  /// If the [from] argument is passed, [path] is made relative to that instead.
-  ///
-  ///     builder.relative('/root/path/a/b.dart',
-  ///         from: '/root/path'); // -> 'a/b.dart'
-  ///     builder.relative('/root/other.dart',
-  ///         from: '/root/path'); // -> '../other.dart'
-  ///
-  /// If [path] and/or [from] are relative paths, they are assumed to be
-  /// relative to [root].
-  ///
-  /// Since there is no relative path from one drive letter to another on
-  /// Windows, this will return an absolute path in that case.
-  ///
-  ///     builder.relative(r'D:\other', from: r'C:\other'); // -> 'D:\other'
-  ///
-  /// This will also return an absolute path if an absolute [path] is passed to
-  /// a builder with a relative [root].
-  ///
-  ///     var builder = new Builder(r'some/relative/path');
-  ///     builder.relative(r'/absolute/path'); // -> '/absolute/path'
-  String relative(String path, {String from}) {
-    from = from == null ? root : this.join(root, from);
-
-    // We can't determine the path from a relative path to an absolute path.
-    if (this.isRelative(from) && this.isAbsolute(path)) {
-      return this.normalize(path);
-    }
-
-    // If the given path is relative, resolve it relative to the root of the
-    // builder.
-    if (this.isRelative(path) || this.isRootRelative(path)) {
-      path = this.resolve(path);
-    }
-
-    // If the path is still relative and `from` is absolute, we're unable to
-    // find a path from `from` to `path`.
-    if (this.isRelative(path) && this.isAbsolute(from)) {
-      throw new ArgumentError('Unable to find a path to "$path" from "$from".');
-    }
-
-    var fromParsed = _parse(from)..normalize();
-    var pathParsed = _parse(path)..normalize();
-
-    if (fromParsed.parts.length > 0 && fromParsed.parts[0] == '.') {
-      return pathParsed.toString();
-    }
-
-    // If the root prefixes don't match (for example, different drive letters
-    // on Windows), then there is no relative path, so just return the absolute
-    // one. In Windows, drive letters are case-insenstive and we allow
-    // calculation of relative paths, even if a path has not been normalized.
-    if (fromParsed.root != pathParsed.root &&
-        ((fromParsed.root ==  null || pathParsed.root == null) ||
-          fromParsed.root.toLowerCase().replaceAll('/', '\\') !=
-          pathParsed.root.toLowerCase().replaceAll('/', '\\'))) {
-      return pathParsed.toString();
-    }
-
-    // Strip off their common prefix.
-    while (fromParsed.parts.length > 0 && pathParsed.parts.length > 0 &&
-           fromParsed.parts[0] == pathParsed.parts[0]) {
-      fromParsed.parts.removeAt(0);
-      fromParsed.separators.removeAt(1);
-      pathParsed.parts.removeAt(0);
-      pathParsed.separators.removeAt(1);
-    }
-
-    // If there are any directories left in the from path, we need to walk up
-    // out of them. If a directory left in the from path is '..', it cannot
-    // be cancelled by adding a '..'.
-    if (fromParsed.parts.length > 0 && fromParsed.parts[0] == '..') {
-      throw new ArgumentError('Unable to find a path to "$path" from "$from".');
-    }
-    _growListFront(pathParsed.parts, fromParsed.parts.length, '..');
-    pathParsed.separators[0] = '';
-    pathParsed.separators.insertAll(1,
-        new List.filled(fromParsed.parts.length, style.separator));
-
-    // Corner case: the paths completely collapsed.
-    if (pathParsed.parts.length == 0) return '.';
-
-    // Corner case: path was '.' and some '..' directories were added in front.
-    // Don't add a final '/.' in that case.
-    if (pathParsed.parts.length > 1 && pathParsed.parts.last == '.') {
-      pathParsed.parts.removeLast();
-      pathParsed.separators..removeLast()..removeLast()..add('');
-    }
-
-    // Make it relative.
-    pathParsed.root = '';
-    pathParsed.removeTrailingSeparators();
-
-    return pathParsed.toString();
-  }
-
-  /// Removes a trailing extension from the last part of [path].
-  ///
-  ///     builder.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
-  String withoutExtension(String path) {
-    var parsed = _parse(path);
-
-    for (var i = parsed.parts.length - 1; i >= 0; i--) {
-      if (!parsed.parts[i].isEmpty) {
-        parsed.parts[i] = parsed.basenameWithoutExtension;
-        break;
-      }
-    }
-
-    return parsed.toString();
-  }
-
-  /// Returns the path represented by [uri].
-  ///
-  /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
-  /// style, this will just convert [uri] to a string.
-  ///
-  ///     // POSIX
-  ///     builder.fromUri(Uri.parse('file:///path/to/foo'))
-  ///       // -> '/path/to/foo'
-  ///
-  ///     // Windows
-  ///     builder.fromUri(Uri.parse('file:///C:/path/to/foo'))
-  ///       // -> r'C:\path\to\foo'
-  ///
-  ///     // URL
-  ///     builder.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
-  ///       // -> 'http://dartlang.org/path/to/foo'
-  String fromUri(Uri uri) => style.pathFromUri(uri);
-
-  /// Returns the URI that represents [path].
-  ///
-  /// For POSIX and Windows styles, this will return a `file:` URI. For the URL
-  /// style, this will just convert [path] to a [Uri].
-  ///
-  ///     // POSIX
-  ///     builder.toUri('/path/to/foo')
-  ///       // -> Uri.parse('file:///path/to/foo')
-  ///
-  ///     // Windows
-  ///     builder.toUri(r'C:\path\to\foo')
-  ///       // -> Uri.parse('file:///C:/path/to/foo')
-  ///
-  ///     // URL
-  ///     builder.toUri('http://dartlang.org/path/to/foo')
-  ///       // -> Uri.parse('http://dartlang.org/path/to/foo')
-  Uri toUri(String path) {
-    if (isRelative(path)) {
-      return style.relativePathToUri(path);
-    } else {
-      return style.absolutePathToUri(join(root, path));
-    }
-  }
-
-  _ParsedPath _parse(String path) {
-    var before = path;
-
-    // Remove the root prefix, if any.
-    var root = style.getRoot(path);
-    var isRootRelative = style.getRelativeRoot(path) != null;
-    if (root != null) path = path.substring(root.length);
-
-    // Split the parts on path separators.
-    var parts = [];
-    var separators = [];
-
-    var firstSeparator = style.separatorPattern.matchAsPrefix(path);
-    if (firstSeparator != null) {
-      separators.add(firstSeparator[0]);
-      path = path.substring(firstSeparator[0].length);
-    } else {
-      separators.add('');
-    }
-
-    var start = 0;
-    for (var match in style.separatorPattern.allMatches(path)) {
-      parts.add(path.substring(start, match.start));
-      separators.add(match[0]);
-      start = match.end;
-    }
-
-    // Add the final part, if any.
-    if (start < path.length) {
-      parts.add(path.substring(start));
-      separators.add('');
-    }
-
-    return new _ParsedPath(style, root, isRootRelative, parts, separators);
-  }
-}
-
-/// An enum type describing a "flavor" of path.
-abstract class Style {
-  /// POSIX-style paths use "/" (forward slash) as separators. Absolute paths
-  /// start with "/". Used by UNIX, Linux, Mac OS X, and others.
-  static final posix = new _PosixStyle();
-
-  /// Windows paths use "\" (backslash) as separators. Absolute paths start with
-  /// a drive letter followed by a colon (example, "C:") or two backslashes
-  /// ("\\") for UNC paths.
-  // TODO(rnystrom): The UNC root prefix should include the drive name too, not
-  // just the "\\".
-  static final windows = new _WindowsStyle();
-
-  /// URLs aren't filesystem paths, but they're supported to make it easier to
-  /// manipulate URL paths in the browser.
-  ///
-  /// URLs use "/" (forward slash) as separators. Absolute paths either start
-  /// with a protocol and optional hostname (e.g. `http://dartlang.org`,
-  /// `file://`) or with "/".
-  static final url = new _UrlStyle();
-
-  /// The style of the host platform.
-  ///
-  /// When running on the command line, this will be [windows] or [posix] based
-  /// on the host operating system. On a browser, this will be [url].
-  static final platform = _getPlatformStyle();
-
-  /// Gets the type of the host platform.
-  static Style _getPlatformStyle() {
-    if (_io == null) return Style.url;
-
-    if ((_io.declarations[#Platform] as ClassMirror).getField(#operatingSystem)
-        .reflectee == 'windows') {
-      return Style.windows;
-    }
-
-    return Style.posix;
-  }
-
-  /// The name of this path style. Will be "posix" or "windows".
-  String get name;
-
-  /// The path separator for this style. On POSIX, this is `/`. On Windows,
-  /// it's `\`.
-  String get separator;
-
-  /// The [Pattern] that can be used to match a separator for a path in this
-  /// style. Windows allows both "/" and "\" as path separators even though "\"
-  /// is the canonical one.
-  Pattern get separatorPattern;
-
-  /// The [Pattern] that matches path components that need a separator after
-  /// them.
-  ///
-  /// Windows and POSIX styles just need separators when the previous component
-  /// doesn't already end in a separator, but the URL always needs to place a
-  /// separator between the root and the first component, even if the root
-  /// already ends in a separator character. For example, to join "file://" and
-  /// "usr", an additional "/" is needed (making "file:///usr").
-  Pattern get needsSeparatorPattern;
-
-  /// The [Pattern] that can be used to match the root prefix of an absolute
-  /// path in this style.
-  Pattern get rootPattern;
-
-  /// The [Pattern] that can be used to match the root prefix of a root-relative
-  /// path in this style.
-  ///
-  /// This can be null to indicate that this style doesn't support root-relative
-  /// paths.
-  final Pattern relativeRootPattern = null;
-
-  /// A [Builder] that uses this style.
-  Builder get builder => new Builder(style: this);
-
-  /// Gets the root prefix of [path] if path is absolute. If [path] is relative,
-  /// returns `null`.
-  String getRoot(String path) {
-    // TODO(rnystrom): Use firstMatch() when #7080 is fixed.
-    var matches = rootPattern.allMatches(path);
-    if (matches.isNotEmpty) return matches.first[0];
-    return getRelativeRoot(path);
-  }
-
-  /// Gets the root prefix of [path] if it's root-relative.
-  ///
-  /// If [path] is relative or absolute and not root-relative, returns `null`.
-  String getRelativeRoot(String path) {
-    if (relativeRootPattern == null) return null;
-    // TODO(rnystrom): Use firstMatch() when #7080 is fixed.
-    var matches = relativeRootPattern.allMatches(path);
-    if (matches.isEmpty) return null;
-    return matches.first[0];
-  }
-
-  /// Returns the path represented by [uri] in this style.
-  String pathFromUri(Uri uri);
-
-  /// Returns the URI that represents the relative path made of [parts].
-  Uri relativePathToUri(String path) =>
-      new Uri(pathSegments: builder.split(path));
-
-  /// Returns the URI that represents [path], which is assumed to be absolute.
-  Uri absolutePathToUri(String path);
-
-  String toString() => name;
-}
-
-/// The style for POSIX paths.
-class _PosixStyle extends Style {
-  _PosixStyle();
-
-  final name = 'posix';
-  final separator = '/';
-  final separatorPattern = new RegExp(r'/');
-  final needsSeparatorPattern = new RegExp(r'[^/]$');
-  final rootPattern = new RegExp(r'^/');
-
-  String pathFromUri(Uri uri) {
-    if (uri.scheme == '' || uri.scheme == 'file') {
-      return Uri.decodeComponent(uri.path);
-    }
-    throw new ArgumentError("Uri $uri must have scheme 'file:'.");
-  }
-
-  Uri absolutePathToUri(String path) {
-    var parsed = builder._parse(path);
-    if (parsed.parts.isEmpty) {
-      // If the path is a bare root (e.g. "/"), [components] will
-      // currently be empty. We add two empty components so the URL constructor
-      // produces "file:///", with a trailing slash.
-      parsed.parts.addAll(["", ""]);
-    } else if (parsed.hasTrailingSeparator) {
-      // If the path has a trailing slash, add a single empty component so the
-      // URI has a trailing slash as well.
-      parsed.parts.add("");
-    }
-
-    return new Uri(scheme: 'file', pathSegments: parsed.parts);
-  }
-}
-
-/// The style for Windows paths.
-class _WindowsStyle extends Style {
-  _WindowsStyle();
-
-  final name = 'windows';
-  final separator = '\\';
-  final separatorPattern = new RegExp(r'[/\\]');
-  final needsSeparatorPattern = new RegExp(r'[^/\\]$');
-  final rootPattern = new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])');
-
-  String pathFromUri(Uri uri) {
-    if (uri.scheme != '' && uri.scheme != 'file') {
-      throw new ArgumentError("Uri $uri must have scheme 'file:'.");
-    }
-
-    var path = uri.path;
-    if (uri.host == '') {
-      // Drive-letter paths look like "file:///C:/path/to/file". The
-      // replaceFirst removes the extra initial slash.
-      if (path.startsWith('/')) path = path.replaceFirst("/", "");
-    } else {
-      // Network paths look like "file://hostname/path/to/file".
-      path = '\\\\${uri.host}$path';
-    }
-    return Uri.decodeComponent(path.replaceAll("/", "\\"));
-  }
-
-  Uri absolutePathToUri(String path) {
-    var parsed = builder._parse(path);
-    if (parsed.root == r'\\') {
-      // Network paths become "file://hostname/path/to/file".
-
-      var host = parsed.parts.removeAt(0);
-
-      if (parsed.parts.isEmpty) {
-        // If the path is a bare root (e.g. "\\hostname"), [parsed.parts] will
-        // currently be empty. We add two empty components so the URL
-        // constructor produces "file://hostname/", with a trailing slash.
-        parsed.parts.addAll(["", ""]);
-      } else if (parsed.hasTrailingSeparator) {
-        // If the path has a trailing slash, add a single empty component so the
-        // URI has a trailing slash as well.
-        parsed.parts.add("");
-      }
-
-      return new Uri(scheme: 'file', host: host, pathSegments: parsed.parts);
-    } else {
-      // Drive-letter paths become "file:///C:/path/to/file".
-
-      // If the path is a bare root (e.g. "C:\"), [parsed.parts] will currently
-      // be empty. We add an empty component so the URL constructor produces
-      // "file:///C:/", with a trailing slash. We also add an empty component if
-      // the URL otherwise has a trailing slash.
-      if (parsed.parts.length == 0 || parsed.hasTrailingSeparator) {
-        parsed.parts.add("");
-      }
-
-      // Get rid of the trailing "\" in "C:\" because the URI constructor will
-      // add a separator on its own.
-      parsed.parts.insert(0, parsed.root.replaceAll(separatorPattern, ""));
-
-      return new Uri(scheme: 'file', pathSegments: parsed.parts);
-    }
-  }
-}
-
-/// The style for URL paths.
-class _UrlStyle extends Style {
-  _UrlStyle();
-
-  final name = 'url';
-  final separator = '/';
-  final separatorPattern = new RegExp(r'/');
-  final needsSeparatorPattern = new RegExp(
-      r"(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$");
-  final rootPattern = new RegExp(r"[a-zA-Z][-+.a-zA-Z\d]*://[^/]*");
-  final relativeRootPattern = new RegExp(r"^/");
-
-  String pathFromUri(Uri uri) => uri.toString();
-
-  Uri relativePathToUri(String path) => Uri.parse(path);
-  Uri absolutePathToUri(String path) => Uri.parse(path);
-}
-
-// TODO(rnystrom): Make this public?
-class _ParsedPath {
-  /// The [Style] that was used to parse this path.
-  Style style;
-
-  /// The absolute root portion of the path, or `null` if the path is relative.
-  /// On POSIX systems, this will be `null` or "/". On Windows, it can be
-  /// `null`, "//" for a UNC path, or something like "C:\" for paths with drive
-  /// letters.
-  String root;
-
-  /// Whether this path is root-relative.
-  ///
-  /// See [Builder.isRootRelative].
-  bool isRootRelative;
-
-  /// The path-separated parts of the path. All but the last will be
-  /// directories.
-  List<String> parts;
-
-  /// The path separators preceding each part.
-  ///
-  /// The first one will be an empty string unless the root requires a separator
-  /// between it and the path. The last one will be an empty string unless the
-  /// path ends with a trailing separator.
-  List<String> separators;
-
-  /// The file extension of the last non-empty part, or "" if it doesn't have
-  /// one.
-  String get extension => _splitExtension()[1];
-
-  /// `true` if this is an absolute path.
-  bool get isAbsolute => root != null;
-
-  _ParsedPath(this.style, this.root, this.isRootRelative, this.parts,
-      this.separators);
-
-  String get basename {
-    var copy = this.clone();
-    copy.removeTrailingSeparators();
-    if (copy.parts.isEmpty) return root == null ? '' : root;
-    return copy.parts.last;
-  }
-
-  String get basenameWithoutExtension => _splitExtension()[0];
-
-  bool get hasTrailingSeparator =>
-      !parts.isEmpty && (parts.last == '' || separators.last != '');
-
-  void removeTrailingSeparators() {
-    while (!parts.isEmpty && parts.last == '') {
-      parts.removeLast();
-      separators.removeLast();
-    }
-    if (separators.length > 0) separators[separators.length - 1] = '';
-  }
-
-  void normalize() {
-    // Handle '.', '..', and empty parts.
-    var leadingDoubles = 0;
-    var newParts = [];
-    for (var part in parts) {
-      if (part == '.' || part == '') {
-        // Do nothing. Ignore it.
-      } else if (part == '..') {
-        // Pop the last part off.
-        if (newParts.length > 0) {
-          newParts.removeLast();
-        } else {
-          // Backed out past the beginning, so preserve the "..".
-          leadingDoubles++;
-        }
-      } else {
-        newParts.add(part);
-      }
-    }
-
-    // A relative path can back out from the start directory.
-    if (!isAbsolute) {
-      _growListFront(newParts, leadingDoubles, '..');
-    }
-
-    // If we collapsed down to nothing, do ".".
-    if (newParts.length == 0 && !isAbsolute) {
-      newParts.add('.');
-    }
-
-    // Canonicalize separators.
-    var newSeparators = new List.generate(
-        newParts.length, (_) => style.separator, growable: true);
-    newSeparators.insert(0,
-        isAbsolute && newParts.length > 0 &&
-                root.contains(style.needsSeparatorPattern) ?
-            style.separator : '');
-
-    parts = newParts;
-    separators = newSeparators;
-
-    // Normalize the Windows root if needed.
-    if (root != null && style == Style.windows) {
-      root = root.replaceAll('/', '\\');
-    }
-    removeTrailingSeparators();
-  }
-
-  String toString() {
-    var builder = new StringBuffer();
-    if (root != null) builder.write(root);
-    for (var i = 0; i < parts.length; i++) {
-      builder.write(separators[i]);
-      builder.write(parts[i]);
-    }
-    builder.write(separators.last);
-
-    return builder.toString();
-  }
-
-  /// Splits the last non-empty part of the path into a `[basename, extension`]
-  /// pair.
-  ///
-  /// Returns a two-element list. The first is the name of the file without any
-  /// extension. The second is the extension or "" if it has none.
-  List<String> _splitExtension() {
-    var file = parts.lastWhere((p) => p != '', orElse: () => null);
-
-    if (file == null) return ['', ''];
-    if (file == '..') return ['..', ''];
-
-    var lastDot = file.lastIndexOf('.');
-
-    // If there is no dot, or it's the first character, like '.bashrc', it
-    // doesn't count.
-    if (lastDot <= 0) return [file, ''];
-
-    return [file.substring(0, lastDot), file.substring(lastDot)];
-  }
-
-  _ParsedPath clone() => new _ParsedPath(
-      style, root, isRootRelative,
-      new List.from(parts), new List.from(separators));
-}
+Uri toUri(String path) => _context.toUri(path);
diff --git a/pkg/path/lib/src/context.dart b/pkg/path/lib/src/context.dart
new file mode 100644
index 0000000..b897c8b
--- /dev/null
+++ b/pkg/path/lib/src/context.dart
@@ -0,0 +1,492 @@
+// 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 path.context;
+
+import 'style.dart';
+import 'parsed_path.dart';
+import 'path_exception.dart';
+import '../path.dart' as p;
+
+/// An instantiable class for manipulating paths. Unlike the top-level
+/// functions, this lets you explicitly select what platform the paths will use.
+class Context {
+  /// Creates a new path context for the given style and current directory.
+  ///
+  /// If [style] is omitted, it uses the host operating system's path style. If
+  /// only [current] is omitted, it defaults ".". If *both* [style] and
+  /// [current] are omitted, [current] defaults to the real current working
+  /// directory.
+  ///
+  /// On the browser, [style] defaults to [Style.url] and [current] defaults to
+  /// the current URL.
+  factory Context({Style style, String current}) {
+    if (current == null) {
+      if (style == null) {
+        current = p.current;
+      } else {
+        current = ".";
+      }
+    }
+
+    if (style == null) style = Style.platform;
+
+    return new Context._(style, current);
+  }
+
+  Context._(this.style, this.current);
+
+  /// The style of path that this context works with.
+  final Style style;
+
+  /// The current directory that relative paths will be relative to.
+  final String current;
+
+  /// Gets the path separator for the context's [style]. On Mac and Linux,
+  /// this is `/`. On Windows, it's `\`.
+  String get separator => style.separator;
+
+  /// Creates a new path by appending the given path parts to [current].
+  /// Equivalent to [join()] with [current] as the first argument. Example:
+  ///
+  ///     var context = new Context(current: '/root');
+  ///     context.absolute('path', 'to', 'foo'); // -> '/root/path/to/foo'
+  ///
+  /// If [current] isn't absolute, this won't return an absolute path.
+  String absolute(String part1, [String part2, String part3, String part4,
+              String part5, String part6, String part7]) {
+    return join(current, part1, part2, part3, part4, part5, part6, part7);
+  }
+
+  /// Gets the part of [path] after the last separator on the context's
+  /// platform.
+  ///
+  ///     context.basename('path/to/foo.dart'); // -> 'foo.dart'
+  ///     context.basename('path/to');          // -> 'to'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     context.basename('path/to/'); // -> 'to'
+  String basename(String path) => _parse(path).basename;
+
+  /// Gets the part of [path] after the last separator on the context's
+  /// platform, and without any trailing file extension.
+  ///
+  ///     context.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     context.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo'
+  String basenameWithoutExtension(String path) =>
+    _parse(path).basenameWithoutExtension;
+
+  /// Gets the part of [path] before the last separator.
+  ///
+  ///     context.dirname('path/to/foo.dart'); // -> 'path/to'
+  ///     context.dirname('path/to');          // -> 'path'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     context.dirname('path/to/'); // -> 'path'
+  String dirname(String path) {
+    var parsed = _parse(path);
+    parsed.removeTrailingSeparators();
+    if (parsed.parts.isEmpty) return parsed.root == null ? '.' : parsed.root;
+    if (parsed.parts.length == 1) {
+      return parsed.root == null ? '.' : parsed.root;
+    }
+    parsed.parts.removeLast();
+    parsed.separators.removeLast();
+    parsed.removeTrailingSeparators();
+    return parsed.toString();
+  }
+
+  /// Gets the file extension of [path]: the portion of [basename] from the last
+  /// `.` to the end (including the `.` itself).
+  ///
+  ///     context.extension('path/to/foo.dart'); // -> '.dart'
+  ///     context.extension('path/to/foo'); // -> ''
+  ///     context.extension('path.to/foo'); // -> ''
+  ///     context.extension('path/to/foo.dart.js'); // -> '.js'
+  ///
+  /// If the file name starts with a `.`, then it is not considered an
+  /// extension:
+  ///
+  ///     context.extension('~/.bashrc');    // -> ''
+  ///     context.extension('~/.notes.txt'); // -> '.txt'
+  String extension(String path) => _parse(path).extension;
+
+  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+  /// Returns the root of [path] if it's absolute, or an empty string if it's
+  /// relative.
+  ///
+  ///     // Unix
+  ///     context.rootPrefix('path/to/foo'); // -> ''
+  ///     context.rootPrefix('/path/to/foo'); // -> '/'
+  ///
+  ///     // Windows
+  ///     context.rootPrefix(r'path\to\foo'); // -> ''
+  ///     context.rootPrefix(r'C:\path\to\foo'); // -> r'C:\'
+  ///
+  ///     // URL
+  ///     context.rootPrefix('path/to/foo'); // -> ''
+  ///     context.rootPrefix('http://dartlang.org/path/to/foo');
+  ///       // -> 'http://dartlang.org'
+  String rootPrefix(String path) {
+    var root = _parse(path).root;
+    return root == null ? '' : root;
+  }
+
+  /// Returns `true` if [path] is an absolute path and `false` if it is a
+  /// relative path.
+  ///
+  /// On POSIX systems, absolute paths start with a `/` (forward slash). On
+  /// Windows, an absolute path starts with `\\`, or a drive letter followed by
+  /// `:/` or `:\`. For URLs, absolute paths either start with a protocol and
+  /// optional hostname (e.g. `http://dartlang.org`, `file://`) or with a `/`.
+  ///
+  /// URLs that start with `/` are known as "root-relative", since they're
+  /// relative to the root of the current URL. Since root-relative paths are
+  /// still absolute in every other sense, [isAbsolute] will return true for
+  /// them. They can be detected using [isRootRelative].
+  bool isAbsolute(String path) => _parse(path).isAbsolute;
+
+  /// Returns `true` if [path] is a relative path and `false` if it is absolute.
+  /// On POSIX systems, absolute paths start with a `/` (forward slash). On
+  /// Windows, an absolute path starts with `\\`, or a drive letter followed by
+  /// `:/` or `:\`.
+  bool isRelative(String path) => !this.isAbsolute(path);
+
+  /// Returns `true` if [path] is a root-relative path and `false` if it's not.
+  ///
+  /// URLs that start with `/` are known as "root-relative", since they're
+  /// relative to the root of the current URL. Since root-relative paths are
+  /// still absolute in every other sense, [isAbsolute] will return true for
+  /// them. They can be detected using [isRootRelative].
+  ///
+  /// No POSIX and Windows paths are root-relative.
+  bool isRootRelative(String path) => _parse(path).isRootRelative;
+
+  /// Joins the given path parts into a single path. Example:
+  ///
+  ///     context.join('path', 'to', 'foo'); // -> 'path/to/foo'
+  ///
+  /// If any part ends in a path separator, then a redundant separator will not
+  /// be added:
+  ///
+  ///     context.join('path/', 'to', 'foo'); // -> 'path/to/foo
+  ///
+  /// If a part is an absolute path, then anything before that will be ignored:
+  ///
+  ///     context.join('path', '/to', 'foo'); // -> '/to/foo'
+  ///
+  String join(String part1, [String part2, String part3, String part4,
+              String part5, String part6, String part7, String part8]) {
+    var parts = [part1, part2, part3, part4, part5, part6, part7, part8];
+    _validateArgList("join", parts);
+    return joinAll(parts.where((part) => part != null));
+  }
+
+  /// Joins the given path parts into a single path. Example:
+  ///
+  ///     context.joinAll(['path', 'to', 'foo']); // -> 'path/to/foo'
+  ///
+  /// If any part ends in a path separator, then a redundant separator will not
+  /// be added:
+  ///
+  ///     context.joinAll(['path/', 'to', 'foo']); // -> 'path/to/foo
+  ///
+  /// If a part is an absolute path, then anything before that will be ignored:
+  ///
+  ///     context.joinAll(['path', '/to', 'foo']); // -> '/to/foo'
+  ///
+  /// For a fixed number of parts, [join] is usually terser.
+  String joinAll(Iterable<String> parts) {
+    var buffer = new StringBuffer();
+    var needsSeparator = false;
+    var isAbsoluteAndNotRootRelative = false;
+
+    for (var part in parts.where((part) => part != '')) {
+      if (this.isRootRelative(part) && isAbsoluteAndNotRootRelative) {
+        // If the new part is root-relative, it preserves the previous root but
+        // replaces the path after it.
+        var parsed = _parse(part);
+        parsed.root = this.rootPrefix(buffer.toString());
+        if (parsed.root.contains(style.needsSeparatorPattern)) {
+          parsed.separators[0] = style.separator;
+        }
+        buffer.clear();
+        buffer.write(parsed.toString());
+      } else if (this.isAbsolute(part)) {
+        isAbsoluteAndNotRootRelative = !this.isRootRelative(part);
+        // An absolute path discards everything before it.
+        buffer.clear();
+        buffer.write(part);
+      } else {
+        if (part.length > 0 && part[0].contains(style.separatorPattern)) {
+          // The part starts with a separator, so we don't need to add one.
+        } else if (needsSeparator) {
+          buffer.write(separator);
+        }
+
+        buffer.write(part);
+      }
+
+      // Unless this part ends with a separator, we'll need to add one before
+      // the next part.
+      needsSeparator = part.contains(style.needsSeparatorPattern);
+    }
+
+    return buffer.toString();
+  }
+
+  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+  /// Splits [path] into its components using the current platform's
+  /// [separator]. Example:
+  ///
+  ///     context.split('path/to/foo'); // -> ['path', 'to', 'foo']
+  ///
+  /// The path will *not* be normalized before splitting.
+  ///
+  ///     context.split('path/../foo'); // -> ['path', '..', 'foo']
+  ///
+  /// If [path] is absolute, the root directory will be the first element in the
+  /// array. Example:
+  ///
+  ///     // Unix
+  ///     context.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo']
+  ///
+  ///     // Windows
+  ///     context.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo']
+  List<String> split(String path) {
+    var parsed = _parse(path);
+    // Filter out empty parts that exist due to multiple separators in a row.
+    parsed.parts = parsed.parts.where((part) => !part.isEmpty)
+                               .toList();
+    if (parsed.root != null) parsed.parts.insert(0, parsed.root);
+    return parsed.parts;
+  }
+
+  /// Normalizes [path], simplifying it by handling `..`, and `.`, and
+  /// removing redundant path separators whenever possible.
+  ///
+  ///     context.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
+  String normalize(String path) {
+    var parsed = _parse(path);
+    parsed.normalize();
+    return parsed.toString();
+  }
+
+  /// Attempts to convert [path] to an equivalent relative path relative to
+  /// [root].
+  ///
+  ///     var context = new Context(current: '/root/path');
+  ///     context.relative('/root/path/a/b.dart'); // -> 'a/b.dart'
+  ///     context.relative('/root/other.dart'); // -> '../other.dart'
+  ///
+  /// If the [from] argument is passed, [path] is made relative to that instead.
+  ///
+  ///     context.relative('/root/path/a/b.dart',
+  ///         from: '/root/path'); // -> 'a/b.dart'
+  ///     context.relative('/root/other.dart',
+  ///         from: '/root/path'); // -> '../other.dart'
+  ///
+  /// If [path] and/or [from] are relative paths, they are assumed to be
+  /// relative to [current].
+  ///
+  /// Since there is no relative path from one drive letter to another on
+  /// Windows, this will return an absolute path in that case.
+  ///
+  ///     context.relative(r'D:\other', from: r'C:\other'); // -> 'D:\other'
+  ///
+  /// This will also return an absolute path if an absolute [path] is passed to
+  /// a context with a relative path for [current].
+  ///
+  ///     var context = new Context(r'some/relative/path');
+  ///     context.relative(r'/absolute/path'); // -> '/absolute/path'
+  ///
+  /// If [root] is relative, it may be impossible to determine a path from
+  /// [from] to [path]. For example, if [root] and [path] are "." and [from] is
+  /// "/", no path can be determined. In this case, a [PathException] will be
+  /// thrown.
+  String relative(String path, {String from}) {
+    from = from == null ? current : this.join(current, from);
+
+    // We can't determine the path from a relative path to an absolute path.
+    if (this.isRelative(from) && this.isAbsolute(path)) {
+      return this.normalize(path);
+    }
+
+    // If the given path is relative, resolve it relative to the context's
+    // current directory.
+    if (this.isRelative(path) || this.isRootRelative(path)) {
+      path = this.absolute(path);
+    }
+
+    // If the path is still relative and `from` is absolute, we're unable to
+    // find a path from `from` to `path`.
+    if (this.isRelative(path) && this.isAbsolute(from)) {
+      throw new PathException('Unable to find a path to "$path" from "$from".');
+    }
+
+    var fromParsed = _parse(from)..normalize();
+    var pathParsed = _parse(path)..normalize();
+
+    if (fromParsed.parts.length > 0 && fromParsed.parts[0] == '.') {
+      return pathParsed.toString();
+    }
+
+    // If the root prefixes don't match (for example, different drive letters
+    // on Windows), then there is no relative path, so just return the absolute
+    // one. In Windows, drive letters are case-insenstive and we allow
+    // calculation of relative paths, even if a path has not been normalized.
+    if (fromParsed.root != pathParsed.root &&
+        ((fromParsed.root ==  null || pathParsed.root == null) ||
+          fromParsed.root.toLowerCase().replaceAll('/', '\\') !=
+          pathParsed.root.toLowerCase().replaceAll('/', '\\'))) {
+      return pathParsed.toString();
+    }
+
+    // Strip off their common prefix.
+    while (fromParsed.parts.length > 0 && pathParsed.parts.length > 0 &&
+           fromParsed.parts[0] == pathParsed.parts[0]) {
+      fromParsed.parts.removeAt(0);
+      fromParsed.separators.removeAt(1);
+      pathParsed.parts.removeAt(0);
+      pathParsed.separators.removeAt(1);
+    }
+
+    // If there are any directories left in the from path, we need to walk up
+    // out of them. If a directory left in the from path is '..', it cannot
+    // be cancelled by adding a '..'.
+    if (fromParsed.parts.length > 0 && fromParsed.parts[0] == '..') {
+      throw new PathException('Unable to find a path to "$path" from "$from".');
+    }
+    pathParsed.parts.insertAll(0,
+        new List.filled(fromParsed.parts.length, '..'));
+    pathParsed.separators[0] = '';
+    pathParsed.separators.insertAll(1,
+        new List.filled(fromParsed.parts.length, style.separator));
+
+    // Corner case: the paths completely collapsed.
+    if (pathParsed.parts.length == 0) return '.';
+
+    // Corner case: path was '.' and some '..' directories were added in front.
+    // Don't add a final '/.' in that case.
+    if (pathParsed.parts.length > 1 && pathParsed.parts.last == '.') {
+      pathParsed.parts.removeLast();
+      pathParsed.separators..removeLast()..removeLast()..add('');
+    }
+
+    // Make it relative.
+    pathParsed.root = '';
+    pathParsed.removeTrailingSeparators();
+
+    return pathParsed.toString();
+  }
+
+  /// Returns `true` if [child] is a path beneath `parent`, and `false`
+  /// otherwise.
+  ///
+  ///     path.isWithin('/root/path', '/root/path/a'); // -> true
+  ///     path.isWithin('/root/path', '/root/other'); // -> false
+  ///     path.isWithin('/root/path', '/root/path'); // -> false
+  bool isWithin(String parent, String child) {
+    var relative;
+    try {
+      relative = this.relative(child, from: parent);
+    } on PathException catch (_) {
+      // If no relative path from [parent] to [child] is found, [child]
+      // definitely isn't a child of [parent].
+      return false;
+    }
+
+    var parts = this.split(relative);
+    return this.isRelative(relative) && parts.first != '..' &&
+        parts.first != '.';
+  }
+
+  /// Removes a trailing extension from the last part of [path].
+  ///
+  ///     context.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
+  String withoutExtension(String path) {
+    var parsed = _parse(path);
+
+    for (var i = parsed.parts.length - 1; i >= 0; i--) {
+      if (!parsed.parts[i].isEmpty) {
+        parsed.parts[i] = parsed.basenameWithoutExtension;
+        break;
+      }
+    }
+
+    return parsed.toString();
+  }
+
+  /// Returns the path represented by [uri].
+  ///
+  /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
+  /// style, this will just convert [uri] to a string.
+  ///
+  ///     // POSIX
+  ///     context.fromUri(Uri.parse('file:///path/to/foo'))
+  ///       // -> '/path/to/foo'
+  ///
+  ///     // Windows
+  ///     context.fromUri(Uri.parse('file:///C:/path/to/foo'))
+  ///       // -> r'C:\path\to\foo'
+  ///
+  ///     // URL
+  ///     context.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+  ///       // -> 'http://dartlang.org/path/to/foo'
+  String fromUri(Uri uri) => style.pathFromUri(uri);
+
+  /// Returns the URI that represents [path].
+  ///
+  /// For POSIX and Windows styles, this will return a `file:` URI. For the URL
+  /// style, this will just convert [path] to a [Uri].
+  ///
+  ///     // POSIX
+  ///     context.toUri('/path/to/foo')
+  ///       // -> Uri.parse('file:///path/to/foo')
+  ///
+  ///     // Windows
+  ///     context.toUri(r'C:\path\to\foo')
+  ///       // -> Uri.parse('file:///C:/path/to/foo')
+  ///
+  ///     // URL
+  ///     context.toUri('http://dartlang.org/path/to/foo')
+  ///       // -> Uri.parse('http://dartlang.org/path/to/foo')
+  Uri toUri(String path) {
+    if (isRelative(path)) {
+      return style.relativePathToUri(path);
+    } else {
+      return style.absolutePathToUri(join(current, path));
+    }
+  }
+
+  ParsedPath _parse(String path) => new ParsedPath.parse(path, style);
+}
+
+/// Validates that there are no non-null arguments following a null one and
+/// throws an appropriate [ArgumentError] on failure.
+_validateArgList(String method, List<String> args) {
+  for (var i = 1; i < args.length; i++) {
+    // Ignore nulls hanging off the end.
+    if (args[i] == null || args[i - 1] != null) continue;
+
+    var numArgs;
+    for (numArgs = args.length; numArgs >= 1; numArgs--) {
+      if (args[numArgs - 1] != null) break;
+    }
+
+    // Show the arguments.
+    var message = new StringBuffer();
+    message.write("$method(");
+    message.write(args.take(numArgs)
+        .map((arg) => arg == null ? "null" : '"$arg"')
+        .join(", "));
+    message.write("): part ${i - 1} was null, but part $i was not.");
+    throw new ArgumentError(message.toString());
+  }
+}
diff --git a/pkg/path/lib/src/parsed_path.dart b/pkg/path/lib/src/parsed_path.dart
new file mode 100644
index 0000000..5356b44
--- /dev/null
+++ b/pkg/path/lib/src/parsed_path.dart
@@ -0,0 +1,186 @@
+// 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 path.parsed_path;
+
+import 'style.dart';
+
+// TODO(rnystrom): Make this public?
+class ParsedPath {
+  /// The [Style] that was used to parse this path.
+  Style style;
+
+  /// The absolute root portion of the path, or `null` if the path is relative.
+  /// On POSIX systems, this will be `null` or "/". On Windows, it can be
+  /// `null`, "//" for a UNC path, or something like "C:\" for paths with drive
+  /// letters.
+  String root;
+
+  /// Whether this path is root-relative.
+  ///
+  /// See [Context.isRootRelative].
+  bool isRootRelative;
+
+  /// The path-separated parts of the path. All but the last will be
+  /// directories.
+  List<String> parts;
+
+  /// The path separators preceding each part.
+  ///
+  /// The first one will be an empty string unless the root requires a separator
+  /// between it and the path. The last one will be an empty string unless the
+  /// path ends with a trailing separator.
+  List<String> separators;
+
+  /// The file extension of the last non-empty part, or "" if it doesn't have
+  /// one.
+  String get extension => _splitExtension()[1];
+
+  /// `true` if this is an absolute path.
+  bool get isAbsolute => root != null;
+
+  factory ParsedPath.parse(String path, Style style) {
+    var before = path;
+
+    // Remove the root prefix, if any.
+    var root = style.getRoot(path);
+    var isRootRelative = style.getRelativeRoot(path) != null;
+    if (root != null) path = path.substring(root.length);
+
+    // Split the parts on path separators.
+    var parts = [];
+    var separators = [];
+
+    var firstSeparator = style.separatorPattern.matchAsPrefix(path);
+    if (firstSeparator != null) {
+      separators.add(firstSeparator[0]);
+      path = path.substring(firstSeparator[0].length);
+    } else {
+      separators.add('');
+    }
+
+    var start = 0;
+    for (var match in style.separatorPattern.allMatches(path)) {
+      parts.add(path.substring(start, match.start));
+      separators.add(match[0]);
+      start = match.end;
+    }
+
+    // Add the final part, if any.
+    if (start < path.length) {
+      parts.add(path.substring(start));
+      separators.add('');
+    }
+
+    return new ParsedPath._(style, root, isRootRelative, parts, separators);
+  }
+
+  ParsedPath._(this.style, this.root, this.isRootRelative, this.parts,
+      this.separators);
+
+  String get basename {
+    var copy = this.clone();
+    copy.removeTrailingSeparators();
+    if (copy.parts.isEmpty) return root == null ? '' : root;
+    return copy.parts.last;
+  }
+
+  String get basenameWithoutExtension => _splitExtension()[0];
+
+  bool get hasTrailingSeparator =>
+      !parts.isEmpty && (parts.last == '' || separators.last != '');
+
+  void removeTrailingSeparators() {
+    while (!parts.isEmpty && parts.last == '') {
+      parts.removeLast();
+      separators.removeLast();
+    }
+    if (separators.length > 0) separators[separators.length - 1] = '';
+  }
+
+  void normalize() {
+    // Handle '.', '..', and empty parts.
+    var leadingDoubles = 0;
+    var newParts = [];
+    for (var part in parts) {
+      if (part == '.' || part == '') {
+        // Do nothing. Ignore it.
+      } else if (part == '..') {
+        // Pop the last part off.
+        if (newParts.length > 0) {
+          newParts.removeLast();
+        } else {
+          // Backed out past the beginning, so preserve the "..".
+          leadingDoubles++;
+        }
+      } else {
+        newParts.add(part);
+      }
+    }
+
+    // A relative path can back out from the start directory.
+    if (!isAbsolute) {
+      newParts.insertAll(0, new List.filled(leadingDoubles, '..'));
+    }
+
+    // If we collapsed down to nothing, do ".".
+    if (newParts.length == 0 && !isAbsolute) {
+      newParts.add('.');
+    }
+
+    // Canonicalize separators.
+    var newSeparators = new List.generate(
+        newParts.length, (_) => style.separator, growable: true);
+    newSeparators.insert(0,
+        isAbsolute && newParts.length > 0 &&
+                root.contains(style.needsSeparatorPattern) ?
+            style.separator : '');
+
+    parts = newParts;
+    separators = newSeparators;
+
+    // Normalize the Windows root if needed.
+    if (root != null && style == Style.windows) {
+      root = root.replaceAll('/', '\\');
+    }
+    removeTrailingSeparators();
+  }
+
+  String toString() {
+    var builder = new StringBuffer();
+    if (root != null) builder.write(root);
+    for (var i = 0; i < parts.length; i++) {
+      builder.write(separators[i]);
+      builder.write(parts[i]);
+    }
+    builder.write(separators.last);
+
+    return builder.toString();
+  }
+
+  /// Splits the last non-empty part of the path into a `[basename, extension`]
+  /// pair.
+  ///
+  /// Returns a two-element list. The first is the name of the file without any
+  /// extension. The second is the extension or "" if it has none.
+  List<String> _splitExtension() {
+    var file = parts.lastWhere((p) => p != '', orElse: () => null);
+
+    if (file == null) return ['', ''];
+    if (file == '..') return ['..', ''];
+
+    var lastDot = file.lastIndexOf('.');
+
+    // If there is no dot, or it's the first character, like '.bashrc', it
+    // doesn't count.
+    if (lastDot <= 0) return [file, ''];
+
+    return [file.substring(0, lastDot), file.substring(lastDot)];
+  }
+
+  ParsedPath clone() => new ParsedPath._(
+      style, root, isRootRelative,
+      new List.from(parts), new List.from(separators));
+}
+
diff --git a/pkg/path/lib/src/path_exception.dart b/pkg/path/lib/src/path_exception.dart
new file mode 100644
index 0000000..49bd268
--- /dev/null
+++ b/pkg/path/lib/src/path_exception.dart
@@ -0,0 +1,15 @@
+// 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 path.path_exception;
+
+/// An exception class that's thrown when a path operation is unable to be
+/// computed accurately.
+class PathException implements Exception {
+  String message;
+
+  PathException(this.message);
+
+  String toString() => "PathException: $message";
+}
diff --git a/pkg/path/lib/src/style.dart b/pkg/path/lib/src/style.dart
new file mode 100644
index 0000000..9da4b43
--- /dev/null
+++ b/pkg/path/lib/src/style.dart
@@ -0,0 +1,118 @@
+// 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 path.style;
+
+import 'context.dart';
+import 'style/posix.dart';
+import 'style/url.dart';
+import 'style/windows.dart';
+
+/// An enum type describing a "flavor" of path.
+abstract class Style {
+  /// POSIX-style paths use "/" (forward slash) as separators. Absolute paths
+  /// start with "/". Used by UNIX, Linux, Mac OS X, and others.
+  static final posix = new PosixStyle();
+
+  /// Windows paths use "\" (backslash) as separators. Absolute paths start with
+  /// a drive letter followed by a colon (example, "C:") or two backslashes
+  /// ("\\") for UNC paths.
+  // TODO(rnystrom): The UNC root prefix should include the drive name too, not
+  // just the "\\".
+  static final windows = new WindowsStyle();
+
+  /// URLs aren't filesystem paths, but they're supported to make it easier to
+  /// manipulate URL paths in the browser.
+  ///
+  /// URLs use "/" (forward slash) as separators. Absolute paths either start
+  /// with a protocol and optional hostname (e.g. `http://dartlang.org`,
+  /// `file://`) or with "/".
+  static final url = new UrlStyle();
+
+  /// The style of the host platform.
+  ///
+  /// When running on the command line, this will be [windows] or [posix] based
+  /// on the host operating system. On a browser, this will be [url].
+  static final platform = _getPlatformStyle();
+
+  /// Gets the type of the host platform.
+  static Style _getPlatformStyle() {
+    // If we're running a Dart file in the browser from a `file:` URI,
+    // [Uri.base] will point to a file. If we're running on the standalone,
+    // it will point to a directory. We can use that fact to determine which
+    // style to use.
+    if (Uri.base.scheme != 'file') return Style.url;
+    if (!Uri.base.path.endsWith('/')) return Style.url;
+    if (new Uri(path: 'a/b').toFilePath() == 'a\\b') return Style.windows;
+    return Style.posix;
+  }
+
+  /// The name of this path style. Will be "posix" or "windows".
+  String get name;
+
+  /// The path separator for this style. On POSIX, this is `/`. On Windows,
+  /// it's `\`.
+  String get separator;
+
+  /// The [Pattern] that can be used to match a separator for a path in this
+  /// style. Windows allows both "/" and "\" as path separators even though "\"
+  /// is the canonical one.
+  Pattern get separatorPattern;
+
+  /// The [Pattern] that matches path components that need a separator after
+  /// them.
+  ///
+  /// Windows and POSIX styles just need separators when the previous component
+  /// doesn't already end in a separator, but the URL always needs to place a
+  /// separator between the root and the first component, even if the root
+  /// already ends in a separator character. For example, to join "file://" and
+  /// "usr", an additional "/" is needed (making "file:///usr").
+  Pattern get needsSeparatorPattern;
+
+  /// The [Pattern] that can be used to match the root prefix of an absolute
+  /// path in this style.
+  Pattern get rootPattern;
+
+  /// The [Pattern] that can be used to match the root prefix of a root-relative
+  /// path in this style.
+  ///
+  /// This can be null to indicate that this style doesn't support root-relative
+  /// paths.
+  final Pattern relativeRootPattern = null;
+
+  /// A [Context] that uses this style.
+  Context get context => new Context(style: this);
+
+  /// Gets the root prefix of [path] if path is absolute. If [path] is relative,
+  /// returns `null`.
+  String getRoot(String path) {
+    // TODO(rnystrom): Use firstMatch() when #7080 is fixed.
+    var matches = rootPattern.allMatches(path);
+    if (matches.isNotEmpty) return matches.first[0];
+    return getRelativeRoot(path);
+  }
+
+  /// Gets the root prefix of [path] if it's root-relative.
+  ///
+  /// If [path] is relative or absolute and not root-relative, returns `null`.
+  String getRelativeRoot(String path) {
+    if (relativeRootPattern == null) return null;
+    // TODO(rnystrom): Use firstMatch() when #7080 is fixed.
+    var matches = relativeRootPattern.allMatches(path);
+    if (matches.isEmpty) return null;
+    return matches.first[0];
+  }
+
+  /// Returns the path represented by [uri] in this style.
+  String pathFromUri(Uri uri);
+
+  /// Returns the URI that represents the relative path made of [parts].
+  Uri relativePathToUri(String path) =>
+      new Uri(pathSegments: context.split(path));
+
+  /// Returns the URI that represents [path], which is assumed to be absolute.
+  Uri absolutePathToUri(String path);
+
+  String toString() => name;
+}
diff --git a/pkg/path/lib/src/style/posix.dart b/pkg/path/lib/src/style/posix.dart
new file mode 100644
index 0000000..72e7044
--- /dev/null
+++ b/pkg/path/lib/src/style/posix.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.style.posix;
+
+import '../parsed_path.dart';
+import '../style.dart';
+
+/// The style for POSIX paths.
+class PosixStyle extends Style {
+  PosixStyle();
+
+  final name = 'posix';
+  final separator = '/';
+  final separatorPattern = new RegExp(r'/');
+  final needsSeparatorPattern = new RegExp(r'[^/]$');
+  final rootPattern = new RegExp(r'^/');
+
+  String pathFromUri(Uri uri) {
+    if (uri.scheme == '' || uri.scheme == 'file') {
+      return Uri.decodeComponent(uri.path);
+    }
+    throw new ArgumentError("Uri $uri must have scheme 'file:'.");
+  }
+
+  Uri absolutePathToUri(String path) {
+    var parsed = new ParsedPath.parse(path, this);
+    if (parsed.parts.isEmpty) {
+      // If the path is a bare root (e.g. "/"), [components] will
+      // currently be empty. We add two empty components so the URL constructor
+      // produces "file:///", with a trailing slash.
+      parsed.parts.addAll(["", ""]);
+    } else if (parsed.hasTrailingSeparator) {
+      // If the path has a trailing slash, add a single empty component so the
+      // URI has a trailing slash as well.
+      parsed.parts.add("");
+    }
+
+    return new Uri(scheme: 'file', pathSegments: parsed.parts);
+  }
+}
diff --git a/pkg/path/lib/src/style/url.dart b/pkg/path/lib/src/style/url.dart
new file mode 100644
index 0000000..4a7003d
--- /dev/null
+++ b/pkg/path/lib/src/style/url.dart
@@ -0,0 +1,25 @@
+// 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 path.style.url;
+
+import '../style.dart';
+
+/// The style for URL paths.
+class UrlStyle extends Style {
+  UrlStyle();
+
+  final name = 'url';
+  final separator = '/';
+  final separatorPattern = new RegExp(r'/');
+  final needsSeparatorPattern = new RegExp(
+      r"(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$");
+  final rootPattern = new RegExp(r"[a-zA-Z][-+.a-zA-Z\d]*://[^/]*");
+  final relativeRootPattern = new RegExp(r"^/");
+
+  String pathFromUri(Uri uri) => uri.toString();
+
+  Uri relativePathToUri(String path) => Uri.parse(path);
+  Uri absolutePathToUri(String path) => Uri.parse(path);
+}
diff --git a/pkg/path/lib/src/style/windows.dart b/pkg/path/lib/src/style/windows.dart
new file mode 100644
index 0000000..1750578
--- /dev/null
+++ b/pkg/path/lib/src/style/windows.dart
@@ -0,0 +1,74 @@
+// 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 path.style.windows;
+
+import '../parsed_path.dart';
+import '../style.dart';
+
+/// The style for Windows paths.
+class WindowsStyle extends Style {
+  WindowsStyle();
+
+  final name = 'windows';
+  final separator = '\\';
+  final separatorPattern = new RegExp(r'[/\\]');
+  final needsSeparatorPattern = new RegExp(r'[^/\\]$');
+  final rootPattern = new RegExp(r'^(\\\\[^\\]+\\[^\\/]+|[a-zA-Z]:[/\\])');
+  final relativeRootPattern = new RegExp(r"^[/\\](?![/\\])");
+
+  String pathFromUri(Uri uri) {
+    if (uri.scheme != '' && uri.scheme != 'file') {
+      throw new ArgumentError("Uri $uri must have scheme 'file:'.");
+    }
+
+    var path = uri.path;
+    if (uri.host == '') {
+      // Drive-letter paths look like "file:///C:/path/to/file". The
+      // replaceFirst removes the extra initial slash.
+      if (path.startsWith('/')) path = path.replaceFirst("/", "");
+    } else {
+      // Network paths look like "file://hostname/path/to/file".
+      path = '\\\\${uri.host}$path';
+    }
+    return Uri.decodeComponent(path.replaceAll("/", "\\"));
+  }
+
+  Uri absolutePathToUri(String path) {
+    var parsed = new ParsedPath.parse(path, this);
+    if (parsed.root.startsWith(r'\\')) {
+      // Network paths become "file://server/share/path/to/file".
+
+      // The root is of the form "\\server\share". We want "server" to be the
+      // URI host, and "share" to be the first element of the path.
+      var rootParts = parsed.root.split('\\').where((part) => part != '');
+      parsed.parts.insert(0, rootParts.last);
+
+      if (parsed.hasTrailingSeparator) {
+        // If the path has a trailing slash, add a single empty component so the
+        // URI has a trailing slash as well.
+        parsed.parts.add("");
+      }
+
+      return new Uri(scheme: 'file', host: rootParts.first,
+          pathSegments: parsed.parts);
+    } else {
+      // Drive-letter paths become "file:///C:/path/to/file".
+
+      // If the path is a bare root (e.g. "C:\"), [parsed.parts] will currently
+      // be empty. We add an empty component so the URL constructor produces
+      // "file:///C:/", with a trailing slash. We also add an empty component if
+      // the URL otherwise has a trailing slash.
+      if (parsed.parts.length == 0 || parsed.hasTrailingSeparator) {
+        parsed.parts.add("");
+      }
+
+      // Get rid of the trailing "\" in "C:\" because the URI constructor will
+      // add a separator on its own.
+      parsed.parts.insert(0, parsed.root.replaceAll(separatorPattern, ""));
+
+      return new Uri(scheme: 'file', pathSegments: parsed.parts);
+    }
+  }
+}
\ No newline at end of file
diff --git a/pkg/path/pubspec.yaml b/pkg/path/pubspec.yaml
index aa905cf..a391d96 100644
--- a/pkg/path/pubspec.yaml
+++ b/pkg/path/pubspec.yaml
@@ -1,5 +1,5 @@
 name: path
-version: 0.9.0
+version: 1.0.0-rc.1
 author: Dart Team <misc@dartlang.org>
 description: >
  A string-based path manipulation library. All of the path operations you know
@@ -10,4 +10,4 @@
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: ">=1.0.0+3.r30188 <2.0.0"
diff --git a/pkg/path/test/browser_test.dart b/pkg/path/test/browser_test.dart
index 0725646..d8584a4 100644
--- a/pkg/path/test/browser_test.dart
+++ b/pkg/path/test/browser_test.dart
@@ -11,20 +11,21 @@
 main() {
   useHtmlConfiguration();
 
-  group('new Builder()', () {
+  group('new Context()', () {
     test('uses the window location if root and style are omitted', () {
-      var builder = new path.Builder();
-      expect(builder.root, window.location.href);
+      var context = new path.Context();
+      expect(context.current,
+             Uri.parse(window.location.href).resolve('.').toString());
     });
 
     test('uses "." if root is omitted', () {
-      var builder = new path.Builder(style: path.Style.platform);
-      expect(builder.root, ".");
+      var context = new path.Context(style: path.Style.platform);
+      expect(context.current, ".");
     });
 
     test('uses the host platform if style is omitted', () {
-      var builder = new path.Builder();
-      expect(builder.style, path.Style.platform);
+      var context = new path.Context();
+      expect(context.style, path.Style.platform);
     });
   });
 
@@ -33,6 +34,7 @@
   });
 
   test('current', () {
-    expect(path.current, window.location.href);
+    expect(path.current,
+           Uri.parse(window.location.href).resolve('.').toString());
   });
 }
diff --git a/pkg/path/test/io_test.dart b/pkg/path/test/io_test.dart
index 6651249..3e52bb9 100644
--- a/pkg/path/test/io_test.dart
+++ b/pkg/path/test/io_test.dart
@@ -8,20 +8,20 @@
 import 'package:path/path.dart' as path;
 
 main() {
-  group('new Builder()', () {
+  group('new Context()', () {
     test('uses the current directory if root and style are omitted', () {
-      var builder = new path.Builder();
-      expect(builder.root, io.Directory.current.path);
+      var context = new path.Context();
+      expect(context.current, io.Directory.current.path);
     });
 
     test('uses "." if root is omitted', () {
-      var builder = new path.Builder(style: path.Style.platform);
-      expect(builder.root, ".");
+      var context = new path.Context(style: path.Style.platform);
+      expect(context.current, ".");
     });
 
     test('uses the host platform if style is omitted', () {
-      var builder = new path.Builder();
-      expect(builder.style, path.Style.platform);
+      var context = new path.Context();
+      expect(context.style, path.Style.platform);
     });
   });
 
@@ -36,4 +36,17 @@
   test('current', () {
     expect(path.current, io.Directory.current.path);
   });
+
+  test('registers changes to the working directory', () {
+    var dir = io.Directory.current.path;
+    try {
+      expect(path.absolute('foo/bar'), equals(path.join(dir, 'foo/bar')));
+
+      io.Directory.current = path.dirname(dir);
+      expect(path.normalize(path.absolute('foo/bar')),
+          equals(path.normalize(path.join(dir, '../foo/bar'))));
+    } finally {
+      io.Directory.current = dir;
+    }
+  });
 }
diff --git a/pkg/path/test/path_test.dart b/pkg/path/test/path_test.dart
index d6c2f34..19397cf 100644
--- a/pkg/path/test/path_test.dart
+++ b/pkg/path/test/path_test.dart
@@ -23,30 +23,30 @@
     });
   });
 
-  group('new Builder()', () {
-    test('uses the given root directory', () {
-      var builder = new path.Builder(root: '/a/b/c');
-      expect(builder.root, '/a/b/c');
+  group('new Context()', () {
+    test('uses the given current directory', () {
+      var context = new path.Context(current: '/a/b/c');
+      expect(context.current, '/a/b/c');
     });
 
     test('uses the given style', () {
-      var builder = new path.Builder(style: path.Style.windows);
-      expect(builder.style, path.Style.windows);
+      var context = new path.Context(style: path.Style.windows);
+      expect(context.style, path.Style.windows);
     });
   });
 
-  test('posix is a default Builder for the POSIX style', () {
+  test('posix is a default Context for the POSIX style', () {
     expect(path.posix.style, path.Style.posix);
-    expect(path.posix.root, ".");
+    expect(path.posix.current, ".");
   });
 
-  test('windows is a default Builder for the Windows style', () {
+  test('windows is a default Context for the Windows style', () {
     expect(path.windows.style, path.Style.windows);
-    expect(path.windows.root, ".");
+    expect(path.windows.current, ".");
   });
 
-  test('url is a default Builder for the URL style', () {
+  test('url is a default Context for the URL style', () {
     expect(path.url.style, path.Style.url);
-    expect(path.url.root, ".");
+    expect(path.url.current, ".");
   });
 }
diff --git a/pkg/path/test/posix_test.dart b/pkg/path/test/posix_test.dart
index 1156379..83a473e 100644
--- a/pkg/path/test/posix_test.dart
+++ b/pkg/path/test/posix_test.dart
@@ -7,362 +7,358 @@
 import 'package:unittest/unittest.dart';
 import 'package:path/path.dart' as path;
 
-main() {
-  var builder = new path.Builder(style: path.Style.posix, root: '/root/path');
+import 'utils.dart';
 
-  if (new path.Builder().style == path.Style.posix) {
-    group('absolute', () {
-      expect(path.absolute('a/b.txt'), path.join(path.current, 'a/b.txt'));
-      expect(path.absolute('/a/b.txt'), '/a/b.txt');
-    });
-  }
+main() {
+  var context = new path.Context(
+      style: path.Style.posix, current: '/root/path');
 
   test('separator', () {
-    expect(builder.separator, '/');
+    expect(context.separator, '/');
   });
 
   test('extension', () {
-    expect(builder.extension(''), '');
-    expect(builder.extension('.'), '');
-    expect(builder.extension('..'), '');
-    expect(builder.extension('foo.dart'), '.dart');
-    expect(builder.extension('foo.dart.js'), '.js');
-    expect(builder.extension('a.b/c'), '');
-    expect(builder.extension('a.b/c.d'), '.d');
-    expect(builder.extension('~/.bashrc'), '');
-    expect(builder.extension(r'a.b\c'), r'.b\c');
-    expect(builder.extension('foo.dart/'), '.dart');
-    expect(builder.extension('foo.dart//'), '.dart');
+    expect(context.extension(''), '');
+    expect(context.extension('.'), '');
+    expect(context.extension('..'), '');
+    expect(context.extension('foo.dart'), '.dart');
+    expect(context.extension('foo.dart.js'), '.js');
+    expect(context.extension('a.b/c'), '');
+    expect(context.extension('a.b/c.d'), '.d');
+    expect(context.extension('~/.bashrc'), '');
+    expect(context.extension(r'a.b\c'), r'.b\c');
+    expect(context.extension('foo.dart/'), '.dart');
+    expect(context.extension('foo.dart//'), '.dart');
   });
 
   test('rootPrefix', () {
-    expect(builder.rootPrefix(''), '');
-    expect(builder.rootPrefix('a'), '');
-    expect(builder.rootPrefix('a/b'), '');
-    expect(builder.rootPrefix('/a/c'), '/');
-    expect(builder.rootPrefix('/'), '/');
+    expect(context.rootPrefix(''), '');
+    expect(context.rootPrefix('a'), '');
+    expect(context.rootPrefix('a/b'), '');
+    expect(context.rootPrefix('/a/c'), '/');
+    expect(context.rootPrefix('/'), '/');
   });
 
   test('dirname', () {
-    expect(builder.dirname(''), '.');
-    expect(builder.dirname('.'), '.');
-    expect(builder.dirname('..'), '.');
-    expect(builder.dirname('../..'), '..');
-    expect(builder.dirname('a'), '.');
-    expect(builder.dirname('a/b'), 'a');
-    expect(builder.dirname('a/b/c'), 'a/b');
-    expect(builder.dirname('a/b.c'), 'a');
-    expect(builder.dirname('a/'), '.');
-    expect(builder.dirname('a/.'), 'a');
-    expect(builder.dirname('a/..'), 'a');
-    expect(builder.dirname(r'a\b/c'), r'a\b');
-    expect(builder.dirname('/a'), '/');
-    expect(builder.dirname('///a'), '/');
-    expect(builder.dirname('/'), '/');
-    expect(builder.dirname('///'), '/');
-    expect(builder.dirname('a/b/'), 'a');
-    expect(builder.dirname(r'a/b\c'), 'a');
-    expect(builder.dirname('a//'), '.');
-    expect(builder.dirname('a/b//'), 'a');
-    expect(builder.dirname('a//b'), 'a');
+    expect(context.dirname(''), '.');
+    expect(context.dirname('.'), '.');
+    expect(context.dirname('..'), '.');
+    expect(context.dirname('../..'), '..');
+    expect(context.dirname('a'), '.');
+    expect(context.dirname('a/b'), 'a');
+    expect(context.dirname('a/b/c'), 'a/b');
+    expect(context.dirname('a/b.c'), 'a');
+    expect(context.dirname('a/'), '.');
+    expect(context.dirname('a/.'), 'a');
+    expect(context.dirname('a/..'), 'a');
+    expect(context.dirname(r'a\b/c'), r'a\b');
+    expect(context.dirname('/a'), '/');
+    expect(context.dirname('///a'), '/');
+    expect(context.dirname('/'), '/');
+    expect(context.dirname('///'), '/');
+    expect(context.dirname('a/b/'), 'a');
+    expect(context.dirname(r'a/b\c'), 'a');
+    expect(context.dirname('a//'), '.');
+    expect(context.dirname('a/b//'), 'a');
+    expect(context.dirname('a//b'), 'a');
   });
 
   test('basename', () {
-    expect(builder.basename(''), '');
-    expect(builder.basename('.'), '.');
-    expect(builder.basename('..'), '..');
-    expect(builder.basename('.foo'), '.foo');
-    expect(builder.basename('a'), 'a');
-    expect(builder.basename('a/b'), 'b');
-    expect(builder.basename('a/b/c'), 'c');
-    expect(builder.basename('a/b.c'), 'b.c');
-    expect(builder.basename('a/'), 'a');
-    expect(builder.basename('a/.'), '.');
-    expect(builder.basename('a/..'), '..');
-    expect(builder.basename(r'a\b/c'), 'c');
-    expect(builder.basename('/a'), 'a');
-    expect(builder.basename('/'), '/');
-    expect(builder.basename('a/b/'), 'b');
-    expect(builder.basename(r'a/b\c'), r'b\c');
-    expect(builder.basename('a//'), 'a');
-    expect(builder.basename('a/b//'), 'b');
-    expect(builder.basename('a//b'), 'b');
+    expect(context.basename(''), '');
+    expect(context.basename('.'), '.');
+    expect(context.basename('..'), '..');
+    expect(context.basename('.foo'), '.foo');
+    expect(context.basename('a'), 'a');
+    expect(context.basename('a/b'), 'b');
+    expect(context.basename('a/b/c'), 'c');
+    expect(context.basename('a/b.c'), 'b.c');
+    expect(context.basename('a/'), 'a');
+    expect(context.basename('a/.'), '.');
+    expect(context.basename('a/..'), '..');
+    expect(context.basename(r'a\b/c'), 'c');
+    expect(context.basename('/a'), 'a');
+    expect(context.basename('/'), '/');
+    expect(context.basename('a/b/'), 'b');
+    expect(context.basename(r'a/b\c'), r'b\c');
+    expect(context.basename('a//'), 'a');
+    expect(context.basename('a/b//'), 'b');
+    expect(context.basename('a//b'), 'b');
   });
 
   test('basenameWithoutExtension', () {
-    expect(builder.basenameWithoutExtension(''), '');
-    expect(builder.basenameWithoutExtension('.'), '.');
-    expect(builder.basenameWithoutExtension('..'), '..');
-    expect(builder.basenameWithoutExtension('a'), 'a');
-    expect(builder.basenameWithoutExtension('a/b'), 'b');
-    expect(builder.basenameWithoutExtension('a/b/c'), 'c');
-    expect(builder.basenameWithoutExtension('a/b.c'), 'b');
-    expect(builder.basenameWithoutExtension('a/'), 'a');
-    expect(builder.basenameWithoutExtension('a/.'), '.');
-    expect(builder.basenameWithoutExtension(r'a/b\c'), r'b\c');
-    expect(builder.basenameWithoutExtension('a/.bashrc'), '.bashrc');
-    expect(builder.basenameWithoutExtension('a/b/c.d.e'), 'c.d');
-    expect(builder.basenameWithoutExtension('a//'), 'a');
-    expect(builder.basenameWithoutExtension('a/b//'), 'b');
-    expect(builder.basenameWithoutExtension('a//b'), 'b');
-    expect(builder.basenameWithoutExtension('a/b.c/'), 'b');
-    expect(builder.basenameWithoutExtension('a/b.c//'), 'b');
-    expect(builder.basenameWithoutExtension('a/b c.d e'), 'b c');
+    expect(context.basenameWithoutExtension(''), '');
+    expect(context.basenameWithoutExtension('.'), '.');
+    expect(context.basenameWithoutExtension('..'), '..');
+    expect(context.basenameWithoutExtension('a'), 'a');
+    expect(context.basenameWithoutExtension('a/b'), 'b');
+    expect(context.basenameWithoutExtension('a/b/c'), 'c');
+    expect(context.basenameWithoutExtension('a/b.c'), 'b');
+    expect(context.basenameWithoutExtension('a/'), 'a');
+    expect(context.basenameWithoutExtension('a/.'), '.');
+    expect(context.basenameWithoutExtension(r'a/b\c'), r'b\c');
+    expect(context.basenameWithoutExtension('a/.bashrc'), '.bashrc');
+    expect(context.basenameWithoutExtension('a/b/c.d.e'), 'c.d');
+    expect(context.basenameWithoutExtension('a//'), 'a');
+    expect(context.basenameWithoutExtension('a/b//'), 'b');
+    expect(context.basenameWithoutExtension('a//b'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c/'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c//'), 'b');
+    expect(context.basenameWithoutExtension('a/b c.d e'), 'b c');
   });
 
   test('isAbsolute', () {
-    expect(builder.isAbsolute(''), false);
-    expect(builder.isAbsolute('a'), false);
-    expect(builder.isAbsolute('a/b'), false);
-    expect(builder.isAbsolute('/a'), true);
-    expect(builder.isAbsolute('/a/b'), true);
-    expect(builder.isAbsolute('~'), false);
-    expect(builder.isAbsolute('.'), false);
-    expect(builder.isAbsolute('..'), false);
-    expect(builder.isAbsolute('.foo'), false);
-    expect(builder.isAbsolute('../a'), false);
-    expect(builder.isAbsolute('C:/a'), false);
-    expect(builder.isAbsolute(r'C:\a'), false);
-    expect(builder.isAbsolute(r'\\a'), false);
+    expect(context.isAbsolute(''), false);
+    expect(context.isAbsolute('a'), false);
+    expect(context.isAbsolute('a/b'), false);
+    expect(context.isAbsolute('/a'), true);
+    expect(context.isAbsolute('/a/b'), true);
+    expect(context.isAbsolute('~'), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute('..'), false);
+    expect(context.isAbsolute('.foo'), false);
+    expect(context.isAbsolute('../a'), false);
+    expect(context.isAbsolute('C:/a'), false);
+    expect(context.isAbsolute(r'C:\a'), false);
+    expect(context.isAbsolute(r'\\a'), false);
   });
 
   test('isRelative', () {
-    expect(builder.isRelative(''), true);
-    expect(builder.isRelative('a'), true);
-    expect(builder.isRelative('a/b'), true);
-    expect(builder.isRelative('/a'), false);
-    expect(builder.isRelative('/a/b'), false);
-    expect(builder.isRelative('~'), true);
-    expect(builder.isRelative('.'), true);
-    expect(builder.isRelative('..'), true);
-    expect(builder.isRelative('.foo'), true);
-    expect(builder.isRelative('../a'), true);
-    expect(builder.isRelative('C:/a'), true);
-    expect(builder.isRelative(r'C:\a'), true);
-    expect(builder.isRelative(r'\\a'), true);
+    expect(context.isRelative(''), true);
+    expect(context.isRelative('a'), true);
+    expect(context.isRelative('a/b'), true);
+    expect(context.isRelative('/a'), false);
+    expect(context.isRelative('/a/b'), false);
+    expect(context.isRelative('~'), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative('..'), true);
+    expect(context.isRelative('.foo'), true);
+    expect(context.isRelative('../a'), true);
+    expect(context.isRelative('C:/a'), true);
+    expect(context.isRelative(r'C:\a'), true);
+    expect(context.isRelative(r'\\a'), true);
   });
 
   group('join', () {
     test('allows up to eight parts', () {
-      expect(builder.join('a'), 'a');
-      expect(builder.join('a', 'b'), 'a/b');
-      expect(builder.join('a', 'b', 'c'), 'a/b/c');
-      expect(builder.join('a', 'b', 'c', 'd'), 'a/b/c/d');
-      expect(builder.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f'), 'a/b/c/d/e/f');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), 'a/b/c/d/e/f/g');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
+      expect(context.join('a'), 'a');
+      expect(context.join('a', 'b'), 'a/b');
+      expect(context.join('a', 'b', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', 'c', 'd'), 'a/b/c/d');
+      expect(context.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f'), 'a/b/c/d/e/f');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), 'a/b/c/d/e/f/g');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
           'a/b/c/d/e/f/g/h');
     });
 
     test('does not add separator if a part ends in one', () {
-      expect(builder.join('a/', 'b', 'c/', 'd'), 'a/b/c/d');
-      expect(builder.join('a\\', 'b'), r'a\/b');
+      expect(context.join('a/', 'b', 'c/', 'd'), 'a/b/c/d');
+      expect(context.join('a\\', 'b'), r'a\/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.join('a', '/', 'b', 'c'), '/b/c');
-      expect(builder.join('a', '/b', '/c', 'd'), '/c/d');
-      expect(builder.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d');
-      expect(builder.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d');
+      expect(context.join('a', '/', 'b', 'c'), '/b/c');
+      expect(context.join('a', '/b', '/c', 'd'), '/c/d');
+      expect(context.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d');
+      expect(context.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d');
     });
 
     test('ignores trailing nulls', () {
-      expect(builder.join('a', null), equals('a'));
-      expect(builder.join('a', 'b', 'c', null, null), equals('a/b/c'));
+      expect(context.join('a', null), equals('a'));
+      expect(context.join('a', 'b', 'c', null, null), equals('a/b/c'));
     });
 
     test('ignores empty strings', () {
-      expect(builder.join(''), '');
-      expect(builder.join('', ''), '');
-      expect(builder.join('', 'a'), 'a');
-      expect(builder.join('a', '', 'b', '', '', '', 'c'), 'a/b/c');
-      expect(builder.join('a', 'b', ''), 'a/b');
+      expect(context.join(''), '');
+      expect(context.join('', ''), '');
+      expect(context.join('', 'a'), 'a');
+      expect(context.join('a', '', 'b', '', '', '', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', ''), 'a/b');
     });
 
     test('disallows intermediate nulls', () {
-      expect(() => builder.join('a', null, 'b'), throwsArgumentError);
-      expect(() => builder.join(null, 'a'), throwsArgumentError);
+      expect(() => context.join('a', null, 'b'), throwsArgumentError);
+      expect(() => context.join(null, 'a'), throwsArgumentError);
     });
 
     test('join does not modify internal ., .., or trailing separators', () {
-      expect(builder.join('a/', 'b/c/'), 'a/b/c/');
-      expect(builder.join('a/b/./c/..//', 'd/.././..//e/f//'),
+      expect(context.join('a/', 'b/c/'), 'a/b/c/');
+      expect(context.join('a/b/./c/..//', 'd/.././..//e/f//'),
              'a/b/./c/..//d/.././..//e/f//');
-      expect(builder.join('a/b', 'c/../../../..'), 'a/b/c/../../../..');
-      expect(builder.join('a', 'b${builder.separator}'), 'a/b/');
+      expect(context.join('a/b', 'c/../../../..'), 'a/b/c/../../../..');
+      expect(context.join('a', 'b${context.separator}'), 'a/b/');
     });
   });
 
   group('joinAll', () {
     test('allows more than eight parts', () {
-      expect(builder.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
+      expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
           'a/b/c/d/e/f/g/h/i');
     });
 
     test('does not add separator if a part ends in one', () {
-      expect(builder.joinAll(['a/', 'b', 'c/', 'd']), 'a/b/c/d');
-      expect(builder.joinAll(['a\\', 'b']), r'a\/b');
+      expect(context.joinAll(['a/', 'b', 'c/', 'd']), 'a/b/c/d');
+      expect(context.joinAll(['a\\', 'b']), r'a\/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.joinAll(['a', '/', 'b', 'c']), '/b/c');
-      expect(builder.joinAll(['a', '/b', '/c', 'd']), '/c/d');
-      expect(builder.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d');
-      expect(builder.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d');
+      expect(context.joinAll(['a', '/', 'b', 'c']), '/b/c');
+      expect(context.joinAll(['a', '/b', '/c', 'd']), '/c/d');
+      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d');
+      expect(context.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d');
     });
   });
 
   group('split', () {
     test('simple cases', () {
-      expect(builder.split(''), []);
-      expect(builder.split('.'), ['.']);
-      expect(builder.split('..'), ['..']);
-      expect(builder.split('foo'), equals(['foo']));
-      expect(builder.split('foo/bar.txt'), equals(['foo', 'bar.txt']));
-      expect(builder.split('foo/bar/baz'), equals(['foo', 'bar', 'baz']));
-      expect(builder.split('foo/../bar/./baz'),
+      expect(context.split(''), []);
+      expect(context.split('.'), ['.']);
+      expect(context.split('..'), ['..']);
+      expect(context.split('foo'), equals(['foo']));
+      expect(context.split('foo/bar.txt'), equals(['foo', 'bar.txt']));
+      expect(context.split('foo/bar/baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/../bar/./baz'),
           equals(['foo', '..', 'bar', '.', 'baz']));
-      expect(builder.split('foo//bar///baz'), equals(['foo', 'bar', 'baz']));
-      expect(builder.split('foo/\\/baz'), equals(['foo', '\\', 'baz']));
-      expect(builder.split('.'), equals(['.']));
-      expect(builder.split(''), equals([]));
-      expect(builder.split('foo/'), equals(['foo']));
-      expect(builder.split('//'), equals(['/']));
+      expect(context.split('foo//bar///baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/\\/baz'), equals(['foo', '\\', 'baz']));
+      expect(context.split('.'), equals(['.']));
+      expect(context.split(''), equals([]));
+      expect(context.split('foo/'), equals(['foo']));
+      expect(context.split('//'), equals(['/']));
     });
 
     test('includes the root for absolute paths', () {
-      expect(builder.split('/foo/bar/baz'), equals(['/', 'foo', 'bar', 'baz']));
-      expect(builder.split('/'), equals(['/']));
+      expect(context.split('/foo/bar/baz'), equals(['/', 'foo', 'bar', 'baz']));
+      expect(context.split('/'), equals(['/']));
     });
   });
 
   group('normalize', () {
     test('simple cases', () {
-      expect(builder.normalize(''), '.');
-      expect(builder.normalize('.'), '.');
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize('a'), 'a');
-      expect(builder.normalize('/'), '/');
-      expect(builder.normalize(r'\'), r'\');
-      expect(builder.normalize('C:/'), 'C:');
-      expect(builder.normalize(r'C:\'), r'C:\');
-      expect(builder.normalize(r'\\'), r'\\');
-      expect(builder.normalize('a/./\xc5\u0bf8-;\u{1f085}\u{00}/c/d/../'),
+      expect(context.normalize(''), '.');
+      expect(context.normalize('.'), '.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('a'), 'a');
+      expect(context.normalize('/'), '/');
+      expect(context.normalize(r'\'), r'\');
+      expect(context.normalize('C:/'), 'C:');
+      expect(context.normalize(r'C:\'), r'C:\');
+      expect(context.normalize(r'\\'), r'\\');
+      expect(context.normalize('a/./\xc5\u0bf8-;\u{1f085}\u{00}/c/d/../'),
              'a/\xc5\u0bf8-;\u{1f085}\u{00}/c');
     });
 
     test('collapses redundant separators', () {
-      expect(builder.normalize(r'a/b/c'), r'a/b/c');
-      expect(builder.normalize(r'a//b///c////d'), r'a/b/c/d');
+      expect(context.normalize(r'a/b/c'), r'a/b/c');
+      expect(context.normalize(r'a//b///c////d'), r'a/b/c/d');
     });
 
     test('does not collapse separators for other platform', () {
-      expect(builder.normalize(r'a\\b\\\c'), r'a\\b\\\c');
+      expect(context.normalize(r'a\\b\\\c'), r'a\\b\\\c');
     });
 
     test('eliminates "." parts', () {
-      expect(builder.normalize('./'), '.');
-      expect(builder.normalize('/.'), '/');
-      expect(builder.normalize('/./'), '/');
-      expect(builder.normalize('./.'), '.');
-      expect(builder.normalize('a/./b'), 'a/b');
-      expect(builder.normalize('a/.b/c'), 'a/.b/c');
-      expect(builder.normalize('a/././b/./c'), 'a/b/c');
-      expect(builder.normalize('././a'), 'a');
-      expect(builder.normalize('a/./.'), 'a');
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('/.'), '/');
+      expect(context.normalize('/./'), '/');
+      expect(context.normalize('./.'), '.');
+      expect(context.normalize('a/./b'), 'a/b');
+      expect(context.normalize('a/.b/c'), 'a/.b/c');
+      expect(context.normalize('a/././b/./c'), 'a/b/c');
+      expect(context.normalize('././a'), 'a');
+      expect(context.normalize('a/./.'), 'a');
     });
 
     test('eliminates ".." parts', () {
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize('../'), '..');
-      expect(builder.normalize('../../..'), '../../..');
-      expect(builder.normalize('../../../'), '../../..');
-      expect(builder.normalize('/..'), '/');
-      expect(builder.normalize('/../../..'), '/');
-      expect(builder.normalize('/../../../a'), '/a');
-      expect(builder.normalize('c:/..'), '.');
-      expect(builder.normalize('A:/../../..'), '../..');
-      expect(builder.normalize('a/..'), '.');
-      expect(builder.normalize('a/b/..'), 'a');
-      expect(builder.normalize('a/../b'), 'b');
-      expect(builder.normalize('a/./../b'), 'b');
-      expect(builder.normalize('a/b/c/../../d/e/..'), 'a/d');
-      expect(builder.normalize('a/b/../../../../c'), '../../c');
-      expect(builder.normalize(r'z/a/b/../../..\../c'), r'z/..\../c');
-      expect(builder.normalize(r'a/b\c/../d'), 'a/d');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(context.normalize('../../..'), '../../..');
+      expect(context.normalize('../../../'), '../../..');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('/../../..'), '/');
+      expect(context.normalize('/../../../a'), '/a');
+      expect(context.normalize('c:/..'), '.');
+      expect(context.normalize('A:/../../..'), '../..');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize(r'z/a/b/../../..\../c'), r'z/..\../c');
+      expect(context.normalize(r'a/b\c/../d'), 'a/d');
     });
 
     test('does not walk before root on absolute paths', () {
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize('../'), '..');
-      expect(builder.normalize('http://dartlang.org/..'), 'http:');
-      expect(builder.normalize('http://dartlang.org/../../a'), 'a');
-      expect(builder.normalize('file:///..'), '.');
-      expect(builder.normalize('file:///../../a'), '../a');
-      expect(builder.normalize('/..'), '/');
-      expect(builder.normalize('a/..'), '.');
-      expect(builder.normalize('../a'), '../a');
-      expect(builder.normalize('/../a'), '/a');
-      expect(builder.normalize('c:/../a'), 'a');
-      expect(builder.normalize('/../a'), '/a');
-      expect(builder.normalize('a/b/..'), 'a');
-      expect(builder.normalize('../a/b/..'), '../a');
-      expect(builder.normalize('a/../b'), 'b');
-      expect(builder.normalize('a/./../b'), 'b');
-      expect(builder.normalize('a/b/c/../../d/e/..'), 'a/d');
-      expect(builder.normalize('a/b/../../../../c'), '../../c');
-      expect(builder.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(context.normalize('http://dartlang.org/..'), 'http:');
+      expect(context.normalize('http://dartlang.org/../../a'), 'a');
+      expect(context.normalize('file:///..'), '.');
+      expect(context.normalize('file:///../../a'), '../a');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('../a'), '../a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('c:/../a'), 'a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('../a/b/..'), '../a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.');
     });
 
     test('removes trailing separators', () {
-      expect(builder.normalize('./'), '.');
-      expect(builder.normalize('.//'), '.');
-      expect(builder.normalize('a/'), 'a');
-      expect(builder.normalize('a/b/'), 'a/b');
-      expect(builder.normalize(r'a/b\'), r'a/b\');
-      expect(builder.normalize('a/b///'), 'a/b');
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('.//'), '.');
+      expect(context.normalize('a/'), 'a');
+      expect(context.normalize('a/b/'), 'a/b');
+      expect(context.normalize(r'a/b\'), r'a/b\');
+      expect(context.normalize('a/b///'), 'a/b');
     });
   });
 
   group('relative', () {
     group('from absolute root', () {
       test('given absolute path in root', () {
-        expect(builder.relative('/'), '../..');
-        expect(builder.relative('/root'), '..');
-        expect(builder.relative('/root/path'), '.');
-        expect(builder.relative('/root/path/a'), 'a');
-        expect(builder.relative('/root/path/a/b.txt'), 'a/b.txt');
-        expect(builder.relative('/root/a/b.txt'), '../a/b.txt');
+        expect(context.relative('/'), '../..');
+        expect(context.relative('/root'), '..');
+        expect(context.relative('/root/path'), '.');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('/root/path/a/b.txt'), 'a/b.txt');
+        expect(context.relative('/root/a/b.txt'), '../a/b.txt');
       });
 
       test('given absolute path outside of root', () {
-        expect(builder.relative('/a/b'), '../../a/b');
-        expect(builder.relative('/root/path/a'), 'a');
-        expect(builder.relative('/root/path/a/b.txt'), 'a/b.txt');
-        expect(builder.relative('/root/a/b.txt'), '../a/b.txt');
+        expect(context.relative('/a/b'), '../../a/b');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('/root/path/a/b.txt'), 'a/b.txt');
+        expect(context.relative('/root/a/b.txt'), '../a/b.txt');
       });
 
       test('given relative path', () {
         // The path is considered relative to the root, so it basically just
         // normalizes.
-        expect(builder.relative(''), '.');
-        expect(builder.relative('.'), '.');
-        expect(builder.relative('a'), 'a');
-        expect(builder.relative('a/b.txt'), 'a/b.txt');
-        expect(builder.relative('../a/b.txt'), '../a/b.txt');
-        expect(builder.relative('a/./b/../c.txt'), 'a/c.txt');
+        expect(context.relative(''), '.');
+        expect(context.relative('.'), '.');
+        expect(context.relative('a'), 'a');
+        expect(context.relative('a/b.txt'), 'a/b.txt');
+        expect(context.relative('../a/b.txt'), '../a/b.txt');
+        expect(context.relative('a/./b/../c.txt'), 'a/c.txt');
       });
 
       // Regression
       test('from root-only path', () {
-        expect(builder.relative('/', from: '/'), '.');
-        expect(builder.relative('/root/path', from: '/'), 'root/path');
+        expect(context.relative('/', from: '/'), '.');
+        expect(context.relative('/root/path', from: '/'), 'root/path');
       });
     });
 
     group('from relative root', () {
-      var r = new path.Builder(style: path.Style.posix, root: 'foo/bar');
+      var r = new path.Context(style: path.Style.posix, current: 'foo/bar');
 
       test('given absolute path', () {
         expect(r.relative('/'), equals('/'));
@@ -383,103 +379,126 @@
     });
 
     test('from a root with extension', () {
-      var r = new path.Builder(style: path.Style.posix, root: '/dir.ext');
+      var r = new path.Context(style: path.Style.posix, current: '/dir.ext');
       expect(r.relative('/dir.ext/file'), 'file');
     });
 
     test('with a root parameter', () {
-      expect(builder.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
-      expect(builder.relative('..', from: '/foo/bar'), equals('../../root'));
-      expect(builder.relative('/foo/bar/baz', from: 'foo/bar'),
+      expect(context.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
+      expect(context.relative('..', from: '/foo/bar'), equals('../../root'));
+      expect(context.relative('/foo/bar/baz', from: 'foo/bar'),
           equals('../../../../foo/bar/baz'));
-      expect(builder.relative('..', from: 'foo/bar'), equals('../../..'));
+      expect(context.relative('..', from: 'foo/bar'), equals('../../..'));
     });
 
     test('with a root parameter and a relative root', () {
-      var r = new path.Builder(style: path.Style.posix, root: 'relative/root');
+      var r = new path.Context(
+          style: path.Style.posix, current: 'relative/root');
       expect(r.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
-      expect(() => r.relative('..', from: '/foo/bar'), throwsArgumentError);
+      expect(() => r.relative('..', from: '/foo/bar'), throwsPathException);
       expect(r.relative('/foo/bar/baz', from: 'foo/bar'),
           equals('/foo/bar/baz'));
       expect(r.relative('..', from: 'foo/bar'), equals('../../..'));
     });
 
     test('from a . root', () {
-      var r = new path.Builder(style: path.Style.posix, root: '.');
+      var r = new path.Context(style: path.Style.posix, current: '.');
       expect(r.relative('/foo/bar/baz'), equals('/foo/bar/baz'));
       expect(r.relative('foo/bar/baz'), equals('foo/bar/baz'));
     });
   });
 
-  group('resolve', () {
+  group('isWithin', () {
+    test('simple cases', () {
+      expect(context.isWithin('foo/bar', 'foo/bar'), isFalse);
+      expect(context.isWithin('foo/bar', 'foo/bar/baz'), isTrue);
+      expect(context.isWithin('foo/bar', 'foo/baz'), isFalse);
+      expect(context.isWithin('foo/bar', '../path/foo/bar/baz'), isTrue);
+      expect(context.isWithin('/', '/foo/bar'), isTrue);
+      expect(context.isWithin('baz', '/root/path/baz/bang'), isTrue);
+      expect(context.isWithin('baz', '/root/path/bang/baz'), isFalse);
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.posix, current: 'foo/bar');
+      expect(context.isWithin('.', 'a/b/c'), isTrue);
+      expect(context.isWithin('.', '../a/b/c'), isFalse);
+      expect(context.isWithin('.', '../../a/foo/b/c'), isFalse);
+      expect(context.isWithin('/', '/baz/bang'), isTrue);
+      expect(context.isWithin('.', '/baz/bang'), isFalse);
+    });
+  });
+
+  group('absolute', () {
     test('allows up to seven parts', () {
-      expect(builder.resolve('a'), '/root/path/a');
-      expect(builder.resolve('a', 'b'), '/root/path/a/b');
-      expect(builder.resolve('a', 'b', 'c'), '/root/path/a/b/c');
-      expect(builder.resolve('a', 'b', 'c', 'd'), '/root/path/a/b/c/d');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e'), '/root/path/a/b/c/d/e');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e', 'f'),
+      expect(context.absolute('a'), '/root/path/a');
+      expect(context.absolute('a', 'b'), '/root/path/a/b');
+      expect(context.absolute('a', 'b', 'c'), '/root/path/a/b/c');
+      expect(context.absolute('a', 'b', 'c', 'd'), '/root/path/a/b/c/d');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e'), '/root/path/a/b/c/d/e');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'),
           '/root/path/a/b/c/d/e/f');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e', 'f', 'g'),
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'),
           '/root/path/a/b/c/d/e/f/g');
     });
 
     test('does not add separator if a part ends in one', () {
-      expect(builder.resolve('a/', 'b', 'c/', 'd'), '/root/path/a/b/c/d');
-      expect(builder.resolve(r'a\', 'b'), r'/root/path/a\/b');
+      expect(context.absolute('a/', 'b', 'c/', 'd'), '/root/path/a/b/c/d');
+      expect(context.absolute(r'a\', 'b'), r'/root/path/a\/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.resolve('a', '/b', '/c', 'd'), '/c/d');
-      expect(builder.resolve('a', r'c:\b', 'c', 'd'), r'/root/path/a/c:\b/c/d');
-      expect(builder.resolve('a', r'\\b', 'c', 'd'), r'/root/path/a/\\b/c/d');
+      expect(context.absolute('a', '/b', '/c', 'd'), '/c/d');
+      expect(context.absolute('a', r'c:\b', 'c', 'd'),
+          r'/root/path/a/c:\b/c/d');
+      expect(context.absolute('a', r'\\b', 'c', 'd'), r'/root/path/a/\\b/c/d');
     });
   });
 
   test('withoutExtension', () {
-    expect(builder.withoutExtension(''), '');
-    expect(builder.withoutExtension('a'), 'a');
-    expect(builder.withoutExtension('.a'), '.a');
-    expect(builder.withoutExtension('a.b'), 'a');
-    expect(builder.withoutExtension('a/b.c'), 'a/b');
-    expect(builder.withoutExtension('a/b.c.d'), 'a/b.c');
-    expect(builder.withoutExtension('a/'), 'a/');
-    expect(builder.withoutExtension('a/b/'), 'a/b/');
-    expect(builder.withoutExtension('a/.'), 'a/.');
-    expect(builder.withoutExtension('a/.b'), 'a/.b');
-    expect(builder.withoutExtension('a.b/c'), 'a.b/c');
-    expect(builder.withoutExtension(r'a.b\c'), r'a');
-    expect(builder.withoutExtension(r'a/b\c'), r'a/b\c');
-    expect(builder.withoutExtension(r'a/b\c.d'), r'a/b\c');
-    expect(builder.withoutExtension('a/b.c/'), 'a/b/');
-    expect(builder.withoutExtension('a/b.c//'), 'a/b//');
+    expect(context.withoutExtension(''), '');
+    expect(context.withoutExtension('a'), 'a');
+    expect(context.withoutExtension('.a'), '.a');
+    expect(context.withoutExtension('a.b'), 'a');
+    expect(context.withoutExtension('a/b.c'), 'a/b');
+    expect(context.withoutExtension('a/b.c.d'), 'a/b.c');
+    expect(context.withoutExtension('a/'), 'a/');
+    expect(context.withoutExtension('a/b/'), 'a/b/');
+    expect(context.withoutExtension('a/.'), 'a/.');
+    expect(context.withoutExtension('a/.b'), 'a/.b');
+    expect(context.withoutExtension('a.b/c'), 'a.b/c');
+    expect(context.withoutExtension(r'a.b\c'), r'a');
+    expect(context.withoutExtension(r'a/b\c'), r'a/b\c');
+    expect(context.withoutExtension(r'a/b\c.d'), r'a/b\c');
+    expect(context.withoutExtension('a/b.c/'), 'a/b/');
+    expect(context.withoutExtension('a/b.c//'), 'a/b//');
   });
 
   test('fromUri', () {
-    expect(builder.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
-    expect(builder.fromUri(Uri.parse('file:///path/to/foo/')), '/path/to/foo/');
-    expect(builder.fromUri(Uri.parse('file:///')), '/');
-    expect(builder.fromUri(Uri.parse('foo/bar')), 'foo/bar');
-    expect(builder.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
-    expect(builder.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
-    expect(builder.fromUri(Uri.parse('file:///path/to/foo%23bar')),
+    expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
+    expect(context.fromUri(Uri.parse('file:///path/to/foo/')), '/path/to/foo/');
+    expect(context.fromUri(Uri.parse('file:///')), '/');
+    expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+    expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
+    expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
+    expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
         '/path/to/foo#bar');
-    expect(builder.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
         r'_{_}_`_^_ _"_%_');
-    expect(() => builder.fromUri(Uri.parse('http://dartlang.org')),
+    expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
         throwsArgumentError);
   });
 
   test('toUri', () {
-    expect(builder.toUri('/path/to/foo'), Uri.parse('file:///path/to/foo'));
-    expect(builder.toUri('/path/to/foo/'), Uri.parse('file:///path/to/foo/'));
-    expect(builder.toUri('/'), Uri.parse('file:///'));
-    expect(builder.toUri('foo/bar'), Uri.parse('foo/bar'));
-    expect(builder.toUri('/path/to/foo#bar'),
+    expect(context.toUri('/path/to/foo'), Uri.parse('file:///path/to/foo'));
+    expect(context.toUri('/path/to/foo/'), Uri.parse('file:///path/to/foo/'));
+    expect(context.toUri('/'), Uri.parse('file:///'));
+    expect(context.toUri('foo/bar'), Uri.parse('foo/bar'));
+    expect(context.toUri('/path/to/foo#bar'),
         Uri.parse('file:///path/to/foo%23bar'));
-    expect(builder.toUri(r'/_{_}_`_^_ _"_%_'),
+    expect(context.toUri(r'/_{_}_`_^_ _"_%_'),
         Uri.parse('file:///_%7B_%7D_%60_%5E_%20_%22_%25_'));
-    expect(builder.toUri(r'_{_}_`_^_ _"_%_'),
+    expect(context.toUri(r'_{_}_`_^_ _"_%_'),
         Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
   });
 }
diff --git a/pkg/path/test/relative_test.dart b/pkg/path/test/relative_test.dart
index b9cd254..58163d2 100644
--- a/pkg/path/test/relative_test.dart
+++ b/pkg/path/test/relative_test.dart
@@ -2,34 +2,36 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// Test "relative" on all styles of path.Builder, on all platforms.
+// Test "relative" on all styles of path.Context, on all platforms.
 
 import "package:unittest/unittest.dart";
 import "package:path/path.dart" as path;
 
+import "utils.dart";
+
 void main() {
   test("test relative", () {
-    relativeTest(new path.Builder(style: path.Style.posix, root: '.'), '/');
-    relativeTest(new path.Builder(style: path.Style.posix, root: '/'), '/');
-    relativeTest(new path.Builder(style: path.Style.windows, root: r'd:\'),
+    relativeTest(new path.Context(style: path.Style.posix, current: '.'), '/');
+    relativeTest(new path.Context(style: path.Style.posix, current: '/'), '/');
+    relativeTest(new path.Context(style: path.Style.windows, current: r'd:\'),
                  r'c:\');
-    relativeTest(new path.Builder(style: path.Style.windows, root: '.'),
+    relativeTest(new path.Context(style: path.Style.windows, current: '.'),
                  r'c:\');
-    relativeTest(new path.Builder(style: path.Style.url, root: 'file:///'),
+    relativeTest(new path.Context(style: path.Style.url, current: 'file:///'),
                  'http://myserver/');
-    relativeTest(new path.Builder(style: path.Style.url, root: '.'),
+    relativeTest(new path.Context(style: path.Style.url, current: '.'),
                  'http://myserver/');
-    relativeTest(new path.Builder(style: path.Style.url, root: 'file:///'),
+    relativeTest(new path.Context(style: path.Style.url, current: 'file:///'),
                  '/');
-    relativeTest(new path.Builder(style: path.Style.url, root: '.'), '/');
+    relativeTest(new path.Context(style: path.Style.url, current: '.'), '/');
   });
 }
 
-void relativeTest(path.Builder builder, String prefix) {
-  var isRelative = (builder.root == '.');
+void relativeTest(path.Context context, String prefix) {
+  var isRelative = (context.current == '.');
   // Cases where the arguments are absolute paths.
   expectRelative(result, pathArg, fromArg) {
-    expect(builder.normalize(result), builder.relative(pathArg, from: fromArg));
+    expect(context.normalize(result), context.relative(pathArg, from: fromArg));
   }
 
   expectRelative('c/d', '${prefix}a/b/c/d', '${prefix}a/b');
@@ -75,11 +77,11 @@
 
   // Should always throw - no relative path can be constructed.
   if (isRelative) {
-    expect(() => builder.relative('.', from: '..'), throwsArgumentError);
-    expect(() => builder.relative('a/b', from: '../../d'),
-           throwsArgumentError);
-    expect(() => builder.relative('a/b', from: '${prefix}a/b'),
-           throwsArgumentError);
+    expect(() => context.relative('.', from: '..'), throwsPathException);
+    expect(() => context.relative('a/b', from: '../../d'),
+           throwsPathException);
+    expect(() => context.relative('a/b', from: '${prefix}a/b'),
+           throwsPathException);
     // An absolute path relative from a relative path returns the absolute path.
     expectRelative('${prefix}a/b', '${prefix}a/b', 'c/d');
   }
diff --git a/pkg/path/test/url_test.dart b/pkg/path/test/url_test.dart
index d43e88c..e149b4f 100644
--- a/pkg/path/test/url_test.dart
+++ b/pkg/path/test/url_test.dart
@@ -6,489 +6,489 @@
 import 'package:path/path.dart' as path;
 
 main() {
-  var builder = new path.Builder(style: path.Style.url,
-      root: 'http://dartlang.org/root/path');
+  var context = new path.Context(style: path.Style.url,
+      current: 'http://dartlang.org/root/path');
 
   test('separator', () {
-    expect(builder.separator, '/');
+    expect(context.separator, '/');
   });
 
   test('extension', () {
-    expect(builder.extension(''), '');
-    expect(builder.extension('foo.dart'), '.dart');
-    expect(builder.extension('foo.dart.js'), '.js');
-    expect(builder.extension('a.b/c'), '');
-    expect(builder.extension('a.b/c.d'), '.d');
-    expect(builder.extension(r'a.b\c'), r'.b\c');
-    expect(builder.extension('foo.dart/'), '.dart');
-    expect(builder.extension('foo.dart//'), '.dart');
+    expect(context.extension(''), '');
+    expect(context.extension('foo.dart'), '.dart');
+    expect(context.extension('foo.dart.js'), '.js');
+    expect(context.extension('a.b/c'), '');
+    expect(context.extension('a.b/c.d'), '.d');
+    expect(context.extension(r'a.b\c'), r'.b\c');
+    expect(context.extension('foo.dart/'), '.dart');
+    expect(context.extension('foo.dart//'), '.dart');
   });
 
   test('rootPrefix', () {
-    expect(builder.rootPrefix(''), '');
-    expect(builder.rootPrefix('a'), '');
-    expect(builder.rootPrefix('a/b'), '');
-    expect(builder.rootPrefix('http://dartlang.org/a/c'),
+    expect(context.rootPrefix(''), '');
+    expect(context.rootPrefix('a'), '');
+    expect(context.rootPrefix('a/b'), '');
+    expect(context.rootPrefix('http://dartlang.org/a/c'),
         'http://dartlang.org');
-    expect(builder.rootPrefix('file:///a/c'), 'file://');
-    expect(builder.rootPrefix('/a/c'), '/');
-    expect(builder.rootPrefix('http://dartlang.org/'), 'http://dartlang.org');
-    expect(builder.rootPrefix('file:///'), 'file://');
-    expect(builder.rootPrefix('http://dartlang.org'), 'http://dartlang.org');
-    expect(builder.rootPrefix('file://'), 'file://');
-    expect(builder.rootPrefix('/'), '/');
+    expect(context.rootPrefix('file:///a/c'), 'file://');
+    expect(context.rootPrefix('/a/c'), '/');
+    expect(context.rootPrefix('http://dartlang.org/'), 'http://dartlang.org');
+    expect(context.rootPrefix('file:///'), 'file://');
+    expect(context.rootPrefix('http://dartlang.org'), 'http://dartlang.org');
+    expect(context.rootPrefix('file://'), 'file://');
+    expect(context.rootPrefix('/'), '/');
   });
 
   test('dirname', () {
-    expect(builder.dirname(''), '.');
-    expect(builder.dirname('a'), '.');
-    expect(builder.dirname('a/b'), 'a');
-    expect(builder.dirname('a/b/c'), 'a/b');
-    expect(builder.dirname('a/b.c'), 'a');
-    expect(builder.dirname('a/'), '.');
-    expect(builder.dirname('a/.'), 'a');
-    expect(builder.dirname(r'a\b/c'), r'a\b');
-    expect(builder.dirname('http://dartlang.org/a'), 'http://dartlang.org');
-    expect(builder.dirname('file:///a'), 'file://');
-    expect(builder.dirname('/a'), '/');
-    expect(builder.dirname('http://dartlang.org///a'), 'http://dartlang.org');
-    expect(builder.dirname('file://///a'), 'file://');
-    expect(builder.dirname('///a'), '/');
-    expect(builder.dirname('http://dartlang.org/'), 'http://dartlang.org');
-    expect(builder.dirname('http://dartlang.org'), 'http://dartlang.org');
-    expect(builder.dirname('file:///'), 'file://');
-    expect(builder.dirname('file://'), 'file://');
-    expect(builder.dirname('/'), '/');
-    expect(builder.dirname('http://dartlang.org///'), 'http://dartlang.org');
-    expect(builder.dirname('file://///'), 'file://');
-    expect(builder.dirname('///'), '/');
-    expect(builder.dirname('a/b/'), 'a');
-    expect(builder.dirname(r'a/b\c'), 'a');
-    expect(builder.dirname('a//'), '.');
-    expect(builder.dirname('a/b//'), 'a');
-    expect(builder.dirname('a//b'), 'a');
+    expect(context.dirname(''), '.');
+    expect(context.dirname('a'), '.');
+    expect(context.dirname('a/b'), 'a');
+    expect(context.dirname('a/b/c'), 'a/b');
+    expect(context.dirname('a/b.c'), 'a');
+    expect(context.dirname('a/'), '.');
+    expect(context.dirname('a/.'), 'a');
+    expect(context.dirname(r'a\b/c'), r'a\b');
+    expect(context.dirname('http://dartlang.org/a'), 'http://dartlang.org');
+    expect(context.dirname('file:///a'), 'file://');
+    expect(context.dirname('/a'), '/');
+    expect(context.dirname('http://dartlang.org///a'), 'http://dartlang.org');
+    expect(context.dirname('file://///a'), 'file://');
+    expect(context.dirname('///a'), '/');
+    expect(context.dirname('http://dartlang.org/'), 'http://dartlang.org');
+    expect(context.dirname('http://dartlang.org'), 'http://dartlang.org');
+    expect(context.dirname('file:///'), 'file://');
+    expect(context.dirname('file://'), 'file://');
+    expect(context.dirname('/'), '/');
+    expect(context.dirname('http://dartlang.org///'), 'http://dartlang.org');
+    expect(context.dirname('file://///'), 'file://');
+    expect(context.dirname('///'), '/');
+    expect(context.dirname('a/b/'), 'a');
+    expect(context.dirname(r'a/b\c'), 'a');
+    expect(context.dirname('a//'), '.');
+    expect(context.dirname('a/b//'), 'a');
+    expect(context.dirname('a//b'), 'a');
   });
 
   test('basename', () {
-    expect(builder.basename(''), '');
-    expect(builder.basename('a'), 'a');
-    expect(builder.basename('a/b'), 'b');
-    expect(builder.basename('a/b/c'), 'c');
-    expect(builder.basename('a/b.c'), 'b.c');
-    expect(builder.basename('a/'), 'a');
-    expect(builder.basename('a/.'), '.');
-    expect(builder.basename(r'a\b/c'), 'c');
-    expect(builder.basename('http://dartlang.org/a'), 'a');
-    expect(builder.basename('file:///a'), 'a');
-    expect(builder.basename('/a'), 'a');
-    expect(builder.basename('http://dartlang.org/'), 'http://dartlang.org');
-    expect(builder.basename('http://dartlang.org'), 'http://dartlang.org');
-    expect(builder.basename('file:///'), 'file://');
-    expect(builder.basename('file://'), 'file://');
-    expect(builder.basename('/'), '/');
-    expect(builder.basename('a/b/'), 'b');
-    expect(builder.basename(r'a/b\c'), r'b\c');
-    expect(builder.basename('a//'), 'a');
-    expect(builder.basename('a/b//'), 'b');
-    expect(builder.basename('a//b'), 'b');
-    expect(builder.basename('a b/c d.e f'), 'c d.e f');
+    expect(context.basename(''), '');
+    expect(context.basename('a'), 'a');
+    expect(context.basename('a/b'), 'b');
+    expect(context.basename('a/b/c'), 'c');
+    expect(context.basename('a/b.c'), 'b.c');
+    expect(context.basename('a/'), 'a');
+    expect(context.basename('a/.'), '.');
+    expect(context.basename(r'a\b/c'), 'c');
+    expect(context.basename('http://dartlang.org/a'), 'a');
+    expect(context.basename('file:///a'), 'a');
+    expect(context.basename('/a'), 'a');
+    expect(context.basename('http://dartlang.org/'), 'http://dartlang.org');
+    expect(context.basename('http://dartlang.org'), 'http://dartlang.org');
+    expect(context.basename('file:///'), 'file://');
+    expect(context.basename('file://'), 'file://');
+    expect(context.basename('/'), '/');
+    expect(context.basename('a/b/'), 'b');
+    expect(context.basename(r'a/b\c'), r'b\c');
+    expect(context.basename('a//'), 'a');
+    expect(context.basename('a/b//'), 'b');
+    expect(context.basename('a//b'), 'b');
+    expect(context.basename('a b/c d.e f'), 'c d.e f');
   });
 
   test('basenameWithoutExtension', () {
-    expect(builder.basenameWithoutExtension(''), '');
-    expect(builder.basenameWithoutExtension('.'), '.');
-    expect(builder.basenameWithoutExtension('..'), '..');
-    expect(builder.basenameWithoutExtension('a'), 'a');
-    expect(builder.basenameWithoutExtension('a/b'), 'b');
-    expect(builder.basenameWithoutExtension('a/b/c'), 'c');
-    expect(builder.basenameWithoutExtension('a/b.c'), 'b');
-    expect(builder.basenameWithoutExtension('a/'), 'a');
-    expect(builder.basenameWithoutExtension('a/.'), '.');
-    expect(builder.basenameWithoutExtension(r'a/b\c'), r'b\c');
-    expect(builder.basenameWithoutExtension('a/.bashrc'), '.bashrc');
-    expect(builder.basenameWithoutExtension('a/b/c.d.e'), 'c.d');
-    expect(builder.basenameWithoutExtension('a//'), 'a');
-    expect(builder.basenameWithoutExtension('a/b//'), 'b');
-    expect(builder.basenameWithoutExtension('a//b'), 'b');
-    expect(builder.basenameWithoutExtension('a/b.c/'), 'b');
-    expect(builder.basenameWithoutExtension('a/b.c//'), 'b');
-    expect(builder.basenameWithoutExtension('a/b c.d e.f g'), 'b c.d e');
+    expect(context.basenameWithoutExtension(''), '');
+    expect(context.basenameWithoutExtension('.'), '.');
+    expect(context.basenameWithoutExtension('..'), '..');
+    expect(context.basenameWithoutExtension('a'), 'a');
+    expect(context.basenameWithoutExtension('a/b'), 'b');
+    expect(context.basenameWithoutExtension('a/b/c'), 'c');
+    expect(context.basenameWithoutExtension('a/b.c'), 'b');
+    expect(context.basenameWithoutExtension('a/'), 'a');
+    expect(context.basenameWithoutExtension('a/.'), '.');
+    expect(context.basenameWithoutExtension(r'a/b\c'), r'b\c');
+    expect(context.basenameWithoutExtension('a/.bashrc'), '.bashrc');
+    expect(context.basenameWithoutExtension('a/b/c.d.e'), 'c.d');
+    expect(context.basenameWithoutExtension('a//'), 'a');
+    expect(context.basenameWithoutExtension('a/b//'), 'b');
+    expect(context.basenameWithoutExtension('a//b'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c/'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c//'), 'b');
+    expect(context.basenameWithoutExtension('a/b c.d e.f g'), 'b c.d e');
   });
 
   test('isAbsolute', () {
-    expect(builder.isAbsolute(''), false);
-    expect(builder.isAbsolute('a'), false);
-    expect(builder.isAbsolute('a/b'), false);
-    expect(builder.isAbsolute('http://dartlang.org/a'), true);
-    expect(builder.isAbsolute('file:///a'), true);
-    expect(builder.isAbsolute('/a'), true);
-    expect(builder.isAbsolute('http://dartlang.org/a/b'), true);
-    expect(builder.isAbsolute('file:///a/b'), true);
-    expect(builder.isAbsolute('/a/b'), true);
-    expect(builder.isAbsolute('http://dartlang.org/'), true);
-    expect(builder.isAbsolute('file:///'), true);
-    expect(builder.isAbsolute('http://dartlang.org'), true);
-    expect(builder.isAbsolute('file://'), true);
-    expect(builder.isAbsolute('/'), true);
-    expect(builder.isAbsolute('~'), false);
-    expect(builder.isAbsolute('.'), false);
-    expect(builder.isAbsolute('../a'), false);
-    expect(builder.isAbsolute('C:/a'), false);
-    expect(builder.isAbsolute(r'C:\a'), false);
-    expect(builder.isAbsolute(r'\\a'), false);
+    expect(context.isAbsolute(''), false);
+    expect(context.isAbsolute('a'), false);
+    expect(context.isAbsolute('a/b'), false);
+    expect(context.isAbsolute('http://dartlang.org/a'), true);
+    expect(context.isAbsolute('file:///a'), true);
+    expect(context.isAbsolute('/a'), true);
+    expect(context.isAbsolute('http://dartlang.org/a/b'), true);
+    expect(context.isAbsolute('file:///a/b'), true);
+    expect(context.isAbsolute('/a/b'), true);
+    expect(context.isAbsolute('http://dartlang.org/'), true);
+    expect(context.isAbsolute('file:///'), true);
+    expect(context.isAbsolute('http://dartlang.org'), true);
+    expect(context.isAbsolute('file://'), true);
+    expect(context.isAbsolute('/'), true);
+    expect(context.isAbsolute('~'), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute('../a'), false);
+    expect(context.isAbsolute('C:/a'), false);
+    expect(context.isAbsolute(r'C:\a'), false);
+    expect(context.isAbsolute(r'\\a'), false);
   });
 
   test('isRelative', () {
-    expect(builder.isRelative(''), true);
-    expect(builder.isRelative('a'), true);
-    expect(builder.isRelative('a/b'), true);
-    expect(builder.isRelative('http://dartlang.org/a'), false);
-    expect(builder.isRelative('file:///a'), false);
-    expect(builder.isRelative('/a'), false);
-    expect(builder.isRelative('http://dartlang.org/a/b'), false);
-    expect(builder.isRelative('file:///a/b'), false);
-    expect(builder.isRelative('/a/b'), false);
-    expect(builder.isRelative('http://dartlang.org/'), false);
-    expect(builder.isRelative('file:///'), false);
-    expect(builder.isRelative('http://dartlang.org'), false);
-    expect(builder.isRelative('file://'), false);
-    expect(builder.isRelative('/'), false);
-    expect(builder.isRelative('~'), true);
-    expect(builder.isRelative('.'), true);
-    expect(builder.isRelative('../a'), true);
-    expect(builder.isRelative('C:/a'), true);
-    expect(builder.isRelative(r'C:\a'), true);
-    expect(builder.isRelative(r'\\a'), true);
+    expect(context.isRelative(''), true);
+    expect(context.isRelative('a'), true);
+    expect(context.isRelative('a/b'), true);
+    expect(context.isRelative('http://dartlang.org/a'), false);
+    expect(context.isRelative('file:///a'), false);
+    expect(context.isRelative('/a'), false);
+    expect(context.isRelative('http://dartlang.org/a/b'), false);
+    expect(context.isRelative('file:///a/b'), false);
+    expect(context.isRelative('/a/b'), false);
+    expect(context.isRelative('http://dartlang.org/'), false);
+    expect(context.isRelative('file:///'), false);
+    expect(context.isRelative('http://dartlang.org'), false);
+    expect(context.isRelative('file://'), false);
+    expect(context.isRelative('/'), false);
+    expect(context.isRelative('~'), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative('../a'), true);
+    expect(context.isRelative('C:/a'), true);
+    expect(context.isRelative(r'C:\a'), true);
+    expect(context.isRelative(r'\\a'), true);
   });
 
   test('isRootRelative', () {
-    expect(builder.isRootRelative(''), false);
-    expect(builder.isRootRelative('a'), false);
-    expect(builder.isRootRelative('a/b'), false);
-    expect(builder.isRootRelative('http://dartlang.org/a'), false);
-    expect(builder.isRootRelative('file:///a'), false);
-    expect(builder.isRootRelative('/a'), true);
-    expect(builder.isRootRelative('http://dartlang.org/a/b'), false);
-    expect(builder.isRootRelative('file:///a/b'), false);
-    expect(builder.isRootRelative('/a/b'), true);
-    expect(builder.isRootRelative('http://dartlang.org/'), false);
-    expect(builder.isRootRelative('file:///'), false);
-    expect(builder.isRootRelative('http://dartlang.org'), false);
-    expect(builder.isRootRelative('file://'), false);
-    expect(builder.isRootRelative('/'), true);
-    expect(builder.isRootRelative('~'), false);
-    expect(builder.isRootRelative('.'), false);
-    expect(builder.isRootRelative('../a'), false);
-    expect(builder.isRootRelative('C:/a'), false);
-    expect(builder.isRootRelative(r'C:\a'), false);
-    expect(builder.isRootRelative(r'\\a'), false);
+    expect(context.isRootRelative(''), false);
+    expect(context.isRootRelative('a'), false);
+    expect(context.isRootRelative('a/b'), false);
+    expect(context.isRootRelative('http://dartlang.org/a'), false);
+    expect(context.isRootRelative('file:///a'), false);
+    expect(context.isRootRelative('/a'), true);
+    expect(context.isRootRelative('http://dartlang.org/a/b'), false);
+    expect(context.isRootRelative('file:///a/b'), false);
+    expect(context.isRootRelative('/a/b'), true);
+    expect(context.isRootRelative('http://dartlang.org/'), false);
+    expect(context.isRootRelative('file:///'), false);
+    expect(context.isRootRelative('http://dartlang.org'), false);
+    expect(context.isRootRelative('file://'), false);
+    expect(context.isRootRelative('/'), true);
+    expect(context.isRootRelative('~'), false);
+    expect(context.isRootRelative('.'), false);
+    expect(context.isRootRelative('../a'), false);
+    expect(context.isRootRelative('C:/a'), false);
+    expect(context.isRootRelative(r'C:\a'), false);
+    expect(context.isRootRelative(r'\\a'), false);
   });
 
   group('join', () {
     test('allows up to eight parts', () {
-      expect(builder.join('a'), 'a');
-      expect(builder.join('a', 'b'), 'a/b');
-      expect(builder.join('a', 'b', 'c'), 'a/b/c');
-      expect(builder.join('a', 'b', 'c', 'd'), 'a/b/c/d');
-      expect(builder.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f'), 'a/b/c/d/e/f');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), 'a/b/c/d/e/f/g');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
+      expect(context.join('a'), 'a');
+      expect(context.join('a', 'b'), 'a/b');
+      expect(context.join('a', 'b', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', 'c', 'd'), 'a/b/c/d');
+      expect(context.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f'), 'a/b/c/d/e/f');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), 'a/b/c/d/e/f/g');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
           'a/b/c/d/e/f/g/h');
     });
 
     test('does not add separator if a part ends in one', () {
-      expect(builder.join('a/', 'b', 'c/', 'd'), 'a/b/c/d');
-      expect(builder.join('a\\', 'b'), r'a\/b');
+      expect(context.join('a/', 'b', 'c/', 'd'), 'a/b/c/d');
+      expect(context.join('a\\', 'b'), r'a\/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.join('a', 'http://dartlang.org', 'b', 'c'),
+      expect(context.join('a', 'http://dartlang.org', 'b', 'c'),
           'http://dartlang.org/b/c');
-      expect(builder.join('a', 'file://', 'b', 'c'), 'file:///b/c');
-      expect(builder.join('a', '/', 'b', 'c'), '/b/c');
-      expect(builder.join('a', '/b', 'http://dartlang.org/c', 'd'),
+      expect(context.join('a', 'file://', 'b', 'c'), 'file:///b/c');
+      expect(context.join('a', '/', 'b', 'c'), '/b/c');
+      expect(context.join('a', '/b', 'http://dartlang.org/c', 'd'),
           'http://dartlang.org/c/d');
-      expect(builder.join(
+      expect(context.join(
               'a', 'http://google.com/b', 'http://dartlang.org/c', 'd'),
           'http://dartlang.org/c/d');
-      expect(builder.join('a', '/b', '/c', 'd'), '/c/d');
-      expect(builder.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d');
-      expect(builder.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d');
+      expect(context.join('a', '/b', '/c', 'd'), '/c/d');
+      expect(context.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d');
+      expect(context.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d');
     });
 
     test('preserves roots before a root-relative path', () {
-      expect(builder.join('http://dartlang.org', 'a', '/b', 'c'),
+      expect(context.join('http://dartlang.org', 'a', '/b', 'c'),
           'http://dartlang.org/b/c');
-      expect(builder.join('file://', 'a', '/b', 'c'), 'file:///b/c');
-      expect(builder.join('file://', 'a', '/b', 'c', '/d'), 'file:///d');
+      expect(context.join('file://', 'a', '/b', 'c'), 'file:///b/c');
+      expect(context.join('file://', 'a', '/b', 'c', '/d'), 'file:///d');
     });
 
     test('ignores trailing nulls', () {
-      expect(builder.join('a', null), equals('a'));
-      expect(builder.join('a', 'b', 'c', null, null), equals('a/b/c'));
+      expect(context.join('a', null), equals('a'));
+      expect(context.join('a', 'b', 'c', null, null), equals('a/b/c'));
     });
 
     test('ignores empty strings', () {
-      expect(builder.join(''), '');
-      expect(builder.join('', ''), '');
-      expect(builder.join('', 'a'), 'a');
-      expect(builder.join('a', '', 'b', '', '', '', 'c'), 'a/b/c');
-      expect(builder.join('a', 'b', ''), 'a/b');
+      expect(context.join(''), '');
+      expect(context.join('', ''), '');
+      expect(context.join('', 'a'), 'a');
+      expect(context.join('a', '', 'b', '', '', '', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', ''), 'a/b');
     });
 
     test('disallows intermediate nulls', () {
-      expect(() => builder.join('a', null, 'b'), throwsArgumentError);
-      expect(() => builder.join(null, 'a'), throwsArgumentError);
+      expect(() => context.join('a', null, 'b'), throwsArgumentError);
+      expect(() => context.join(null, 'a'), throwsArgumentError);
     });
 
     test('Join does not modify internal ., .., or trailing separators', () {
-      expect(builder.join('a/', 'b/c/'), 'a/b/c/');
-      expect(builder.join('a/b/./c/..//', 'd/.././..//e/f//'),
+      expect(context.join('a/', 'b/c/'), 'a/b/c/');
+      expect(context.join('a/b/./c/..//', 'd/.././..//e/f//'),
              'a/b/./c/..//d/.././..//e/f//');
-      expect(builder.join('a/b', 'c/../../../..'), 'a/b/c/../../../..');
-      expect(builder.join('a', 'b${builder.separator}'), 'a/b/');
+      expect(context.join('a/b', 'c/../../../..'), 'a/b/c/../../../..');
+      expect(context.join('a', 'b${context.separator}'), 'a/b/');
     });
   });
 
   group('joinAll', () {
     test('allows more than eight parts', () {
-      expect(builder.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
+      expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
           'a/b/c/d/e/f/g/h/i');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.joinAll(['a', 'http://dartlang.org', 'b', 'c']),
+      expect(context.joinAll(['a', 'http://dartlang.org', 'b', 'c']),
           'http://dartlang.org/b/c');
-      expect(builder.joinAll(['a', 'file://', 'b', 'c']), 'file:///b/c');
-      expect(builder.joinAll(['a', '/', 'b', 'c']), '/b/c');
-      expect(builder.joinAll(['a', '/b', 'http://dartlang.org/c', 'd']),
+      expect(context.joinAll(['a', 'file://', 'b', 'c']), 'file:///b/c');
+      expect(context.joinAll(['a', '/', 'b', 'c']), '/b/c');
+      expect(context.joinAll(['a', '/b', 'http://dartlang.org/c', 'd']),
           'http://dartlang.org/c/d');
-      expect(builder.joinAll(
+      expect(context.joinAll(
               ['a', 'http://google.com/b', 'http://dartlang.org/c', 'd']),
           'http://dartlang.org/c/d');
-      expect(builder.joinAll(['a', '/b', '/c', 'd']), '/c/d');
-      expect(builder.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d');
-      expect(builder.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d');
+      expect(context.joinAll(['a', '/b', '/c', 'd']), '/c/d');
+      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d');
+      expect(context.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d');
     });
 
     test('preserves roots before a root-relative path', () {
-      expect(builder.joinAll(['http://dartlang.org', 'a', '/b', 'c']),
+      expect(context.joinAll(['http://dartlang.org', 'a', '/b', 'c']),
           'http://dartlang.org/b/c');
-      expect(builder.joinAll(['file://', 'a', '/b', 'c']), 'file:///b/c');
-      expect(builder.joinAll(['file://', 'a', '/b', 'c', '/d']), 'file:///d');
+      expect(context.joinAll(['file://', 'a', '/b', 'c']), 'file:///b/c');
+      expect(context.joinAll(['file://', 'a', '/b', 'c', '/d']), 'file:///d');
     });
   });
 
   group('split', () {
     test('simple cases', () {
-      expect(builder.split(''), []);
-      expect(builder.split('.'), ['.']);
-      expect(builder.split('..'), ['..']);
-      expect(builder.split('foo'), equals(['foo']));
-      expect(builder.split('foo/bar.txt'), equals(['foo', 'bar.txt']));
-      expect(builder.split('foo/bar/baz'), equals(['foo', 'bar', 'baz']));
-      expect(builder.split('foo/../bar/./baz'),
+      expect(context.split(''), []);
+      expect(context.split('.'), ['.']);
+      expect(context.split('..'), ['..']);
+      expect(context.split('foo'), equals(['foo']));
+      expect(context.split('foo/bar.txt'), equals(['foo', 'bar.txt']));
+      expect(context.split('foo/bar/baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/../bar/./baz'),
           equals(['foo', '..', 'bar', '.', 'baz']));
-      expect(builder.split('foo//bar///baz'), equals(['foo', 'bar', 'baz']));
-      expect(builder.split('foo/\\/baz'), equals(['foo', '\\', 'baz']));
-      expect(builder.split('.'), equals(['.']));
-      expect(builder.split(''), equals([]));
-      expect(builder.split('foo/'), equals(['foo']));
-      expect(builder.split('http://dartlang.org//'),
+      expect(context.split('foo//bar///baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/\\/baz'), equals(['foo', '\\', 'baz']));
+      expect(context.split('.'), equals(['.']));
+      expect(context.split(''), equals([]));
+      expect(context.split('foo/'), equals(['foo']));
+      expect(context.split('http://dartlang.org//'),
           equals(['http://dartlang.org']));
-      expect(builder.split('file:////'), equals(['file://']));
-      expect(builder.split('//'), equals(['/']));
+      expect(context.split('file:////'), equals(['file://']));
+      expect(context.split('//'), equals(['/']));
     });
 
     test('includes the root for absolute paths', () {
-      expect(builder.split('http://dartlang.org/foo/bar/baz'),
+      expect(context.split('http://dartlang.org/foo/bar/baz'),
           equals(['http://dartlang.org', 'foo', 'bar', 'baz']));
-      expect(builder.split('file:///foo/bar/baz'),
+      expect(context.split('file:///foo/bar/baz'),
           equals(['file://', 'foo', 'bar', 'baz']));
-      expect(builder.split('/foo/bar/baz'), equals(['/', 'foo', 'bar', 'baz']));
-      expect(builder.split('http://dartlang.org/'),
+      expect(context.split('/foo/bar/baz'), equals(['/', 'foo', 'bar', 'baz']));
+      expect(context.split('http://dartlang.org/'),
           equals(['http://dartlang.org']));
-      expect(builder.split('http://dartlang.org'),
+      expect(context.split('http://dartlang.org'),
           equals(['http://dartlang.org']));
-      expect(builder.split('file:///'), equals(['file://']));
-      expect(builder.split('file://'), equals(['file://']));
-      expect(builder.split('/'), equals(['/']));
+      expect(context.split('file:///'), equals(['file://']));
+      expect(context.split('file://'), equals(['file://']));
+      expect(context.split('/'), equals(['/']));
     });
   });
 
   group('normalize', () {
     test('simple cases', () {
-      expect(builder.normalize(''), '.');
-      expect(builder.normalize('.'), '.');
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize('a'), 'a');
-      expect(builder.normalize('http://dartlang.org/'), 'http://dartlang.org');
-      expect(builder.normalize('http://dartlang.org'), 'http://dartlang.org');
-      expect(builder.normalize('file://'), 'file://');
-      expect(builder.normalize('file:///'), 'file://');
-      expect(builder.normalize('/'), '/');
-      expect(builder.normalize(r'\'), r'\');
-      expect(builder.normalize('C:/'), 'C:');
-      expect(builder.normalize(r'C:\'), r'C:\');
-      expect(builder.normalize(r'\\'), r'\\');
-      expect(builder.normalize('a/./\xc5\u0bf8-;\u{1f085}\u{00}/c/d/../'),
+      expect(context.normalize(''), '.');
+      expect(context.normalize('.'), '.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('a'), 'a');
+      expect(context.normalize('http://dartlang.org/'), 'http://dartlang.org');
+      expect(context.normalize('http://dartlang.org'), 'http://dartlang.org');
+      expect(context.normalize('file://'), 'file://');
+      expect(context.normalize('file:///'), 'file://');
+      expect(context.normalize('/'), '/');
+      expect(context.normalize(r'\'), r'\');
+      expect(context.normalize('C:/'), 'C:');
+      expect(context.normalize(r'C:\'), r'C:\');
+      expect(context.normalize(r'\\'), r'\\');
+      expect(context.normalize('a/./\xc5\u0bf8-;\u{1f085}\u{00}/c/d/../'),
              'a/\xc5\u0bf8-;\u{1f085}\u{00}/c');
     });
 
     test('collapses redundant separators', () {
-      expect(builder.normalize(r'a/b/c'), r'a/b/c');
-      expect(builder.normalize(r'a//b///c////d'), r'a/b/c/d');
+      expect(context.normalize(r'a/b/c'), r'a/b/c');
+      expect(context.normalize(r'a//b///c////d'), r'a/b/c/d');
     });
 
     test('does not collapse separators for other platform', () {
-      expect(builder.normalize(r'a\\b\\\c'), r'a\\b\\\c');
+      expect(context.normalize(r'a\\b\\\c'), r'a\\b\\\c');
     });
 
     test('eliminates "." parts', () {
-      expect(builder.normalize('./'), '.');
-      expect(builder.normalize('http://dartlang.org/.'), 'http://dartlang.org');
-      expect(builder.normalize('file:///.'), 'file://');
-      expect(builder.normalize('/.'), '/');
-      expect(builder.normalize('http://dartlang.org/./'),
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('http://dartlang.org/.'), 'http://dartlang.org');
+      expect(context.normalize('file:///.'), 'file://');
+      expect(context.normalize('/.'), '/');
+      expect(context.normalize('http://dartlang.org/./'),
           'http://dartlang.org');
-      expect(builder.normalize('file:///./'), 'file://');
-      expect(builder.normalize('/./'), '/');
-      expect(builder.normalize('./.'), '.');
-      expect(builder.normalize('a/./b'), 'a/b');
-      expect(builder.normalize('a/.b/c'), 'a/.b/c');
-      expect(builder.normalize('a/././b/./c'), 'a/b/c');
-      expect(builder.normalize('././a'), 'a');
-      expect(builder.normalize('a/./.'), 'a');
+      expect(context.normalize('file:///./'), 'file://');
+      expect(context.normalize('/./'), '/');
+      expect(context.normalize('./.'), '.');
+      expect(context.normalize('a/./b'), 'a/b');
+      expect(context.normalize('a/.b/c'), 'a/.b/c');
+      expect(context.normalize('a/././b/./c'), 'a/b/c');
+      expect(context.normalize('././a'), 'a');
+      expect(context.normalize('a/./.'), 'a');
     });
 
     test('eliminates ".." parts', () {
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize('../'), '..');
-      expect(builder.normalize('../../..'), '../../..');
-      expect(builder.normalize('../../../'), '../../..');
-      expect(builder.normalize('http://dartlang.org/..'),
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(context.normalize('../../..'), '../../..');
+      expect(context.normalize('../../../'), '../../..');
+      expect(context.normalize('http://dartlang.org/..'),
           'http://dartlang.org');
-      expect(builder.normalize('file:///..'), 'file://');
-      expect(builder.normalize('/..'), '/');
-      expect(builder.normalize('http://dartlang.org/../../..'),
+      expect(context.normalize('file:///..'), 'file://');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('http://dartlang.org/../../..'),
           'http://dartlang.org');
-      expect(builder.normalize('file:///../../..'), 'file://');
-      expect(builder.normalize('/../../..'), '/');
-      expect(builder.normalize('http://dartlang.org/../../../a'),
+      expect(context.normalize('file:///../../..'), 'file://');
+      expect(context.normalize('/../../..'), '/');
+      expect(context.normalize('http://dartlang.org/../../../a'),
           'http://dartlang.org/a');
-      expect(builder.normalize('file:///../../../a'), 'file:///a');
-      expect(builder.normalize('/../../../a'), '/a');
-      expect(builder.normalize('c:/..'), '.');
-      expect(builder.normalize('A:/../../..'), '../..');
-      expect(builder.normalize('a/..'), '.');
-      expect(builder.normalize('a/b/..'), 'a');
-      expect(builder.normalize('a/../b'), 'b');
-      expect(builder.normalize('a/./../b'), 'b');
-      expect(builder.normalize('a/b/c/../../d/e/..'), 'a/d');
-      expect(builder.normalize('a/b/../../../../c'), '../../c');
-      expect(builder.normalize('z/a/b/../../..\../c'), 'z/..\../c');
-      expect(builder.normalize('a/b\c/../d'), 'a/d');
+      expect(context.normalize('file:///../../../a'), 'file:///a');
+      expect(context.normalize('/../../../a'), '/a');
+      expect(context.normalize('c:/..'), '.');
+      expect(context.normalize('A:/../../..'), '../..');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize('z/a/b/../../..\../c'), 'z/..\../c');
+      expect(context.normalize('a/b\c/../d'), 'a/d');
     });
 
     test('does not walk before root on absolute paths', () {
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize('../'), '..');
-      expect(builder.normalize('http://dartlang.org/..'),
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(context.normalize('http://dartlang.org/..'),
           'http://dartlang.org');
-      expect(builder.normalize('http://dartlang.org/../a'),
+      expect(context.normalize('http://dartlang.org/../a'),
              'http://dartlang.org/a');
-      expect(builder.normalize('file:///..'), 'file://');
-      expect(builder.normalize('file:///../a'), 'file:///a');
-      expect(builder.normalize('/..'), '/');
-      expect(builder.normalize('a/..'), '.');
-      expect(builder.normalize('../a'), '../a');
-      expect(builder.normalize('/../a'), '/a');
-      expect(builder.normalize('c:/../a'), 'a');
-      expect(builder.normalize('/../a'), '/a');
-      expect(builder.normalize('a/b/..'), 'a');
-      expect(builder.normalize('../a/b/..'), '../a');
-      expect(builder.normalize('a/../b'), 'b');
-      expect(builder.normalize('a/./../b'), 'b');
-      expect(builder.normalize('a/b/c/../../d/e/..'), 'a/d');
-      expect(builder.normalize('a/b/../../../../c'), '../../c');
-      expect(builder.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.');
+      expect(context.normalize('file:///..'), 'file://');
+      expect(context.normalize('file:///../a'), 'file:///a');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('../a'), '../a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('c:/../a'), 'a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('../a/b/..'), '../a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.');
     });
 
     test('removes trailing separators', () {
-      expect(builder.normalize('./'), '.');
-      expect(builder.normalize('.//'), '.');
-      expect(builder.normalize('a/'), 'a');
-      expect(builder.normalize('a/b/'), 'a/b');
-      expect(builder.normalize(r'a/b\'), r'a/b\');
-      expect(builder.normalize('a/b///'), 'a/b');
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('.//'), '.');
+      expect(context.normalize('a/'), 'a');
+      expect(context.normalize('a/b/'), 'a/b');
+      expect(context.normalize(r'a/b\'), r'a/b\');
+      expect(context.normalize('a/b///'), 'a/b');
     });
   });
 
   group('relative', () {
     group('from absolute root', () {
       test('given absolute path in root', () {
-        expect(builder.relative('http://dartlang.org'), '../..');
-        expect(builder.relative('http://dartlang.org/'), '../..');
-        expect(builder.relative('/'), '../..');
-        expect(builder.relative('http://dartlang.org/root'), '..');
-        expect(builder.relative('/root'), '..');
-        expect(builder.relative('http://dartlang.org/root/path'), '.');
-        expect(builder.relative('/root/path'), '.');
-        expect(builder.relative('http://dartlang.org/root/path/a'), 'a');
-        expect(builder.relative('/root/path/a'), 'a');
-        expect(builder.relative('http://dartlang.org/root/path/a/b.txt'),
+        expect(context.relative('http://dartlang.org'), '../..');
+        expect(context.relative('http://dartlang.org/'), '../..');
+        expect(context.relative('/'), '../..');
+        expect(context.relative('http://dartlang.org/root'), '..');
+        expect(context.relative('/root'), '..');
+        expect(context.relative('http://dartlang.org/root/path'), '.');
+        expect(context.relative('/root/path'), '.');
+        expect(context.relative('http://dartlang.org/root/path/a'), 'a');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('http://dartlang.org/root/path/a/b.txt'),
             'a/b.txt');
-        expect(builder.relative('/root/path/a/b.txt'), 'a/b.txt');
-        expect(builder.relative('http://dartlang.org/root/a/b.txt'),
+        expect(context.relative('/root/path/a/b.txt'), 'a/b.txt');
+        expect(context.relative('http://dartlang.org/root/a/b.txt'),
             '../a/b.txt');
-        expect(builder.relative('/root/a/b.txt'), '../a/b.txt');
+        expect(context.relative('/root/a/b.txt'), '../a/b.txt');
       });
 
       test('given absolute path outside of root', () {
-        expect(builder.relative('http://dartlang.org/a/b'), '../../a/b');
-        expect(builder.relative('/a/b'), '../../a/b');
-        expect(builder.relative('http://dartlang.org/root/path/a'), 'a');
-        expect(builder.relative('/root/path/a'), 'a');
-        expect(builder.relative('http://dartlang.org/root/path/a/b.txt'),
+        expect(context.relative('http://dartlang.org/a/b'), '../../a/b');
+        expect(context.relative('/a/b'), '../../a/b');
+        expect(context.relative('http://dartlang.org/root/path/a'), 'a');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('http://dartlang.org/root/path/a/b.txt'),
             'a/b.txt');
-        expect(builder.relative('http://dartlang.org/root/path/a/b.txt'),
+        expect(context.relative('http://dartlang.org/root/path/a/b.txt'),
             'a/b.txt');
-        expect(builder.relative('http://dartlang.org/root/a/b.txt'),
+        expect(context.relative('http://dartlang.org/root/a/b.txt'),
             '../a/b.txt');
       });
 
       test('given absolute path with different hostname/protocol', () {
-        expect(builder.relative(r'http://google.com/a/b'),
+        expect(context.relative(r'http://google.com/a/b'),
             r'http://google.com/a/b');
-        expect(builder.relative(r'file:///a/b'),
+        expect(context.relative(r'file:///a/b'),
             r'file:///a/b');
       });
 
       test('given relative path', () {
         // The path is considered relative to the root, so it basically just
         // normalizes.
-        expect(builder.relative(''), '.');
-        expect(builder.relative('.'), '.');
-        expect(builder.relative('a'), 'a');
-        expect(builder.relative('a/b.txt'), 'a/b.txt');
-        expect(builder.relative('../a/b.txt'), '../a/b.txt');
-        expect(builder.relative('a/./b/../c.txt'), 'a/c.txt');
+        expect(context.relative(''), '.');
+        expect(context.relative('.'), '.');
+        expect(context.relative('a'), 'a');
+        expect(context.relative('a/b.txt'), 'a/b.txt');
+        expect(context.relative('../a/b.txt'), '../a/b.txt');
+        expect(context.relative('a/./b/../c.txt'), 'a/c.txt');
       });
 
       // Regression
       test('from root-only path', () {
-        expect(builder.relative('http://dartlang.org',
+        expect(context.relative('http://dartlang.org',
                 from: 'http://dartlang.org'),
             '.');
-        expect(builder.relative('http://dartlang.org/root/path',
+        expect(context.relative('http://dartlang.org/root/path',
                 from: 'http://dartlang.org'),
             'root/path');
       });
     });
 
     group('from relative root', () {
-      var r = new path.Builder(style: path.Style.url, root: 'foo/bar');
+      var r = new path.Context(style: path.Style.url, current: 'foo/bar');
 
       test('given absolute path', () {
         expect(r.relative('http://google.com/'), equals('http://google.com'));
@@ -513,7 +513,7 @@
     });
 
     group('from root-relative root', () {
-      var r = new path.Builder(style: path.Style.url, root: '/foo/bar');
+      var r = new path.Context(style: path.Style.url, current: '/foo/bar');
 
       test('given absolute path', () {
         expect(r.relative('http://google.com/'), equals('http://google.com'));
@@ -538,50 +538,50 @@
     });
 
     test('from a root with extension', () {
-      var r = new path.Builder(style: path.Style.url, root: '/dir.ext');
+      var r = new path.Context(style: path.Style.url, current: '/dir.ext');
       expect(r.relative('/dir.ext/file'), 'file');
     });
 
     test('with a root parameter', () {
-      expect(builder.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
+      expect(context.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
       expect(
-          builder.relative('/foo/bar/baz', from: 'http://dartlang.org/foo/bar'),
+          context.relative('/foo/bar/baz', from: 'http://dartlang.org/foo/bar'),
           equals('baz'));
       expect(
-          builder.relative('http://dartlang.org/foo/bar/baz', from: '/foo/bar'),
+          context.relative('http://dartlang.org/foo/bar/baz', from: '/foo/bar'),
           equals('baz'));
-      expect(builder.relative('http://dartlang.org/foo/bar/baz',
+      expect(context.relative('http://dartlang.org/foo/bar/baz',
               from: 'file:///foo/bar'),
           equals('http://dartlang.org/foo/bar/baz'));
-      expect(builder.relative('http://dartlang.org/foo/bar/baz',
+      expect(context.relative('http://dartlang.org/foo/bar/baz',
           from: 'http://dartlang.org/foo/bar'), equals('baz'));
       expect(
-          builder.relative('/foo/bar/baz', from: 'file:///foo/bar'),
+          context.relative('/foo/bar/baz', from: 'file:///foo/bar'),
           equals('http://dartlang.org/foo/bar/baz'));
       expect(
-          builder.relative('file:///foo/bar/baz', from: '/foo/bar'),
+          context.relative('file:///foo/bar/baz', from: '/foo/bar'),
           equals('file:///foo/bar/baz'));
 
-      expect(builder.relative('..', from: '/foo/bar'), equals('../../root'));
-      expect(builder.relative('..', from: 'http://dartlang.org/foo/bar'),
+      expect(context.relative('..', from: '/foo/bar'), equals('../../root'));
+      expect(context.relative('..', from: 'http://dartlang.org/foo/bar'),
           equals('../../root'));
-      expect(builder.relative('..', from: 'file:///foo/bar'),
+      expect(context.relative('..', from: 'file:///foo/bar'),
           equals('http://dartlang.org/root'));
-      expect(builder.relative('..', from: '/foo/bar'), equals('../../root'));
+      expect(context.relative('..', from: '/foo/bar'), equals('../../root'));
 
-      expect(builder.relative('http://dartlang.org/foo/bar/baz',
+      expect(context.relative('http://dartlang.org/foo/bar/baz',
               from: 'foo/bar'),
           equals('../../../../foo/bar/baz'));
-      expect(builder.relative('file:///foo/bar/baz', from: 'foo/bar'),
+      expect(context.relative('file:///foo/bar/baz', from: 'foo/bar'),
           equals('file:///foo/bar/baz'));
-      expect(builder.relative('/foo/bar/baz', from: 'foo/bar'),
+      expect(context.relative('/foo/bar/baz', from: 'foo/bar'),
           equals('../../../../foo/bar/baz'));
 
-      expect(builder.relative('..', from: 'foo/bar'), equals('../../..'));
+      expect(context.relative('..', from: 'foo/bar'), equals('../../..'));
     });
 
     test('with a root parameter and a relative root', () {
-      var r = new path.Builder(style: path.Style.url, root: 'relative/root');
+      var r = new path.Context(style: path.Style.url, current: 'relative/root');
       expect(r.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
       expect(
           r.relative('/foo/bar/baz', from: 'http://dartlang.org/foo/bar'),
@@ -606,7 +606,7 @@
     });
 
     test('from a . root', () {
-      var r = new path.Builder(style: path.Style.url, root: '.');
+      var r = new path.Context(style: path.Style.url, current: '.');
       expect(r.relative('http://dartlang.org/foo/bar/baz'),
           equals('http://dartlang.org/foo/bar/baz'));
       expect(r.relative('file:///foo/bar/baz'), equals('file:///foo/bar/baz'));
@@ -615,89 +615,122 @@
     });
   });
 
-  group('resolve', () {
+  group('isWithin', () {
+    test('simple cases', () {
+      expect(context.isWithin('foo/bar', 'foo/bar'), isFalse);
+      expect(context.isWithin('foo/bar', 'foo/bar/baz'), isTrue);
+      expect(context.isWithin('foo/bar', 'foo/baz'), isFalse);
+      expect(context.isWithin('foo/bar', '../path/foo/bar/baz'), isTrue);
+      expect(context.isWithin(
+              'http://dartlang.org', 'http://dartlang.org/foo/bar'),
+          isTrue);
+      expect(context.isWithin(
+              'http://dartlang.org', 'http://pub.dartlang.org/foo/bar'),
+          isFalse);
+      expect(context.isWithin('http://dartlang.org', '/foo/bar'), isTrue);
+      expect(context.isWithin('http://dartlang.org/foo', '/foo/bar'), isTrue);
+      expect(context.isWithin('http://dartlang.org/foo', '/bar/baz'), isFalse);
+      expect(context.isWithin('baz', 'http://dartlang.org/root/path/baz/bang'),
+          isTrue);
+      expect(context.isWithin('baz', 'http://dartlang.org/root/path/bang/baz'),
+          isFalse);
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.url, current: 'foo/bar');
+      expect(context.isWithin('.', 'a/b/c'), isTrue);
+      expect(context.isWithin('.', '../a/b/c'), isFalse);
+      expect(context.isWithin('.', '../../a/foo/b/c'), isFalse);
+      expect(context.isWithin(
+              'http://dartlang.org/', 'http://dartlang.org/baz/bang'),
+          isTrue);
+      expect(context.isWithin('.', 'http://dartlang.org/baz/bang'), isFalse);
+    });
+  });
+
+  group('absolute', () {
     test('allows up to seven parts', () {
-      expect(builder.resolve('a'), 'http://dartlang.org/root/path/a');
-      expect(builder.resolve('a', 'b'), 'http://dartlang.org/root/path/a/b');
-      expect(builder.resolve('a', 'b', 'c'),
+      expect(context.absolute('a'), 'http://dartlang.org/root/path/a');
+      expect(context.absolute('a', 'b'), 'http://dartlang.org/root/path/a/b');
+      expect(context.absolute('a', 'b', 'c'),
           'http://dartlang.org/root/path/a/b/c');
-      expect(builder.resolve('a', 'b', 'c', 'd'),
+      expect(context.absolute('a', 'b', 'c', 'd'),
           'http://dartlang.org/root/path/a/b/c/d');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e'),
+      expect(context.absolute('a', 'b', 'c', 'd', 'e'),
           'http://dartlang.org/root/path/a/b/c/d/e');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e', 'f'),
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'),
           'http://dartlang.org/root/path/a/b/c/d/e/f');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e', 'f', 'g'),
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'),
           'http://dartlang.org/root/path/a/b/c/d/e/f/g');
     });
 
     test('does not add separator if a part ends in one', () {
-      expect(builder.resolve('a/', 'b', 'c/', 'd'),
+      expect(context.absolute('a/', 'b', 'c/', 'd'),
           'http://dartlang.org/root/path/a/b/c/d');
-      expect(builder.resolve(r'a\', 'b'),
+      expect(context.absolute(r'a\', 'b'),
           r'http://dartlang.org/root/path/a\/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.resolve('a', '/b', '/c', 'd'), 'http://dartlang.org/c/d');
-      expect(builder.resolve('a', '/b', 'file:///c', 'd'), 'file:///c/d');
-      expect(builder.resolve('a', r'c:\b', 'c', 'd'),
+      expect(context.absolute('a', '/b', '/c', 'd'), 'http://dartlang.org/c/d');
+      expect(context.absolute('a', '/b', 'file:///c', 'd'), 'file:///c/d');
+      expect(context.absolute('a', r'c:\b', 'c', 'd'),
           r'http://dartlang.org/root/path/a/c:\b/c/d');
-      expect(builder.resolve('a', r'\\b', 'c', 'd'),
+      expect(context.absolute('a', r'\\b', 'c', 'd'),
           r'http://dartlang.org/root/path/a/\\b/c/d');
     });
   });
 
   test('withoutExtension', () {
-    expect(builder.withoutExtension(''), '');
-    expect(builder.withoutExtension('a'), 'a');
-    expect(builder.withoutExtension('.a'), '.a');
-    expect(builder.withoutExtension('a.b'), 'a');
-    expect(builder.withoutExtension('a/b.c'), 'a/b');
-    expect(builder.withoutExtension('a/b.c.d'), 'a/b.c');
-    expect(builder.withoutExtension('a/'), 'a/');
-    expect(builder.withoutExtension('a/b/'), 'a/b/');
-    expect(builder.withoutExtension('a/.'), 'a/.');
-    expect(builder.withoutExtension('a/.b'), 'a/.b');
-    expect(builder.withoutExtension('a.b/c'), 'a.b/c');
-    expect(builder.withoutExtension(r'a.b\c'), r'a');
-    expect(builder.withoutExtension(r'a/b\c'), r'a/b\c');
-    expect(builder.withoutExtension(r'a/b\c.d'), r'a/b\c');
-    expect(builder.withoutExtension('a/b.c/'), 'a/b/');
-    expect(builder.withoutExtension('a/b.c//'), 'a/b//');
+    expect(context.withoutExtension(''), '');
+    expect(context.withoutExtension('a'), 'a');
+    expect(context.withoutExtension('.a'), '.a');
+    expect(context.withoutExtension('a.b'), 'a');
+    expect(context.withoutExtension('a/b.c'), 'a/b');
+    expect(context.withoutExtension('a/b.c.d'), 'a/b.c');
+    expect(context.withoutExtension('a/'), 'a/');
+    expect(context.withoutExtension('a/b/'), 'a/b/');
+    expect(context.withoutExtension('a/.'), 'a/.');
+    expect(context.withoutExtension('a/.b'), 'a/.b');
+    expect(context.withoutExtension('a.b/c'), 'a.b/c');
+    expect(context.withoutExtension(r'a.b\c'), r'a');
+    expect(context.withoutExtension(r'a/b\c'), r'a/b\c');
+    expect(context.withoutExtension(r'a/b\c.d'), r'a/b\c');
+    expect(context.withoutExtension('a/b.c/'), 'a/b/');
+    expect(context.withoutExtension('a/b.c//'), 'a/b//');
   });
 
   test('fromUri', () {
-    expect(builder.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
+    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
         'http://dartlang.org/path/to/foo');
-    expect(builder.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
+    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
         'http://dartlang.org/path/to/foo/');
-    expect(builder.fromUri(Uri.parse('file:///path/to/foo')),
+    expect(context.fromUri(Uri.parse('file:///path/to/foo')),
         'file:///path/to/foo');
-    expect(builder.fromUri(Uri.parse('foo/bar')), 'foo/bar');
-    expect(builder.fromUri(Uri.parse('http://dartlang.org/path/to/foo%23bar')),
+    expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo%23bar')),
         'http://dartlang.org/path/to/foo%23bar');
     // Since the resulting "path" is also a URL, special characters should
     // remain percent-encoded in the result.
-    expect(builder.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
         r'_%7B_%7D_%60_%5E_%20_%22_%25_');
   });
 
   test('toUri', () {
-    expect(builder.toUri('http://dartlang.org/path/to/foo'),
+    expect(context.toUri('http://dartlang.org/path/to/foo'),
         Uri.parse('http://dartlang.org/path/to/foo'));
-    expect(builder.toUri('http://dartlang.org/path/to/foo/'),
+    expect(context.toUri('http://dartlang.org/path/to/foo/'),
         Uri.parse('http://dartlang.org/path/to/foo/'));
-    expect(builder.toUri('file:///path/to/foo'),
+    expect(context.toUri('file:///path/to/foo'),
         Uri.parse('file:///path/to/foo'));
-    expect(builder.toUri('foo/bar'), Uri.parse('foo/bar'));
-    expect(builder.toUri('http://dartlang.org/path/to/foo%23bar'),
+    expect(context.toUri('foo/bar'), Uri.parse('foo/bar'));
+    expect(context.toUri('http://dartlang.org/path/to/foo%23bar'),
         Uri.parse('http://dartlang.org/path/to/foo%23bar'));
     // Since the input path is also a URI, special characters should already
     // be percent encoded there too.
-    expect(builder.toUri(r'http://foo.com/_%7B_%7D_%60_%5E_%20_%22_%25_'),
+    expect(context.toUri(r'http://foo.com/_%7B_%7D_%60_%5E_%20_%22_%25_'),
         Uri.parse('http://foo.com/_%7B_%7D_%60_%5E_%20_%22_%25_'));
-    expect(builder.toUri(r'_%7B_%7D_%60_%5E_%20_%22_%25_'),
+    expect(context.toUri(r'_%7B_%7D_%60_%5E_%20_%22_%25_'),
         Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
   });
 }
diff --git a/pkg/path/test/utils.dart b/pkg/path/test/utils.dart
new file mode 100644
index 0000000..1730798
--- /dev/null
+++ b/pkg/path/test/utils.dart
@@ -0,0 +1,11 @@
+// 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 path.test.utils;
+
+import "package:unittest/unittest.dart";
+import "package:path/path.dart" as path;
+
+/// A matcher for a closure that throws a [path.PathException].
+final throwsPathException = throwsA(new isInstanceOf<path.PathException>());
diff --git a/pkg/path/test/windows_test.dart b/pkg/path/test/windows_test.dart
index 787adfc..e5dcac4 100644
--- a/pkg/path/test/windows_test.dart
+++ b/pkg/path/test/windows_test.dart
@@ -7,391 +7,463 @@
 import 'package:unittest/unittest.dart';
 import 'package:path/path.dart' as path;
 
-main() {
-  var builder = new path.Builder(style: path.Style.windows,
-                                 root: r'C:\root\path');
+import 'utils.dart';
 
-  if (new path.Builder().style == path.Style.windows) {
-    group('absolute', () {
-      expect(path.absolute(r'a\b.txt'), path.join(path.current, r'a\b.txt'));
-      expect(path.absolute(r'C:\a\b.txt'), r'C:\a\b.txt');
-      expect(path.absolute(r'\\a\b.txt'), r'\\a\b.txt');
-    });
-  }
+main() {
+  var context = new path.Context(style: path.Style.windows,
+                                 current: r'C:\root\path');
 
   group('separator', () {
-    expect(builder.separator, '\\');
+    expect(context.separator, '\\');
   });
 
   test('extension', () {
-    expect(builder.extension(''), '');
-    expect(builder.extension('.'), '');
-    expect(builder.extension('..'), '');
-    expect(builder.extension('a/..'), '');
-    expect(builder.extension('foo.dart'), '.dart');
-    expect(builder.extension('foo.dart.js'), '.js');
-    expect(builder.extension('foo bar\gule fisk.dart.js'), '.js');
-    expect(builder.extension(r'a.b\c'), '');
-    expect(builder.extension('a.b/c.d'), '.d');
-    expect(builder.extension(r'~\.bashrc'), '');
-    expect(builder.extension(r'a.b/c'), r'');
-    expect(builder.extension(r'foo.dart\'), '.dart');
-    expect(builder.extension(r'foo.dart\\'), '.dart');
+    expect(context.extension(''), '');
+    expect(context.extension('.'), '');
+    expect(context.extension('..'), '');
+    expect(context.extension('a/..'), '');
+    expect(context.extension('foo.dart'), '.dart');
+    expect(context.extension('foo.dart.js'), '.js');
+    expect(context.extension('foo bar\gule fisk.dart.js'), '.js');
+    expect(context.extension(r'a.b\c'), '');
+    expect(context.extension('a.b/c.d'), '.d');
+    expect(context.extension(r'~\.bashrc'), '');
+    expect(context.extension(r'a.b/c'), r'');
+    expect(context.extension(r'foo.dart\'), '.dart');
+    expect(context.extension(r'foo.dart\\'), '.dart');
   });
 
   test('rootPrefix', () {
-    expect(builder.rootPrefix(''), '');
-    expect(builder.rootPrefix('a'), '');
-    expect(builder.rootPrefix(r'a\b'), '');
-    expect(builder.rootPrefix(r'C:\a\c'), r'C:\');
-    expect(builder.rootPrefix('C:\\'), r'C:\');
-    expect(builder.rootPrefix('C:/'), 'C:/');
-
-    // TODO(nweiz): enable this once issue 7323 is fixed.
-    // expect(builder.rootPrefix(r'\\server\a\b'), r'\\server\');
+    expect(context.rootPrefix(''), '');
+    expect(context.rootPrefix('a'), '');
+    expect(context.rootPrefix(r'a\b'), '');
+    expect(context.rootPrefix(r'C:\a\c'), r'C:\');
+    expect(context.rootPrefix('C:\\'), r'C:\');
+    expect(context.rootPrefix('C:/'), 'C:/');
+    expect(context.rootPrefix(r'\\server\share\a\b'), r'\\server\share');
+    expect(context.rootPrefix(r'\a\b'), r'\');
+    expect(context.rootPrefix(r'/a/b'), r'/');
+    expect(context.rootPrefix(r'\'), r'\');
+    expect(context.rootPrefix(r'/'), r'/');
   });
 
   test('dirname', () {
-    expect(builder.dirname(r''), '.');
-    expect(builder.dirname(r'a'), '.');
-    expect(builder.dirname(r'a\b'), 'a');
-    expect(builder.dirname(r'a\b\c'), r'a\b');
-    expect(builder.dirname(r'a\b.c'), 'a');
-    expect(builder.dirname(r'a\'), '.');
-    expect(builder.dirname('a/'), '.');
-    expect(builder.dirname(r'a\.'), 'a');
-    expect(builder.dirname(r'a\b/c'), r'a\b');
-    expect(builder.dirname(r'C:\a'), r'C:\');
-    expect(builder.dirname(r'C:\\\a'), r'C:\');
-    expect(builder.dirname(r'C:\'), r'C:\');
-    expect(builder.dirname(r'C:\\\'), r'C:\');
-    expect(builder.dirname(r'a\b\'), r'a');
-    expect(builder.dirname(r'a/b\c'), 'a/b');
-    expect(builder.dirname(r'a\\'), r'.');
-    expect(builder.dirname(r'a\b\\'), 'a');
-    expect(builder.dirname(r'a\\b'), 'a');
-    expect(builder.dirname(r'foo bar\gule fisk'), 'foo bar');
+    expect(context.dirname(r''), '.');
+    expect(context.dirname(r'a'), '.');
+    expect(context.dirname(r'a\b'), 'a');
+    expect(context.dirname(r'a\b\c'), r'a\b');
+    expect(context.dirname(r'a\b.c'), 'a');
+    expect(context.dirname(r'a\'), '.');
+    expect(context.dirname('a/'), '.');
+    expect(context.dirname(r'a\.'), 'a');
+    expect(context.dirname(r'a\b/c'), r'a\b');
+    expect(context.dirname(r'C:\a'), r'C:\');
+    expect(context.dirname(r'C:\\\a'), r'C:\');
+    expect(context.dirname(r'C:\'), r'C:\');
+    expect(context.dirname(r'C:\\\'), r'C:\');
+    expect(context.dirname(r'a\b\'), r'a');
+    expect(context.dirname(r'a/b\c'), 'a/b');
+    expect(context.dirname(r'a\\'), r'.');
+    expect(context.dirname(r'a\b\\'), 'a');
+    expect(context.dirname(r'a\\b'), 'a');
+    expect(context.dirname(r'foo bar\gule fisk'), 'foo bar');
+    expect(context.dirname(r'\\server\share'), r'\\server\share');
+    expect(context.dirname(r'\\server\share\dir'), r'\\server\share');
+    expect(context.dirname(r'\a'), r'\');
+    expect(context.dirname(r'/a'), r'/');
+    expect(context.dirname(r'\'), r'\');
+    expect(context.dirname(r'/'), r'/');
   });
 
   test('basename', () {
-    expect(builder.basename(r''), '');
-    expect(builder.basename(r'.'), '.');
-    expect(builder.basename(r'..'), '..');
-    expect(builder.basename(r'.hest'), '.hest');
-    expect(builder.basename(r'a'), 'a');
-    expect(builder.basename(r'a\b'), 'b');
-    expect(builder.basename(r'a\b\c'), 'c');
-    expect(builder.basename(r'a\b.c'), 'b.c');
-    expect(builder.basename(r'a\'), 'a');
-    expect(builder.basename(r'a/'), 'a');
-    expect(builder.basename(r'a\.'), '.');
-    expect(builder.basename(r'a\b/c'), r'c');
-    expect(builder.basename(r'C:\a'), 'a');
-    expect(builder.basename(r'C:\'), r'C:\');
-    expect(builder.basename(r'a\b\'), 'b');
-    expect(builder.basename(r'a/b\c'), 'c');
-    expect(builder.basename(r'a\\'), 'a');
-    expect(builder.basename(r'a\b\\'), 'b');
-    expect(builder.basename(r'a\\b'), 'b');
-    expect(builder.basename(r'a\\b'), 'b');
-    expect(builder.basename(r'a\fisk hest.ma pa'), 'fisk hest.ma pa');
+    expect(context.basename(r''), '');
+    expect(context.basename(r'.'), '.');
+    expect(context.basename(r'..'), '..');
+    expect(context.basename(r'.hest'), '.hest');
+    expect(context.basename(r'a'), 'a');
+    expect(context.basename(r'a\b'), 'b');
+    expect(context.basename(r'a\b\c'), 'c');
+    expect(context.basename(r'a\b.c'), 'b.c');
+    expect(context.basename(r'a\'), 'a');
+    expect(context.basename(r'a/'), 'a');
+    expect(context.basename(r'a\.'), '.');
+    expect(context.basename(r'a\b/c'), r'c');
+    expect(context.basename(r'C:\a'), 'a');
+    expect(context.basename(r'C:\'), r'C:\');
+    expect(context.basename(r'a\b\'), 'b');
+    expect(context.basename(r'a/b\c'), 'c');
+    expect(context.basename(r'a\\'), 'a');
+    expect(context.basename(r'a\b\\'), 'b');
+    expect(context.basename(r'a\\b'), 'b');
+    expect(context.basename(r'a\\b'), 'b');
+    expect(context.basename(r'a\fisk hest.ma pa'), 'fisk hest.ma pa');
+    expect(context.basename(r'\\server\share'), r'\\server\share');
+    expect(context.basename(r'\\server\share\dir'), r'dir');
+    expect(context.basename(r'\a'), r'a');
+    expect(context.basename(r'/a'), r'a');
+    expect(context.basename(r'\'), r'\');
+    expect(context.basename(r'/'), r'/');
   });
 
   test('basenameWithoutExtension', () {
-    expect(builder.basenameWithoutExtension(''), '');
-    expect(builder.basenameWithoutExtension('.'), '.');
-    expect(builder.basenameWithoutExtension('..'), '..');
-    expect(builder.basenameWithoutExtension('.hest'), '.hest');
-    expect(builder.basenameWithoutExtension('a'), 'a');
-    expect(builder.basenameWithoutExtension(r'a\b'), 'b');
-    expect(builder.basenameWithoutExtension(r'a\b\c'), 'c');
-    expect(builder.basenameWithoutExtension(r'a\b.c'), 'b');
-    expect(builder.basenameWithoutExtension(r'a\'), 'a');
-    expect(builder.basenameWithoutExtension(r'a\.'), '.');
-    expect(builder.basenameWithoutExtension(r'a\b/c'), r'c');
-    expect(builder.basenameWithoutExtension(r'a\.bashrc'), '.bashrc');
-    expect(builder.basenameWithoutExtension(r'a\b\c.d.e'), 'c.d');
-    expect(builder.basenameWithoutExtension(r'a\\'), 'a');
-    expect(builder.basenameWithoutExtension(r'a\b\\'), 'b');
-    expect(builder.basenameWithoutExtension(r'a\\b'), 'b');
-    expect(builder.basenameWithoutExtension(r'a\b.c\'), 'b');
-    expect(builder.basenameWithoutExtension(r'a\b.c\\'), 'b');
-    expect(builder.basenameWithoutExtension(r'C:\f h.ma pa.f s'), 'f h.ma pa');
+    expect(context.basenameWithoutExtension(''), '');
+    expect(context.basenameWithoutExtension('.'), '.');
+    expect(context.basenameWithoutExtension('..'), '..');
+    expect(context.basenameWithoutExtension('.hest'), '.hest');
+    expect(context.basenameWithoutExtension('a'), 'a');
+    expect(context.basenameWithoutExtension(r'a\b'), 'b');
+    expect(context.basenameWithoutExtension(r'a\b\c'), 'c');
+    expect(context.basenameWithoutExtension(r'a\b.c'), 'b');
+    expect(context.basenameWithoutExtension(r'a\'), 'a');
+    expect(context.basenameWithoutExtension(r'a\.'), '.');
+    expect(context.basenameWithoutExtension(r'a\b/c'), r'c');
+    expect(context.basenameWithoutExtension(r'a\.bashrc'), '.bashrc');
+    expect(context.basenameWithoutExtension(r'a\b\c.d.e'), 'c.d');
+    expect(context.basenameWithoutExtension(r'a\\'), 'a');
+    expect(context.basenameWithoutExtension(r'a\b\\'), 'b');
+    expect(context.basenameWithoutExtension(r'a\\b'), 'b');
+    expect(context.basenameWithoutExtension(r'a\b.c\'), 'b');
+    expect(context.basenameWithoutExtension(r'a\b.c\\'), 'b');
+    expect(context.basenameWithoutExtension(r'C:\f h.ma pa.f s'), 'f h.ma pa');
   });
 
   test('isAbsolute', () {
-    expect(builder.isAbsolute(''), false);
-    expect(builder.isAbsolute('.'), false);
-    expect(builder.isAbsolute('..'), false);
-    expect(builder.isAbsolute('a'), false);
-    expect(builder.isAbsolute(r'a\b'), false);
-    expect(builder.isAbsolute(r'\a'), false);
-    expect(builder.isAbsolute(r'\a\b'), false);
-    expect(builder.isAbsolute('~'), false);
-    expect(builder.isAbsolute('.'), false);
-    expect(builder.isAbsolute(r'..\a'), false);
-    expect(builder.isAbsolute(r'a:/a\b'), true);
-    expect(builder.isAbsolute(r'D:/a/b'), true);
-    expect(builder.isAbsolute(r'c:\'), true);
-    expect(builder.isAbsolute(r'B:\'), true);
-    expect(builder.isAbsolute(r'c:\a'), true);
-    expect(builder.isAbsolute(r'C:\a'), true);
-    expect(builder.isAbsolute(r'\\a'), true);
-    expect(builder.isAbsolute(r'\\'), true);
+    expect(context.isAbsolute(''), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute('..'), false);
+    expect(context.isAbsolute('a'), false);
+    expect(context.isAbsolute(r'a\b'), false);
+    expect(context.isAbsolute(r'\a\b'), true);
+    expect(context.isAbsolute(r'\'), true);
+    expect(context.isAbsolute(r'/a/b'), true);
+    expect(context.isAbsolute(r'/'), true);
+    expect(context.isAbsolute('~'), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute(r'..\a'), false);
+    expect(context.isAbsolute(r'a:/a\b'), true);
+    expect(context.isAbsolute(r'D:/a/b'), true);
+    expect(context.isAbsolute(r'c:\'), true);
+    expect(context.isAbsolute(r'B:\'), true);
+    expect(context.isAbsolute(r'c:\a'), true);
+    expect(context.isAbsolute(r'C:\a'), true);
+    expect(context.isAbsolute(r'\\server\share'), true);
+    expect(context.isAbsolute(r'\\server\share\path'), true);
   });
 
   test('isRelative', () {
-    expect(builder.isRelative(''), true);
-    expect(builder.isRelative('.'), true);
-    expect(builder.isRelative('..'), true);
-    expect(builder.isRelative('a'), true);
-    expect(builder.isRelative(r'a\b'), true);
-    expect(builder.isRelative(r'\a'), true);
-    expect(builder.isRelative(r'\a\b'), true);
-    expect(builder.isRelative('~'), true);
-    expect(builder.isRelative('.'), true);
-    expect(builder.isRelative(r'..\a'), true);
-    expect(builder.isRelative(r'a:/a\b'), false);
-    expect(builder.isRelative(r'D:/a/b'), false);
-    expect(builder.isRelative(r'c:\'), false);
-    expect(builder.isRelative(r'B:\'), false);
-    expect(builder.isRelative(r'c:\a'), false);
-    expect(builder.isRelative(r'C:\a'), false);
-    expect(builder.isRelative(r'\\a'), false);
-    expect(builder.isRelative(r'\\'), false);
+    expect(context.isRelative(''), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative('..'), true);
+    expect(context.isRelative('a'), true);
+    expect(context.isRelative(r'a\b'), true);
+    expect(context.isRelative(r'\a\b'), false);
+    expect(context.isRelative(r'\'), false);
+    expect(context.isRelative(r'/a/b'), false);
+    expect(context.isRelative(r'/'), false);
+    expect(context.isRelative('~'), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative(r'..\a'), true);
+    expect(context.isRelative(r'a:/a\b'), false);
+    expect(context.isRelative(r'D:/a/b'), false);
+    expect(context.isRelative(r'c:\'), false);
+    expect(context.isRelative(r'B:\'), false);
+    expect(context.isRelative(r'c:\a'), false);
+    expect(context.isRelative(r'C:\a'), false);
+    expect(context.isRelative(r'\\server\share'), false);
+    expect(context.isRelative(r'\\server\share\path'), false);
+  });
+
+  test('isRootRelative', () {
+    expect(context.isRootRelative(''), false);
+    expect(context.isRootRelative('.'), false);
+    expect(context.isRootRelative('..'), false);
+    expect(context.isRootRelative('a'), false);
+    expect(context.isRootRelative(r'a\b'), false);
+    expect(context.isRootRelative(r'\a\b'), true);
+    expect(context.isRootRelative(r'\'), true);
+    expect(context.isRootRelative(r'/a/b'), true);
+    expect(context.isRootRelative(r'/'), true);
+    expect(context.isRootRelative('~'), false);
+    expect(context.isRootRelative('.'), false);
+    expect(context.isRootRelative(r'..\a'), false);
+    expect(context.isRootRelative(r'a:/a\b'), false);
+    expect(context.isRootRelative(r'D:/a/b'), false);
+    expect(context.isRootRelative(r'c:\'), false);
+    expect(context.isRootRelative(r'B:\'), false);
+    expect(context.isRootRelative(r'c:\a'), false);
+    expect(context.isRootRelative(r'C:\a'), false);
+    expect(context.isRootRelative(r'\\server\share'), false);
+    expect(context.isRootRelative(r'\\server\share\path'), false);
   });
 
   group('join', () {
     test('allows up to eight parts', () {
-      expect(builder.join('a'), 'a');
-      expect(builder.join('a', 'b'), r'a\b');
-      expect(builder.join('a', 'b', 'c'), r'a\b\c');
-      expect(builder.join('a', 'b', 'c', 'd'), r'a\b\c\d');
-      expect(builder.join('a', 'b', 'c', 'd', 'e'), r'a\b\c\d\e');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f'), r'a\b\c\d\e\f');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), r'a\b\c\d\e\f\g');
-      expect(builder.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
+      expect(context.join('a'), 'a');
+      expect(context.join('a', 'b'), r'a\b');
+      expect(context.join('a', 'b', 'c'), r'a\b\c');
+      expect(context.join('a', 'b', 'c', 'd'), r'a\b\c\d');
+      expect(context.join('a', 'b', 'c', 'd', 'e'), r'a\b\c\d\e');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f'), r'a\b\c\d\e\f');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), r'a\b\c\d\e\f\g');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
           r'a\b\c\d\e\f\g\h');
     });
 
     test('does not add separator if a part ends or begins in one', () {
-      expect(builder.join(r'a\', 'b', r'c\', 'd'), r'a\b\c\d');
-      expect(builder.join('a/', 'b'), r'a/b');
-      expect(builder.join('a', '/b'), 'a/b');
-      expect(builder.join('a', r'\b'), r'a\b');
+      expect(context.join(r'a\', 'b', r'c\', 'd'), r'a\b\c\d');
+      expect(context.join('a/', 'b'), r'a/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.join('a', '/b', '/c', 'd'), r'a/b/c\d');
-      expect(builder.join('a', r'c:\b', 'c', 'd'), r'c:\b\c\d');
-      expect(builder.join('a', r'\\b', r'\\c', 'd'), r'\\c\d');
+      expect(context.join('a', r'\b', r'\c', 'd'), r'\c\d');
+      expect(context.join('a', '/b', '/c', 'd'), r'/c\d');
+      expect(context.join('a', r'c:\b', 'c', 'd'), r'c:\b\c\d');
+      expect(context.join('a', r'\\b\c', r'\\d\e', 'f'), r'\\d\e\f');
+      expect(context.join('a', r'c:\b', r'\c', 'd'), r'c:\c\d');
+      expect(context.join('a', r'\\b\c\d', r'\e', 'f'), r'\\b\c\e\f');
     });
 
     test('ignores trailing nulls', () {
-      expect(builder.join('a', null), equals('a'));
-      expect(builder.join('a', 'b', 'c', null, null), equals(r'a\b\c'));
+      expect(context.join('a', null), equals('a'));
+      expect(context.join('a', 'b', 'c', null, null), equals(r'a\b\c'));
     });
 
     test('ignores empty strings', () {
-      expect(builder.join(''), '');
-      expect(builder.join('', ''), '');
-      expect(builder.join('', 'a'), 'a');
-      expect(builder.join('a', '', 'b', '', '', '', 'c'), r'a\b\c');
-      expect(builder.join('a', 'b', ''), r'a\b');
+      expect(context.join(''), '');
+      expect(context.join('', ''), '');
+      expect(context.join('', 'a'), 'a');
+      expect(context.join('a', '', 'b', '', '', '', 'c'), r'a\b\c');
+      expect(context.join('a', 'b', ''), r'a\b');
     });
 
     test('disallows intermediate nulls', () {
-      expect(() => builder.join('a', null, 'b'), throwsArgumentError);
-      expect(() => builder.join(null, 'a'), throwsArgumentError);
+      expect(() => context.join('a', null, 'b'), throwsArgumentError);
+      expect(() => context.join(null, 'a'), throwsArgumentError);
     });
 
     test('join does not modify internal ., .., or trailing separators', () {
-      expect(builder.join('a/', 'b/c/'), 'a/b/c/');
-      expect(builder.join(r'a\b\./c\..\\', r'd\..\.\..\\e\f\\'),
+      expect(context.join('a/', 'b/c/'), 'a/b/c/');
+      expect(context.join(r'a\b\./c\..\\', r'd\..\.\..\\e\f\\'),
              r'a\b\./c\..\\d\..\.\..\\e\f\\');
-      expect(builder.join(r'a\b', r'c\..\..\..\..'), r'a\b\c\..\..\..\..');
-      expect(builder.join(r'a', 'b${builder.separator}'), r'a\b\');
+      expect(context.join(r'a\b', r'c\..\..\..\..'), r'a\b\c\..\..\..\..');
+      expect(context.join(r'a', 'b${context.separator}'), r'a\b\');
     });
   });
 
   group('joinAll', () {
     test('allows more than eight parts', () {
-      expect(builder.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
+      expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
           r'a\b\c\d\e\f\g\h\i');
     });
 
     test('does not add separator if a part ends or begins in one', () {
-      expect(builder.joinAll([r'a\', 'b', r'c\', 'd']), r'a\b\c\d');
-      expect(builder.joinAll(['a/', 'b']), r'a/b');
-      expect(builder.joinAll(['a', '/b']), 'a/b');
-      expect(builder.joinAll(['a', r'\b']), r'a\b');
+      expect(context.joinAll([r'a\', 'b', r'c\', 'd']), r'a\b\c\d');
+      expect(context.joinAll(['a/', 'b']), r'a/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.joinAll(['a', '/b', '/c', 'd']), r'a/b/c\d');
-      expect(builder.joinAll(['a', r'c:\b', 'c', 'd']), r'c:\b\c\d');
-      expect(builder.joinAll(['a', r'\\b', r'\\c', 'd']), r'\\c\d');
+      expect(context.joinAll(['a', r'\b', r'\c', 'd']), r'\c\d');
+      expect(context.joinAll(['a', '/b', '/c', 'd']), r'/c\d');
+      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'c:\b\c\d');
+      expect(context.joinAll(['a', r'\\b\c', r'\\d\e', 'f']), r'\\d\e\f');
+      expect(context.joinAll(['a', r'c:\b', r'\c', 'd']), r'c:\c\d');
+      expect(context.joinAll(['a', r'\\b\c\d', r'\e', 'f']), r'\\b\c\e\f');
     });
   });
 
   group('split', () {
     test('simple cases', () {
-      expect(builder.split(''), []);
-      expect(builder.split('.'), ['.']);
-      expect(builder.split('..'), ['..']);
-      expect(builder.split('foo'), equals(['foo']));
-      expect(builder.split(r'foo\bar.txt'), equals(['foo', 'bar.txt']));
-      expect(builder.split(r'foo\bar/baz'), equals(['foo', 'bar', 'baz']));
-      expect(builder.split(r'foo\..\bar\.\baz'),
+      expect(context.split(''), []);
+      expect(context.split('.'), ['.']);
+      expect(context.split('..'), ['..']);
+      expect(context.split('foo'), equals(['foo']));
+      expect(context.split(r'foo\bar.txt'), equals(['foo', 'bar.txt']));
+      expect(context.split(r'foo\bar/baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split(r'foo\..\bar\.\baz'),
           equals(['foo', '..', 'bar', '.', 'baz']));
-      expect(builder.split(r'foo\\bar\\\baz'), equals(['foo', 'bar', 'baz']));
-      expect(builder.split(r'foo\/\baz'), equals(['foo', 'baz']));
-      expect(builder.split('.'), equals(['.']));
-      expect(builder.split(''), equals([]));
-      expect(builder.split('foo/'), equals(['foo']));
-      expect(builder.split(r'C:\'), equals([r'C:\']));
+      expect(context.split(r'foo\\bar\\\baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split(r'foo\/\baz'), equals(['foo', 'baz']));
+      expect(context.split('.'), equals(['.']));
+      expect(context.split(''), equals([]));
+      expect(context.split('foo/'), equals(['foo']));
+      expect(context.split(r'C:\'), equals([r'C:\']));
     });
 
     test('includes the root for absolute paths', () {
-      expect(builder.split(r'C:\foo\bar\baz'),
+      expect(context.split(r'C:\foo\bar\baz'),
           equals([r'C:\', 'foo', 'bar', 'baz']));
-      expect(builder.split(r'C:\\'), equals([r'C:\']));
+      expect(context.split(r'C:\\'), equals([r'C:\']));
 
-      // TODO(nweiz): enable these once issue 7323 is fixed.
-      // expect(builder.split(r'\\server\foo\bar\baz'),
-      //     equals([r'\\server\', 'foo', 'bar', 'baz']));
-      // expect(builder.split(r'\\server\'), equals([r'\\server\']));
+      expect(context.split(r'\\server\share\foo\bar\baz'),
+          equals([r'\\server\share', 'foo', 'bar', 'baz']));
+      expect(context.split(r'\\server\share'), equals([r'\\server\share']));
+
+      expect(context.split(r'\foo\bar\baz'),
+          equals([r'\', 'foo', 'bar', 'baz']));
+      expect(context.split(r'\'), equals([r'\']));
     });
   });
 
   group('normalize', () {
     test('simple cases', () {
-      expect(builder.normalize(''), '.');
-      expect(builder.normalize('.'), '.');
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize('a'), 'a');
-      expect(builder.normalize(r'\'), '.');
-      expect(builder.normalize('/'), r'.');
-      expect(builder.normalize('C:/'), r'C:\');
-      expect(builder.normalize(r'C:\'), r'C:\');
-      expect(builder.normalize(r'\\'), r'\\');
-      expect(builder.normalize('a\\.\\\xc5\u0bf8-;\u{1f085}\u{00}\\c\\d\\..\\'),
+      expect(context.normalize(''), '.');
+      expect(context.normalize('.'), '.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('a'), 'a');
+      expect(context.normalize('/a/b'), r'\a\b');
+      expect(context.normalize(r'\'), r'\');
+      expect(context.normalize(r'\a\b'), r'\a\b');
+      expect(context.normalize('/'), r'\');
+      expect(context.normalize('C:/'), r'C:\');
+      expect(context.normalize(r'C:\'), r'C:\');
+      expect(context.normalize(r'\\server\share'), r'\\server\share');
+      expect(context.normalize('a\\.\\\xc5\u0bf8-;\u{1f085}\u{00}\\c\\d\\..\\'),
              'a\\\xc5\u0bf8-;\u{1f085}\u{00}\x5cc');
     });
 
     test('collapses redundant separators', () {
-      expect(builder.normalize(r'a\b\c'), r'a\b\c');
-      expect(builder.normalize(r'a\\b\\\c\\\\d'), r'a\b\c\d');
+      expect(context.normalize(r'a\b\c'), r'a\b\c');
+      expect(context.normalize(r'a\\b\\\c\\\\d'), r'a\b\c\d');
     });
 
     test('eliminates "." parts', () {
-      expect(builder.normalize(r'.\'), '.');
-      expect(builder.normalize(r'c:\.'), r'c:\');
-      expect(builder.normalize(r'B:\.\'), r'B:\');
-      expect(builder.normalize(r'\\.'), r'\\');
-      expect(builder.normalize(r'\\.\'), r'\\');
-      expect(builder.normalize(r'.\.'), '.');
-      expect(builder.normalize(r'a\.\b'), r'a\b');
-      expect(builder.normalize(r'a\.b\c'), r'a\.b\c');
-      expect(builder.normalize(r'a\./.\b\.\c'), r'a\b\c');
-      expect(builder.normalize(r'.\./a'), 'a');
-      expect(builder.normalize(r'a/.\.'), 'a');
+      expect(context.normalize(r'.\'), '.');
+      expect(context.normalize(r'c:\.'), r'c:\');
+      expect(context.normalize(r'B:\.\'), r'B:\');
+      expect(context.normalize(r'\\server\share\.'), r'\\server\share');
+      expect(context.normalize(r'.\.'), '.');
+      expect(context.normalize(r'a\.\b'), r'a\b');
+      expect(context.normalize(r'a\.b\c'), r'a\.b\c');
+      expect(context.normalize(r'a\./.\b\.\c'), r'a\b\c');
+      expect(context.normalize(r'.\./a'), 'a');
+      expect(context.normalize(r'a/.\.'), 'a');
+      expect(context.normalize(r'\.'), r'\');
+      expect(context.normalize('/.'), r'\');
     });
 
     test('eliminates ".." parts', () {
-      expect(builder.normalize('..'), '..');
-      expect(builder.normalize(r'..\'), '..');
-      expect(builder.normalize(r'..\..\..'), r'..\..\..');
-      expect(builder.normalize(r'../..\..\'), r'..\..\..');
-      // TODO(rnystrom): Is this how Python handles absolute paths on Windows?
-      expect(builder.normalize(r'\\..'), r'\\');
-      expect(builder.normalize(r'\\..\..\..'), r'\\');
-      expect(builder.normalize(r'\\..\../..\a'), r'\\a');
-      expect(builder.normalize(r'c:\..'), r'c:\');
-      expect(builder.normalize(r'A:/..\..\..'), r'A:\');
-      expect(builder.normalize(r'b:\..\..\..\a'), r'b:\a');
-      expect(builder.normalize(r'b:\r\..\..\..\a\c\.\..'), r'b:\a');
-      expect(builder.normalize(r'a\..'), '.');
-      expect(builder.normalize(r'..\a'), r'..\a');
-      expect(builder.normalize(r'c:\..\a'), r'c:\a');
-      // A path starting with '\' is not an absolute path on Windows.
-      expect(builder.normalize(r'\..\a'), r'..\a');
-      expect(builder.normalize(r'a\b\..'), 'a');
-      expect(builder.normalize(r'..\a\b\..'), r'..\a');
-      expect(builder.normalize(r'a\..\b'), 'b');
-      expect(builder.normalize(r'a\.\..\b'), 'b');
-      expect(builder.normalize(r'a\b\c\..\..\d\e\..'), r'a\d');
-      expect(builder.normalize(r'a\b\..\..\..\..\c'), r'..\..\c');
-      expect(builder.normalize(r'a/b/c/../../..d/./.e/f././'), r'a\..d\.e\f.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize(r'..\'), '..');
+      expect(context.normalize(r'..\..\..'), r'..\..\..');
+      expect(context.normalize(r'../..\..\'), r'..\..\..');
+      expect(context.normalize(r'\\server\share\..'), r'\\server\share');
+      expect(context.normalize(r'\\server\share\..\../..\a'),
+          r'\\server\share\a');
+      expect(context.normalize(r'c:\..'), r'c:\');
+      expect(context.normalize(r'A:/..\..\..'), r'A:\');
+      expect(context.normalize(r'b:\..\..\..\a'), r'b:\a');
+      expect(context.normalize(r'b:\r\..\..\..\a\c\.\..'), r'b:\a');
+      expect(context.normalize(r'a\..'), '.');
+      expect(context.normalize(r'..\a'), r'..\a');
+      expect(context.normalize(r'c:\..\a'), r'c:\a');
+      expect(context.normalize(r'\..\a'), r'\a');
+      expect(context.normalize(r'a\b\..'), 'a');
+      expect(context.normalize(r'..\a\b\..'), r'..\a');
+      expect(context.normalize(r'a\..\b'), 'b');
+      expect(context.normalize(r'a\.\..\b'), 'b');
+      expect(context.normalize(r'a\b\c\..\..\d\e\..'), r'a\d');
+      expect(context.normalize(r'a\b\..\..\..\..\c'), r'..\..\c');
+      expect(context.normalize(r'a/b/c/../../..d/./.e/f././'), r'a\..d\.e\f.');
     });
 
     test('removes trailing separators', () {
-      expect(builder.normalize(r'.\'), '.');
-      expect(builder.normalize(r'.\\'), '.');
-      expect(builder.normalize(r'a/'), 'a');
-      expect(builder.normalize(r'a\b\'), r'a\b');
-      expect(builder.normalize(r'a\b\\\'), r'a\b');
+      expect(context.normalize(r'.\'), '.');
+      expect(context.normalize(r'.\\'), '.');
+      expect(context.normalize(r'a/'), 'a');
+      expect(context.normalize(r'a\b\'), r'a\b');
+      expect(context.normalize(r'a\b\\\'), r'a\b');
     });
 
     test('normalizes separators', () {
-      expect(builder.normalize(r'a/b\c'), r'a\b\c');
+      expect(context.normalize(r'a/b\c'), r'a\b\c');
     });
   });
 
   group('relative', () {
     group('from absolute root', () {
       test('given absolute path in root', () {
-        expect(builder.relative(r'C:\'), r'..\..');
-        expect(builder.relative(r'C:\root'), '..');
-        expect(builder.relative(r'C:\root\path'), '.');
-        expect(builder.relative(r'C:\root\path\a'), 'a');
-        expect(builder.relative(r'C:\root\path\a\b.txt'), r'a\b.txt');
-        expect(builder.relative(r'C:\root\a\b.txt'), r'..\a\b.txt');
-        expect(builder.relative(r'C:/'), r'..\..');
-        expect(builder.relative(r'C:/root'), '..');
-        expect(builder.relative(r'c:\'), r'..\..');
-        expect(builder.relative(r'c:\root'), '..');
+        expect(context.relative(r'C:\'), r'..\..');
+        expect(context.relative(r'C:\root'), '..');
+        expect(context.relative(r'\root'), '..');
+        expect(context.relative(r'C:\root\path'), '.');
+        expect(context.relative(r'\root\path'), '.');
+        expect(context.relative(r'C:\root\path\a'), 'a');
+        expect(context.relative(r'\root\path\a'), 'a');
+        expect(context.relative(r'C:\root\path\a\b.txt'), r'a\b.txt');
+        expect(context.relative(r'C:\root\a\b.txt'), r'..\a\b.txt');
+        expect(context.relative(r'C:/'), r'..\..');
+        expect(context.relative(r'C:/root'), '..');
+        expect(context.relative(r'c:\'), r'..\..');
+        expect(context.relative(r'c:\root'), '..');
       });
 
       test('given absolute path outside of root', () {
-        expect(builder.relative(r'C:\a\b'), r'..\..\a\b');
-        expect(builder.relative(r'C:\root\path\a'), 'a');
-        expect(builder.relative(r'C:\root\path\a\b.txt'), r'a\b.txt');
-        expect(builder.relative(r'C:\root\a\b.txt'), r'..\a\b.txt');
-        expect(builder.relative(r'C:/a/b'), r'..\..\a\b');
-        expect(builder.relative(r'C:/root/path/a'), 'a');
-        expect(builder.relative(r'c:\a\b'), r'..\..\a\b');
-        expect(builder.relative(r'c:\root\path\a'), 'a');
+        expect(context.relative(r'C:\a\b'), r'..\..\a\b');
+        expect(context.relative(r'\a\b'), r'..\..\a\b');
+        expect(context.relative(r'C:\root\path\a'), 'a');
+        expect(context.relative(r'C:\root\path\a\b.txt'), r'a\b.txt');
+        expect(context.relative(r'C:\root\a\b.txt'), r'..\a\b.txt');
+        expect(context.relative(r'C:/a/b'), r'..\..\a\b');
+        expect(context.relative(r'C:/root/path/a'), 'a');
+        expect(context.relative(r'c:\a\b'), r'..\..\a\b');
+        expect(context.relative(r'c:\root\path\a'), 'a');
       });
 
       test('given absolute path on different drive', () {
-        expect(builder.relative(r'D:\a\b'), r'D:\a\b');
+        expect(context.relative(r'D:\a\b'), r'D:\a\b');
       });
 
       test('given relative path', () {
         // The path is considered relative to the root, so it basically just
         // normalizes.
-        expect(builder.relative(''), '.');
-        expect(builder.relative('.'), '.');
-        expect(builder.relative('a'), 'a');
-        expect(builder.relative(r'a\b.txt'), r'a\b.txt');
-        expect(builder.relative(r'..\a\b.txt'), r'..\a\b.txt');
-        expect(builder.relative(r'a\.\b\..\c.txt'), r'a\c.txt');
+        expect(context.relative(''), '.');
+        expect(context.relative('.'), '.');
+        expect(context.relative('a'), 'a');
+        expect(context.relative(r'a\b.txt'), r'a\b.txt');
+        expect(context.relative(r'..\a\b.txt'), r'..\a\b.txt');
+        expect(context.relative(r'a\.\b\..\c.txt'), r'a\c.txt');
       });
 
       // Regression
       test('from root-only path', () {
-        expect(builder.relative(r'C:\', from: r'C:\'), '.');
-        expect(builder.relative(r'C:\root\path', from: r'C:\'), r'root\path');
+        expect(context.relative(r'C:\', from: r'C:\'), '.');
+        expect(context.relative(r'C:\root\path', from: r'C:\'), r'root\path');
       });
     });
 
     group('from relative root', () {
-      var r = new path.Builder(style: path.Style.windows, root: r'foo\bar');
+      var r = new path.Context(style: path.Style.windows, current: r'foo\bar');
 
       test('given absolute path', () {
         expect(r.relative(r'C:\'), equals(r'C:\'));
         expect(r.relative(r'C:\a\b'), equals(r'C:\a\b'));
+        expect(r.relative(r'\'), equals(r'\'));
+        expect(r.relative(r'\a\b'), equals(r'\a\b'));
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(r.relative(''), '.');
+        expect(r.relative('.'), '.');
+        expect(r.relative('..'), '..');
+        expect(r.relative('a'), 'a');
+        expect(r.relative(r'a\b.txt'), r'a\b.txt');
+        expect(r.relative(r'..\a/b.txt'), r'..\a\b.txt');
+        expect(r.relative(r'a\./b\../c.txt'), r'a\c.txt');
+      });
+    });
+
+    group('from root-relative root', () {
+      var r = new path.Context(style: path.Style.windows, current: r'\foo\bar');
+
+      test('given absolute path', () {
+        expect(r.relative(r'C:\'), equals(r'C:\'));
+        expect(r.relative(r'C:\a\b'), equals(r'C:\a\b'));
+        expect(r.relative(r'\'), equals(r'..\..'));
+        expect(r.relative(r'\a\b'), equals(r'..\..\a\b'));
+        expect(r.relative('/'), equals(r'..\..'));
+        expect(r.relative('/a/b'), equals(r'..\..\a\b'));
       });
 
       test('given relative path', () {
@@ -408,124 +480,156 @@
     });
 
     test('from a root with extension', () {
-      var r = new path.Builder(style: path.Style.windows, root: r'C:\dir.ext');
+      var r = new path.Context(
+          style: path.Style.windows, current: r'C:\dir.ext');
       expect(r.relative(r'C:\dir.ext\file'), 'file');
     });
 
     test('with a root parameter', () {
-      expect(builder.relative(r'C:\foo\bar\baz', from: r'C:\foo\bar'),
+      expect(context.relative(r'C:\foo\bar\baz', from: r'C:\foo\bar'),
           equals('baz'));
-      expect(builder.relative('..', from: r'C:\foo\bar'),
+      expect(context.relative('..', from: r'C:\foo\bar'),
           equals(r'..\..\root'));
-      expect(builder.relative('..', from: r'D:\foo\bar'), equals(r'C:\root'));
-      expect(builder.relative(r'C:\foo\bar\baz', from: r'foo\bar'),
+      expect(context.relative('..', from: r'D:\foo\bar'), equals(r'C:\root'));
+      expect(context.relative(r'C:\foo\bar\baz', from: r'foo\bar'),
           equals(r'..\..\..\..\foo\bar\baz'));
-      expect(builder.relative('..', from: r'foo\bar'), equals(r'..\..\..'));
+      expect(context.relative('..', from: r'foo\bar'), equals(r'..\..\..'));
     });
 
     test('with a root parameter and a relative root', () {
-      var r = new path.Builder(style: path.Style.windows, root: r'relative\root');
+      var r = new path.Context(
+          style: path.Style.windows, current: r'relative\root');
       expect(r.relative(r'C:\foo\bar\baz', from: r'C:\foo\bar'), equals('baz'));
-      expect(() => r.relative('..', from: r'C:\foo\bar'), throwsArgumentError);
+      expect(() => r.relative('..', from: r'C:\foo\bar'), throwsPathException);
       expect(r.relative(r'C:\foo\bar\baz', from: r'foo\bar'),
           equals(r'C:\foo\bar\baz'));
       expect(r.relative('..', from: r'foo\bar'), equals(r'..\..\..'));
     });
 
     test('given absolute with different root prefix', () {
-      expect(builder.relative(r'D:\a\b'), r'D:\a\b');
-      expect(builder.relative(r'\\a\b'), r'\\a\b');
+      expect(context.relative(r'D:\a\b'), r'D:\a\b');
+      expect(context.relative(r'\\server\share\a\b'), r'\\server\share\a\b');
     });
 
     test('from a . root', () {
-      var r = new path.Builder(style: path.Style.windows, root: '.');
+      var r = new path.Context(style: path.Style.windows, current: '.');
       expect(r.relative(r'C:\foo\bar\baz'), equals(r'C:\foo\bar\baz'));
       expect(r.relative(r'foo\bar\baz'), equals(r'foo\bar\baz'));
+      expect(r.relative(r'\foo\bar\baz'), equals(r'\foo\bar\baz'));
     });
   });
 
-  group('resolve', () {
+  group('isWithin', () {
+    test('simple cases', () {
+      expect(context.isWithin(r'foo\bar', r'foo\bar'), isFalse);
+      expect(context.isWithin(r'foo\bar', r'foo\bar\baz'), isTrue);
+      expect(context.isWithin(r'foo\bar', r'foo\baz'), isFalse);
+      expect(context.isWithin(r'foo\bar', r'..\path\foo\bar\baz'), isTrue);
+      expect(context.isWithin(r'C:\', r'C:\foo\bar'), isTrue);
+      expect(context.isWithin(r'C:\', r'D:\foo\bar'), isFalse);
+      expect(context.isWithin(r'C:\', r'\foo\bar'), isTrue);
+      expect(context.isWithin(r'C:\foo', r'\foo\bar'), isTrue);
+      expect(context.isWithin(r'C:\foo', r'\bar\baz'), isFalse);
+      expect(context.isWithin(r'baz', r'C:\root\path\baz\bang'), isTrue);
+      expect(context.isWithin(r'baz', r'C:\root\path\bang\baz'), isFalse);
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.windows, current: r'foo\bar');
+      expect(context.isWithin('.', r'a\b\c'), isTrue);
+      expect(context.isWithin('.', r'..\a\b\c'), isFalse);
+      expect(context.isWithin('.', r'..\..\a\foo\b\c'), isFalse);
+      expect(context.isWithin(r'C:\', r'C:\baz\bang'), isTrue);
+      expect(context.isWithin('.', r'C:\baz\bang'), isFalse);
+    });
+  });
+
+  group('absolute', () {
     test('allows up to seven parts', () {
-      expect(builder.resolve('a'), r'C:\root\path\a');
-      expect(builder.resolve('a', 'b'), r'C:\root\path\a\b');
-      expect(builder.resolve('a', 'b', 'c'), r'C:\root\path\a\b\c');
-      expect(builder.resolve('a', 'b', 'c', 'd'), r'C:\root\path\a\b\c\d');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e'),
+      expect(context.absolute('a'), r'C:\root\path\a');
+      expect(context.absolute('a', 'b'), r'C:\root\path\a\b');
+      expect(context.absolute('a', 'b', 'c'), r'C:\root\path\a\b\c');
+      expect(context.absolute('a', 'b', 'c', 'd'), r'C:\root\path\a\b\c\d');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e'),
           r'C:\root\path\a\b\c\d\e');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e', 'f'),
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'),
           r'C:\root\path\a\b\c\d\e\f');
-      expect(builder.resolve('a', 'b', 'c', 'd', 'e', 'f', 'g'),
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'),
           r'C:\root\path\a\b\c\d\e\f\g');
     });
 
     test('does not add separator if a part ends in one', () {
-      expect(builder.resolve(r'a\', 'b', r'c\', 'd'), r'C:\root\path\a\b\c\d');
-      expect(builder.resolve('a/', 'b'), r'C:\root\path\a/b');
+      expect(context.absolute(r'a\', 'b', r'c\', 'd'), r'C:\root\path\a\b\c\d');
+      expect(context.absolute('a/', 'b'), r'C:\root\path\a/b');
     });
 
     test('ignores parts before an absolute path', () {
-      expect(builder.resolve('a', '/b', '/c', 'd'), r'C:\root\path\a/b/c\d');
-      expect(builder.resolve('a', r'c:\b', 'c', 'd'), r'c:\b\c\d');
-      expect(builder.resolve('a', r'\\b', r'\\c', 'd'), r'\\c\d');
+      expect(context.absolute('a', '/b', '/c', 'd'), r'C:\c\d');
+      expect(context.absolute('a', r'\b', r'\c', 'd'), r'C:\c\d');
+      expect(context.absolute('a', r'c:\b', 'c', 'd'), r'c:\b\c\d');
+      expect(context.absolute('a', r'\\b\c', r'\\d\e', 'f'), r'\\d\e\f');
     });
   });
 
   test('withoutExtension', () {
-    expect(builder.withoutExtension(''), '');
-    expect(builder.withoutExtension('a'), 'a');
-    expect(builder.withoutExtension('.a'), '.a');
-    expect(builder.withoutExtension('a.b'), 'a');
-    expect(builder.withoutExtension(r'a\b.c'), r'a\b');
-    expect(builder.withoutExtension(r'a\b.c.d'), r'a\b.c');
-    expect(builder.withoutExtension(r'a\'), r'a\');
-    expect(builder.withoutExtension(r'a\b\'), r'a\b\');
-    expect(builder.withoutExtension(r'a\.'), r'a\.');
-    expect(builder.withoutExtension(r'a\.b'), r'a\.b');
-    expect(builder.withoutExtension(r'a.b\c'), r'a.b\c');
-    expect(builder.withoutExtension(r'a/b.c/d'), r'a/b.c/d');
-    expect(builder.withoutExtension(r'a\b/c'), r'a\b/c');
-    expect(builder.withoutExtension(r'a\b/c.d'), r'a\b/c');
-    expect(builder.withoutExtension(r'a.b/c'), r'a.b/c');
-    expect(builder.withoutExtension(r'a\b.c\'), r'a\b\');
+    expect(context.withoutExtension(''), '');
+    expect(context.withoutExtension('a'), 'a');
+    expect(context.withoutExtension('.a'), '.a');
+    expect(context.withoutExtension('a.b'), 'a');
+    expect(context.withoutExtension(r'a\b.c'), r'a\b');
+    expect(context.withoutExtension(r'a\b.c.d'), r'a\b.c');
+    expect(context.withoutExtension(r'a\'), r'a\');
+    expect(context.withoutExtension(r'a\b\'), r'a\b\');
+    expect(context.withoutExtension(r'a\.'), r'a\.');
+    expect(context.withoutExtension(r'a\.b'), r'a\.b');
+    expect(context.withoutExtension(r'a.b\c'), r'a.b\c');
+    expect(context.withoutExtension(r'a/b.c/d'), r'a/b.c/d');
+    expect(context.withoutExtension(r'a\b/c'), r'a\b/c');
+    expect(context.withoutExtension(r'a\b/c.d'), r'a\b/c');
+    expect(context.withoutExtension(r'a.b/c'), r'a.b/c');
+    expect(context.withoutExtension(r'a\b.c\'), r'a\b\');
   });
 
   test('fromUri', () {
-    expect(builder.fromUri(Uri.parse('file:///C:/path/to/foo')),
+    expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
         r'C:\path\to\foo');
-    expect(builder.fromUri(Uri.parse('file://hostname/path/to/foo')),
-        r'\\hostname\path\to\foo');
-    expect(builder.fromUri(Uri.parse('file:///C:/')), r'C:\');
-    expect(builder.fromUri(Uri.parse('file://hostname/')), r'\\hostname\');
-    expect(builder.fromUri(Uri.parse('foo/bar')), r'foo\bar');
-    expect(builder.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
-    expect(builder.fromUri(Uri.parse('///C:/path/to/foo')), r'C:\path\to\foo');
-    expect(builder.fromUri(Uri.parse('//hostname/path/to/foo')),
-        r'\\hostname\path\to\foo');
-    expect(builder.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
+    expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
+        r'\\server\share\path\to\foo');
+    expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
+    expect(context.fromUri(Uri.parse('file://server/share')),
+        r'\\server\share');
+    expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
+    expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
+    expect(context.fromUri(Uri.parse('///C:/path/to/foo')), r'C:\path\to\foo');
+    expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
+        r'\\server\share\path\to\foo');
+    expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
         r'C:\path\to\foo#bar');
-    expect(builder.fromUri(Uri.parse('file://hostname/path/to/foo%23bar')),
-        r'\\hostname\path\to\foo#bar');
-    expect(builder.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+    expect(context.fromUri(Uri.parse('file://server/share/path/to/foo%23bar')),
+        r'\\server\share\path\to\foo#bar');
+    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
         r'_{_}_`_^_ _"_%_');
-    expect(() => builder.fromUri(Uri.parse('http://dartlang.org')),
+    expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
         throwsArgumentError);
   });
 
   test('toUri', () {
-    expect(builder.toUri(r'C:\path\to\foo'),
+    expect(context.toUri(r'C:\path\to\foo'),
         Uri.parse('file:///C:/path/to/foo'));
-    expect(builder.toUri(r'C:\path\to\foo\'),
+    expect(context.toUri(r'C:\path\to\foo\'),
         Uri.parse('file:///C:/path/to/foo/'));
-    expect(builder.toUri(r'C:\'), Uri.parse('file:///C:/'));
-    expect(builder.toUri(r'\\hostname\'), Uri.parse('file://hostname/'));
-    expect(builder.toUri(r'foo\bar'), Uri.parse('foo/bar'));
-    expect(builder.toUri(r'C:\path\to\foo#bar'),
+    expect(context.toUri(r'C:\'), Uri.parse('file:///C:/'));
+    expect(context.toUri(r'\\server\share'), Uri.parse('file://server/share'));
+    expect(context.toUri(r'\\server\share\'),
+        Uri.parse('file://server/share/'));
+    expect(context.toUri(r'foo\bar'), Uri.parse('foo/bar'));
+    expect(context.toUri(r'C:\path\to\foo#bar'),
         Uri.parse('file:///C:/path/to/foo%23bar'));
-    expect(builder.toUri(r'\\hostname\path\to\foo#bar'),
-        Uri.parse('file://hostname/path/to/foo%23bar'));
-    expect(builder.toUri(r'C:\_{_}_`_^_ _"_%_'),
+    expect(context.toUri(r'\\server\share\path\to\foo#bar'),
+        Uri.parse('file://server/share/path/to/foo%23bar'));
+    expect(context.toUri(r'C:\_{_}_`_^_ _"_%_'),
         Uri.parse('file:///C:/_%7B_%7D_%60_%5E_%20_%22_%25_'));
-    expect(builder.toUri(r'_{_}_`_^_ _"_%_'),
+    expect(context.toUri(r'_{_}_`_^_ _"_%_'),
         Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
   });
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index dc4af2c..41fd2a5 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -14,7 +14,7 @@
 scheduled_test/lib/*: Skip
 polymer/example/scoped_style/*: Skip
 
-scheduled_test/test/scheduled_server_test: Pass, Slow, Fail # Issue 9231, 13524
+scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 
 
@@ -29,10 +29,13 @@
 collection_helpers/test/equality_test/04: Fail # Issue 1533
 collection_helpers/test/equality_test/05: Fail # Issue 1533
 collection_helpers/test/equality_test/none: Pass, Fail # Issue 14348
+collection_helpers/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
 
 [ $compiler == dart2js && $checked && $runtime == ie9 ]
 crypto/test/base64_test: Timeout # Issue 12486
-template_binding/test/template_binding_test: Fail # Issue 15093
+
+[ $compiler == dart2js && $checked && $runtime == d8 ]
+serialization/test/serialization_test: Pass, RuntimeError # Issue 14735
 
 [ $runtime == d8 || $runtime == jsshell ]
 unittest/test/unittest_nested_groups_setup_teardown_test: Pass, RuntimeError # http://dartbug.com/10109
@@ -56,6 +59,7 @@
 polymer/test/noscript_test: Skip #uses dart:html
 polymer/test/prop_attr_bind_reflection_test: Skip #uses dart:html
 polymer/test/prop_attr_reflection_test: Skip #uses dart:html
+polymer/test/property_change_test: Skip # uses dart:html
 polymer/test/publish_attributes_test: Skip #uses dart:html
 polymer/test/publish_inherited_properties_test: Skip #uses dart:html
 polymer/test/register_test: Skip #uses dart:html
@@ -70,6 +74,11 @@
 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 == ff && $system != windows ]
+# 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.
+collection_helpers/test/typed_buffers_test: RuntimeError
 
 [ $runtime == opera && $compiler == dart2js ]
 intl/test/find_default_locale_browser_test: Fail
@@ -78,6 +87,7 @@
 [ $runtime == ie9 ]
 intl/test/date_time_format_http_request_test: Fail # Issue 8983
 mime/test/mime_multipart_transformer_test: Skip # No typed_data on IE9.
+collection_helpers/test/typed_buffers_test: Fail, Crash # No typed_data on IE9.
 polymer/test/instance_attrs_test: Pass, Fail # Issue 14167
 
 [ $runtime == safari ]
@@ -88,6 +98,9 @@
 crypto/test/sha256_test: Pass, Fail # Issue 12502
 crypto/test/hmac_sha256_test: Pass, Fail # Issue 12502
 
+# Unexplained errors only occuring on Safari.
+collection_helpers/test/typed_buffers_test: RuntimeError
+
 [ $runtime == ie9 || $runtime == ie10 ]
 polymer/example/canonicalization/test/canonicalization_deploy_test: Pass, Timeout
 polymer/example/canonicalization/test/canonicalization_test: Fail, Timeout, OK # tests development only behavior
@@ -102,6 +115,7 @@
 polymer/test/events_test: Pass, Timeout # Issue 13260
 polymer/test/nested_binding_test: Pass, Timeout # Issue 13260
 polymer/test/noscript_test: Pass, Timeout # Issue 13260
+polymer/test/property_change_test: Pass, Timeout # Issue 13260
 polymer/test/prop_attr_reflection_test: Pass, Timeout # Issue 13260
 polymer/test/prop_attr_bind_reflection_test: Pass, Timeout # Issue 13260
 polymer/test/publish_attributes_test: Pass, Timeout # Issue 13260
@@ -109,7 +123,7 @@
 polymer/test/register_test: Pass, Timeout # Issue 13260
 polymer/test/take_attributes_test: Pass, Timeout # Issue 13260
 polymer/test/template_distribute_dynamic_test: Pass, Timeout # Issue 13260
-polymer/test/unbind_test: Pass, Timeout # Issue 13260
+polymer/test/unbind_test: Pass, Fail, Timeout # Issue 13260, 15259
 
 # Skip browser-specific tests on VM
 [ $runtime == vm ]
@@ -196,7 +210,7 @@
 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/transform_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.
 watcher/test/*: Fail, OK # Uses dart:io.
@@ -231,6 +245,8 @@
 third_party/html5lib/test/parser_test: Skip
 third_party/html5lib/test/tokenizer_test: Skip
 
+polymer/test/unbind_test: Pass, Fail # Issue 15259
+
 [ $runtime == safari]
  # Bug in JSC: the test only passes when being debugged.
 crypto/test/hmac_md5_test: Fail, Pass
@@ -250,7 +266,6 @@
 [ $arch == simarm || $arch == simmips ]
 barback/test/too_many_open_files_test: Pass, Slow, Fail # 14220
 third_party/html5lib/test/tokenizer_test: Pass, Slow
-watcher/test/no_subscription_test: Pass, Fail  # Issue 13705.
 
 # Skip serialization test that explicitly has no library declaration in the
 # test on Dartium, which requires all tests to have a library.
@@ -295,7 +310,7 @@
 scheduled_test/test/scheduled_server_test: Skip # Uses dart:io
 
 [ $browser || $runtime == vm ]
-unittest/test/missing_tick_test: Timeout, Fail, OK # This test should fail, not time out.
+unittest/test/missing_tick_test: Fail, OK # Expected to fail, due to timeout.
 
 # Issue http://dartbug.com/12930
 [ $runtime == vm ]
@@ -325,6 +340,14 @@
 unittest/test/matchers_test: StaticWarning, OK # testing error creating abstract class
 unittest/test/mock_test: StaticWarning, OK # testing unimplemented members
 
-[ $runtime == vm ]
-# Issue surfaced after removing deprecated async features.
-scheduled_test/test/scheduled_test/nested_task_test: RuntimeError # Issue 14639
+[ $runtime == vm && ($system == windows || $system == macos) ]
+watcher/test/*/linux_test: Skip
+
+[ $runtime == vm && ($system == windows || $system == linux) ]
+watcher/test/*/mac_os_test: Skip
+
+[ $runtime == vm && $system == linux ]
+watcher/test/*/linux_test: Pass, Slow # Issue 14606
+
+[ $runtime == vm && $system == macos ]
+watcher/test/directory_watcher/mac_os_test: Pass, Fail  # Issue 15024
diff --git a/pkg/polymer/lib/builder.dart b/pkg/polymer/lib/builder.dart
index e1879e0d..440c2723 100644
--- a/pkg/polymer/lib/builder.dart
+++ b/pkg/polymer/lib/builder.dart
@@ -214,7 +214,8 @@
   var transformOptions = new TransformOptions(
       entryPoints: entryPoints,
       directlyIncludeJS: options.directlyIncludeJS,
-      contentSecurityPolicy: options.contentSecurityPolicy);
+      contentSecurityPolicy: options.contentSecurityPolicy,
+      releaseMode: options.releaseMode);
 
   var barbackOptions = new BarbackOptions(
       new PolymerTransformerGroup(transformOptions).phases,
@@ -260,9 +261,16 @@
    */
   final bool directlyIncludeJS;
 
+  /**
+   * Run transformers in release mode. For instance, uses the minified versions
+   * of shadow_dom and custom-elements polyfills.
+   */
+  final bool releaseMode;
+
   CommandLineOptions(this.changedFiles, this.removedFiles, this.clean,
       this.full, this.machineFormat, this.forceDeploy, this.outDir,
-      this.directlyIncludeJS, this.contentSecurityPolicy);
+      this.directlyIncludeJS, this.contentSecurityPolicy,
+      this.releaseMode);
 }
 
 /**
@@ -318,6 +326,11 @@
     ..addFlag('csp', help:
         'replaces *.dart with *.dart.precompiled.js to comply with \n'
         'Content Security Policy restrictions.')
+    ..addFlag('debug', help:
+        'run in debug mode. For example, use the debug versions of the \n'
+        'polyfills (shadow_dom.debug.js and custom-elements.debug.js) \n'
+        'instead of the minified versions.',
+        defaultsTo: false)
     ..addFlag('help', abbr: 'h',
         negatable: false, help: 'Displays this help and exit.');
 
@@ -342,5 +355,5 @@
   }
   return new CommandLineOptions(res['changed'], res['removed'], res['clean'],
       res['full'], res['machine'], res['deploy'], res['out'], res['js'],
-      res['csp']);
+      res['csp'], !res['debug']);
 }
diff --git a/pkg/polymer/lib/deploy.dart b/pkg/polymer/lib/deploy.dart
index b79c351..d3e41a2 100644
--- a/pkg/polymer/lib/deploy.dart
+++ b/pkg/polymer/lib/deploy.dart
@@ -42,10 +42,12 @@
   if (test == null) {
     var transformOps = new TransformOptions(
         directlyIncludeJS: args['js'],
-        contentSecurityPolicy: args['csp']);
+        contentSecurityPolicy: args['csp'],
+        releaseMode: !args['debug']);
     options = new BarbackOptions(createDeployPhases(transformOps), outDir);
   } else {
-    options = _createTestOptions(test, outDir, args['js'], args['csp']);
+    options = _createTestOptions(
+        test, outDir, args['js'], args['csp'], !args['debug']);
   }
   if (options == null) exit(1);
 
@@ -60,7 +62,7 @@
 createDeployPhases(options) => new PolymerTransformerGroup(options).phases;
 
 BarbackOptions _createTestOptions(String testFile, String outDir,
-    bool directlyIncludeJS, bool contentSecurityPolicy) {
+    bool directlyIncludeJS, bool contentSecurityPolicy, bool releaseMode) {
   var testDir = path.normalize(path.dirname(testFile));
 
   // A test must be allowed to import things in the package.
@@ -77,7 +79,8 @@
   var phases = createDeployPhases(new TransformOptions(
       entryPoints: [path.relative(testFile, from: pubspecDir)],
       directlyIncludeJS: directlyIncludeJS,
-      contentSecurityPolicy: contentSecurityPolicy));
+      contentSecurityPolicy: contentSecurityPolicy,
+      releaseMode: releaseMode));
   return new BarbackOptions(phases, outDir,
       currentPackage: packageName,
       packageDirs: {packageName : pubspecDir},
@@ -113,6 +116,11 @@
           'deploy replaces *.dart scripts with *.dart.js. This flag \n'
           'leaves "packages/browser/dart.js" to do the replacement at runtime.',
           defaultsTo: true)
+      ..addFlag('debug', help:
+          'run in debug mode. For example, use the debug versions of the \n'
+          'polyfills (shadow_dom.debug.js and custom-elements.debug.js) \n'
+          'instead of the minified versions.',
+          defaultsTo: false)
       ..addFlag('csp', help:
           'replaces *.dart with *.dart.precompiled.js to comply with \n'
           'Content Security Policy restrictions.');
diff --git a/pkg/polymer/lib/src/build/build_filter.dart b/pkg/polymer/lib/src/build/build_filter.dart
new file mode 100644
index 0000000..9bc8bd4
--- /dev/null
+++ b/pkg/polymer/lib/src/build/build_filter.dart
@@ -0,0 +1,47 @@
+// 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.
+
+/**
+ * Final phase of the polymer transformation: removes any files that are not
+ * needed for deployment.
+ */
+library polymer.src.build.build_filter;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'common.dart';
+
+/**
+ * Removes any files not needed for deployment, such as internal build artifacts
+ * and non-entry HTML files.
+ */
+class BuildFilter extends Transformer with PolymerTransformer {
+  final TransformOptions options;
+  BuildFilter(this.options);
+
+  Future<bool> isPrimary(Asset input) => new Future.value(
+      // nothing is filtered in debug mode
+      options.releaseMode &&
+      // TODO(sigmund): remove this exclusion once we have dev_transformers
+      // (dartbug.com/14187)
+      input.id.path.startsWith('web/') &&
+      // may filter non-entry HTML files and internal artifacts
+      (input.id.extension == '.html' || input.id.extension == '.scriptUrls') &&
+      // keep any entry points
+      !options.isHtmlEntryPoint(input.id));
+
+  Future apply(Transform transform) {
+    if (transform.primaryInput.id.extension == '.scriptUrls') {
+      return new Future.value(null);
+    }
+    return readPrimaryAsHtml(transform).then((document) {
+      // Keep .html files that don't use polymer, since the app developer might
+      // have non-polymer entrypoints.
+      if (document.queryAll('polymer-element').isEmpty) {
+        transform.addOutput(transform.primaryInput);
+      }
+    });
+  }
+}
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 6724561..655ccbf 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -62,8 +62,14 @@
    */
   final bool directlyIncludeJS;
 
+  /**
+   * Run transformers to create a releasable app. For example, include the
+   * minified versions of the polyfills rather than the debug versions.
+   */
+  final bool releaseMode;
+
   TransformOptions({entryPoints, this.contentSecurityPolicy: false,
-      this.directlyIncludeJS: true})
+      this.directlyIncludeJS: true, this.releaseMode: true})
       : entryPoints = entryPoints == null ? null
           : entryPoints.map(_systemToAssetPath).toList();
 
@@ -119,32 +125,45 @@
     return null;
   }
 
-  var package;
-  var targetPath;
   var segments = urlBuilder.split(url);
-  if (segments[0] == 'packages') {
-    if (segments.length < 3) {
-      logger.error("incomplete packages/ path. It should have at least 3 "
-          "segments packages/name/path-from-name's-lib-dir", span: span);
-      return null;
-    }
-    package = segments[1];
-    targetPath = urlBuilder.join('lib',
-        urlBuilder.joinAll(segments.sublist(2)));
-  } else if (segments[0] == 'assets') {
-    if (segments.length < 3) {
-      logger.error("incomplete assets/ path. It should have at least 3 "
-          "segments assets/name/path-from-name's-asset-dir", span: span);
-    }
-    package = segments[1];
-    targetPath = urlBuilder.join('asset',
-        urlBuilder.joinAll(segments.sublist(2)));
-  } else {
-    package = source.package;
-    targetPath = urlBuilder.normalize(
-        urlBuilder.join(urlBuilder.dirname(source.path), url));
+  var prefix = segments[0];
+  var entryFolder = !source.path.startsWith('lib/') &&
+      !source.path.startsWith('asset/');
+
+  // URLs of the form "packages/foo/bar" seen under entry folders (like web/,
+  // test/, example/, etc) are resolved as an asset in another package.
+  if (entryFolder && (prefix == 'packages' || prefix == 'assets')) {
+    return _extractOtherPackageId(0, segments, logger, span);
   }
-  return new AssetId(package, targetPath);
+
+  var targetPath = urlBuilder.normalize(
+      urlBuilder.join(urlBuilder.dirname(source.path), url));
+
+  // Relative URLs of the form "../../packages/foo/bar" in an asset under lib/
+  // or asset/ are also resolved as an asset in another package.
+  segments = urlBuilder.split(targetPath);
+  if (!entryFolder && segments.length > 1 && segments[0] == '..' &&
+      (segments[1] == 'packages' || segments[1] == 'assets')) {
+    return _extractOtherPackageId(1, segments, logger, span);
+  }
+
+  // Otherwise, resolve as a path in the same package.
+  return new AssetId(source.package, targetPath);
+}
+
+AssetId _extractOtherPackageId(int index, List segments,
+    TransformLogger logger, Span span) {
+  if (index >= segments.length) return null;
+  var prefix = segments[index];
+  if (prefix != 'packages' && prefix != 'assets') return null;
+  var folder = prefix == 'packages' ? 'lib' : 'asset';
+  if (segments.length < index + 3) {
+    logger.error("incomplete $prefix/ path. It should have at least 3 "
+        "segments $prefix/name/path-from-name's-$folder-dir", span: span);
+    return null;
+  }
+  return new AssetId(segments[index + 1],
+      path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
 }
 
 /**
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index 3b10cef..79298c1 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -27,9 +27,6 @@
  * support script tags with inlined code, use this transformer after running
  * [InlineCodeExtractor] on an earlier phase.
  */
-// TODO(sigmund): currently we just inline polymer-element and script tags, we
-// need to make sure we match semantics of html-imports for other tags too.
-// (see dartbug.com/12613).
 class ImportInliner extends Transformer with PolymerTransformer {
   final TransformOptions options;
 
@@ -42,11 +39,11 @@
   Future apply(Transform transform) {
     var logger = transform.logger;
     var seen = new Set<AssetId>();
-    var elements = [];
+    var documents = [];
     var id = transform.primaryInput.id;
     seen.add(id);
     return readPrimaryAsHtml(transform).then((document) {
-      var future = _visitImports(document, id, transform, seen, elements);
+      var future = _visitImports(document, id, transform, seen, documents);
       return future.then((importsFound) {
         // We produce a secondary asset with extra information for later phases.
         var secondaryId = id.addExtension('.scriptUrls');
@@ -56,39 +53,42 @@
           return;
         }
 
-        for (var tag in document.queryAll('link')) {
-          if (tag.attributes['rel'] == 'import') {
-            tag.remove();
-          }
-        }
-
         // Split Dart script tags from all the other elements. Now that Dartium
         // only allows a single script tag per page, we can't inline script
         // tags. Instead, we collect the urls of each script tag so we import
         // them directly from the Dart bootstrap code.
         var scripts = [];
-        var rest = [];
-        for (var e in elements) {
-          if (e.tagName == 'script' &&
-              e.attributes['type'] == 'application/dart') {
-            scripts.add(e);
-          } else if (e.tagName == 'polymer-element') {
-            rest.add(e);
-            var script = e.query('script');
-            if (script != null &&
-                script.attributes['type'] == 'application/dart') {
-              script.remove();
-              scripts.add(script);
+
+        var fragment = new DocumentFragment();
+        for (var importedDoc in documents) {
+          bool first = true;
+          for (var e in importedDoc.queryAll('script')) {
+            if (e.attributes['type'] == 'application/dart') {
+              e.remove();
+
+              // only one Dart script per document is supported in Dartium.
+              if (first) {
+                first = false;
+                scripts.add(e);
+              } else {
+                // TODO(jmesserly): remove this when we are running linter.
+                logger.warning('more than one Dart script per HTML document is '
+                    'not supported. Script will be ignored.',
+                    span: e.sourceSpan);
+              }
             }
-          } else {
-            rest.add(e);
           }
+
+          // TODO(jmesserly): should we merge the head too?
+          fragment.nodes.addAll(importedDoc.body.nodes);
         }
 
-        var fragment = new DocumentFragment()..nodes.addAll(rest);
-        document.body.insertBefore(fragment,
-            //TODO(jmesserly): add Node.firstChild to html5lib
-            document.body.nodes.length == 0 ? null : document.body.nodes[0]);
+        document.body.insertBefore(fragment, document.body.firstChild);
+
+        for (var tag in document.queryAll('link')) {
+          if (tag.attributes['rel'] == 'import') tag.remove();
+        }
+
         transform.addOutput(new Asset.fromString(id, document.outerHtml));
 
         var scriptIds = [];
@@ -114,7 +114,7 @@
    * the order they appear, transitive imports are added first.
    */
   Future<bool> _visitImports(Document document, AssetId sourceId,
-      Transform transform, Set<AssetId> seen, List<Node> elements) {
+      Transform transform, Set<AssetId> seen, List<Document> documents) {
     var importIds = [];
     bool hasImports = false;
     for (var tag in document.queryAll('link')) {
@@ -133,7 +133,7 @@
     return Future.forEach(importIds, (id) {
       if (seen.contains(id)) return new Future.value(null);
       seen.add(id);
-      return _collectElements(id, transform, seen, elements);
+      return _collectImportedDocuments(id, transform, seen, documents);
     }).then((_) => true);
   }
 
@@ -141,32 +141,17 @@
    * Loads an asset identified by [id], visits its imports and collects it's
    * polymer-element definitions and script tags.
    */
-  Future _collectElements(AssetId id, Transform transform,
-      Set<AssetId> seen, List elements) {
+  Future _collectImportedDocuments(AssetId id, Transform transform,
+      Set<AssetId> seen, List documents) {
     return readAsHtml(id, transform).then((document) {
-      return _visitImports(document, id, transform, seen, elements).then((_) {
+      return _visitImports(document, id, transform, seen, documents).then((_) {
         new _UrlNormalizer(transform, id).visit(document);
-        new _InlineQuery(elements).visit(document);
+        documents.add(document);
       });
     });
   }
 }
 
-/** Implements document.queryAll('polymer-element,script'). */
-// TODO(sigmund): delete this (dartbug.com/14135)
-class _InlineQuery extends TreeVisitor {
-  final List<Element> elements;
-  _InlineQuery(this.elements);
-
-  visitElement(Element node) {
-    if (node.tagName == 'polymer-element' || node.tagName == 'script') {
-      elements.add(node);
-    } else {
-      super.visitElement(node);
-    }
-  }
-}
-
 /** Internally adjusts urls in the html that we are about to inline. */
 class _UrlNormalizer extends TreeVisitor {
   final Transform transform;
@@ -211,7 +196,7 @@
       // Techincally we shouldn't get there
       transform.logger.error("don't know how to include $id from $primaryId",
           span: span);
-      return null;
+      return href;
     }
 
     var builder = path.url;
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index f186d31..3c5fa20 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -254,11 +254,6 @@
     if (_isEntrypoint && !_dartTagSeen) {
       _logger.error(USE_INIT_DART, span: doc.body.sourceSpan);
     }
-
-    if (_isEntrypoint && !_dartJSSeen) {
-      // TODO(sigmund): remove this when webkitStartDart is gone.
-      _logger.error(USE_DART_JS, span: doc.body.sourceSpan);
-    }
   }
 
   /** Produce warnings for invalid link-rel tags. */
@@ -496,15 +491,6 @@
           span: node.attributeSpans[name]);
     }
 
-    var eventName = name.substring('on-'.length);
-    if (eventName.contains('-')) {
-      var newEvent = toCamelCase(eventName);
-      _logger.warning('Invalid event name "$name". After the "on-" the event '
-          'name should not use dashes. For example use "on-$newEvent" or '
-          '"on-${newEvent.toLowerCase()}" (both forms are equivalent in HTML).',
-          span: node.attributeSpans[name]);
-    }
-
     if (value.contains('.') || value.contains('(')) {
       _logger.warning('Invalid event handler body "$value". Declare a method '
           'in your custom element "void handlerName(event, detail, target)" '
@@ -542,16 +528,12 @@
 const String _NO_COLOR = '\u001b[0m';
 
 const String USE_INIT_DART =
-    'To run a polymer applications, you need to call "initPolymer". You can '
+    'To run a polymer application, you need to call "initPolymer". You can '
     'either include a generic script tag that does this for you:'
     '\'<script type="application/dart">export "package:polymer/init.dart";'
     '</script>\' or add your own script tag and call that function. '
     'Make sure the script tag is placed after all HTML imports.';
 
-const String USE_DART_JS =
-    'To run a polymer applications in Dartium, make sure to include'
-    '\'<script src="packages/browser/dart.js"></script>\' in your page';
-
 const String BOOT_JS_DEPRECATED =
     '"boot.js" is now deprecated. Instead, you can initialize your polymer '
     'application by calling "initPolymer()" in your main. If you don\'t have a '
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index c809d8f..fefc148 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -2,10 +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.
 
-/**
- * Final phase of the polymer transformation: includes any additional polyfills
- * that may needed by the deployed app.
- */
+/** Includes any additional polyfills that may needed by the deployed app. */
 library polymer.src.build.polyfill_injector;
 
 import 'dart:async';
@@ -99,13 +96,17 @@
 
       // JS interop code is required for Polymer CSS shimming.
       if (!jsInteropFound) _addScript('browser/interop.js');
+
+      // TODO(sigmund): enable using .min.js. This currently fails in checked
+      // mode because of bugs in dart2js mirrors (dartbug.com/14720).
+      // var suffix = options.releaseMode ? '.min.js' : '.debug.js';
+      var suffix = '.debug.js';
       if (!customElementFound) {
-        _addScript('custom_element/custom-elements.debug.js');
+        _addScript('custom_element/custom-elements$suffix');
       }
 
       // This polyfill needs to be the first one on the head
-      // TODO(jmesserly): this is .debug to workaround issue 13046.
-      if (!shadowDomFound) _addScript('shadow_dom/shadow_dom.debug.js');
+      if (!shadowDomFound) _addScript('shadow_dom/shadow_dom$suffix');
 
       transform.addOutput(
           new Asset.fromString(transform.primaryInput.id, document.outerHtml));
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index 84dbc1a..e50628c 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -222,8 +222,10 @@
     var cls = reflectClass(type);
     // TODO(jmesserly): this feels unnatrual in Dart. Since we have convenient
     // lazy static initialization, can we get by without it?
-    var registered = cls.methods[#registerCallback];
-    if (registered != null && registered.isStatic &&
+    var registered = cls.declarations[#registerCallback];
+    if (registered != null &&
+        registered is MethodMirror &&
+        registered.isStatic &&
         registered.isRegularMethod) {
       cls.invoke(#registerCallback, [this]);
     }
@@ -265,12 +267,7 @@
         }
 
         var property = new Symbol(attr);
-        var mirror = cls.declarations[property];
-        if (mirror is MethodMirror) {
-          if (!mirror.isGetter || !_hasSetter(cls, mirror)) mirror = null;
-        } else if (mirror is! VariableMirror) {
-          mirror = null;
-        }
+        var mirror = _getProperty(cls, property);
         if (mirror == null) {
           window.console.warn('property for attribute $attr of polymer-element '
               'name=$name not found.');
@@ -363,7 +360,7 @@
   void installLocalSheets() {
     var sheets = this.sheets.where(
         (s) => !s.attributes.containsKey(_SCOPE_ATTR));
-    var content = this.templateContent;
+    var content = templateContent;
     if (content != null) {
       var cssText = new StringBuffer();
       for (var sheet in sheets) {
@@ -378,8 +375,8 @@
   }
 
   List<Element> findNodes(String selector, [bool matcher(Element e)]) {
-    var nodes = this.queryAll(selector).toList();
-    var content = this.templateContent;
+    var nodes = this.querySelectorAll(selector).toList();
+    var content = templateContent;
     if (content != null) {
       nodes = nodes..addAll(content.queryAll(selector));
     }
@@ -437,6 +434,8 @@
   // If an element may take 6us to create, getCustomPropertyNames might
   // cost 1.6us more.
   void inferObservers(ClassMirror cls) {
+    if (cls == _objectType) return;
+    inferObservers(cls.superclass);
     for (var method in cls.declarations.values) {
       if (method is! MethodMirror || method.isStatic
           || !method.isRegularMethod) continue;
@@ -497,33 +496,26 @@
 
 final _objectType = reflectClass(Object);
 
+
 Map _getPublishedProperties(ClassMirror cls, Map props) {
   if (cls == _objectType) return props;
   props = _getPublishedProperties(cls.superclass, props);
-  for (var field in cls.declarations.values) {
-    if (field is! VariableMirror ||
-        field.isFinal || field.isStatic || field.isPrivate) continue;
+  for (var member in cls.declarations.values) {
+    if (member.isStatic || member.isPrivate) continue;
 
-    for (var meta in field.metadata) {
-      if (meta.reflectee is PublishedProperty) {
-        if (props == null) props = {};
-        props[field.simpleName] = field;
-        break;
-      }
-    }
-  }
+    if (member is VariableMirror && !member.isFinal
+        || member is MethodMirror && member.isGetter) {
 
-  for (var getter in cls.declarations.values) {
-    if (getter is! MethodMirror || !getter.isGetter ||
-        getter.isStatic || getter.isPrivate) continue;
-
-    for (var meta in getter.metadata) {
-      if (meta.reflectee is PublishedProperty) {
-        if (_hasSetter(cls, getter)) {
-          if (props == null) props = {};
-          props[getter.simpleName] = getter;
+      for (var meta in member.metadata) {
+        if (meta.reflectee is PublishedProperty) {
+          // Note: we delay the setter check until we find @published because
+          // it's a tad expensive.
+          if (member is! MethodMirror || _hasSetter(cls, member)) {
+            if (props == null) props = {};
+            props[member.simpleName] = member;
+          }
+          break;
         }
-        break;
       }
     }
   }
@@ -531,6 +523,18 @@
   return props;
 }
 
+DeclarationMirror _getProperty(ClassMirror cls, Symbol property) {
+  do {
+    var mirror = cls.declarations[property];
+    if (mirror is MethodMirror && mirror.isGetter && _hasSetter(cls, mirror)
+        || mirror is VariableMirror) {
+      return mirror;
+    }
+    cls = cls.superclass;
+  } while (cls != null);
+  return null;
+}
+
 bool _hasSetter(ClassMirror cls, MethodMirror getter) {
   var setterName = new Symbol('${MirrorSystem.getName(getter.simpleName)}=');
   var mirror = cls.declarations[setterName];
@@ -552,7 +556,7 @@
 void _shimShadowDomStyling(DocumentFragment template, String name,
     String extendee) {
   if (js.context == null || template == null) return;
-  if (js.context.hasProperty('ShadowDOMPolyfill')) return;
+  if (!js.context.hasProperty('ShadowDOMPolyfill')) return;
 
   var platform = js.context['Platform'];
   if (platform == null) return;
@@ -568,12 +572,39 @@
 const _STYLE_SCOPE_ATTRIBUTE = 'element';
 const _STYLE_CONTROLLER_SCOPE = 'controller';
 
-String _cssTextFromSheet(Element sheet) {
-  if (sheet == null || js.context == null) return '';
-  var resource = new js.JsObject.fromBrowserObject(sheet)['__resource'];
-  return resource != null ? resource : '';
+String _cssTextFromSheet(LinkElement sheet) {
+  if (sheet == null) return '';
+
+  // TODO(jmesserly): sometimes the href property is wrong after deployment.
+  var href = sheet.href;
+  if (href == '') href = sheet.attributes["href"];
+
+  if (js.context != null && js.context.hasProperty('HTMLImports')) {
+    var jsSheet = new js.JsObject.fromBrowserObject(sheet);
+    var resource = jsSheet['__resource'];
+    if (resource != null) return resource;
+    _sheetLog.fine('failed to get stylesheet text href="$href"');
+    return '';
+  }
+  // TODO(jmesserly): it seems like polymer-js is always polyfilling
+  // HTMLImports, because their code depends on "__resource" to work.
+  // We work around this by using a sync XHR to get the stylesheet text.
+  // Right now this code is only used in Dartium, but if it's going to stick
+  // around we will need to find a different approach.
+  try {
+    return (new HttpRequest()
+        ..open('GET', href, async: false)
+        ..send())
+        .responseText;
+  } on DomException catch (e, t) {
+    _sheetLog.fine('failed to get stylesheet text href="$href" error: '
+        '$e, trace: $t');
+    return '';
+  }
 }
 
+final Logger _sheetLog = new Logger('polymer.stylesheet');
+
 const _OBSERVE_SUFFIX = 'Changed';
 
 // TODO(jmesserly): is this list complete?
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index 671d9e0..f3ad9ea 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -794,7 +794,7 @@
     // explicitly. Unless VM mirrors are optimized first, this will be expensive
     // once custom elements extend directly from Element (see issue 11108).
     var receiverMirror = reflect(receiver);
-    var method = receiverMirror.type.methods[methodName];
+    var method = _findMethod(receiverMirror.type, methodName);
     if (method != null) {
       // This will either truncate the argument list or extend it with extra
       // null arguments, so it will match the signature.
@@ -805,6 +805,14 @@
     return receiverMirror.invoke(methodName, args).reflectee;
   }
 
+  static MethodMirror _findMethod(ClassMirror type, Symbol name) {
+    do {
+      var member = type.declarations[name];
+      if (member is MethodMirror) return member;
+      type = type.superclass;
+    } while (type != null);
+  }
+
   /**
    * Invokes a function asynchronously.
    * This will call `Platform.flush()` and then return a `new Timer`
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index eb0a726..5ee0915 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -141,6 +141,8 @@
 final String _packageRoot =
     '${path.dirname(Uri.parse(window.location.href).path)}/packages/';
 
+final Logger _loaderLog = new Logger('polymer.loader');
+
 /**
  * Reads the library at [uriString] (which can be an absolute URI or a relative
  * URI from the root library), and:
@@ -164,16 +166,16 @@
   }
 
   if (lib == null) {
-    print('warning: $uri library not found');
+    _loaderLog.info('$uri library not found');
     return;
   }
 
   // Search top-level functions marked with @initMethod
-  for (var f in lib.functions.values) {
+  for (var f in lib.declarations.values.where((d) => d is MethodMirror)) {
     _maybeInvoke(lib, f);
   }
 
-  for (var c in lib.classes.values) {
+  for (var c in lib.declarations.values.where((d) => d is ClassMirror)) {
     // Search for @CustomTag on classes
     for (var m in c.metadata) {
       var meta = m.reflectee;
diff --git a/pkg/polymer/lib/transformer.dart b/pkg/polymer/lib/transformer.dart
index b9649ba..735fac3 100644
--- a/pkg/polymer/lib/transformer.dart
+++ b/pkg/polymer/lib/transformer.dart
@@ -6,12 +6,14 @@
 library polymer.transformer;
 
 import 'package:barback/barback.dart';
-import 'package:observe/transform.dart';
+import 'package:observe/transformer.dart';
+
+import 'src/build/build_filter.dart';
 import 'src/build/code_extractor.dart';
-import 'src/build/import_inliner.dart';
-import 'src/build/script_compactor.dart';
-import 'src/build/polyfill_injector.dart';
 import 'src/build/common.dart';
+import 'src/build/import_inliner.dart';
+import 'src/build/polyfill_injector.dart';
+import 'src/build/script_compactor.dart';
 
 /**
  * The Polymer transformer, which internally runs several phases that will:
@@ -36,13 +38,14 @@
 
 TransformOptions _parseSettings(BarbackSettings settings) {
   var args = settings.configuration;
-  bool release = settings.mode == BarbackMode.RELEASE;
+  bool releaseMode = settings.mode == BarbackMode.RELEASE;
   bool jsOption = args['js'];
   bool csp = args['csp'] == true; // defaults to false
   return new TransformOptions(
       entryPoints: _readEntrypoints(args['entry_points']),
-      directlyIncludeJS: jsOption == null ? release : jsOption,
-      contentSecurityPolicy: csp);
+      directlyIncludeJS: jsOption == null ? releaseMode : jsOption,
+      contentSecurityPolicy: csp,
+      releaseMode: releaseMode);
 }
 
 _readEntrypoints(value) {
@@ -70,6 +73,7 @@
     [new ObservableTransformer()],
     [new ImportInliner(options)],
     [new ScriptCompactor(options)],
-    [new PolyfillInjector(options)]
+    [new PolyfillInjector(options)],
+    [new BuildFilter(options)]
   ];
 }
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 853824c..ab6bad8 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.9.0
+version: 0.9.1-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
@@ -13,16 +13,19 @@
   browser: ">=0.9.0 <0.10.0"
   csslib: ">=0.9.0 <0.10.0"
   custom_element: ">=0.9.0 <0.10.0"
-  html5lib: ">=0.9.0 <0.10.0"
+  html5lib: ">=0.9.1-dev <0.10.0"
   html_import: ">=0.9.0 <0.10.0"
   logging: ">=0.9.0 <0.10.0"
-  observe: ">=0.9.0 <0.10.0"
+  observe: ">=0.9.1-dev <0.10.0"
   path: ">=0.9.0 <0.10.0"
   polymer_expressions: ">=0.9.0 <0.10.0"
   shadow_dom: ">=0.9.0 <0.10.0"
   source_maps: ">=0.9.0 <0.10.0"
   template_binding: ">=0.9.0 <0.10.0"
   yaml: ">=0.9.0 <0.10.0"
+transformers:
+- observe:
+    files: lib/src/instance.dart
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
 environment:
diff --git a/pkg/polymer/test/build/common.dart b/pkg/polymer/test/build/common.dart
index 496a9f1..592f92f 100644
--- a/pkg/polymer/test/build/common.dart
+++ b/pkg/polymer/test/build/common.dart
@@ -102,7 +102,7 @@
   });
 }
 
-// TODO(jmesserly): this is .debug to workaround issue 13046.
+// TODO(jmesserly): this is .debug to workaround issue 14720.
 const SHADOW_DOM_TAG =
     '<script src="packages/shadow_dom/shadow_dom.debug.js"></script>\n';
 
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 05abda2..8de8571 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -140,7 +140,7 @@
           '</head><body><polymer-element>2</polymer-element></html>',
       'b|asset/test3.html':
           '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="packages/c/test4.html">'
+          '<link rel="import" href="../../packages/c/test4.html">'
           '</head><body><polymer-element>3</polymer-element></html>',
       'c|lib/test4.html':
           '<!DOCTYPE html><html><head>'
@@ -160,7 +160,7 @@
           '<polymer-element>2</polymer-element></body></html>',
       'b|asset/test3.html':
           '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="packages/c/test4.html">'
+          '<link rel="import" href="../../packages/c/test4.html">'
           '</head><body><polymer-element>3</polymer-element></html>',
       'c|lib/test4.html':
           '<!DOCTYPE html><html><head>'
@@ -361,6 +361,43 @@
           '[["a","web/s1.dart"]]',
     });
 
+  testPhases('imports with Dart script after JS script', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="test_1.html">'
+          '</head></html>',
+      'a|web/test_1.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="test_1.html">'
+          '</head><body>'
+          '<foo>42</foo><bar-baz></bar-baz>'
+          '<polymer-element>1'
+          '<script src="s1.js"></script>'
+          '<script type="application/dart" src="s1.dart"></script>'
+          '</polymer-element>'
+          'FOO</body></html>',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<foo>42</foo><bar-baz></bar-baz>'
+          '<polymer-element>1'
+          '<script src="s1.js"></script>'
+          '</polymer-element>'
+          'FOO</body></html>',
+      'a|web/test.html.scriptUrls': '[["a","web/s1.dart"]]',
+      'a|web/test_1.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<foo>42</foo><bar-baz></bar-baz>'
+          '<polymer-element>1'
+          '<script src="s1.js"></script>'
+          '<script type="application/dart" src="s1.dart"></script>'
+          '</polymer-element>'
+          'FOO</body></html>',
+      'a|web/test_1.html.scriptUrls': '[]',
+    });
+
   testPhases('imports cycle, 2-step lasso', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index 6cd294a..46964be 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -34,8 +34,7 @@
     _testLinter('missing Dart code and dart.js', {
         'a|web/test.html': '<!DOCTYPE html><html></html>',
       }, {
-        'a|web/test.html.messages': 'error: $USE_INIT_DART\n'
-                                    'error: $USE_DART_JS',
+        'a|web/test.html.messages': 'error: $USE_INIT_DART',
       });
 
     _testLinter('using deprecated boot.js', {
@@ -59,7 +58,7 @@
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
       }, {
-        'a|web/test.html.messages': 
+        'a|web/test.html.messages':
             'warning: Only one "application/dart" script tag per document is'
             ' allowed. (web/test.html 1 0)',
       });
@@ -72,7 +71,7 @@
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
       }, {
-        'a|lib/test.html.messages': 
+        'a|lib/test.html.messages':
             'warning: Only one "application/dart" script tag per document is'
             ' allowed. (lib/test.html 1 0)',
       });
@@ -87,7 +86,7 @@
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
       }, {
-        'a|web/test.html.messages': 
+        'a|web/test.html.messages':
             'warning: Only one "application/dart" script tag per document is'
             ' allowed. (web/test.html 1 0)',
       });
@@ -100,8 +99,7 @@
         'a|web/test.html.messages':
             'warning: Unexpected start tag (html). Expected DOCTYPE. '
             '(web/test.html 0 0)\n'
-            'error: $USE_INIT_DART\n'
-            'error: $USE_DART_JS',
+            'error: $USE_INIT_DART',
       });
 
     _testLinter('in lib', {
@@ -157,7 +155,7 @@
             <polymer-element name="x-a"></polymer-element>
             </html>'''.replaceAll('            ', ''),
         'a|lib/test.html': '''<html>
-            <link rel="import" href="packages/b/b.html">
+            <link rel="import" href="../../packages/b/b.html">
             <polymer-element name="x-a"></polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, {
@@ -361,18 +359,12 @@
             '(lib/test.html 1 33)'
       });
 
-    _testLinter('on-foo-bar is no longer supported', {
+    _testLinter('on-foo-bar is supported as a custom event name', {
         'a|lib/test.html': '''<html><body>
             <polymer-element name="x-a"><div on-foo-bar="quux"></div>
             </polymer-element>
             '''.replaceAll('            ', ''),
-      }, {
-        'a|lib/test.html.messages':
-            'warning: Invalid event name "on-foo-bar". After the "on-" the '
-            'event name should not use dashes. For example use "on-fooBar" or '
-            '"on-foobar" (both forms are equivalent in HTML). '
-            '(lib/test.html 1 33)'
-      });
+      }, {});
   });
 
   group('using custom tags', () {
diff --git a/pkg/polymer/test/event_handlers_test.dart b/pkg/polymer/test/event_handlers_test.dart
index 8267e0a..0b65bf6 100644
--- a/pkg/polymer/test/event_handlers_test.dart
+++ b/pkg/polymer/test/event_handlers_test.dart
@@ -116,5 +116,6 @@
   test('events handled', () {
     XTest test = query('x-test');
     expect(test._onTestDone, isNotNull, reason: 'ready was called');
+    return test._onTestDone;
   });
 }
diff --git a/pkg/polymer/test/event_handlers_test.html b/pkg/polymer/test/event_handlers_test.html
index 0669974..941c1ed 100644
--- a/pkg/polymer/test/event_handlers_test.html
+++ b/pkg/polymer/test/event_handlers_test.html
@@ -18,7 +18,7 @@
   <x-test>
     <div>...light...</div>
   </x-test>
- 
+
   <polymer-element name="x-test" on-tap="{{hostTapAction}}">
     <template>
       <style>
@@ -38,7 +38,7 @@
         <content></content>
       </div>
       <input id="input" on-focus="{{focusAction}}"
-                        on-blur="{{blurAction}}">focusy</input>
+                        on-blur="{{blurAction}}">focusy
       <div id="list"
            style="height: 200px; overflow: auto; border: 1px solid black;"
            on-scroll="{{scrollAction}}">
diff --git a/pkg/polymer/test/events_test.dart b/pkg/polymer/test/events_test.dart
index afd7e46..f14cf4a 100644
--- a/pkg/polymer/test/events_test.dart
+++ b/pkg/polymer/test/events_test.dart
@@ -29,6 +29,21 @@
   }
 }
 
+@reflectable
+class TestBase extends PolymerElement {
+  TestBase.created() : super.created();
+
+  List clicks = [];
+  void clickHandler(e) {
+    clicks.add('local click under $localName (id $id) on ${e.target.id}');
+  }
+}
+
+@CustomTag("test-c")
+class TestC extends TestBase {
+  TestC.created() : super.created();
+}
+
 main() {
   initPolymer();
   useHtmlConfiguration();
@@ -56,4 +71,17 @@
     b2.click();
     expect(testB.clicks, ['local click under test-b (id b) on b-2']);
   });
+
+  test('event on superclass', () {
+    var testC = query('#c');
+    expect(testC.clicks, isEmpty);
+    testC.click();
+    expect(testC.clicks, []);
+    var c1 = testC.shadowRoot.query('#c-1');
+    c1.click();
+    expect(testC.clicks, []);
+    var c2 = testC.shadowRoot.query('#c-2');
+    c2.click();
+    expect(testC.clicks, ['local click under test-c (id c) on c-2']);
+  });
 }
diff --git a/pkg/polymer/test/events_test.html b/pkg/polymer/test/events_test.html
index 5ff6eab..ec87ef3 100644
--- a/pkg/polymer/test/events_test.html
+++ b/pkg/polymer/test/events_test.html
@@ -32,8 +32,18 @@
     </template>
   </polymer-element>
 
+  <polymer-element name="test-c">
+    <template>
+      <div>
+        <span id="c-1">1</span>
+        <span id="c-2" on-click="{{clickHandler}}">2</span>
+      </div>
+    </template>
+  </polymer-element>
+
   <test-a id="a"></test-a>
   <test-b id="b"></test-b>
+  <test-c id="c"></test-c>
 
   <script type="application/dart" src="events_test.dart"></script>
   </body>
diff --git a/pkg/polymer/test/property_change_test.dart b/pkg/polymer/test/property_change_test.dart
new file mode 100644
index 0000000..ea41e11
--- /dev/null
+++ b/pkg/polymer/test/property_change_test.dart
@@ -0,0 +1,58 @@
+// 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 polymer.test.property_change_test;
+
+import 'dart:async';
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:unittest/matcher.dart';
+
+// Dart note: this is a tad different from the JS code. We don't support putting
+// expandos on Dart objects and then observing them. On the other hand, we want
+// to make sure that superclass observers are correctly detected.
+
+final _zonk = new Completer();
+final _bar = new Completer();
+
+@reflectable
+class XBase extends PolymerElement {
+  @observable String zonk = '';
+
+  XBase.created() : super.created();
+
+  zonkChanged() {
+    expect(zonk, 'zonk', reason: 'change calls *Changed on superclass');
+    _zonk.complete();
+  }
+}
+
+@CustomTag('x-test')
+class XTest extends XBase {
+  @observable String bar = '';
+
+  XTest.created() : super.created();
+
+  ready() {
+    bar = 'bar';
+    new Future(() { zonk = 'zonk'; });
+  }
+
+  barChanged() {
+    expect(bar, 'bar', reason: 'change in ready calls *Changed');
+    _bar.complete();
+  }
+}
+
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('bar change detected', () => _bar.future);
+  test('zonk change detected', () => _zonk.future);
+}
diff --git a/pkg/polymer/test/property_change_test.html b/pkg/polymer/test/property_change_test.html
new file mode 100644
index 0000000..c418921
--- /dev/null
+++ b/pkg/polymer/test/property_change_test.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<!--
+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.
+-->
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>property changes</title>
+    <script src="packages/unittest/test_controller.js"></script>
+  </head>
+  <body>
+    <x-test id="test"></x-test>
+
+    <polymer-element name="x-test"><template></template></polymer-element>
+    <script type="application/dart" src="property_change_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer/test/publish_attributes_test.dart b/pkg/polymer/test/publish_attributes_test.dart
index b22132e..8701a7b 100644
--- a/pkg/polymer/test/publish_attributes_test.dart
+++ b/pkg/polymer/test/publish_attributes_test.dart
@@ -37,10 +37,21 @@
   XSquid.created() : super.created();
 
   @published int baz = 13;
-  @published int zot = 5;
+  @published int zot = 3;
   @published int squid = 7;
 }
 
+// Test inherited "attriubtes"
+class XBaz extends PolymerElement {
+  XBaz.created() : super.created();
+  @observable int qux = 13;
+}
+
+@CustomTag('x-qux')
+class XQux extends XBaz {
+  XQux.created() : super.created();
+}
+
 main() {
   initPolymer();
   useHtmlConfiguration();
@@ -55,5 +66,6 @@
     expect(published('x-bar'), [#Foo, #baz, #Bar]);
     expect(published('x-zot'), [#Foo, #baz, #Bar, #zot]);
     expect(published('x-squid'), [#Foo, #baz, #Bar, #zot, #squid]);
+    expect(published('x-qux'), [#qux]);
   });
 }
diff --git a/pkg/polymer/test/publish_attributes_test.html b/pkg/polymer/test/publish_attributes_test.html
index 9c0969d..d513e65 100644
--- a/pkg/polymer/test/publish_attributes_test.html
+++ b/pkg/polymer/test/publish_attributes_test.html
@@ -24,6 +24,8 @@
     <polymer-element name="x-squid" extends="x-zot" attributes="squid">
     </polymer-element>
 
+    <polymer-element name="x-qux" attributes="qux"></polymer-element>
+
   <script type="application/dart" src="publish_attributes_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer_expressions/benchmark/all.dart b/pkg/polymer_expressions/benchmark/all.dart
new file mode 100644
index 0000000..2aaabca
--- /dev/null
+++ b/pkg/polymer_expressions/benchmark/all.dart
@@ -0,0 +1,13 @@
+// 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 polymer_expressions.benchmark.all;
+
+import 'parse.dart' as parse;
+import 'eval.dart' as eval;
+
+main() {
+  parse.main();
+  eval.main();
+}
diff --git a/pkg/polymer_expressions/benchmark/eval.dart b/pkg/polymer_expressions/benchmark/eval.dart
new file mode 100644
index 0000000..7bc0f56
--- /dev/null
+++ b/pkg/polymer_expressions/benchmark/eval.dart
@@ -0,0 +1,59 @@
+// 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 polymer_expressions.benchmark.eval;
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+import 'package:polymer_expressions/parser.dart' show parse;
+import 'package:polymer_expressions/eval.dart' show eval, Scope;
+
+class Foo {
+  final Bar bar;
+  Foo(this.bar);
+}
+
+class Bar {
+  String baz;
+  Bar(this.baz);
+}
+
+class EvalBenchmark extends BenchmarkBase {
+  final expr;
+  final scope;
+
+  EvalBenchmark(String name, String expr, {Object model, Map variables})
+      : expr = parse(expr),
+        scope = new Scope(model: model, variables: variables),
+        super('$name: $expr ');
+
+  run() {
+    var value = eval(expr, scope);
+  }
+
+}
+
+double total = 0.0;
+
+benchmark(String name, String expr, {Object model, Map variables}) {
+  var score = new EvalBenchmark(name, expr, model: model, variables: variables)
+      .measure();
+  print("$name $expr: $score us");
+  total += score;
+}
+
+main() {
+
+  benchmark('Constant', '1');
+  benchmark('Top-level Name', 'foo',
+      variables: {'foo': new Foo(new Bar('hello'))});
+  benchmark('Model field', 'bar',
+      model: new Foo(new Bar('hello')));
+  benchmark('Path', 'foo.bar.baz',
+      variables: {'foo': new Foo(new Bar('hello'))});
+  benchmark('Map', 'm["foo"]',
+      variables: {'m': {'foo': 1}});
+  benchmark('Equality', '"abc" == "123"');
+  print('total: $total us');
+
+}
diff --git a/pkg/polymer_expressions/benchmark/parse.dart b/pkg/polymer_expressions/benchmark/parse.dart
new file mode 100644
index 0000000..b131509
--- /dev/null
+++ b/pkg/polymer_expressions/benchmark/parse.dart
@@ -0,0 +1,28 @@
+// 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 polymer_expressions.benchmark.parse;
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+import 'package:polymer_expressions/parser.dart' show parse;
+
+/**
+ * Measures pure parsing time of several expressions
+ */
+class PolymerParseBenchmark extends BenchmarkBase {
+  PolymerParseBenchmark() : super('PolymerParseBenchmark');
+
+  run() {
+    parse('foo.bar.baz');
+    parse('f()');
+    parse('(1 + 2) * 3');
+    parse('1 + 2.0 + false + "abcdefg" + {"a": 1}');
+    parse('(a * (b * (c * (d * (e)))))');
+    parse('a(b(c(d(e(f)))))');
+  }
+}
+
+main() {
+  new PolymerParseBenchmark().report();
+}
diff --git a/pkg/polymer_expressions/example/streams/collect_key_press.html b/pkg/polymer_expressions/example/streams/collect_key_press.html
index f214056..0bd7ffe 100644
--- a/pkg/polymer_expressions/example/streams/collect_key_press.html
+++ b/pkg/polymer_expressions/example/streams/collect_key_press.html
@@ -15,7 +15,7 @@
       import 'dart:html';
       import 'package:polymer_expressions/polymer_expressions.dart';
       import 'package:polymer_expressions/async.dart';
-      import 'package:mdv/mdv.dart' as mdv;
+      import 'package:template_binding/template_binding.dart';
       import 'package:observe/observe.dart';
 
       Iterable collect(StreamBinding s) {
diff --git a/pkg/polymer_expressions/example/streams/count_clicks.html b/pkg/polymer_expressions/example/streams/count_clicks.html
index 705a180..01a1667 100644
--- a/pkg/polymer_expressions/example/streams/count_clicks.html
+++ b/pkg/polymer_expressions/example/streams/count_clicks.html
@@ -15,7 +15,7 @@
       import 'dart:html';
       import 'package:polymer_expressions/polymer_expressions.dart';
       import 'package:polymer_expressions/async.dart';
-      import 'package:mdv/mdv.dart' as mdv;
+      import 'package:template_binding/template_binding.dart';
       import 'package:observe/observe.dart';
 
       count(StreamBinding s) {
diff --git a/pkg/polymer_expressions/example/streams/mouse_move.html b/pkg/polymer_expressions/example/streams/mouse_move.html
index d4ef3f3..2ac6154 100644
--- a/pkg/polymer_expressions/example/streams/mouse_move.html
+++ b/pkg/polymer_expressions/example/streams/mouse_move.html
@@ -13,7 +13,7 @@
     <script type="application/dart">
       import 'dart:html';
       import 'package:polymer_expressions/polymer_expressions.dart';
-      import 'package:mdv/mdv.dart' as mdv;
+      import 'package:template_binding/template_binding.dart';
 
       main() {
         var globals = {
diff --git a/pkg/polymer_expressions/example/streams/mouse_resize_image.html b/pkg/polymer_expressions/example/streams/mouse_resize_image.html
index 2021ec1..461e6ab 100644
--- a/pkg/polymer_expressions/example/streams/mouse_resize_image.html
+++ b/pkg/polymer_expressions/example/streams/mouse_resize_image.html
@@ -16,7 +16,7 @@
       import 'dart:html';
       import 'dart:math';
       import 'package:polymer_expressions/polymer_expressions.dart';
-      import 'package:mdv/mdv.dart' as mdv;
+      import 'package:template_binding/template_binding.dart';
 
       main() {
         var globals = {
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
index b774807..29d2c02 100644
--- a/pkg/polymer_expressions/lib/eval.dart
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -107,17 +107,20 @@
     expression = empty();
     Identifier ident = expr;
     property = ident.value;
+  } else if (expr is Index) {
+    if (expr.argument is! Literal) notAssignable();
+    expression = expr.receiver;
+    Literal l = expr.argument;
+    property = l.value;
+    isIndex = true;
+  } else if (expr is Getter) {
+    expression = expr.receiver;
+    property = expr.name;
   } else if (expr is Invoke) {
-    Invoke invoke = expr;
-    expression = invoke.receiver;
-    if (invoke.method == '[]') {
-      if (invoke.arguments[0] is! Literal) notAssignable();
-      Literal l = invoke.arguments[0];
-      property = l.value;
-      isIndex = true;
-    } else if (invoke.method != null) {
-      if (invoke.arguments != null) notAssignable();
-      property = invoke.method;
+    expression = expr.receiver;
+    if (expr.method != null) {
+      if (expr.arguments != null) notAssignable();
+      property = expr.method;
     } else {
       notAssignable();
     }
@@ -158,8 +161,8 @@
   final ObservableMap<String, Object> _variables;
   InstanceMirror __modelMirror;
 
-  Scope({this.model, Map<String, Object> variables: const {}, this.parent})
-      : _variables = new ObservableMap.from(variables);
+  Scope({this.model, Map<String, Object> variables, this.parent})
+      : _variables = new ObservableMap.from(variables == null ? {} : variables);
 
   InstanceMirror get _modelMirror {
     if (__modelMirror != null) return __modelMirror;
@@ -304,6 +307,22 @@
 
   visitParenthesizedExpression(ParenthesizedExpression e) => visit(e.child);
 
+  visitGetter(Getter g) {
+    var receiver = visit(g.receiver);
+    var getter = new GetterObserver(g, receiver);
+    receiver._parent = getter;
+    return getter;
+  }
+
+  visitIndex(Index i) {
+    var receiver = visit(i.receiver);
+    var arg = visit(i.argument);
+    var index =  new IndexObserver(i, receiver, arg);
+    receiver._parent = index;
+    arg._parent = index;
+    return index;
+  }
+
   visitInvoke(Invoke i) {
     var receiver = visit(i.receiver);
     var args = (i.arguments == null)
@@ -494,6 +513,10 @@
     } else if (left._value == null || right._value == null) {
       _value = null;
     } else {
+      if (operator == '|' && left._value is ObservableList) {
+        _subscription = (left._value as ObservableList).listChanges
+            .listen((_) => _invalidate(scope));
+      }
       _value = f(left._value, right._value);
     }
   }
@@ -502,70 +525,100 @@
 
 }
 
+class GetterObserver extends ExpressionObserver<Getter> implements Getter {
+  final ExpressionObserver receiver;
+
+  GetterObserver(Expression expr, this.receiver) : super(expr);
+
+  String get name => _expr.name;
+
+  _updateSelf(Scope scope) {
+    var receiverValue = receiver._value;
+    if (receiverValue == null) {
+      _value = null;
+      return;
+    }
+    var mirror = reflect(receiverValue);
+    var symbol = new Symbol(_expr.name);
+    _value = mirror.getField(symbol).reflectee;
+
+    if (receiverValue is Observable) {
+      _subscription = (receiverValue as Observable).changes.listen((changes) {
+        if (changes.any((c) => c is PropertyChangeRecord && c.name == symbol)) {
+          _invalidate(scope);
+        }
+      });
+    }
+  }
+
+  accept(Visitor v) => v.visitGetter(this);
+}
+
+class IndexObserver extends ExpressionObserver<Index> implements Index {
+  final ExpressionObserver receiver;
+  final ExpressionObserver argument;
+
+  IndexObserver(Expression expr, this.receiver, this.argument) : super(expr);
+
+  _updateSelf(Scope scope) {
+    var receiverValue = receiver._value;
+    if (receiverValue == null) {
+      _value = null;
+      return;
+    }
+    var key = argument._value;
+    _value = receiverValue[key];
+
+    if (receiverValue is Observable) {
+      _subscription = (receiverValue as Observable).changes.listen((changes) {
+        if (changes.any((c) => c is MapChangeRecord && c.key == key)) {
+          _invalidate(scope);
+        }
+      });
+    }
+  }
+
+  accept(Visitor v) => v.visitIndex(this);
+}
+
 class InvokeObserver extends ExpressionObserver<Invoke> implements Invoke {
   final ExpressionObserver receiver;
-  List<ExpressionObserver> arguments;
+  final List<ExpressionObserver> arguments;
 
-  InvokeObserver(Expression expr, this.receiver, [this.arguments])
-      : super(expr);
-
-  bool get isGetter => _expr.isGetter;
+  InvokeObserver(Expression expr, this.receiver, this.arguments)
+      : super(expr) {
+    assert(arguments != null);
+  }
 
   String get method => _expr.method;
 
   _updateSelf(Scope scope) {
-    var args = (arguments == null)
-        ? []
-        : arguments.map((a) => a._value)
-            .toList(growable: false);
+    var args = arguments.map((a) => a._value).toList();
     var receiverValue = receiver._value;
     if (receiverValue == null) {
       _value = null;
-    } else if (_expr.method == null) {
-      if (_expr.isGetter) {
-        // getter, but not a top-level identifier
-        // TODO(justin): listen to the receiver's owner
-        _value = receiverValue;
-      } else {
-        // top-level function or model method
-        // TODO(justin): listen to model changes to see if the method has
-        // changed? listen to the scope to see if the top-level method has
-        // changed?
-        assert(receiverValue is Function);
-        _value = call(receiverValue, args);
-      }
+      return;
+    }
+    if (_expr.method == null) {
+      // top-level function or model method
+      // TODO(justin): listen to model changes to see if the method has
+      // changed? listen to the scope to see if the top-level method has
+      // changed?
+      assert(receiverValue is Function);
+      _value = call(receiverValue, args);
     } else {
-      // special case [] because we don't need mirrors
-      if (_expr.method == '[]') {
-        assert(args.length == 1);
-        var key = args[0];
-        _value = receiverValue[key];
+      var mirror = reflect(receiverValue);
+      var symbol = new Symbol(_expr.method);
+      _value = mirror.invoke(symbol, args, null).reflectee;
 
-        if (receiverValue is Observable) {
-          _subscription = (receiverValue as Observable).changes.listen(
-              (List<ChangeRecord> changes) {
-                if (changes.any((c) =>
-                    c is MapChangeRecord && c.key == key)) {
-                  _invalidate(scope);
-                }
-              });
-        }
-      } else {
-        var mirror = reflect(receiverValue);
-        var symbol = new Symbol(_expr.method);
-        _value = (_expr.isGetter)
-            ? mirror.getField(symbol).reflectee
-            : mirror.invoke(symbol, args, null).reflectee;
-
-        if (receiverValue is Observable) {
-          _subscription = (receiverValue as Observable).changes.listen(
-              (List<ChangeRecord> changes) {
-                if (changes.any(
-                    (c) => c is PropertyChangeRecord && c.name == symbol)) {
-                  _invalidate(scope);
-                }
-              });
-        }
+      if (receiverValue is Observable) {
+        _subscription = (receiverValue as Observable).changes.listen(
+            (List<ChangeRecord> changes) {
+              if (changes.any(
+                  (c) => c is PropertyChangeRecord && c.name == symbol)) {
+                _invalidate(scope);
+              }
+            });
       }
     }
   }
diff --git a/pkg/polymer_expressions/lib/expression.dart b/pkg/polymer_expressions/lib/expression.dart
index 60b7548..c89724f 100644
--- a/pkg/polymer_expressions/lib/expression.dart
+++ b/pkg/polymer_expressions/lib/expression.dart
@@ -18,7 +18,9 @@
 UnaryOperator unary(String op, Expression e) => new UnaryOperator(op, e);
 BinaryOperator binary(Expression l, String op, Expression r) =>
     new BinaryOperator(l, op, r);
-Invoke invoke(Expression e, String m, [List<Expression> a]) =>
+Getter getter(Expression e, String m) => new Getter(e, m);
+Index index(Expression e, Expression a) => new Index(e, a);
+Invoke invoke(Expression e, String m, List<Expression> a) =>
     new Invoke(e, m, a);
 InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
 
@@ -44,7 +46,11 @@
   BinaryOperator binary(Expression l, String op, Expression r) =>
       new BinaryOperator(l, op, r);
 
-  Invoke invoke(Expression e, String m, [List<Expression> a]) =>
+  Getter getter(Expression g, String n) => new Getter(g, n);
+
+  Index index(Expression e, Expression a) => new Index(e, a);
+
+  Invoke invoke(Expression e, String m, List<Expression> a) =>
       new Invoke(e, m, a);
 
   InExpression inExpr(Expression l, Expression r) => new InExpression(l, r);
@@ -183,6 +189,44 @@
   int get hashCode => _JenkinsSmiHash.hash2(left.hashCode, right.hashCode);
 }
 
+class Index extends Expression {
+  final Expression receiver;
+  final Expression argument;
+
+  Index(this.receiver, this.argument);
+
+  accept(Visitor v) => v.visitIndex(this);
+
+  String toString() => '$receiver[$argument]';
+
+  bool operator ==(o) =>
+      o is Index
+      && o.receiver == receiver
+      && o.argument == argument;
+
+  int get hashCode =>
+      _JenkinsSmiHash.hash2(receiver.hashCode, argument.hashCode);
+}
+
+class Getter extends Expression {
+  final Expression receiver;
+  final String name;
+
+  Getter(this.receiver, this.name);
+
+  accept(Visitor v) => v.visitGetter(this);
+
+  String toString() => '$receiver.$name';
+
+  bool operator ==(o) =>
+      o is Getter
+      && o.receiver == receiver
+      && o.name == name;
+
+  int get hashCode => _JenkinsSmiHash.hash2(receiver.hashCode, name.hashCode);
+
+}
+
 /**
  * Represents a function or method invocation. If [method] is null, then
  * [receiver] is an expression that should evaluate to a function. If [method]
@@ -194,12 +238,12 @@
   final String method;
   final List<Expression> arguments;
 
-  Invoke(this.receiver, this.method, [this.arguments]);
+  Invoke(this.receiver, this.method, this.arguments) {
+    assert(arguments != null);
+  }
 
   accept(Visitor v) => v.visitInvoke(this);
 
-  bool get isGetter => arguments == null;
-
   String toString() => '$receiver.$method($arguments)';
 
   bool operator ==(o) =>
@@ -243,10 +287,11 @@
     return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
   }
 
-  static int hash2(a, b) => finish(combine(combine(0, a), b));
+  static int hash2(int a, int b) => finish(combine(combine(0, a), b));
 
-  static int hash3(a, b, c) => finish(combine(combine(combine(0, a), b), c));
+  static int hash3(int a, int b, int c) =>
+      finish(combine(combine(combine(0, a), b), c));
 
-  static int hash4(a, b, c, d) =>
+  static int hash4(int a, int b, int c, int d) =>
       finish(combine(combine(combine(combine(0, a), b), c), d));
 }
diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart
index 9a16300..d786266 100644
--- a/pkg/polymer_expressions/lib/parser.dart
+++ b/pkg/polymer_expressions/lib/parser.dart
@@ -16,7 +16,7 @@
   final Tokenizer _tokenizer;
   List<Token> _tokens;
   Iterator _iterator;
-  Token _token;
+  Token get _token => _iterator.current;
 
   Parser(String input, {AstFactory astFactory})
       : _tokenizer = new Tokenizer(input),
@@ -34,7 +34,7 @@
         || (value != null && _token.value != value)) {
       throw new ParseException("Expected $value: $_token");
     }
-    _token = _iterator.moveNext() ? _iterator.current : null;
+    _iterator.moveNext();
   }
 
   Expression _parseExpression() {
@@ -52,18 +52,18 @@
       if (_token.kind == GROUPER_TOKEN) {
         if (_token.value == '(') {
           var args = _parseArguments();
+          assert(args != null);
           left = _astFactory.invoke(left, null, args);
         } else if (_token.value == '[') {
           var indexExpr = _parseIndex();
-          var args = indexExpr == null ? [] : [indexExpr];
-          left = _astFactory.invoke(left, '[]', args);
+          left = _astFactory.index(left, indexExpr);
         } else {
           break;
         }
       } else if (_token.kind == DOT_TOKEN) {
         _advance();
         var right = _parseUnary();
-        left = _makeInvoke(left, right);
+        left = _makeInvokeOrGetter(left, right);
       } else if (_token.kind == KEYWORD_TOKEN && _token.value == 'in') {
         left = _parseComprehension(left);
       } else if (_token.kind == OPERATOR_TOKEN
@@ -76,9 +76,10 @@
     return left;
   }
 
-  Invoke _makeInvoke(left, right) {
+  // invoke or getter
+  Expression _makeInvokeOrGetter(left, right) {
     if (right is Identifier) {
-      return _astFactory.invoke(left, right.value);
+      return _astFactory.getter(left, right.value);
     } else if (right is Invoke && right.receiver is Identifier) {
       Identifier method = right.receiver;
       return _astFactory.invoke(left, method.value, right.arguments);
@@ -209,12 +210,6 @@
     }
   }
 
-  Invoke _parseInvoke() {
-    var identifier = _parseIdentifier();
-    var args = _parseArguments();
-    return _astFactory.invoke(null, identifier, args);
-  }
-
   Identifier _parseIdentifier() {
     if (_token.kind != IDENTIFIER_TOKEN) {
       throw new ParseException("expected identifier: $_token.value");
diff --git a/pkg/polymer_expressions/lib/src/globals.dart b/pkg/polymer_expressions/lib/src/globals.dart
index 281536d..d2a4ffd 100644
--- a/pkg/polymer_expressions/lib/src/globals.dart
+++ b/pkg/polymer_expressions/lib/src/globals.dart
@@ -24,6 +24,10 @@
   final int index;
   final V value;
 
+  operator==(o) => o is IndexedValue && o.index == index && o.value == value;
+  int get hashCode => value.hashCode;
+  String toString() => '($index, $value)';
+
   IndexedValue(this.index, this.value);
 }
 
diff --git a/pkg/polymer_expressions/lib/visitor.dart b/pkg/polymer_expressions/lib/visitor.dart
index 03341c2..4fafa7b5 100644
--- a/pkg/polymer_expressions/lib/visitor.dart
+++ b/pkg/polymer_expressions/lib/visitor.dart
@@ -10,6 +10,8 @@
   visit(Expression s) => s.accept(this);
   visitEmptyExpression(EmptyExpression e);
   visitParenthesizedExpression(ParenthesizedExpression e);
+  visitGetter(Getter i);
+  visitIndex(Index i);
   visitInvoke(Invoke i);
   visitLiteral(Literal l);
   visitMapLiteral(MapLiteral l);
@@ -26,10 +28,21 @@
   visitEmptyExpression(EmptyExpression e) => visitExpression(e);
 
   visitParenthesizedExpression(ParenthesizedExpression e) {
-    visit(e);
+    visit(e.child);
     visitExpression(e);
   }
 
+  visitGetter(Getter i) {
+    visit(i.receiver);
+    visitExpression(i);
+  }
+
+  visitIndex(Index i) {
+    visit(i.receiver);
+    visit(i.argument);
+    visitExpression(i);
+  }
+
   visitInvoke(Invoke i) {
     visit(i.receiver);
     if (i.arguments != null) {
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 4a62f0f..92db8e4 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -9,5 +9,6 @@
   template_binding: ">=0.9.0 <0.10.0"
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
+  benchmark_harness: ">=1.0.0 <2.0.0"
 environment:
   sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/polymer_expressions/test/all_tests.dart b/pkg/polymer_expressions/test/all_tests.dart
index bbfccba..dfe6a3a 100644
--- a/pkg/polymer_expressions/test/all_tests.dart
+++ b/pkg/polymer_expressions/test/all_tests.dart
@@ -7,9 +7,11 @@
 import 'eval_test.dart' as eval;
 import 'parser_test.dart' as parser;
 import 'tokenizer_test.dart' as tokenizer;
+import 'visitor_test.dart' as visitor;
 
 main() {
-  tokenizer.main();
-  parser.main();
   eval.main();
+  parser.main();
+  tokenizer.main();
+  visitor.main();
 }
diff --git a/pkg/polymer_expressions/test/globals_test.dart b/pkg/polymer_expressions/test/globals_test.dart
index 4a7907e..295aa11 100644
--- a/pkg/polymer_expressions/test/globals_test.dart
+++ b/pkg/polymer_expressions/test/globals_test.dart
@@ -49,5 +49,43 @@
         'Item 3 is expressions',
       ]);
     }));
+
+    test('should update after changes', wrapMicrotask(() {
+      var model = toObservable(
+              ['hello', 'from', 'polymer', 'expressions', 'a', 'b', 'c']);
+
+      templateBind(testDiv.query('template'))
+          ..bindingDelegate = new PolymerExpressions()
+          ..model = model;
+
+      performMicrotaskCheckpoint();
+
+      expect(testDiv.queryAll('div').map((n) => n.text), [
+        'Item 0 is hello',
+        'Item 1 is from',
+        'Item 2 is polymer',
+        'Item 3 is expressions',
+        'Item 4 is a',
+        'Item 5 is b',
+        'Item 6 is c',
+      ]);
+
+      model.removeAt(1);
+      model[1] = 'world';
+      model[2] = '!';
+      model.insert(5, 'e');
+
+      performMicrotaskCheckpoint();
+
+      expect(testDiv.queryAll('div').map((n) => n.text), [
+        'Item 0 is hello',
+        'Item 1 is world',
+        'Item 2 is !',
+        'Item 3 is a',
+        'Item 4 is b',
+        'Item 5 is e',
+        'Item 6 is c',
+      ]);
+    }));
   });
 }
diff --git a/pkg/polymer_expressions/test/parser_test.dart b/pkg/polymer_expressions/test/parser_test.dart
index 66c1d04..4b3f2b1 100644
--- a/pkg/polymer_expressions/test/parser_test.dart
+++ b/pkg/polymer_expressions/test/parser_test.dart
@@ -80,15 +80,15 @@
     });
 
     test('should parse a dot operator', () {
-      expectParse('a.b', invoke(ident('a'), 'b'));
+      expectParse('a.b', getter(ident('a'), 'b'));
     });
 
     test('should parse chained dot operators', () {
-      expectParse('a.b.c', invoke(invoke(ident('a'), 'b'), 'c'));
+      expectParse('a.b.c', getter(getter(ident('a'), 'b'), 'c'));
     });
 
     test('should give dot high associativity', () {
-      expectParse('a * b.c', binary(ident('a'), '*', invoke(ident('b'), 'c')));
+      expectParse('a * b.c', binary(ident('a'), '*', getter(ident('b'), 'c')));
     });
 
     test('should parse a function with no arguments', () {
@@ -146,20 +146,19 @@
     });
 
     test('should parse an index operator', () {
-      expectParse('a[b]', invoke(ident('a'), '[]', [ident('b')]));
-      expectParse('a.b[c]', invoke(invoke(ident('a'), 'b', null),
-          '[]', [ident('c')]));
+      expectParse('a[b]', index(ident('a'), ident('b')));
+      expectParse('a.b[c]', index(getter(ident('a'), 'b'), ident('c')));
     });
 
     test('should parse chained index operators', () {
-      expectParse('a[][]', invoke(invoke(ident('a'), '[]', []), '[]', []));
+      expectParse('a[][]', index(index(ident('a'), null), null));
     });
 
     test('should parse multiple index operators', () {
       expectParse('a[b] + c[d]', binary(
-          invoke(ident('a'), '[]', [ident('b')]),
+          index(ident('a'), ident('b')),
           '+',
-          invoke(ident('c'), '[]', [ident('d')])));
+          index(ident('c'), ident('d'))));
     });
 
     test('should parse a filter chain', () {
@@ -170,7 +169,7 @@
     test('should parse comprehension', () {
       expectParse('a in b', inExpr(ident('a'), ident('b')));
       expectParse('a in b.c',
-          inExpr(ident('a'), invoke(ident('b'), 'c', null)));
+          inExpr(ident('a'), getter(ident('b'), 'c')));
       expectParse('a in b + c',
           inExpr(ident('a'), binary(ident('b'), '+', ident('c'))));
     });
@@ -201,7 +200,7 @@
 
     test('should parse map literals with method calls', () {
       expectParse("{'a': 1}.length",
-          invoke(mapLiteral([mapLiteralEntry(literal('a'), literal(1))]),
+          getter(mapLiteral([mapLiteralEntry(literal('a'), literal(1))]),
               'length'));
     });
   });
diff --git a/pkg/polymer_expressions/test/visitor_test.dart b/pkg/polymer_expressions/test/visitor_test.dart
new file mode 100644
index 0000000..887ac7c
--- /dev/null
+++ b/pkg/polymer_expressions/test/visitor_test.dart
@@ -0,0 +1,27 @@
+// 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 visitor_test;
+
+import 'package:polymer_expressions/parser.dart';
+import 'package:polymer_expressions/visitor.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+
+  group('visitor', () {
+
+    // regression test
+    test('should not infinitely recurse on parenthesized expressions', () {
+      var visitor = new TestVisitor();
+      var expr = new Parser('(1)').parse();
+      visitor.visit(expr);
+    });
+
+  });
+}
+
+class TestVisitor extends RecursiveVisitor {
+  visitExpression(e) => null;
+}
diff --git a/pkg/scheduled_test/lib/scheduled_server.dart b/pkg/scheduled_test/lib/scheduled_server.dart
index 071aa07..3f2addd 100644
--- a/pkg/scheduled_test/lib/scheduled_server.dart
+++ b/pkg/scheduled_test/lib/scheduled_server.dart
@@ -78,7 +78,7 @@
       handler.ready = true;
       return handler.result.catchError((e) {
         // Close the server so that we don't leave a dangling request.
-        _server.then((s) => s.close());
+        _server.then((s) => s.close(force: true));
         throw e;
       });
     }, "'$description' waiting for $method $path");
@@ -97,7 +97,7 @@
       return _handlers.removeFirst().fn(request);
     }).catchError((e) {
       // Close the server so that we don't leave a dangling request.
-      _server.then((s) => s.close());
+      _server.then((s) => s.close(force: true));
       throw e;
     }), 'receiving ${request.method} ${request.uri}');
   }
diff --git a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
index e5baf44..1b377ae 100644
--- a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
@@ -13,9 +13,6 @@
 import '../../scheduled_test.dart';
 import '../utils.dart';
 
-/// A path builder to ensure that [load] uses POSIX paths.
-final path.Builder _path = new path.Builder(style: path.Style.posix);
-
 /// A descriptor describing a directory containing multiple files.
 class DirectoryDescriptor extends Descriptor implements LoadableDescriptor {
   /// The entries contained within this directory. This is intentionally
@@ -58,11 +55,11 @@
 
   Stream<List<int>> load(String pathToLoad) {
     return futureStream(new Future.value().then((_) {
-      if (_path.isAbsolute(pathToLoad)) {
+      if (path.posix.isAbsolute(pathToLoad)) {
         throw new ArgumentError("Can't load absolute path '$pathToLoad'.");
       }
 
-      var split = _path.split(_path.normalize(pathToLoad));
+      var split = path.posix.split(path.posix.normalize(pathToLoad));
       if (split.isEmpty || split.first == '.' || split.first == '..') {
         throw new ArgumentError("Can't load '$pathToLoad' from within "
             "'$name'.");
@@ -88,7 +85,7 @@
           return (matchingEntries.first as ReadableDescriptor).read();
         } else {
           return (matchingEntries.first as LoadableDescriptor)
-              .load(_path.joinAll(remainingPath));
+              .load(path.posix.joinAll(remainingPath));
         }
       }
     }));
diff --git a/pkg/scheduled_test/lib/src/future_group.dart b/pkg/scheduled_test/lib/src/future_group.dart
index f1f64db..05071c8 100644
--- a/pkg/scheduled_test/lib/src/future_group.dart
+++ b/pkg/scheduled_test/lib/src/future_group.dart
@@ -34,11 +34,11 @@
         completed = true;
         _completer.complete(_values);
       }
-    }).catchError((error) {
+    }).catchError((error, stackTrace) {
       if (completed) return;
 
       completed = true;
-      _completer.completeError(error);
+      _completer.completeError(error, stackTrace);
     }));
 
     return task;
diff --git a/pkg/scheduled_test/lib/src/schedule.dart b/pkg/scheduled_test/lib/src/schedule.dart
index 5c88464..7cc30fb 100644
--- a/pkg/scheduled_test/lib/src/schedule.dart
+++ b/pkg/scheduled_test/lib/src/schedule.dart
@@ -134,26 +134,26 @@
 
       _state = ScheduleState.RUNNING;
       return tasks._run();
-    }).catchError((e) {
-      _addError(e);
-      return onException._run().catchError((innerError) {
+    }).catchError((error, stackTrace) {
+      _addError(error, stackTrace);
+      return onException._run().catchError((innerError, innerTrace) {
         // If an error occurs in a task in the onException queue, make sure it's
         // registered in the error list and re-throw it. We could also re-throw
-        // `e`; ultimately, all the errors will be shown to the user if any
+        // `error`; ultimately, all the errors will be shown to the user if any
         // ScheduleError is thrown.
-        _addError(innerError);
+        _addError(innerError, innerTrace);
         throw innerError;
       }).then((_) {
         // If there are no errors in the onException queue, re-throw the
         // original error that caused it to run.
-        throw e;
+        throw error;
       });
     }).whenComplete(() {
-      return onComplete._run().catchError((e) {
+      return onComplete._run().catchError((error, stackTrace) {
         // If an error occurs in a task in the onComplete queue, make sure it's
         // registered in the error list and re-throw it.
-        _addError(e);
-        throw e;
+        _addError(error, stackTrace);
+        throw error;
       });
     }).whenComplete(() {
       if (_timeoutTimer != null) _timeoutTimer.cancel();
@@ -255,13 +255,14 @@
   Future wrapFuture(Future future, [String description]) {
     var done = wrapAsync((fn) => fn(), description);
 
-    future = future.then((result) => done(() => result)).catchError((e) {
+    future = future.then((result) => done(() => result))
+        .catchError((error, stackTrace) {
       done(() {
-        throw e;
+        throw new ScheduleError.from(this, error, stackTrace: stackTrace);
       });
       // wrapAsync will catch the first throw, so we throw [e] again so it
       // propagates through the Future chain.
-      throw e;
+      throw error;
     });
 
     // Don't top-level the error, since it's already been signaled to the
@@ -307,9 +308,10 @@
   /// Register an error in the schedule's error list. This ensures that there
   /// are no duplicate errors, and that all errors are wrapped in
   /// [ScheduleError].
-  void _addError(error) {
-    if (error is ScheduleError && errors.contains(error)) return;
-    _errors.add(new ScheduleError.from(this, error));
+  void _addError(error, [StackTrace stackTrace]) {
+    error = new ScheduleError.from(this, error, stackTrace: stackTrace);
+    if (errors.contains(error)) return;
+    _errors.add(error);
   }
 }
 
@@ -424,8 +426,8 @@
     }
 
     var task = new Task(() {
-      return new Future.sync(fn).catchError((e) {
-        throw new ScheduleError.from(_schedule, e);
+      return new Future.sync(fn).catchError((e, stackTrace) {
+        throw new ScheduleError.from(_schedule, e, stackTrace: stackTrace);
       });
     }, description, this);
     _contents.add(task);
@@ -546,8 +548,9 @@
     } else if (_taskFuture != null) {
       // Catch errors coming off the old task future, in case it completes after
       // timing out.
-      _taskFuture.substitute(new Future.error(error)).catchError((e) {
-        _schedule._signalPostTimeoutError(e);
+      _taskFuture.substitute(new Future.error(error))
+          .catchError((e, stackTrace) {
+        _schedule._signalPostTimeoutError(e, stackTrace);
       });
     } else {
       // This branch probably won't be reached, but it's conceivable that the
diff --git a/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart b/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
index 4c38e11..9e1eeb2 100644
--- a/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
+++ b/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
@@ -30,7 +30,7 @@
       : super(server),
         _inner = server;
 
-  Future close() => _inner.close();
+  Future close({bool force: false}) => _inner.close(force: force);
 
   int get port => _inner.port;
 
@@ -143,5 +143,6 @@
     _inner.writeAll(objects, separator);
   void writeCharCode(int charCode) => _inner.writeCharCode(charCode);
   void writeln([Object obj = ""]) => _inner.writeln(obj);
-  void addError(error) => _inner.addError(error);
+  void addError(error, [StackTrace stackTrace]) =>
+      _inner.addError(error, stackTrace);
 }
diff --git a/pkg/scheduled_test/lib/src/utils.dart b/pkg/scheduled_test/lib/src/utils.dart
index 80d8bc4..7daac77 100644
--- a/pkg/scheduled_test/lib/src/utils.dart
+++ b/pkg/scheduled_test/lib/src/utils.dart
@@ -28,8 +28,7 @@
 /// Configures [future] so that its result (success or exception) is passed on
 /// to [completer].
 void chainToCompleter(Future future, Completer completer) {
-  future.then((value) => completer.complete(value),
-      onError: completer.completeError);
+  future.then(completer.complete, onError: completer.completeError);
 }
 
 /// Prepends each line in [text] with [prefix]. If [firstPrefix] is passed, the
@@ -78,19 +77,49 @@
 Stream errorStream(error) => new Future.error(error).asStream();
 
 /// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes. If [future] completes to an
-/// error, the return value will emit that error and then close.
-Stream futureStream(Future<Stream> future) {
-  var controller = new StreamController(sync: true);
-  future.then((stream) {
-    stream.listen(
-        controller.add,
-        onError: controller.addError,
-        onDone: controller.close);
-  }).catchError((e) {
-    controller.addError(e);
-    controller.close();
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+  var subscription;
+  var controller;
+
+  future = future.catchError((e, stackTrace) {
+    // Since [controller] is synchronous, it's likely that emitting an error
+    // will cause it to be cancelled before we call close.
+    if (controller != null) controller.addError(e, stackTrace);
+    if (controller != null) controller.close();
+    controller = null;
   });
+
+  onListen() {
+    future.then((stream) {
+      if (controller == null) return;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: controller.close);
+    });
+  }
+
+  onCancel() {
+    if (subscription != null) subscription.cancel();
+    subscription = null;
+    controller = null;
+  }
+
+  if (broadcast) {
+    controller = new StreamController.broadcast(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  } else {
+    controller = new StreamController(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  }
   return controller.stream;
 }
 
diff --git a/pkg/scheduled_test/test/metatest.dart b/pkg/scheduled_test/test/metatest.dart
index d2ed92f..18309bd 100644
--- a/pkg/scheduled_test/test/metatest.dart
+++ b/pkg/scheduled_test/test/metatest.dart
@@ -119,7 +119,9 @@
 /// describing the results of that test run.
 Future<Map> _runInIsolate(String description) {
   var replyPort = new ReceivePort();
-  return Isolate.spawnUri(Platform.script, [], {
+  // TODO(nweiz): Don't use path here once issue 8440 is fixed.
+  var uri = path.toUri(path.absolute(path.fromUri(Platform.script)));
+  return Isolate.spawnUri(uri, [], {
     'testToRun': description,
     'replyTo': replyPort.sendPort
   }).then((_) {
diff --git a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
index ecb88d0..1356b80 100644
--- a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
@@ -90,7 +90,7 @@
 
   expectTestsPass("nested scheduled blocks whose return values are passed to "
       "wrapFuture should report exceptions once", () {
-    var error = new Object();
+    var error = 'oh no!';
     var errors;
     test('test 1', () {
       currentSchedule.onException.schedule(() {
diff --git a/pkg/scheduled_test/test/utils.dart b/pkg/scheduled_test/test/utils.dart
index 88c0fa3..9bfc913 100644
--- a/pkg/scheduled_test/test/utils.dart
+++ b/pkg/scheduled_test/test/utils.dart
@@ -31,10 +31,10 @@
     if (completer.isCompleted) return;
     timer.cancel();
     completer.complete(value);
-  }).catchError((error) {
+  }).catchError((error, stackTrace) {
     if (completer.isCompleted) return;
     timer.cancel();
-    completer.completeError(error);
+    completer.completeError(error, stackTrace);
   });
   return completer.future;
 }
diff --git a/pkg/shadow_dom/lib/shadow_dom.debug.js b/pkg/shadow_dom/lib/shadow_dom.debug.js
index 5ed6ecf..477e03b 100644
--- a/pkg/shadow_dom/lib/shadow_dom.debug.js
+++ b/pkg/shadow_dom/lib/shadow_dom.debug.js
@@ -1462,7 +1462,7 @@
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
 
-var ShadowDOMPolyfill = {};
+window.ShadowDOMPolyfill = {};
 
 (function(scope) {
   'use strict';
@@ -1831,7 +1831,430 @@
   scope.wrapIfNeeded = wrapIfNeeded;
   scope.wrappers = wrappers;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(context) {
+  'use strict';
+
+  var OriginalMutationObserver = window.MutationObserver;
+  var callbacks = [];
+  var pending = false;
+  var timerFunc;
+
+  function handle() {
+    pending = false;
+    var copies = callbacks.slice(0);
+    callbacks = [];
+    for (var i = 0; i < copies.length; i++) {
+      (0, copies[i])();
+    }
+  }
+
+  if (OriginalMutationObserver) {
+    var counter = 1;
+    var observer = new OriginalMutationObserver(handle);
+    var textNode = document.createTextNode(counter);
+    observer.observe(textNode, {characterData: true});
+
+    timerFunc = function() {
+      counter = (counter + 1) % 2;
+      textNode.data = counter;
+    };
+
+  } else {
+    timerFunc = window.setImmediate || window.setTimeout;
+  }
+
+  function setEndOfMicrotask(func) {
+    callbacks.push(func);
+    if (pending)
+      return;
+    pending = true;
+    timerFunc(handle, 0);
+  }
+
+  context.setEndOfMicrotask = setEndOfMicrotask;
+
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var setEndOfMicrotask = scope.setEndOfMicrotask
+  var wrapIfNeeded = scope.wrapIfNeeded
+  var wrappers = scope.wrappers;
+
+  var registrationsTable = new WeakMap();
+  var globalMutationObservers = [];
+  var isScheduled = false;
+
+  function scheduleCallback(observer) {
+    if (isScheduled)
+      return;
+    setEndOfMicrotask(notifyObservers);
+    isScheduled = true;
+  }
+
+  // http://dom.spec.whatwg.org/#mutation-observers
+  function notifyObservers() {
+    isScheduled = false;
+
+    do {
+      var notifyList = globalMutationObservers.slice();
+      var anyNonEmpty = false;
+      for (var i = 0; i < notifyList.length; i++) {
+        var mo = notifyList[i];
+        var queue = mo.takeRecords();
+        removeTransientObserversFor(mo);
+        if (queue.length) {
+          mo.callback_(queue, mo);
+          anyNonEmpty = true;
+        }
+      }
+    } while (anyNonEmpty);
+  }
+
+  /**
+   * @param {string} type
+   * @param {Node} target
+   * @constructor
+   */
+  function MutationRecord(type, target) {
+    this.type = type;
+    this.target = target;
+    this.addedNodes = new wrappers.NodeList();
+    this.removedNodes = new wrappers.NodeList();
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this.attributeName = null;
+    this.attributeNamespace = null;
+    this.oldValue = null;
+  }
+
+  /**
+   * Registers transient observers to ancestor and its ancesors for the node
+   * which was removed.
+   * @param {!Node} ancestor
+   * @param {!Node} node
+   */
+  function registerTransientObservers(ancestor, node) {
+    for (; ancestor; ancestor = ancestor.parentNode) {
+      var registrations = registrationsTable.get(ancestor);
+      if (!registrations)
+        continue;
+      for (var i = 0; i < registrations.length; i++) {
+        var registration = registrations[i];
+        if (registration.options.subtree)
+          registration.addTransientObserver(node);
+      }
+    }
+  }
+
+  function removeTransientObserversFor(observer) {
+    for (var i = 0; i < observer.nodes_.length; i++) {
+      var node = observer.nodes_[i];
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        return;
+      for (var j = 0; j < registrations.length; j++) {
+        var registration = registrations[j];
+        if (registration.observer === observer)
+          registration.removeTransientObservers();
+      }
+    }
+  }
+
+  // http://dom.spec.whatwg.org/#queue-a-mutation-record
+  function enqueueMutation(target, type, data) {
+    // 1.
+    var interestedObservers = Object.create(null);
+    var associatedStrings = Object.create(null);
+
+    // 2.
+    for (var node = target; node; node = node.parentNode) {
+      // 3.
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        continue;
+      for (var j = 0; j < registrations.length; j++) {
+        var registration = registrations[j];
+        var options = registration.options;
+        // 1.
+        if (node !== target && !options.subtree)
+          continue;
+
+        // 2.
+        if (type === 'attributes' && !options.attributes)
+          continue;
+
+        // 3. If type is "attributes", options's attributeFilter is present, and
+        // either options's attributeFilter does not contain name or namespace
+        // is non-null, continue.
+        if (type === 'attributes' && options.attributeFilter &&
+            (data.namespace !== null ||
+             options.attributeFilter.indexOf(data.name) === -1)) {
+          continue;
+        }
+
+        // 4.
+        if (type === 'characterData' && !options.characterData)
+          continue;
+
+        // 5.
+        if (type === 'childList' && !options.childList)
+          continue;
+
+        // 6.
+        var observer = registration.observer;
+        interestedObservers[observer.uid_] = observer;
+
+        // 7. If either type is "attributes" and options's attributeOldValue is
+        // true, or type is "characterData" and options's characterDataOldValue
+        // is true, set the paired string of registered observer's observer in
+        // interested observers to oldValue.
+        if (type === 'attributes' && options.attributeOldValue ||
+            type === 'characterData' && options.characterDataOldValue) {
+          associatedStrings[observer.uid_] = data.oldValue;
+        }
+      }
+    }
+
+    var anyRecordsEnqueued = false;
+
+    // 4.
+    for (var uid in interestedObservers) {
+      var observer = interestedObservers[uid];
+      var record = new MutationRecord(type, target);
+
+      // 2.
+      if ('name' in data && 'namespace' in data) {
+        record.attributeName = data.name;
+        record.attributeNamespace = data.namespace;
+      }
+
+      // 3.
+      if (data.addedNodes)
+        record.addedNodes = data.addedNodes;
+
+      // 4.
+      if (data.removedNodes)
+        record.removedNodes = data.removedNodes;
+
+      // 5.
+      if (data.previousSibling)
+        record.previousSibling = data.previousSibling;
+
+      // 6.
+      if (data.nextSibling)
+        record.nextSibling = data.nextSibling;
+
+      // 7.
+      if (associatedStrings[uid] !== undefined)
+        record.oldValue = associatedStrings[uid];
+
+      // 8.
+      observer.records_.push(record);
+
+      anyRecordsEnqueued = true;
+    }
+
+    if (anyRecordsEnqueued)
+      scheduleCallback();
+  }
+
+  var slice = Array.prototype.slice;
+
+  /**
+   * @param {!Object} options
+   * @constructor
+   */
+  function MutationObserverOptions(options) {
+    this.childList = !!options.childList;
+    this.subtree = !!options.subtree;
+
+    // 1. If either options' attributeOldValue or attributeFilter is present
+    // and options' attributes is omitted, set options' attributes to true.
+    if (!('attributes' in options) &&
+        ('attributeOldValue' in options || 'attributeFilter' in options)) {
+      this.attributes = true;
+    } else {
+      this.attributes = !!options.attributes;
+    }
+
+    // 2. If options' characterDataOldValue is present and options'
+    // characterData is omitted, set options' characterData to true.
+    if ('characterDataOldValue' in options && !('characterData' in options))
+      this.characterData = true;
+    else
+      this.characterData = !!options.characterData;
+
+    // 3. & 4.
+    if (!this.attributes &&
+        (options.attributeOldValue || 'attributeFilter' in options) ||
+        // 5.
+        !this.characterData && options.characterDataOldValue) {
+      throw new TypeError();
+    }
+
+    this.characterData = !!options.characterData;
+    this.attributeOldValue = !!options.attributeOldValue;
+    this.characterDataOldValue = !!options.characterDataOldValue;
+    if ('attributeFilter' in options) {
+      if (options.attributeFilter == null ||
+          typeof options.attributeFilter !== 'object') {
+        throw new TypeError();
+      }
+      this.attributeFilter = slice.call(options.attributeFilter);
+    } else {
+      this.attributeFilter = null;
+    }
+  }
+
+  var uidCounter = 0;
+
+  /**
+   * The class that maps to the DOM MutationObserver interface.
+   * @param {Function} callback.
+   * @constructor
+   */
+  function MutationObserver(callback) {
+    this.callback_ = callback;
+    this.nodes_ = [];
+    this.records_ = [];
+    this.uid_ = ++uidCounter;
+
+    // This will leak. There is no way to implement this without WeakRefs :'(
+    globalMutationObservers.push(this);
+  }
+
+  MutationObserver.prototype = {
+    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe
+    observe: function(target, options) {
+      target = wrapIfNeeded(target);
+
+      var newOptions = new MutationObserverOptions(options);
+
+      // 6.
+      var registration;
+      var registrations = registrationsTable.get(target);
+      if (!registrations)
+        registrationsTable.set(target, registrations = []);
+
+      for (var i = 0; i < registrations.length; i++) {
+        if (registrations[i].observer === this) {
+          registration = registrations[i];
+          // 6.1.
+          registration.removeTransientObservers();
+          // 6.2.
+          registration.options = newOptions;
+        }
+      }
+
+      // 7.
+      if (!registration) {
+        registration = new Registration(this, target, newOptions);
+        registrations.push(registration);
+        this.nodes_.push(target);
+      }
+    },
+
+    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect
+    disconnect: function() {
+      this.nodes_.forEach(function(node) {
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          var registration = registrations[i];
+          if (registration.observer === this) {
+            registrations.splice(i, 1);
+            // Each node can only have one registered observer associated with
+            // this observer.
+            break;
+          }
+        }
+      }, this);
+      this.records_ = [];
+    },
+
+    takeRecords: function() {
+      var copyOfRecords = this.records_;
+      this.records_ = [];
+      return copyOfRecords;
+    }
+  };
+
+  /**
+   * Class used to represent a registered observer.
+   * @param {MutationObserver} observer
+   * @param {Node} target
+   * @param {MutationObserverOptions} options
+   * @constructor
+   */
+  function Registration(observer, target, options) {
+    this.observer = observer;
+    this.target = target;
+    this.options = options;
+    this.transientObservedNodes = [];
+  }
+
+  Registration.prototype = {
+    /**
+     * Adds a transient observer on node. The transient observer gets removed
+     * next time we deliver the change records.
+     * @param {Node} node
+     */
+    addTransientObserver: function(node) {
+      // Don't add transient observers on the target itself. We already have all
+      // the required listeners set up on the target.
+      if (node === this.target)
+        return;
+
+      this.transientObservedNodes.push(node);
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        registrationsTable.set(node, registrations = []);
+
+      // We know that registrations does not contain this because we already
+      // checked if node === this.target.
+      registrations.push(this);
+    },
+
+    removeTransientObservers: function() {
+      var transientObservedNodes = this.transientObservedNodes;
+      this.transientObservedNodes = [];
+
+      for (var i = 0; i < transientObservedNodes.length; i++) {
+        var node = transientObservedNodes[i];
+        var registrations = registrationsTable.get(node);
+        for (var j = 0; j < registrations.length; j++) {
+          if (registrations[j] === this) {
+            registrations.splice(j, 1);
+            // Each node can only have one registered observer associated with
+            // this observer.
+            break;
+          }
+        }
+      }
+    }
+  };
+
+  scope.enqueueMutation = enqueueMutation;
+  scope.registerTransientObservers = registerTransientObservers;
+  scope.wrappers.MutationObserver = MutationObserver;
+  scope.wrappers.MutationRecord = MutationRecord;
+
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -2579,7 +3002,7 @@
   scope.wrappers.MutationEvent = MutationEvent;
   scope.wrappers.UIEvent = UIEvent;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2012 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -2626,7 +3049,8 @@
   scope.addWrapNodeListMethod = addWrapNodeListMethod;
   scope.wrapNodeList = wrapNodeList;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2012 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -2636,9 +3060,11 @@
 
   var EventTarget = scope.wrappers.EventTarget;
   var NodeList = scope.wrappers.NodeList;
-  var defineWrapGetter = scope.defineWrapGetter;
   var assert = scope.assert;
+  var defineWrapGetter = scope.defineWrapGetter;
+  var enqueueMutation = scope.enqueueMutation;
   var mixin = scope.mixin;
+  var registerTransientObservers = scope.registerTransientObservers;
   var registerWrapper = scope.registerWrapper;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
@@ -2648,6 +3074,36 @@
     assert(node instanceof Node);
   }
 
+  function createOneElementNodeList(node) {
+    var nodes = new NodeList();
+    nodes[0] = node;
+    nodes.length = 1;
+    return nodes;
+  }
+
+  var surpressMutations = false;
+
+  /**
+   * Called before node is inserted into a node to enqueue its removal from its
+   * old parent.
+   * @param {!Node} node The node that is about to be removed.
+   * @param {!Node} parent The parent node that the node is being removed from.
+   * @param {!NodeList} nodes The collected nodes.
+   */
+  function enqueueRemovalForInsertedNodes(node, parent, nodes) {
+    enqueueMutation(parent, 'childList', {
+      removedNodes: nodes,
+      previousSibling: node.previousSibling,
+      nextSibling: node.nextSibling
+    });
+  }
+
+  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
+    enqueueMutation(df, 'childList', {
+      removedNodes: nodes
+    });
+  }
+
   /**
    * Collects nodes from a DocumentFragment or a Node for removal followed
    * by an insertion.
@@ -2655,60 +3111,95 @@
    * This updates the internal pointers for node, previousNode and nextNode.
    */
   function collectNodes(node, parentNode, previousNode, nextNode) {
-    if (!(node instanceof DocumentFragment)) {
-      if (node.parentNode)
-        node.parentNode.removeChild(node);
-      node.parentNode_ = parentNode;
-      node.previousSibling_ = previousNode;
-      node.nextSibling_ = nextNode;
+    if (node instanceof DocumentFragment) {
+      var nodes = collectNodesForDocumentFragment(node);
+
+      // The extra loop is to work around bugs with DocumentFragments in IE.
+      surpressMutations = true;
+      for (var i = nodes.length - 1; i >= 0; i--) {
+        node.removeChild(nodes[i]);
+        nodes[i].parentNode_ = parentNode;
+      }
+      surpressMutations = false;
+
+      for (var i = 0; i < nodes.length; i++) {
+        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
+        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
+      }
+
       if (previousNode)
-        previousNode.nextSibling_ = node;
+        previousNode.nextSibling_ = nodes[0];
       if (nextNode)
-        nextNode.previousSibling_ = node;
-      return [node];
+        nextNode.previousSibling_ = nodes[nodes.length - 1];
+
+      return nodes;
     }
 
-    var nodes = [];
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      nodes.push(child);
+    var nodes = createOneElementNodeList(node);
+    var oldParent = node.parentNode;
+    if (oldParent) {
+      // This will enqueue the mutation record for the removal as needed.
+      oldParent.removeChild(node);
     }
 
-    for (var i = nodes.length - 1; i >= 0; i--) {
-      node.removeChild(nodes[i]);
-      nodes[i].parentNode_ = parentNode;
-    }
-
-    for (var i = 0; i < nodes.length; i++) {
-      nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
-      nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
-    }
-
+    node.parentNode_ = parentNode;
+    node.previousSibling_ = previousNode;
+    node.nextSibling_ = nextNode;
     if (previousNode)
-      previousNode.nextSibling_ = nodes[0];
+      previousNode.nextSibling_ = node;
     if (nextNode)
-      nextNode.previousSibling_ = nodes[nodes.length - 1];
+      nextNode.previousSibling_ = node;
 
     return nodes;
   }
 
-  function collectNodesNoNeedToUpdatePointers(node) {
-    if (node instanceof DocumentFragment) {
-      var nodes = [];
-      var i = 0;
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        nodes[i++] = child;
-      }
-      return nodes;
+  function collectNodesNative(node) {
+    if (node instanceof DocumentFragment)
+      return collectNodesForDocumentFragment(node);
+
+    var nodes = createOneElementNodeList(node);
+    var oldParent = node.parentNode;
+    if (oldParent)
+      enqueueRemovalForInsertedNodes(node, oldParent, nodes);
+    return nodes;
+  }
+
+  function collectNodesForDocumentFragment(node) {
+    var nodes = new NodeList();
+    var i = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      nodes[i++] = child;
     }
-    return [node];
+    nodes.length = i;
+    enqueueRemovalForInsertedDocumentFragment(node, nodes);
+    return nodes;
+  }
+
+  function snapshotNodeList(nodeList) {
+    // NodeLists are not live at the moment so just return the same object.
+    return nodeList;
+  }
+
+  // http://dom.spec.whatwg.org/#node-is-inserted
+  function nodeWasAdded(node) {
+    node.nodeIsInserted_();
   }
 
   function nodesWereAdded(nodes) {
     for (var i = 0; i < nodes.length; i++) {
-      nodes[i].nodeWasAdded_();
+      nodeWasAdded(nodes[i]);
     }
   }
 
+  // http://dom.spec.whatwg.org/#node-is-removed
+  function nodeWasRemoved(node) {
+    // Nothing at this point in time.
+  }
+
+  function nodesWereRemoved(nodes) {
+    // Nothing at this point in time.
+  }
+
   function ensureSameOwnerDocument(parent, child) {
     var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?
         parent : parent.ownerDocument;
@@ -2851,69 +3342,56 @@
   Node.prototype = Object.create(EventTarget.prototype);
   mixin(Node.prototype, {
     appendChild: function(childWrapper) {
-      assertIsNodeWrapper(childWrapper);
-
-      var nodes;
-
-      if (this.invalidateShadowRenderer() || invalidateParent(childWrapper)) {
-        var previousNode = this.lastChild;
-        var nextNode = null;
-        nodes = collectNodes(childWrapper, this, previousNode, nextNode);
-
-        this.lastChild_ = nodes[nodes.length - 1];
-        if (!previousNode)
-          this.firstChild_ = nodes[0];
-
-        originalAppendChild.call(this.impl, unwrapNodesForInsertion(this, nodes));
-      } else {
-        nodes = collectNodesNoNeedToUpdatePointers(childWrapper)
-        ensureSameOwnerDocument(this, childWrapper);
-        originalAppendChild.call(this.impl, unwrap(childWrapper));
-      }
-
-      nodesWereAdded(nodes);
-
-      return childWrapper;
+      return this.insertBefore(childWrapper, null);
     },
 
     insertBefore: function(childWrapper, refWrapper) {
-      // TODO(arv): Unify with appendChild
-      if (!refWrapper)
-        return this.appendChild(childWrapper);
-
       assertIsNodeWrapper(childWrapper);
-      assertIsNodeWrapper(refWrapper);
-      assert(refWrapper.parentNode === this);
+
+      refWrapper = refWrapper || null;
+      refWrapper && assertIsNodeWrapper(refWrapper);
+      refWrapper && assert(refWrapper.parentNode === this);
 
       var nodes;
+      var previousNode =
+          refWrapper ? refWrapper.previousSibling : this.lastChild;
 
-      if (this.invalidateShadowRenderer() || invalidateParent(childWrapper)) {
-        var previousNode = refWrapper.previousSibling;
-        var nextNode = refWrapper;
-        nodes = collectNodes(childWrapper, this, previousNode, nextNode);
+      var useNative = !this.invalidateShadowRenderer() &&
+                      !invalidateParent(childWrapper);
 
-        if (this.firstChild === refWrapper)
-          this.firstChild_ = nodes[0];
+      if (useNative)
+        nodes = collectNodesNative(childWrapper);
+      else
+        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
 
-        // insertBefore refWrapper no matter what the parent is?
-        var refNode = unwrap(refWrapper);
-        var parentNode = refNode.parentNode;
-
-        if (parentNode) {
-          originalInsertBefore.call(
-              parentNode,
-              unwrapNodesForInsertion(this, nodes),
-              refNode);
-        } else {
-          adoptNodesIfNeeded(this, nodes);
-        }
-      } else {
-        nodes = collectNodesNoNeedToUpdatePointers(childWrapper);
+      if (useNative) {
         ensureSameOwnerDocument(this, childWrapper);
         originalInsertBefore.call(this.impl, unwrap(childWrapper),
                                   unwrap(refWrapper));
+      } else {
+        if (!previousNode)
+          this.firstChild_ = nodes[0];
+        if (!refWrapper)
+          this.lastChild_ = nodes[nodes.length - 1];
+
+        var refNode = unwrap(refWrapper);
+        var parentNode = refNode ? refNode.parentNode : this.impl;
+
+        // insertBefore refWrapper no matter what the parent is?
+        if (parentNode) {
+          originalInsertBefore.call(parentNode,
+              unwrapNodesForInsertion(this, nodes), refNode);
+        } else {
+          adoptNodesIfNeeded(this, nodes);
+        }
       }
 
+      enqueueMutation(this, 'childList', {
+        addedNodes: nodes,
+        nextSibling: refWrapper,
+        previousSibling: previousNode
+      });
+
       nodesWereAdded(nodes);
 
       return childWrapper;
@@ -2939,15 +3417,15 @@
       }
 
       var childNode = unwrap(childWrapper);
-      if (this.invalidateShadowRenderer()) {
+      var childWrapperNextSibling = childWrapper.nextSibling;
+      var childWrapperPreviousSibling = childWrapper.previousSibling;
 
+      if (this.invalidateShadowRenderer()) {
         // We need to remove the real node from the DOM before updating the
         // pointers. This is so that that mutation event is dispatched before
         // the pointers have changed.
         var thisFirstChild = this.firstChild;
         var thisLastChild = this.lastChild;
-        var childWrapperNextSibling = childWrapper.nextSibling;
-        var childWrapperPreviousSibling = childWrapper.previousSibling;
 
         var parentNode = childNode.parentNode;
         if (parentNode)
@@ -2970,6 +3448,16 @@
         removeChildOriginalHelper(this.impl, childNode);
       }
 
+      if (!surpressMutations) {
+        enqueueMutation(this, 'childList', {
+          removedNodes: createOneElementNodeList(childWrapper),
+          nextSibling: childWrapperNextSibling,
+          previousSibling: childWrapperPreviousSibling
+        });
+      }
+
+      registerTransientObservers(this, childWrapper);
+
       return childWrapper;
     },
 
@@ -2983,16 +3471,22 @@
       }
 
       var oldChildNode = unwrap(oldChildWrapper);
+      var nextNode = oldChildWrapper.nextSibling;
+      var previousNode = oldChildWrapper.previousSibling;
       var nodes;
 
-      if (this.invalidateShadowRenderer() ||
-          invalidateParent(newChildWrapper)) {
-        var previousNode = oldChildWrapper.previousSibling;
-        var nextNode = oldChildWrapper.nextSibling;
+      var useNative = !this.invalidateShadowRenderer() &&
+                      !invalidateParent(newChildWrapper);
+
+      if (useNative) {
+        nodes = collectNodesNative(newChildWrapper);
+      } else {
         if (nextNode === newChildWrapper)
           nextNode = newChildWrapper.nextSibling;
         nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
+      }
 
+      if (!useNative) {
         if (this.firstChild === oldChildWrapper)
           this.firstChild_ = nodes[0];
         if (this.lastChild === oldChildWrapper)
@@ -3009,25 +3503,32 @@
               oldChildNode);
         }
       } else {
-        nodes = collectNodesNoNeedToUpdatePointers(newChildWrapper);
         ensureSameOwnerDocument(this, newChildWrapper);
         originalReplaceChild.call(this.impl, unwrap(newChildWrapper),
                                   oldChildNode);
       }
 
+      enqueueMutation(this, 'childList', {
+        addedNodes: nodes,
+        removedNodes: createOneElementNodeList(oldChildWrapper),
+        nextSibling: nextNode,
+        previousSibling: previousNode
+      });
+
+      nodeWasRemoved(oldChildWrapper);
       nodesWereAdded(nodes);
 
       return oldChildWrapper;
     },
 
     /**
-     * Called after a node was added. Subclasses override this to invalidate
+     * Called after a node was inserted. Subclasses override this to invalidate
      * the renderer as needed.
      * @private
      */
-    nodeWasAdded_: function() {
+    nodeIsInserted_: function() {
       for (var child = this.firstChild; child; child = child.nextSibling) {
-        child.nodeWasAdded_();
+        child.nodeIsInserted_();
       }
     },
 
@@ -3084,6 +3585,8 @@
       return s;
     },
     set textContent(textContent) {
+      var removedNodes = snapshotNodeList(this.childNodes);
+
       if (this.invalidateShadowRenderer()) {
         removeAllChildNodes(this);
         if (textContent !== '') {
@@ -3093,6 +3596,16 @@
       } else {
         this.impl.textContent = textContent;
       }
+
+      var addedNodes = snapshotNodeList(this.childNodes);
+
+      enqueueMutation(this, 'childList', {
+        addedNodes: addedNodes,
+        removedNodes: removedNodes
+      });
+
+      nodesWereRemoved(removedNodes);
+      nodesWereAdded(addedNodes);
     },
 
     get childNodes() {
@@ -3106,9 +3619,6 @@
     },
 
     cloneNode: function(deep) {
-      if (!this.invalidateShadowRenderer())
-        return wrap(this.impl.cloneNode(deep));
-
       var clone = wrap(this.impl.cloneNode(false));
       if (deep) {
         for (var child = this.firstChild; child; child = child.nextSibling) {
@@ -3151,9 +3661,14 @@
   delete Node.prototype.querySelectorAll;
   Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
 
+  scope.nodeWasAdded = nodeWasAdded;
+  scope.nodeWasRemoved = nodeWasRemoved;
+  scope.nodesWereAdded = nodesWereAdded;
+  scope.nodesWereRemoved = nodesWereRemoved;
+  scope.snapshotNodeList = snapshotNodeList;
   scope.wrappers.Node = Node;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -3227,7 +3742,7 @@
   scope.GetElementsByInterface = GetElementsByInterface;
   scope.SelectorsInterface = SelectorsInterface;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3297,7 +3812,7 @@
   scope.ChildNodeInterface = ChildNodeInterface;
   scope.ParentNodeInterface = ParentNodeInterface;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3308,6 +3823,7 @@
 
   var ChildNodeInterface = scope.ChildNodeInterface;
   var Node = scope.wrappers.Node;
+  var enqueueMutation = scope.enqueueMutation;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
 
@@ -3323,6 +3839,16 @@
     },
     set textContent(value) {
       this.data = value;
+    },
+    get data() {
+      return this.impl.data;
+    },
+    set data(value) {
+      var oldValue = this.impl.data;
+      enqueueMutation(this, 'characterData', {
+        oldValue: oldValue
+      });
+      this.impl.data = value;
     }
   });
 
@@ -3332,7 +3858,7 @@
                   document.createTextNode(''));
 
   scope.wrappers.CharacterData = CharacterData;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3347,6 +3873,7 @@
   var ParentNodeInterface = scope.ParentNodeInterface;
   var SelectorsInterface = scope.SelectorsInterface;
   var addWrapNodeListMethod = scope.addWrapNodeListMethod;
+  var enqueueMutation = scope.enqueueMutation;
   var mixin = scope.mixin;
   var oneOf = scope.oneOf;
   var registerWrapper = scope.registerWrapper;
@@ -3374,6 +3901,17 @@
       renderer.invalidate();
   }
 
+  function enqueAttributeChange(element, name, oldValue) {
+    // This is not fully spec compliant. We should use localName (which might
+    // have a different case than name) and the namespace (which requires us
+    // to get the Attr object).
+    enqueueMutation(element, 'attributes', {
+      name: name,
+      namespace: null,
+      oldValue: oldValue
+    });
+  }
+
   function Element(node) {
     Node.call(this, node);
   }
@@ -3394,12 +3932,16 @@
     },
 
     setAttribute: function(name, value) {
+      var oldValue = this.impl.getAttribute(name);
       this.impl.setAttribute(name, value);
+      enqueAttributeChange(this, name, oldValue);
       invalidateRendererBasedOnAttribute(this, name);
     },
 
     removeAttribute: function(name) {
+      var oldValue = this.impl.getAttribute(name);
       this.impl.removeAttribute(name);
+      enqueAttributeChange(this, name, oldValue);
       invalidateRendererBasedOnAttribute(this, name);
     },
 
@@ -3450,7 +3992,7 @@
   // that reflect attributes.
   scope.matchesName = matchesName;
   scope.wrappers.Element = Element;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3461,8 +4003,12 @@
 
   var Element = scope.wrappers.Element;
   var defineGetter = scope.defineGetter;
+  var enqueueMutation = scope.enqueueMutation;
   var mixin = scope.mixin;
+  var nodesWereAdded = scope.nodesWereAdded;
+  var nodesWereRemoved = scope.nodesWereRemoved;
   var registerWrapper = scope.registerWrapper;
+  var snapshotNodeList = scope.snapshotNodeList;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
 
@@ -3564,10 +4110,21 @@
       return getInnerHTML(this);
     },
     set innerHTML(value) {
+      var removedNodes = snapshotNodeList(this.childNodes);
+
       if (this.invalidateShadowRenderer())
         setInnerHTML(this, value, this.tagName);
       else
         this.impl.innerHTML = value;
+      var addedNodes = snapshotNodeList(this.childNodes);
+
+      enqueueMutation(this, 'childList', {
+        addedNodes: addedNodes,
+        removedNodes: removedNodes
+      });
+
+      nodesWereRemoved(removedNodes);
+      nodesWereAdded(addedNodes);
     },
 
     get outerHTML() {
@@ -3651,7 +4208,8 @@
   // TODO: Find a better way to share these two with WrapperShadowRoot.
   scope.getInnerHTML = getInnerHTML;
   scope.setInnerHTML = setInnerHTML
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -3682,7 +4240,7 @@
                   document.createElement('canvas'));
 
   scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3724,7 +4282,8 @@
     registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
 
   scope.wrappers.HTMLContentElement = HTMLContentElement;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -3767,7 +4326,7 @@
 
   scope.wrappers.HTMLImageElement = HTMLImageElement;
   scope.wrappers.Image = Image;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3794,7 +4353,7 @@
     registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
 
   scope.wrappers.HTMLShadowElement = HTMLShadowElement;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3879,7 +4438,8 @@
     registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
 
   scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -3901,7 +4461,7 @@
                   document.createElement('audio'));
 
   scope.wrappers.HTMLMediaElement = HTMLMediaElement;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -3944,7 +4504,7 @@
 
   scope.wrappers.HTMLAudioElement = HTMLAudioElement;
   scope.wrappers.Audio = Audio;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -4008,7 +4568,7 @@
 
   scope.wrappers.HTMLOptionElement = HTMLOptionElement;
   scope.wrappers.Option = Option;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -4040,7 +4600,8 @@
   HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
   registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
   scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -4076,10 +4637,11 @@
     }
   });
 
-  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D);
+  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,
+                  document.createElement('canvas').getContext('2d'));
 
   scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -4119,10 +4681,111 @@
     }
   });
 
-  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext);
+  // Blink/WebKit has broken DOM bindings. Usually we would create an instance
+  // of the object and pass it into registerWrapper as a "blueprint" but
+  // creating WebGL contexts is expensive and might fail so we use a dummy
+  // object with dummy instance properties for these broken browsers.
+  var instanceProperties = /WebKit/.test(navigator.userAgent) ?
+      {drawingBufferHeight: null, drawingBufferWidth: null} : {};
+
+  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,
+      instanceProperties);
 
   scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var wrap = scope.wrap;
+
+  var OriginalRange = window.Range;
+
+  function Range(impl) {
+    this.impl = impl;
+  }
+  Range.prototype = {
+    get startContainer() {
+      return wrap(this.impl.startContainer);
+    },
+    get endContainer() {
+      return wrap(this.impl.endContainer);
+    },
+    get commonAncestorContainer() {
+      return wrap(this.impl.commonAncestorContainer);
+    },
+    setStart: function(refNode,offset) {
+      this.impl.setStart(unwrapIfNeeded(refNode), offset);
+    },
+    setEnd: function(refNode,offset) {
+      this.impl.setEnd(unwrapIfNeeded(refNode), offset);
+    },
+    setStartBefore: function(refNode) {
+      this.impl.setStartBefore(unwrapIfNeeded(refNode));
+    },
+    setStartAfter: function(refNode) {
+      this.impl.setStartAfter(unwrapIfNeeded(refNode));
+    },
+    setEndBefore: function(refNode) {
+      this.impl.setEndBefore(unwrapIfNeeded(refNode));
+    },
+    setEndAfter: function(refNode) {
+      this.impl.setEndAfter(unwrapIfNeeded(refNode));
+    },
+    selectNode: function(refNode) {
+      this.impl.selectNode(unwrapIfNeeded(refNode));
+    },
+    selectNodeContents: function(refNode) {
+      this.impl.selectNodeContents(unwrapIfNeeded(refNode));
+    },
+    compareBoundaryPoints: function(how, sourceRange) {
+      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));
+    },
+    extractContents: function() {
+      return wrap(this.impl.extractContents());
+    },
+    cloneContents: function() {
+      return wrap(this.impl.cloneContents());
+    },
+    insertNode: function(node) {
+      this.impl.insertNode(unwrapIfNeeded(node));
+    },
+    surroundContents: function(newParent) {
+      this.impl.surroundContents(unwrapIfNeeded(newParent));
+    },
+    cloneRange: function() {
+      return wrap(this.impl.cloneRange());
+    },
+    isPointInRange: function(node, offset) {
+      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);
+    },
+    comparePoint: function(node, offset) {
+      return this.impl.comparePoint(unwrapIfNeeded(node), offset);
+    },
+    intersectsNode: function(node) {
+      return this.impl.intersectsNode(unwrapIfNeeded(node));
+    }
+  };
+
+  // IE9 does not have createContextualFragment.
+  if (OriginalRange.prototype.createContextualFragment) {
+    Range.prototype.createContextualFragment = function(html) {
+      return wrap(this.impl.createContextualFragment(html));
+    };
+  }
+
+  registerWrapper(window.Range, Range, document.createRange());
+
+  scope.wrappers.Range = Range;
+
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -4149,7 +4812,7 @@
   scope.wrappers.DocumentFragment = DocumentFragment;
   scope.wrappers.Text = Text;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -4214,7 +4877,9 @@
   });
 
   scope.wrappers.ShadowRoot = ShadowRoot;
-})(this.ShadowDOMPolyfill);
+
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
@@ -4849,8 +5514,8 @@
     return getDistributedChildNodes(this);
   };
 
-  HTMLShadowElement.prototype.nodeWasAdded_ =
-  HTMLContentElement.prototype.nodeWasAdded_ = function() {
+  HTMLShadowElement.prototype.nodeIsInserted_ =
+  HTMLContentElement.prototype.nodeIsInserted_ = function() {
     // Invalidate old renderer if any.
     this.invalidateShadowRenderer();
 
@@ -4875,7 +5540,8 @@
     remove: remove,
   };
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -4929,7 +5595,7 @@
 
   elementsWithFormProperty.forEach(createWrapperConstructor);
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -5221,7 +5887,7 @@
   scope.wrappers.DOMImplementation = DOMImplementation;
   scope.wrappers.Document = Document;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -5271,188 +5937,7 @@
 
   scope.wrappers.Window = Window;
 
-})(this.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var defineGetter = scope.defineGetter;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var registerWrapper = scope.registerWrapper;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrapNodeList = scope.wrapNodeList;
-  var wrappers = scope.wrappers;
-
-  var OriginalMutationObserver = window.MutationObserver ||
-      window.WebKitMutationObserver;
-
-  if (!OriginalMutationObserver)
-    return;
-
-  var OriginalMutationRecord = window.MutationRecord;
-
-  function MutationRecord(impl) {
-    this.impl = impl;
-  }
-
-  MutationRecord.prototype = {
-    get addedNodes() {
-      return wrapNodeList(this.impl.addedNodes);
-    },
-    get removedNodes() {
-      return wrapNodeList(this.impl.removedNodes);
-    }
-  };
-
-  ['target', 'previousSibling', 'nextSibling'].forEach(function(name) {
-    defineWrapGetter(MutationRecord, name);
-  });
-
-  // WebKit/Blink treats these as instance properties so we override
-  [
-    'type',
-    'attributeName',
-    'attributeNamespace',
-    'oldValue'
-  ].forEach(function(name) {
-    defineGetter(MutationRecord, name, function() {
-      return this.impl[name];
-    });
-  });
-
-  if (OriginalMutationRecord)
-    registerWrapper(OriginalMutationRecord, MutationRecord);
-
-  function wrapRecord(record) {
-    return new MutationRecord(record);
-  }
-
-  function wrapRecords(records) {
-    return records.map(wrapRecord);
-  }
-
-  function MutationObserver(callback) {
-    var self = this;
-    this.impl = new OriginalMutationObserver(function(mutations, observer) {
-      callback.call(self, wrapRecords(mutations), self);
-    });
-  }
-
-  var OriginalNode = window.Node;
-
-  MutationObserver.prototype = {
-    observe: function(target, options) {
-      this.impl.observe(unwrapIfNeeded(target), options);
-    },
-    disconnect: function() {
-      this.impl.disconnect();
-    },
-    takeRecords: function() {
-      return wrapRecords(this.impl.takeRecords());
-    }
-  };
-
-  scope.wrappers.MutationObserver = MutationObserver;
-  scope.wrappers.MutationRecord = MutationRecord;
-
-})(this.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is goverened by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalRange = window.Range;
-
-  function Range(impl) {
-    this.impl = impl;
-  }
-  Range.prototype = {
-    get startContainer() {
-      return wrap(this.impl.startContainer);
-    },
-    get endContainer() {
-      return wrap(this.impl.endContainer);
-    },
-    get commonAncestorContainer() {
-      return wrap(this.impl.commonAncestorContainer);
-    },
-    setStart: function(refNode,offset) {
-      this.impl.setStart(unwrapIfNeeded(refNode), offset);
-    },
-    setEnd: function(refNode,offset) {
-      this.impl.setEnd(unwrapIfNeeded(refNode), offset);
-    },
-    setStartBefore: function(refNode) {
-      this.impl.setStartBefore(unwrapIfNeeded(refNode));
-    },
-    setStartAfter: function(refNode) {
-      this.impl.setStartAfter(unwrapIfNeeded(refNode));
-    },
-    setEndBefore: function(refNode) {
-      this.impl.setEndBefore(unwrapIfNeeded(refNode));
-    },
-    setEndAfter: function(refNode) {
-      this.impl.setEndAfter(unwrapIfNeeded(refNode));
-    },
-    selectNode: function(refNode) {
-      this.impl.selectNode(unwrapIfNeeded(refNode));
-    },
-    selectNodeContents: function(refNode) {
-      this.impl.selectNodeContents(unwrapIfNeeded(refNode));
-    },
-    compareBoundaryPoints: function(how, sourceRange) {
-      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));
-    },
-    extractContents: function() {
-      return wrap(this.impl.extractContents());
-    },
-    cloneContents: function() {
-      return wrap(this.impl.cloneContents());
-    },
-    insertNode: function(node) {
-      this.impl.insertNode(unwrapIfNeeded(node));
-    },
-    surroundContents: function(newParent) {
-      this.impl.surroundContents(unwrapIfNeeded(newParent));
-    },
-    cloneRange: function() {
-      return wrap(this.impl.cloneRange());
-    },
-    isPointInRange: function(node, offset) {
-      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);
-    },
-    comparePoint: function(node, offset) {
-      return this.impl.comparePoint(unwrapIfNeeded(node), offset);
-    },
-    intersectsNode: function(node) {
-      return this.impl.intersectsNode(unwrapIfNeeded(node));
-    }
-  };
-
-  // IE9 does not have createContextualFragment.
-  if (OriginalRange.prototype.createContextualFragment) {
-    Range.prototype.createContextualFragment = function(html) {
-      return wrap(this.impl.createContextualFragment(html));
-    };
-  }
-
-  registerWrapper(window.Range, Range);
-
-  scope.wrappers.Range = Range;
-
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
 
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -5554,7 +6039,8 @@
   // Export for testing.
   scope.knownElements = elements;
 
-})(this.ShadowDOMPolyfill);
+})(window.ShadowDOMPolyfill);
+
 /*
  * Copyright 2013 The Polymer Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
@@ -6057,7 +6543,7 @@
    * Convert ^ and ^^ combinators by replacing with space.
   */
   convertCombinators: function(cssText) {
-    return cssText.replace('^^', ' ').replace('^', ' ');
+    return cssText.replace(/\^\^/g, ' ').replace(/\^/g, ' ');
   },
   // change a selector like 'div' to 'name div'
   scopeRules: function(cssRules, name, typeExtension) {
diff --git a/pkg/shadow_dom/lib/shadow_dom.min.js b/pkg/shadow_dom/lib/shadow_dom.min.js
index c9b57af..1080a13 100644
--- a/pkg/shadow_dom/lib/shadow_dom.min.js
+++ b/pkg/shadow_dom/lib/shadow_dom.min.js
@@ -1,3 +1,3 @@
-if(!HTMLElement.prototype.createShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}(),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)F="new",G="updated",H="reconfigured",I="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=J||b[1].type!=J?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:M(a)&&M(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:U.test(a))}function i(a,b){if(b!==V)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),L&&!K&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn()),void 0)}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=W[a];if(b)return b;if(!h(a))return X;var b=new i(a,V);return W[a]=b,b}function k(b){for(var c=0;Y>c&&b.check();)b.report(),c++;a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c)}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(a,b){var c=b||(Array.isArray(a)?[]:{});for(var d in a)c[d]=a[d];return Array.isArray(a)&&(c.length=a.length),c}function p(a,b,c,d){if(this.closed=!1,this.object=a,this.callback=b,this.target=c,this.token=d,this.reporting=!0,K){var e=this;this.boundInternalCallback=function(a){e.internalCallback(a)}}q(this)}function q(a){$&&(Z.push(a),p._allObserversCount++)}function r(a,b,c,d){p.call(this,a,b,c,d),this.connect(),this.sync(!0)}function s(a,b,c,d){if(!Array.isArray(a))throw Error("Provided object is not an Array");r.call(this,a,b,c,d)}function t(a){this.arr=[],this.callback=a,this.isObserved=!0}function u(a,b,c,d,e,g,h){var b=b instanceof i?b:j(b);return b&&b.length&&f(a)?(p.call(this,a,c,d,e),this.valueFn=g,this.setValueFn=h,this.path=b,this.connect(),this.sync(!0),void 0):(this.value_=b?b.getValueFrom(a):void 0,this.value=g?g(this.value_):this.value_,this.closed=!0,void 0)}function v(a,b,c,d){p.call(this,void 0,a,b,c),this.valueFn=d,this.observed=[],this.values=[],this.value=void 0,this.oldValue=void 0,this.oldValues=void 0,this.changeFlags=void 0,this.started=!1}function w(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function x(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];db[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=G&&(g.type!=F?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function y(a,b,c){return{index:a,removed:b,addedCount:c}}function z(){}function A(a,b,c,d,e,f){return ib.calcSplices(a,b,c,d,e,f)}function B(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function C(a,b,c,d){for(var e=y(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=B(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function D(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case J:C(c,g.index,g.removed.slice(),g.addedCount);break;case F:case G:case I:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;C(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function E(a,b){var c=[];return D(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?(b.removed[0]!==a[b.index]&&c.push(b),void 0):(c=c.concat(A(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)),void 0)}),c}var F="add",G="update",H="reconfigure",I="delete",J="splice",K=b(),L=c(),M=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},N="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},O="[$_a-zA-Z]",P="[$_a-zA-Z0-9]",Q=O+"+"+P+"*",R="(?:[0-9]|[1-9]+[0-9]+)",S="(?:"+Q+"|"+R+")",T="(?:"+S+")(?:\\s*\\.\\s*"+S+")*",U=new RegExp("^"+T+"$"),V={},W={};i.get=j,i.prototype=N({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a,b){for(var c=0;c<this.length;c++){if(null==a)return;b&&b.observe(a),a=a[this[c]]}return a},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++)this[e],c+=a[e],b+=" &&\n     "+c+" != null";return b+=")\n",c+=a[e],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var X=new i("",V);X.valid=!1,X.getValueFrom=X.setValueFrom=function(){};var Y=1e3;p.prototype={internalCallback:function(a){this.closed||this.reporting&&this.check(a)&&(this.report(),this.testingResults&&(this.testingResults.anyChanged=!0))},close:function(){this.closed||(this.object&&"function"==typeof this.object.close&&this.object.close(),this.disconnect(),this.object=void 0,this.closed=!0)},deliver:function(a){this.closed||(K?(this.testingResults=a,Object.deliverChangeRecords(this.boundInternalCallback),this.testingResults=void 0):k(this))},report:function(){this.reporting&&(this.sync(!1),this.callback&&(this.reportArgs.push(this.token),this.invokeCallback(this.reportArgs)),this.reportArgs=void 0)},invokeCallback:function(a){try{this.callback.apply(this.target,a)}catch(b){p._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},reset:function(){this.closed||(K&&(this.reporting=!1,Object.deliverChangeRecords(this.boundInternalCallback),this.reporting=!0),this.sync(!0))}};var Z,$=!K||a.forceCollectObservers;p._allObserversCount=0,$&&(Z=[]);var _=!1,ab="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!_){if(ab)return Object.deliverAllChangeRecords(),void 0;if($){_=!0;var b=0,c={};do{b++;var d=Z;Z=[],c.anyChanged=!1;for(var e=0;e<d.length;e++){var f=d[e];f.closed||(K?f.deliver(c):f.check()&&(c.anyChanged=!0,f.report()),Z.push(f))}}while(Y>b&&c.anyChanged);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=b),p._allObserversCount=Z.length,_=!1}}},$&&(a.Platform.clearObservers=function(){Z=[]}),r.prototype=N({__proto__:p.prototype,connect:function(){K&&Object.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=o(this.object))},check:function(a){var b,c;if(K){if(!a)return!1;c={},b=x(this.object,a,c)}else c=this.oldObject,b=n(this.object,this.oldObject);return m(b)?!1:(this.reportArgs=[b.added||{},b.removed||{},b.changed||{}],this.reportArgs.push(function(a){return c[a]}),!0)},disconnect:function(){K?this.object&&Object.unobserve(this.object,this.boundInternalCallback):this.oldObject=void 0}}),s.prototype=N({__proto__:r.prototype,connect:function(){K&&Array.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=this.object.slice())},check:function(a){var b;if(K){if(!a)return!1;b=E(this.object,a)}else b=A(this.object,0,this.object.length,this.oldObject,0,this.oldObject.length);return b&&b.length?(this.reportArgs=[b],!0):!1}}),s.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})};var bb=Object.getPrototypeOf({}),cb=Object.getPrototypeOf([]);t.prototype={reset:function(){this.isObserved=!this.isObserved},observe:function(a){if(f(a)&&a!==bb&&a!==cb){var b=this.arr.indexOf(a);b>=0&&this.arr[b+1]===this.isObserved||(0>b&&(b=this.arr.length,this.arr[b]=a,Object.observe(a,this.callback)),this.arr[b+1]=this.isObserved,this.observe(Object.getPrototypeOf(a)))}},cleanup:function(){for(var a=0,b=0,c=this.isObserved;b<this.arr.length;){var d=this.arr[b];this.arr[b+1]==c?(b>a&&(this.arr[a]=d,this.arr[a+1]=c),a+=2):Object.unobserve(d,this.callback),b+=2}this.arr.length=a}},u.prototype=N({__proto__:p.prototype,connect:function(){K&&(this.observedSet=new t(this.boundInternalCallback))},disconnect:function(){this.value=void 0,this.value_=void 0,this.observedSet&&(this.observedSet.reset(),this.observedSet.cleanup(),this.observedSet=void 0)},check:function(){return this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.observedSet&&this.observedSet.cleanup(),g(this.value_,this.oldValue_)?!1:(this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.reportArgs=[this.value,this.oldValue],!0)},sync:function(a){a&&(this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.observedSet&&this.observedSet.cleanup()),this.oldValue_=this.value_,this.oldValue=this.value},setValue:function(a){this.path&&("function"==typeof this.setValueFn&&(a=this.setValueFn(a)),this.path.setValueFrom(this.object,a))}}),v.prototype=N({__proto__:u.prototype,addPath:function(a,b){if(this.started)throw Error("Cannot add more paths once started.");var b=b instanceof i?b:j(b),c=b?b.getValueFrom(a):void 0;this.observed.push(a,b),this.values.push(c)},start:function(){this.started=!0,this.connect(),this.sync(!0)},getValues:function(){this.observedSet&&this.observedSet.reset();for(var a=!1,b=0;b<this.observed.length;b+=2){var c=this.observed[b+1];if(c){var d=this.observed[b],e=c.getValueFrom(d,this.observedSet),f=this.values[b/2];if(!g(e,f)){if(!a&&!this.valueFn){this.oldValues=this.oldValues||[],this.changeFlags=this.changeFlags||[];for(var h=0;h<this.values.length;h++)this.oldValues[h]=this.values[h],this.changeFlags[h]=!1}this.valueFn||(this.changeFlags[b/2]=!0),this.values[b/2]=e,a=!0}}}return this.observedSet&&this.observedSet.cleanup(),a},check:function(){if(this.getValues()){if(this.valueFn){if(this.value=this.valueFn(this.values),g(this.value,this.oldValue))return!1;this.reportArgs=[this.value,this.oldValue]}else this.reportArgs=[this.values,this.oldValues,this.changeFlags,this.observed];return!0}},sync:function(a){a&&(this.getValues(),this.valueFn&&(this.value=this.valueFn(this.values))),this.valueFn&&(this.oldValue=this.value)},close:function(){if(this.observed){for(var a=0;a<this.observed.length;a+=2){var b=this.observed[a];b&&"function"==typeof b.close&&b.close()}this.observed=void 0,this.values=void 0}p.prototype.close.call(this)}});var db={};db[F]=!0,db[G]=!0,db[I]=!0,u.defineProperty=function(a,b,c){var d=c.object,e=j(c.path),f=w(a,b),g=new u(d,c.path,function(a,b){f&&f(G,b)});return Object.defineProperty(a,b,{get:function(){return e.getValueFrom(d)},set:function(a){e.setValueFrom(d,a)},configurable:!0}),{close:function(){var c=e.getValueFrom(d);f&&g.deliver(),g.close(),Object.defineProperty(a,b,{value:c,writable:!0,configurable:!0})}}};var eb=0,fb=1,gb=2,hb=3;z.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(eb):(e.push(fb),d=g),b--,c--):f==h?(e.push(hb),b--,d=h):(e.push(gb),c--,d=i)}else e.push(hb),b--;else e.push(gb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,0==c-b&&0==f-e)return[];if(b==c){for(var j=y(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[y(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case eb:j&&(l.push(j),j=void 0),m++,n++;break;case fb:j||(j=y(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case gb:j||(j=y(m,[],0)),j.addedCount++,m++;break;case hb:j||(j=y(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var ib=new z;a.Observer=p,a.Observer.hasObjectObserve=K,a.ArrayObserver=s,a.ArrayObserver.calculateSplices=function(a,b){return ib.calculateSplices(a,b)},a.ArraySplice=z,a.ObjectObserver=r,a.PathObserver=u,a.CompoundPathObserver=v,a.Path=i,a.Observer.changeRecordTypes={add:F,update:G,reconfigure:H,"delete":I,splice:J}}("undefined"!=typeof global&&global?global:this),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}();var ShadowDOMPolyfill={};!function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function d(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=D.get(b);if(c)return c;var d=f(b),e=s(d);return p(b,e,a),e}function g(a,b){n(a,b,!0)}function h(a,b){n(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return G&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return G&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return G&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(b,c,d){Object.getOwnPropertyNames(b).forEach(function(e){if(!(e in c)){J&&b.__lookupGetter__(e);var f;try{f=Object.getOwnPropertyDescriptor(b,e)}catch(g){f=K}var h,j;if(d&&"function"==typeof f.value)return c[e]=m(e),void 0;var n=i(e);h=n?a.getEventHandlerGetter(e):k(e),(f.writable||f.set)&&(j=n?a.getEventHandlerSetter(e):l(e)),Object.defineProperty(c,e,{get:h,set:j,configurable:f.configurable,enumerable:f.enumerable})}})}function o(a,b,c){var e=a.prototype;p(e,b,c),d(b,a)}function p(a,c,d){var e=c.prototype;b(void 0===D.get(a)),D.set(a,c),E.set(e,a),g(a,e),d&&h(e,d)}function q(a,b){return D.get(b.prototype)===a}function r(a){var b=Object.getPrototypeOf(a),c=f(b),d=s(c);return p(b,d,a),d}function s(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b}function t(a){return a instanceof F.EventTarget||a instanceof F.Event||a instanceof F.Range||a instanceof F.DOMImplementation||a instanceof F.CanvasRenderingContext2D||F.WebGLRenderingContext&&a instanceof F.WebGLRenderingContext}function u(a){return a instanceof N||a instanceof M||a instanceof O||a instanceof P||a instanceof L||a instanceof Q||R&&a instanceof R}function v(a){return null===a?null:(b(u(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function w(a){return null===a?null:(b(t(a)),a.impl)}function x(a){return a&&t(a)?w(a):a}function y(a){return a&&!t(a)?v(a):a}function z(a,c){null!==c&&(b(u(a)),b(void 0===c||t(c)),a.polymerWrapper_=c)}function A(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function B(a,b){A(a,b,function(){return v(this.impl[b])})}function C(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=y(this);return a[b].apply(a,arguments)}})})}var D=new WeakMap,E=new WeakMap,F=Object.create(null),G=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(G)try{var H=new Function("","return true;");G=H()}catch(I){G=!1}Object.getOwnPropertyNames(window);var J=/Firefox/.test(navigator.userAgent),K={get:function(){},set:function(){},configurable:!0,enumerable:!0},L=window.DOMImplementation,M=window.Event,N=window.Node,O=window.Window,P=window.Range,Q=window.CanvasRenderingContext2D,R=window.WebGLRenderingContext;a.assert=b,a.constructorTable=D,a.defineGetter=A,a.defineWrapGetter=B,a.forwardMethodsToWrapper=C,a.isWrapperFor=q,a.mixin=c,a.nativePrototypeTable=E,a.oneOf=e,a.registerObject=r,a.registerWrapper=o,a.rewrap=z,a.unwrap=w,a.unwrapIfNeeded=x,a.wrap=v,a.wrapIfNeeded=y,a.wrappers=F}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof O.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&N(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var l=null;if(g.length){if(c(i)&&(l=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(m(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,l,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a){for(var b;b=a.parentNode;)a=b;return a}function m(a,b){return l(a)===l(b)}function n(a,b){return a===b?!0:a instanceof O.ShadowRoot?n(l(a.host),b):!1}function o(){Z++}function p(){Z--}function q(b){if(!Q.get(b)){if(Q.set(b,!0),b instanceof $){if(Z)return}else a.renderAllPending();var c=N(b.target),d=N(b);return r(d,c)}}function r(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof O.Document&&c.shift(),Y.set(a,c),s(a,c)&&t(a,c)&&u(a,c),U.set(a,x.NONE),S.set(a,null),a.defaultPrevented}function s(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=x.CAPTURING_PHASE,!v(b[d],a,c)))return!1}return!0}function t(a,b){var c=x.AT_TARGET;return v(b[0],a,c)}function u(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=x.AT_TARGET;else{if(!d||W.get(a))continue;c=x.BUBBLING_PHASE}if(!v(b[e],a,c))return}}function v(a,b,c){var d=a.target,e=a.currentTarget,f=P.get(e);if(!f)return!0;if("relatedTarget"in b){var g=M(b);if(g.relatedTarget){var h=N(g.relatedTarget),j=i(e,h);if(j===d)return!0;T.set(b,j)}}U.set(b,c);var k=b.type,l=!1;R.set(b,d),S.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===x.CAPTURING_PHASE||n.capture&&c===x.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),W.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!V.get(b)}function w(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function x(a,b){return a instanceof _?(this.impl=a,void 0):N(B(_,"Event",a,b))}function y(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:M(a.relatedTarget)}}):a}function z(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):N(B(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&K(e.prototype,c),d&&(d.prototype["init"+a]?L(d,e,document.createEvent(a)):L(d,e,new d("temp"))),e}function A(a,b){return function(){arguments[b]=M(arguments[b]);var c=M(this);c[a].apply(c,arguments)}}function B(a,b,c,d){if(jb)return new a(c,y(d));var e=M(document.createEvent(b)),f=ib[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=M(b)),g.push(b)}),e["init"+b].apply(e,g),e}function C(a){return"function"==typeof a?!0:a&&a.handleEvent}function D(a){this.impl=a}function E(a){return a instanceof O.ShadowRoot&&(a=a.host),M(a)}function F(a){J(a,mb)}function G(b,c,d,e){a.renderAllPending();for(var f=N(nb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function H(a){return function(){var b=X.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=X.get(this);d||(d=Object.create(null),X.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J=a.forwardMethodsToWrapper,K=a.mixin,L=a.registerWrapper,M=a.unwrap,N=a.wrap,O=a.wrappers;new WeakMap;var P=new WeakMap,Q=new WeakMap,R=new WeakMap,S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=0,$=window.MutationEvent;w.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var _=window.Event;x.prototype={get target(){return R.get(this)},get currentTarget(){return S.get(this)},get eventPhase(){return U.get(this)},get path(){var a=new O.NodeList,b=Y.get(this);if(b){for(var c=0,d=b.length-1,e=l(S.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=l(g);n(e,h)&&(f!==d||g instanceof O.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){V.set(this,!0)},stopImmediatePropagation:function(){V.set(this,!0),W.set(this,!0)}},L(_,x,document.createEvent("Event"));var ab=z("UIEvent",x),bb=z("CustomEvent",x),cb={get relatedTarget(){return T.get(this)||N(M(this).relatedTarget)}},db=K({initMouseEvent:A("initMouseEvent",14)},cb),eb=K({initFocusEvent:A("initFocusEvent",5)},cb),fb=z("MouseEvent",ab,db),gb=z("FocusEvent",ab,eb),hb=z("MutationEvent",x,{initMutationEvent:A("initMutationEvent",3),get relatedNode(){return N(this.impl.relatedNode)}}),ib=Object.create(null),jb=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=K(K({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.EventTarget,mb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;mb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),D.prototype={addEventListener:function(a,b,c){if(C(b)){var d=new w(a,b,c),e=P.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],P.set(this,e);e.push(d);var g=E(this);g.addEventListener_(a,q,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=P.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=E(this);h.removeEventListener_(a,q,!0)}}},dispatchEvent:function(a){var b=E(this),c=M(a);return Q.set(c,!1),b.dispatchEvent_(c)}},lb&&L(lb,D);var nb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.muteMutationEvents=o,a.unmuteMutationEvents=p,a.wrapEventTargetMethods=F,a.wrappers.CustomEvent=bb,a.wrappers.Event=x,a.wrappers.EventTarget=D,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.MutationEvent=hb,a.wrappers.UIEvent=ab}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){o(a instanceof k)}function c(a,b,c,d){if(!(a instanceof DocumentFragment))return a.parentNode&&a.parentNode.removeChild(a),a.parentNode_=b,a.previousSibling_=c,a.nextSibling_=d,c&&(c.nextSibling_=a),d&&(d.previousSibling_=a),[a];for(var e=[],f=a.firstChild;f;f=f.nextSibling)e.push(f);for(var g=e.length-1;g>=0;g--)a.removeChild(e[g]),e[g].parentNode_=b;for(var g=0;g<e.length;g++)e[g].previousSibling_=e[g-1]||c,e[g].nextSibling_=e[g+1]||d;return c&&(c.nextSibling_=e[0]),d&&(d.previousSibling_=e[e.length-1]),e}function d(a){if(a instanceof DocumentFragment){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}return[a]}function e(a){for(var b=0;b<a.length;b++)a[b].nodeWasAdded_()}function f(a,b){var c=a.nodeType===k.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function g(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function h(a,b){g(a,b);var c=b.length;if(1===c)return r(b[0]);for(var d=r(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(r(b[e]));return d}function i(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){o(b.parentNode===a);var c=b.nextSibling,d=r(b),e=d.parentNode;e&&z.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=r(a),g=f.firstChild;g;)c=g.nextSibling,z.call(f,g),g=c}function j(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function k(a){o(a instanceof u),l.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var l=a.wrappers.EventTarget,m=a.wrappers.NodeList,n=a.defineWrapGetter,o=a.assert,p=a.mixin,q=a.registerWrapper,r=a.unwrap,s=a.wrap,t=a.wrapIfNeeded,u=window.Node,v=window.DocumentFragment,w=u.prototype.appendChild,x=u.prototype.compareDocumentPosition,y=u.prototype.insertBefore,z=u.prototype.removeChild,A=u.prototype.replaceChild,B=/Trident/.test(navigator.userAgent),C=B?function(a,b){try{z.call(a,b)}catch(c){if(!(a instanceof v))throw c}}:function(a,b){z.call(a,b)};k.prototype=Object.create(l.prototype),p(k.prototype,{appendChild:function(a){b(a);var g;if(this.invalidateShadowRenderer()||j(a)){var i=this.lastChild,k=null;g=c(a,this,i,k),this.lastChild_=g[g.length-1],i||(this.firstChild_=g[0]),w.call(this.impl,h(this,g))}else g=d(a),f(this,a),w.call(this.impl,r(a));return e(g),a},insertBefore:function(a,i){if(!i)return this.appendChild(a);b(a),b(i),o(i.parentNode===this);var k;if(this.invalidateShadowRenderer()||j(a)){var l=i.previousSibling,m=i;k=c(a,this,l,m),this.firstChild===i&&(this.firstChild_=k[0]);var n=r(i),p=n.parentNode;p?y.call(p,h(this,k),n):g(this,k)}else k=d(a),f(this,a),y.call(this.impl,r(a),r(i));return e(k),a},removeChild:function(a){if(b(a),a.parentNode!==this){var c=!1;this.childNodes;for(var d=this.firstChild;d;d=d.nextSibling)if(d===a){c=!0;break}if(!c)throw new Error("NotFoundError")}var e=r(a);if(this.invalidateShadowRenderer()){var f=this.firstChild,g=this.lastChild,h=a.nextSibling,i=a.previousSibling,j=e.parentNode;j&&C(j,e),f===a&&(this.firstChild_=h),g===a&&(this.lastChild_=i),i&&(i.nextSibling_=h),h&&(h.previousSibling_=i),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else C(this.impl,e);return a},replaceChild:function(a,g){if(b(a),b(g),g.parentNode!==this)throw new Error("NotFoundError");var i,k=r(g);if(this.invalidateShadowRenderer()||j(a)){var l=g.previousSibling,m=g.nextSibling;m===a&&(m=a.nextSibling),i=c(a,this,l,m),this.firstChild===g&&(this.firstChild_=i[0]),this.lastChild===g&&(this.lastChild_=i[i.length-1]),g.previousSibling_=g.nextSibling_=g.parentNode_=void 0,k.parentNode&&A.call(k.parentNode,h(this,i),k)}else i=d(a),f(this,a),A.call(this.impl,r(a),k);return e(i),g},nodeWasAdded_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeWasAdded_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:s(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:s(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:s(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:s(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:s(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==k.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)a+=b.textContent;return a},set textContent(a){if(this.invalidateShadowRenderer()){if(i(this),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}}else this.impl.textContent=a},get childNodes(){for(var a=new m,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;
-return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return s(this.impl.cloneNode(a));var b=s(this.impl.cloneNode(!1));if(a)for(var c=this.firstChild;c;c=c.nextSibling)b.appendChild(c.cloneNode(!0));return b},contains:function(a){if(!a)return!1;if(a=t(a),a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return x.call(this.impl,r(a))}}),n(k,"ownerDocument"),q(u,k,document.createDocumentFragment()),delete k.prototype.querySelector,delete k.prototype.querySelectorAll,k.prototype=p(Object.create(l.prototype),k.prototype),a.wrappers.Node=k}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.mixin,f=a.registerWrapper,g=window.CharacterData;b.prototype=Object.create(d.prototype),e(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a}}),e(b.prototype,c),f(g,b,document.createTextNode("")),a.wrappers.CharacterData=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a){g.call(this,a)}function d(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.ParentNodeInterface,i=a.SelectorsInterface;a.addWrapNodeListMethod;var j=a.mixin,k=a.oneOf,l=a.registerWrapper,m=a.wrappers,n=window.Element,o=k(n.prototype,["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"]),p=n.prototype[o];c.prototype=Object.create(g.prototype),j(c.prototype,{createShadowRoot:function(){var b=new m.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,c){this.impl.setAttribute(a,c),b(this,a)},removeAttribute:function(a){this.impl.removeAttribute(a),b(this,a)},matches:function(a){return p.call(this.impl,a)}}),c.prototype[o]=function(a){return this.matches(a)},n.prototype.webkitCreateShadowRoot&&(c.prototype.webkitCreateShadowRoot=c.prototype.createShadowRoot),d(c.prototype,"id"),d(c.prototype,"className","class"),j(c.prototype,e),j(c.prototype,f),j(c.prototype,h),j(c.prototype,i),l(n,c),a.matchesName=o,a.wrappers.Element=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function c(a){return a.replace(r,b)}function d(a){switch(a.nodeType){case Node.ELEMENT_NODE:for(var b,d=a.tagName.toLowerCase(),f="<"+d,g=a.attributes,h=0;b=g[h];h++)f+=" "+b.name+'="'+c(b.value)+'"';return f+=">",s[d]?f:f+e(a)+"</"+d+">";case Node.TEXT_NODE:return c(a.nodeValue);case Node.COMMENT_NODE:return"<!--"+c(a.nodeValue)+"-->";default:throw console.error(a),new Error("not implemented")}}function e(a){for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=d(c);return b}function f(a,b,c){var d=c||"div";a.textContent="";var e=p(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(q(f))}function g(a){l.call(this,a)}function h(b){return function(){return a.renderAllPending(),this.impl[b]}}function i(a){m(g,a,h(a))}function j(b){Object.defineProperty(g.prototype,b,{get:h(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function k(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var l=a.wrappers.Element,m=a.defineGetter,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=/&|<|"/g,s={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},t=window.HTMLElement;g.prototype=Object.create(l.prototype),n(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){this.invalidateShadowRenderer()?f(this,a,this.tagName):this.impl.innerHTML=a},get outerHTML(){return d(this)},set outerHTML(a){var b=this.parentNode;b&&(b.invalidateShadowRenderer(),this.impl.outerHTML=a)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(i),["scrollLeft","scrollTop"].forEach(j),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(k),o(t,g,document.createElement("b")),a.wrappers.HTMLElement=g,a.getInnerHTML=e,a.setInnerHTML=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=o.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);o.set(a,b)}return b}function c(a){var c,d=b(a.ownerDocument),e=l(d.createDocumentFragment());for(h();c=a.firstChild;)e.appendChild(c);return k(),e}function d(a){if(e.call(this,a),!p){var b=c(a);n.set(this,m(b))}}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.muteMutationEvents,i=a.registerWrapper,j=a.setInnerHTML,k=a.unmuteMutationEvents,l=a.unwrap,m=a.wrap,n=new WeakMap,o=new WeakMap,p=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){return p?m(this.impl.content):n.get(this)},get innerHTML(){return f(this.content)},set innerHTML(a){j(this.content,a)}}),p&&i(p,d),a.wrappers.HTMLTemplateElement=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement;a.mixin;var g=a.registerWrapper,h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b),a.wrappers.CanvasRenderingContext2D=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;g&&(c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}}),d(g,b),a.wrappers.WebGLRenderingContext=b)}(this.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createTextNode("")),i=f(document.createComment(""));a.wrappers.Comment=i,a.wrappers.DocumentFragment=g,a.wrappers.Text=h}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=i(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),g(b,this);var d=a.shadowRoot;k.set(this,d),j.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new WeakMap,k=new WeakMap;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return k.get(this)||null},get host(){return j.get(this)||null},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return this.querySelector("#"+a)}}),a.wrappers.ShadowRoot=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=F(a),g=F(c),h=e?F(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=G(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=F(a),d=c.parentNode;if(d){var e=G(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=I.get(a);c||I.set(a,c=[]),c.push(b)}function f(a){H.set(a,[])}function g(a){return H.get(a)}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof y))return!1;if(!L.test(c))return!1;if(":"===c[0]&&!M.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<O.length;a++)O[a].render();O=[]}function l(){E=null,k()}function m(a){var b=K.get(a);return b||(b=new q(a),K.set(a,b)),b}function n(a){for(;a;a=a.parentNode)if(a instanceof C)return a;return null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof z}function s(a){return a instanceof z}function t(a){return a instanceof A}function u(a){return a instanceof A}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){J.set(a,b)}var y=a.wrappers.Element,z=a.wrappers.HTMLContentElement,A=a.wrappers.HTMLShadowElement,B=a.wrappers.Node,C=a.wrappers.ShadowRoot;a.assert,a.mixin,a.muteMutationEvents;var D=a.oneOf;a.unmuteMutationEvents;var E,F=a.unwrap,G=a.wrap,H=new WeakMap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=/^[*.:#[a-zA-Z_|]/,M=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),N=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),O=[],P=new ArraySplice;P.equals=function(a,b){return F(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(F(b)),g=a||new WeakMap,i=P.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=G(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&G(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,O.push(this),E)return;E=window[N](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},B.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},z.prototype.getDistributedNodes=function(){return k(),g(this)},A.prototype.nodeWasAdded_=z.prototype.nodeWasAdded_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=I,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=J,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLSelectElement","HTMLTextAreaElement"];i.forEach(b)}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return v(c.apply(this.impl,arguments))}}function d(a,b){y.call(b.impl,u(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof n&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return v(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.SelectorsInterface,n=a.wrappers.ShadowRoot,o=a.defineWrapGetter,p=a.elementFromPoint,q=a.forwardMethodsToWrapper,r=a.matchesName,s=a.mixin,t=a.registerWrapper,u=a.unwrap,v=a.wrap,w=a.wrapEventTargetMethods;a.wrapNodeList;var x=new WeakMap;b.prototype=Object.create(k.prototype),o(b,"documentElement"),o(b,"body"),o(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var y=document.adoptNode;if(s(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return p(this,this,a,b)}}),document.register){var z=document.register;b.prototype.register=function(b,c){function d(a){return a?(this.impl=a,void 0):c.extends?document.createElement(c.extends,b):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})});var k={prototype:i};return c.extends&&(k.extends=c.extends),z.call(u(this),b,k),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i),d},q([window.HTMLDocument||window.Document],["register"])}q([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild",r]),q([window.HTMLDocument||window.Document],["adoptNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById"]),s(b.prototype,j),s(b.prototype,l),s(b.prototype,m),s(b.prototype,{get implementation(){var a=x.get(this);return a?a:(a=new g(u(this).implementation),x.set(this,a),a)}}),t(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&t(window.HTMLDocument,b),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),t(window.DOMImplementation,g),q([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=a.renderAllPending,j=window.Window;b.prototype=Object.create(c.prototype);var k=window.getComputedStyle;j.prototype.getComputedStyle=function(a,b){return i(),k.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){j.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return k.call(f(this),g(a),b)}}),e(j,b),a.wrappers.Window=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}function c(a){return new b(a)}function d(a){return a.map(c)}function e(a){var b=this;this.impl=new k(function(c){a.call(b,d(c),b)})}var f=a.defineGetter,g=a.defineWrapGetter,h=a.registerWrapper,i=a.unwrapIfNeeded,j=a.wrapNodeList;a.wrappers;var k=window.MutationObserver||window.WebKitMutationObserver;if(k){var l=window.MutationRecord;b.prototype={get addedNodes(){return j(this.impl.addedNodes)},get removedNodes(){return j(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(a){g(b,a)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(a){f(b,a,function(){return this.impl[a]})}),l&&h(l,b),window.Node,e.prototype={observe:function(a,b){this.impl.observe(i(a),b)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return d(this.impl.takeRecords())}},a.wrappers.MutationObserver=e,a.wrappers.MutationRecord=b}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b),a.wrappers.Range=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}a.isWrapperFor;var c={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",data:"HTMLDataElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",time:"HTMLTimeElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",track:"HTMLTrackElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]}),a.knownElements=c}(this.ShadowDOMPolyfill),function(){var a=window.ShadowDOMPolyfill;a.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(b){function c(a){if(a instanceof d)return"NodeList";if(a instanceof e)return"ShadowRoot";if(window.MutationRecord&&a instanceof MutationRecord)return"MutationRecord";if(window.MutationObserver&&a instanceof MutationObserver)return"MutationObserver";if(a instanceof HTMLTemplateElement)return"HTMLTemplateElement";var c=f(a);if(a!==c){var g=a.constructor;if(g===c.constructor){var h=g._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(c),h=h.substring(8,h.length-1),g._ShadowDOMPolyfill$cacheTag_=h),h}a=c}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.unwrapIfNeeded;return c}}();var Platform={};!function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(n,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=b.sheet.cssRules;return b.parentNode.removeChild(b),d}function e(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function f(a){a&&g().appendChild(document.createTextNode(a))}function g(){return h||(h=document.createElement("style"),h.setAttribute("ShadowCSSShim","")),h}var h,i={strictStyling:!1,registry:{},shimStyling:function(a,b,d){var e=this.isTypeExtension(d),g=this.registerDefinition(a,b,d);this.strictStyling&&this.applyScopeToContent(a,b),this.insertPolyfillDirectives(g.rootStyles),this.insertPolyfillRules(g.rootStyles);var h=this.stylesToShimmedCssText(g.scopeStyles,b,e);h+=this.extractPolyfillUnscopedRules(g.rootStyles),g.shimmedStyle=c(h),a&&(a.shimmedStyle=g.shimmedStyle);for(var i,j=0,k=g.rootStyles.length;k>j&&(i=g.rootStyles[j]);j++)i.parentNode.removeChild(i);f(h)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a?a.querySelectorAll("style"):[];e=e?Array.prototype.slice.call(e,0):[],d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return!f||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},isTypeExtension:function(a){return a&&a.indexOf("-")<0},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertPolyfillDirectives:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillDirectivesInCssText(a.textContent)},this)},insertPolyfillDirectivesInCssText:function(a){return a.replace(o,function(a,b){return b.slice(0,-2)+"{"})},insertPolyfillRules:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillRulesInCssText(a.textContent)},this)},insertPolyfillRulesInCssText:function(a){return a.replace(p,function(a,b){return b.slice(0,-1)})},extractPolyfillUnscopedRules:function(a){var b="";return a&&Array.prototype.forEach.call(a,function(a){b+=this.extractPolyfillUnscopedRulesFromCssText(a.textContent)+"\n\n"},this),b},extractPolyfillUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";return c},stylesToShimmedCssText:function(a,b,c){return this.shimAtHost(a,b,c)+this.shimScoping(a,b,c)},shimAtHost:function(a,b,c){return a?this.convertAtHostStyles(a,b,c):void 0},convertAtHostStyles:function(a,c,f){var g=b(a),h=this;return g=g.replace(j,function(a,b){return h.scopeHostCss(b,c,f)}),g=e(this.findAtHostRules(d(g),this.makeScopeMatcher(c,f)))
-},scopeHostCss:function(a,b,c){var d=this;return a.replace(k,function(a,e,f){return d.scopeHostSelector(e,b,c)+" "+f+"\n	"})},scopeHostSelector:function(a,b,c){var d=[],e=a.split(","),f="[is="+b+"]";return e.forEach(function(a){a=a.trim(),a.match(l)?a=a.replace(l,c?f+"$1$3":b+"$1$3"):a.match(m)&&(a=c?f+a:b+a),d.push(a)},this),d.join(", ")},findAtHostRules:function(a,b){return Array.prototype.filter.call(a,this.isHostRule.bind(this,b))},isHostRule:function(a,b){return b.selectorText&&b.selectorText.match(a)||b.cssRules&&this.findAtHostRules(b.cssRules,a).length||b.type==CSSRule.WEBKIT_KEYFRAMES_RULE},shimScoping:function(a,b,c){return a?this.convertScopedStyles(a,b,c):void 0},convertScopedStyles:function(a,c,e){var f=b(a).replace(j,"");f=this.insertPolyfillHostInCssText(f),f=this.convertColonHost(f),f=this.convertPseudos(f),f=this.convertParts(f),f=this.convertCombinators(f);var g=d(f);return f=this.scopeRules(g,c,e)},convertPseudos:function(a){return a.replace(r," [pseudo=$1]")},convertParts:function(a){return a.replace(s," [part=$1]")},convertColonHost:function(a){return a.replace(t,function(a,b,c,d){return b=y,c?c.match(x)?b+c.replace(x,"")+d:b+c+d+", "+c+" "+b+d:b+d})},convertCombinators:function(a){return a.replace("^^"," ").replace("^"," ")},scopeRules:function(a,b,c){var d="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(d+=this.scopeSelector(a.selectorText,b,c,this.strictStyling)+" {\n	",d+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(d+="@media "+a.media.mediaText+" {\n",d+=this.scopeRules(a.cssRules,b),d+="\n}\n\n"):a.cssText&&(d+=a.cssText+"\n\n")},this),d},scopeSelector:function(a,b,c,d){var e=[],f=a.split(",");return f.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b,c)&&(a=d?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b,c)),e.push(a)},this),e.join(", ")},selectorNeedsScoping:function(a,b,c){var d=this.makeScopeMatcher(b,c);return!a.match(d)},makeScopeMatcher:function(a,b){var c=b?"\\[is=['\"]?"+a+"['\"]?\\]":a;return new RegExp("^("+c+")"+u,"m")},applySimpleSelectorScope:function(a,b,c){var d=c?"[is="+b+"]":b;return a.match(z)?(a=a.replace(y,d),a.replace(z,d+" ")):d+" "+a},applyStrictSelectorScope:function(a,b){var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(z,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(v,x).replace(w,x)},propertiesFromRule:function(a){var b=a.style.cssText;return a.style.content&&!a.style.content.match(/['"]+/)&&(b="content: '"+a.style.content+"';\n"+a.style.cssText.replace(/content:[^;]*;/g,"")),b}},j=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,k=/([^{]*)({[\s\S]*?})/gim,l=/(.*)((?:\*)|(?:\:scope))(.*)/,m=/^[.\[:]/,n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,o=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,p=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/::(x-[^\s{,(]*)/gim,s=/::part\(([^)]*)\)/gim,t=/(-host)(?:\(([^)]*)\))?([^,{]*)/gim,u="([>\\s~+[.,{:][\\s\\S]*)?$",v=/@host/gim,w=/\:host/gim,x="-host",y="-host-no-combinator",z=/-host/gim;if(window.ShadowDOMPolyfill){f("style { display: none !important; }\n");var A=document.querySelector("head");A.insertBefore(g(),A.childNodes[0])}a.ShadowCSS=i}(window.Platform)}
\ No newline at end of file
+if(!HTMLElement.prototype.createShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}(),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)F="new",G="updated",H="reconfigured",I="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=J||b[1].type!=J?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:M(a)&&M(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:U.test(a))}function i(a,b){if(b!==V)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),L&&!K&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn()),void 0)}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=W[a];if(b)return b;if(!h(a))return X;var b=new i(a,V);return W[a]=b,b}function k(b){for(var c=0;Y>c&&b.check();)b.report(),c++;a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c)}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function o(a,b){var c=b||(Array.isArray(a)?[]:{});for(var d in a)c[d]=a[d];return Array.isArray(a)&&(c.length=a.length),c}function p(a,b,c,d){if(this.closed=!1,this.object=a,this.callback=b,this.target=c,this.token=d,this.reporting=!0,K){var e=this;this.boundInternalCallback=function(a){e.internalCallback(a)}}q(this)}function q(a){$&&(Z.push(a),p._allObserversCount++)}function r(a,b,c,d){p.call(this,a,b,c,d),this.connect(),this.sync(!0)}function s(a,b,c,d){if(!Array.isArray(a))throw Error("Provided object is not an Array");r.call(this,a,b,c,d)}function t(a){this.arr=[],this.callback=a,this.isObserved=!0}function u(a,b,c,d,e,g,h){var b=b instanceof i?b:j(b);return b&&b.length&&f(a)?(p.call(this,a,c,d,e),this.valueFn=g,this.setValueFn=h,this.path=b,this.connect(),this.sync(!0),void 0):(this.value_=b?b.getValueFrom(a):void 0,this.value=g?g(this.value_):this.value_,this.closed=!0,void 0)}function v(a,b,c,d){p.call(this,void 0,a,b,c),this.valueFn=d,this.observed=[],this.values=[],this.value=void 0,this.oldValue=void 0,this.oldValues=void 0,this.changeFlags=void 0,this.started=!1}function w(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}function x(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];db[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=G&&(g.type!=F?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function y(a,b,c){return{index:a,removed:b,addedCount:c}}function z(){}function A(a,b,c,d,e,f){return ib.calcSplices(a,b,c,d,e,f)}function B(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function C(a,b,c,d){for(var e=y(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=B(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function D(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case J:C(c,g.index,g.removed.slice(),g.addedCount);break;case F:case G:case I:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;C(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function E(a,b){var c=[];return D(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?(b.removed[0]!==a[b.index]&&c.push(b),void 0):(c=c.concat(A(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)),void 0)}),c}var F="add",G="update",H="reconfigure",I="delete",J="splice",K=b(),L=c(),M=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},N="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},O="[$_a-zA-Z]",P="[$_a-zA-Z0-9]",Q=O+"+"+P+"*",R="(?:[0-9]|[1-9]+[0-9]+)",S="(?:"+Q+"|"+R+")",T="(?:"+S+")(?:\\s*\\.\\s*"+S+")*",U=new RegExp("^"+T+"$"),V={},W={};i.get=j,i.prototype=N({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a,b){for(var c=0;c<this.length;c++){if(null==a)return;b&&b.observe(a),a=a[this[c]]}return a},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++)this[e],c+=a[e],b+=" &&\n     "+c+" != null";return b+=")\n",c+=a[e],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var X=new i("",V);X.valid=!1,X.getValueFrom=X.setValueFrom=function(){};var Y=1e3;p.prototype={internalCallback:function(a){this.closed||this.reporting&&this.check(a)&&(this.report(),this.testingResults&&(this.testingResults.anyChanged=!0))},close:function(){this.closed||(this.object&&"function"==typeof this.object.close&&this.object.close(),this.disconnect(),this.object=void 0,this.closed=!0)},deliver:function(a){this.closed||(K?(this.testingResults=a,Object.deliverChangeRecords(this.boundInternalCallback),this.testingResults=void 0):k(this))},report:function(){this.reporting&&(this.sync(!1),this.callback&&(this.reportArgs.push(this.token),this.invokeCallback(this.reportArgs)),this.reportArgs=void 0)},invokeCallback:function(a){try{this.callback.apply(this.target,a)}catch(b){p._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},reset:function(){this.closed||(K&&(this.reporting=!1,Object.deliverChangeRecords(this.boundInternalCallback),this.reporting=!0),this.sync(!0))}};var Z,$=!K||a.forceCollectObservers;p._allObserversCount=0,$&&(Z=[]);var _=!1,ab="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!_){if(ab)return Object.deliverAllChangeRecords(),void 0;if($){_=!0;var b=0,c={};do{b++;var d=Z;Z=[],c.anyChanged=!1;for(var e=0;e<d.length;e++){var f=d[e];f.closed||(K?f.deliver(c):f.check()&&(c.anyChanged=!0,f.report()),Z.push(f))}}while(Y>b&&c.anyChanged);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=b),p._allObserversCount=Z.length,_=!1}}},$&&(a.Platform.clearObservers=function(){Z=[]}),r.prototype=N({__proto__:p.prototype,connect:function(){K&&Object.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=o(this.object))},check:function(a){var b,c;if(K){if(!a)return!1;c={},b=x(this.object,a,c)}else c=this.oldObject,b=n(this.object,this.oldObject);return m(b)?!1:(this.reportArgs=[b.added||{},b.removed||{},b.changed||{}],this.reportArgs.push(function(a){return c[a]}),!0)},disconnect:function(){K?this.object&&Object.unobserve(this.object,this.boundInternalCallback):this.oldObject=void 0}}),s.prototype=N({__proto__:r.prototype,connect:function(){K&&Array.observe(this.object,this.boundInternalCallback)},sync:function(){K||(this.oldObject=this.object.slice())},check:function(a){var b;if(K){if(!a)return!1;b=E(this.object,a)}else b=A(this.object,0,this.object.length,this.oldObject,0,this.oldObject.length);return b&&b.length?(this.reportArgs=[b],!0):!1}}),s.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})};var bb=Object.getPrototypeOf({}),cb=Object.getPrototypeOf([]);t.prototype={reset:function(){this.isObserved=!this.isObserved},observe:function(a){if(f(a)&&a!==bb&&a!==cb){var b=this.arr.indexOf(a);b>=0&&this.arr[b+1]===this.isObserved||(0>b&&(b=this.arr.length,this.arr[b]=a,Object.observe(a,this.callback)),this.arr[b+1]=this.isObserved,this.observe(Object.getPrototypeOf(a)))}},cleanup:function(){for(var a=0,b=0,c=this.isObserved;b<this.arr.length;){var d=this.arr[b];this.arr[b+1]==c?(b>a&&(this.arr[a]=d,this.arr[a+1]=c),a+=2):Object.unobserve(d,this.callback),b+=2}this.arr.length=a}},u.prototype=N({__proto__:p.prototype,connect:function(){K&&(this.observedSet=new t(this.boundInternalCallback))},disconnect:function(){this.value=void 0,this.value_=void 0,this.observedSet&&(this.observedSet.reset(),this.observedSet.cleanup(),this.observedSet=void 0)},check:function(){return this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.observedSet&&this.observedSet.cleanup(),g(this.value_,this.oldValue_)?!1:(this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.reportArgs=[this.value,this.oldValue],!0)},sync:function(a){a&&(this.observedSet&&this.observedSet.reset(),this.value_=this.path.getValueFrom(this.object,this.observedSet),this.value=this.valueFn?this.valueFn(this.value_):this.value_,this.observedSet&&this.observedSet.cleanup()),this.oldValue_=this.value_,this.oldValue=this.value},setValue:function(a){this.path&&("function"==typeof this.setValueFn&&(a=this.setValueFn(a)),this.path.setValueFrom(this.object,a))}}),v.prototype=N({__proto__:u.prototype,addPath:function(a,b){if(this.started)throw Error("Cannot add more paths once started.");var b=b instanceof i?b:j(b),c=b?b.getValueFrom(a):void 0;this.observed.push(a,b),this.values.push(c)},start:function(){this.started=!0,this.connect(),this.sync(!0)},getValues:function(){this.observedSet&&this.observedSet.reset();for(var a=!1,b=0;b<this.observed.length;b+=2){var c=this.observed[b+1];if(c){var d=this.observed[b],e=c.getValueFrom(d,this.observedSet),f=this.values[b/2];if(!g(e,f)){if(!a&&!this.valueFn){this.oldValues=this.oldValues||[],this.changeFlags=this.changeFlags||[];for(var h=0;h<this.values.length;h++)this.oldValues[h]=this.values[h],this.changeFlags[h]=!1}this.valueFn||(this.changeFlags[b/2]=!0),this.values[b/2]=e,a=!0}}}return this.observedSet&&this.observedSet.cleanup(),a},check:function(){if(this.getValues()){if(this.valueFn){if(this.value=this.valueFn(this.values),g(this.value,this.oldValue))return!1;this.reportArgs=[this.value,this.oldValue]}else this.reportArgs=[this.values,this.oldValues,this.changeFlags,this.observed];return!0}},sync:function(a){a&&(this.getValues(),this.valueFn&&(this.value=this.valueFn(this.values))),this.valueFn&&(this.oldValue=this.value)},close:function(){if(this.observed){for(var a=0;a<this.observed.length;a+=2){var b=this.observed[a];b&&"function"==typeof b.close&&b.close()}this.observed=void 0,this.values=void 0}p.prototype.close.call(this)}});var db={};db[F]=!0,db[G]=!0,db[I]=!0,u.defineProperty=function(a,b,c){var d=c.object,e=j(c.path),f=w(a,b),g=new u(d,c.path,function(a,b){f&&f(G,b)});return Object.defineProperty(a,b,{get:function(){return e.getValueFrom(d)},set:function(a){e.setValueFrom(d,a)},configurable:!0}),{close:function(){var c=e.getValueFrom(d);f&&g.deliver(),g.close(),Object.defineProperty(a,b,{value:c,writable:!0,configurable:!0})}}};var eb=0,fb=1,gb=2,hb=3;z.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(eb):(e.push(fb),d=g),b--,c--):f==h?(e.push(hb),b--,d=h):(e.push(gb),c--,d=i)}else e.push(hb),b--;else e.push(gb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,0==c-b&&0==f-e)return[];if(b==c){for(var j=y(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[y(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case eb:j&&(l.push(j),j=void 0),m++,n++;break;case fb:j||(j=y(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case gb:j||(j=y(m,[],0)),j.addedCount++,m++;break;case hb:j||(j=y(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var ib=new z;a.Observer=p,a.Observer.hasObjectObserve=K,a.ArrayObserver=s,a.ArrayObserver.calculateSplices=function(a,b){return ib.calculateSplices(a,b)},a.ArraySplice=z,a.ObjectObserver=r,a.PathObserver=u,a.CompoundPathObserver=v,a.Path=i,a.Observer.changeRecordTypes={add:F,update:G,reconfigure:H,"delete":I,splice:J}}("undefined"!=typeof global&&global?global:this),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),window.ShadowDOMPolyfill={},function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function d(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=D.get(b);if(c)return c;var d=f(b),e=s(d);return p(b,e,a),e}function g(a,b){n(a,b,!0)}function h(a,b){n(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return G&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return G&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return G&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(b,c,d){Object.getOwnPropertyNames(b).forEach(function(e){if(!(e in c)){J&&b.__lookupGetter__(e);var f;try{f=Object.getOwnPropertyDescriptor(b,e)}catch(g){f=K}var h,j;if(d&&"function"==typeof f.value)return c[e]=m(e),void 0;var n=i(e);h=n?a.getEventHandlerGetter(e):k(e),(f.writable||f.set)&&(j=n?a.getEventHandlerSetter(e):l(e)),Object.defineProperty(c,e,{get:h,set:j,configurable:f.configurable,enumerable:f.enumerable})}})}function o(a,b,c){var e=a.prototype;p(e,b,c),d(b,a)}function p(a,c,d){var e=c.prototype;b(void 0===D.get(a)),D.set(a,c),E.set(e,a),g(a,e),d&&h(e,d)}function q(a,b){return D.get(b.prototype)===a}function r(a){var b=Object.getPrototypeOf(a),c=f(b),d=s(c);return p(b,d,a),d}function s(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b}function t(a){return a instanceof F.EventTarget||a instanceof F.Event||a instanceof F.Range||a instanceof F.DOMImplementation||a instanceof F.CanvasRenderingContext2D||F.WebGLRenderingContext&&a instanceof F.WebGLRenderingContext}function u(a){return a instanceof N||a instanceof M||a instanceof O||a instanceof P||a instanceof L||a instanceof Q||R&&a instanceof R}function v(a){return null===a?null:(b(u(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function w(a){return null===a?null:(b(t(a)),a.impl)}function x(a){return a&&t(a)?w(a):a}function y(a){return a&&!t(a)?v(a):a}function z(a,c){null!==c&&(b(u(a)),b(void 0===c||t(c)),a.polymerWrapper_=c)}function A(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function B(a,b){A(a,b,function(){return v(this.impl[b])})}function C(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=y(this);return a[b].apply(a,arguments)}})})}var D=new WeakMap,E=new WeakMap,F=Object.create(null),G=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(G)try{var H=new Function("","return true;");G=H()}catch(I){G=!1}Object.getOwnPropertyNames(window);var J=/Firefox/.test(navigator.userAgent),K={get:function(){},set:function(){},configurable:!0,enumerable:!0},L=window.DOMImplementation,M=window.Event,N=window.Node,O=window.Window,P=window.Range,Q=window.CanvasRenderingContext2D,R=window.WebGLRenderingContext;a.assert=b,a.constructorTable=D,a.defineGetter=A,a.defineWrapGetter=B,a.forwardMethodsToWrapper=C,a.isWrapperFor=q,a.mixin=c,a.nativePrototypeTable=E,a.oneOf=e,a.registerObject=r,a.registerWrapper=o,a.rewrap=z,a.unwrap=w,a.unwrapIfNeeded=x,a.wrap=v,a.wrapIfNeeded=y,a.wrappers=F}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if(!(h!==a&&!l.subtree||"attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof O.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&N(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var l=null;if(g.length){if(c(i)&&(l=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(m(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,l,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a){for(var b;b=a.parentNode;)a=b;return a}function m(a,b){return l(a)===l(b)}function n(a,b){return a===b?!0:a instanceof O.ShadowRoot?n(l(a.host),b):!1}function o(){Z++}function p(){Z--}function q(b){if(!Q.get(b)){if(Q.set(b,!0),b instanceof $){if(Z)return}else a.renderAllPending();var c=N(b.target),d=N(b);return r(d,c)}}function r(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof O.Document&&c.shift(),Y.set(a,c),s(a,c)&&t(a,c)&&u(a,c),U.set(a,x.NONE),S.set(a,null),a.defaultPrevented}function s(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=x.CAPTURING_PHASE,!v(b[d],a,c)))return!1}return!0}function t(a,b){var c=x.AT_TARGET;return v(b[0],a,c)}function u(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=x.AT_TARGET;else{if(!d||W.get(a))continue;c=x.BUBBLING_PHASE}if(!v(b[e],a,c))return}}function v(a,b,c){var d=a.target,e=a.currentTarget,f=P.get(e);if(!f)return!0;if("relatedTarget"in b){var g=M(b);if(g.relatedTarget){var h=N(g.relatedTarget),j=i(e,h);if(j===d)return!0;T.set(b,j)}}U.set(b,c);var k=b.type,l=!1;R.set(b,d),S.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===x.CAPTURING_PHASE||n.capture&&c===x.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),W.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!V.get(b)}function w(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function x(a,b){return a instanceof _?(this.impl=a,void 0):N(B(_,"Event",a,b))}function y(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:M(a.relatedTarget)}}):a}function z(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):N(B(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&K(e.prototype,c),d&&(d.prototype["init"+a]?L(d,e,document.createEvent(a)):L(d,e,new d("temp"))),e}function A(a,b){return function(){arguments[b]=M(arguments[b]);var c=M(this);c[a].apply(c,arguments)}}function B(a,b,c,d){if(jb)return new a(c,y(d));var e=M(document.createEvent(b)),f=ib[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=M(b)),g.push(b)}),e["init"+b].apply(e,g),e}function C(a){return"function"==typeof a?!0:a&&a.handleEvent}function D(a){this.impl=a}function E(a){return a instanceof O.ShadowRoot&&(a=a.host),M(a)}function F(a){J(a,mb)}function G(b,c,d,e){a.renderAllPending();for(var f=N(nb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function H(a){return function(){var b=X.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=X.get(this);d||(d=Object.create(null),X.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J=a.forwardMethodsToWrapper,K=a.mixin,L=a.registerWrapper,M=a.unwrap,N=a.wrap,O=a.wrappers;new WeakMap;var P=new WeakMap,Q=new WeakMap,R=new WeakMap,S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=0,$=window.MutationEvent;w.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var _=window.Event;x.prototype={get target(){return R.get(this)},get currentTarget(){return S.get(this)},get eventPhase(){return U.get(this)},get path(){var a=new O.NodeList,b=Y.get(this);if(b){for(var c=0,d=b.length-1,e=l(S.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=l(g);n(e,h)&&(f!==d||g instanceof O.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){V.set(this,!0)},stopImmediatePropagation:function(){V.set(this,!0),W.set(this,!0)}},L(_,x,document.createEvent("Event"));var ab=z("UIEvent",x),bb=z("CustomEvent",x),cb={get relatedTarget(){return T.get(this)||N(M(this).relatedTarget)}},db=K({initMouseEvent:A("initMouseEvent",14)},cb),eb=K({initFocusEvent:A("initFocusEvent",5)},cb),fb=z("MouseEvent",ab,db),gb=z("FocusEvent",ab,eb),hb=z("MutationEvent",x,{initMutationEvent:A("initMutationEvent",3),get relatedNode(){return N(this.impl.relatedNode)}}),ib=Object.create(null),jb=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=K(K({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.EventTarget,mb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;mb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),D.prototype={addEventListener:function(a,b,c){if(C(b)){var d=new w(a,b,c),e=P.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],P.set(this,e);e.push(d);var g=E(this);g.addEventListener_(a,q,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=P.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=E(this);h.removeEventListener_(a,q,!0)}}},dispatchEvent:function(a){var b=E(this),c=M(a);return Q.set(c,!1),b.dispatchEvent_(c)}},lb&&L(lb,D);var nb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.muteMutationEvents=o,a.unmuteMutationEvents=p,a.wrapEventTargetMethods=F,a.wrappers.CustomEvent=bb,a.wrappers.Event=x,a.wrappers.EventTarget=D,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.MutationEvent=hb,a.wrappers.UIEvent=ab}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){v(a instanceof s)}function c(a){var b=new u;return b[0]=a,b.length=1,b}function d(a,b,c){x(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){x(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);E=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;E=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new u,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;
+return b.length=c,e(a,b),b}function i(a){return a}function j(a){a.nodeIsInserted_()}function k(a){for(var b=0;b<a.length;b++)j(a[b])}function l(){}function m(){}function n(a,b){var c=a.nodeType===s.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return B(b[0]);for(var d=B(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(B(b[e]));return d}function q(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){v(b.parentNode===a);var c=b.nextSibling,d=B(b),e=d.parentNode;e&&J.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=B(a),g=f.firstChild;g;)c=g.nextSibling,J.call(f,g),g=c}function r(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function s(a){v(a instanceof F),t.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var t=a.wrappers.EventTarget,u=a.wrappers.NodeList,v=a.assert,w=a.defineWrapGetter,x=a.enqueueMutation,y=a.mixin,z=a.registerTransientObservers,A=a.registerWrapper,B=a.unwrap,C=a.wrap,D=a.wrapIfNeeded,E=!1,F=window.Node,G=window.DocumentFragment;F.prototype.appendChild;var H=F.prototype.compareDocumentPosition,I=F.prototype.insertBefore,J=F.prototype.removeChild,K=F.prototype.replaceChild,L=/Trident/.test(navigator.userAgent),M=L?function(a,b){try{J.call(a,b)}catch(c){if(!(a instanceof G))throw c}}:function(a,b){J.call(a,b)};s.prototype=Object.create(t.prototype),y(s.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a),c=c||null,c&&b(c),c&&v(c.parentNode===this);var d,e=c?c.previousSibling:this.lastChild,h=!this.invalidateShadowRenderer()&&!r(a);if(d=h?g(a):f(a,this,e,c),h)n(this,a),I.call(this.impl,B(a),B(c));else{e||(this.firstChild_=d[0]),c||(this.lastChild_=d[d.length-1]);var i=B(c),j=i?i.parentNode:this.impl;j?I.call(j,p(this,d),i):o(this,d)}return x(this,"childList",{addedNodes:d,nextSibling:c,previousSibling:e}),k(d),a},removeChild:function(a){if(b(a),a.parentNode!==this){var d=!1;this.childNodes;for(var e=this.firstChild;e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=B(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&M(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else M(this.impl,f);return E||x(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),z(this,a),a},replaceChild:function(a,d){if(b(a),b(d),d.parentNode!==this)throw new Error("NotFoundError");var e,h=B(d),i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!r(a);return m?e=g(a):(i===a&&(i=a.nextSibling),e=f(a,this,j,i)),m?(n(this,a),K.call(this.impl,B(a),h)):(this.firstChild===d&&(this.firstChild_=e[0]),this.lastChild===d&&(this.lastChild_=e[e.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,h.parentNode&&K.call(h.parentNode,p(this,e),h)),x(this,"childList",{addedNodes:e,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(e),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:C(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:C(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:C(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:C(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:C(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==s.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)a+=b.textContent;return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(q(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else this.impl.textContent=a;var d=i(this.childNodes);x(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d)},get childNodes(){for(var a=new u,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){var b=C(this.impl.cloneNode(!1));if(a)for(var c=this.firstChild;c;c=c.nextSibling)b.appendChild(c.cloneNode(!0));return b},contains:function(a){if(!a)return!1;if(a=D(a),a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return H.call(this.impl,B(a))}}),w(s,"ownerDocument"),A(F,s,document.createDocumentFragment()),delete s.prototype.querySelector,delete s.prototype.querySelectorAll,s.prototype=y(Object.create(t.prototype),s.prototype),a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=s}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){h.call(this,a)}function e(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var f=a.ChildNodeInterface,g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface;a.addWrapNodeListMethod;var k=a.enqueueMutation,l=a.mixin,m=a.oneOf,n=a.registerWrapper,o=a.wrappers,p=window.Element,q=m(p.prototype,["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"]),r=p.prototype[q];d.prototype=Object.create(h.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return r.call(this.impl,a)}}),d.prototype[q]=function(a){return this.matches(a)},p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),e(d.prototype,"id"),e(d.prototype,"className","class"),l(d.prototype,f),l(d.prototype,g),l(d.prototype,i),l(d.prototype,j),n(p,d),a.matchesName=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function c(a){return a.replace(v,b)}function d(a){switch(a.nodeType){case Node.ELEMENT_NODE:for(var b,d=a.tagName.toLowerCase(),f="<"+d,g=a.attributes,h=0;b=g[h];h++)f+=" "+b.name+'="'+c(b.value)+'"';return f+=">",w[d]?f:f+e(a)+"</"+d+">";case Node.TEXT_NODE:return c(a.nodeValue);case Node.COMMENT_NODE:return"<!--"+c(a.nodeValue)+"-->";default:throw console.error(a),new Error("not implemented")}}function e(a){for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=d(c);return b}function f(a,b,c){var d=c||"div";a.textContent="";var e=t(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(u(f))}function g(a){l.call(this,a)}function h(b){return function(){return a.renderAllPending(),this.impl[b]}}function i(a){m(g,a,h(a))}function j(b){Object.defineProperty(g.prototype,b,{get:h(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function k(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var l=a.wrappers.Element,m=a.defineGetter,n=a.enqueueMutation,o=a.mixin,p=a.nodesWereAdded,q=a.nodesWereRemoved,r=a.registerWrapper,s=a.snapshotNodeList,t=a.unwrap,u=a.wrap,v=/&|<|"/g,w={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},x=window.HTMLElement;g.prototype=Object.create(l.prototype),o(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){var b=s(this.childNodes);this.invalidateShadowRenderer()?f(this,a,this.tagName):this.impl.innerHTML=a;var c=s(this.childNodes);n(this,"childList",{addedNodes:c,removedNodes:b}),q(b),p(c)},get outerHTML(){return d(this)},set outerHTML(a){var b=this.parentNode;b&&(b.invalidateShadowRenderer(),this.impl.outerHTML=a)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(i),["scrollLeft","scrollTop"].forEach(j),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(k),r(x,g,document.createElement("b")),a.wrappers.HTMLElement=g,a.getInnerHTML=e,a.setInnerHTML=f}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=o.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);o.set(a,b)}return b}function c(a){var c,d=b(a.ownerDocument),e=l(d.createDocumentFragment());for(h();c=a.firstChild;)e.appendChild(c);return k(),e}function d(a){if(e.call(this,a),!p){var b=c(a);n.set(this,m(b))}}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.muteMutationEvents,i=a.registerWrapper,j=a.setInnerHTML,k=a.unmuteMutationEvents,l=a.unwrap,m=a.wrap,n=new WeakMap,o=new WeakMap,p=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){return p?m(this.impl.content):n.get(this)},get innerHTML(){return f(this.content)},set innerHTML(a){j(this.content,a)}}),p&&i(p,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement;a.mixin;var g=a.registerWrapper,h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createTextNode("")),i=f(document.createComment(""));a.wrappers.Comment=i,a.wrappers.DocumentFragment=g,a.wrappers.Text=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=i(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),g(b,this);var d=a.shadowRoot;k.set(this,d),j.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new WeakMap,k=new WeakMap;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return k.get(this)||null},get host(){return j.get(this)||null},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return this.querySelector("#"+a)}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=F(a),g=F(c),h=e?F(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=G(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=F(a),d=c.parentNode;if(d){var e=G(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=I.get(a);c||I.set(a,c=[]),c.push(b)}function f(a){H.set(a,[])}function g(a){return H.get(a)}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof y))return!1;if(!L.test(c))return!1;if(":"===c[0]&&!M.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<O.length;a++)O[a].render();O=[]}function l(){E=null,k()}function m(a){var b=K.get(a);return b||(b=new q(a),K.set(a,b)),b}function n(a){for(;a;a=a.parentNode)if(a instanceof C)return a;return null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof z}function s(a){return a instanceof z}function t(a){return a instanceof A}function u(a){return a instanceof A}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){J.set(a,b)}var y=a.wrappers.Element,z=a.wrappers.HTMLContentElement,A=a.wrappers.HTMLShadowElement,B=a.wrappers.Node,C=a.wrappers.ShadowRoot;a.assert,a.mixin,a.muteMutationEvents;var D=a.oneOf;a.unmuteMutationEvents;var E,F=a.unwrap,G=a.wrap,H=new WeakMap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=/^[*.:#[a-zA-Z_|]/,M=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),N=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),O=[],P=new ArraySplice;P.equals=function(a,b){return F(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(F(b)),g=a||new WeakMap,i=P.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=G(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&G(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,O.push(this),E)return;E=window[N](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},B.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},z.prototype.getDistributedNodes=function(){return k(),g(this)},A.prototype.nodeIsInserted_=z.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=I,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=J,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLSelectElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return v(c.apply(this.impl,arguments))}}function d(a,b){y.call(b.impl,u(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof n&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return v(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.SelectorsInterface,n=a.wrappers.ShadowRoot,o=a.defineWrapGetter,p=a.elementFromPoint,q=a.forwardMethodsToWrapper,r=a.matchesName,s=a.mixin,t=a.registerWrapper,u=a.unwrap,v=a.wrap,w=a.wrapEventTargetMethods;a.wrapNodeList;var x=new WeakMap;b.prototype=Object.create(k.prototype),o(b,"documentElement"),o(b,"body"),o(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var y=document.adoptNode;if(s(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return p(this,this,a,b)}}),document.register){var z=document.register;b.prototype.register=function(b,c){function d(a){return a?(this.impl=a,void 0):c.extends?document.createElement(c.extends,b):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})});var k={prototype:i};return c.extends&&(k.extends=c.extends),z.call(u(this),b,k),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i),d},q([window.HTMLDocument||window.Document],["register"])}q([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild",r]),q([window.HTMLDocument||window.Document],["adoptNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById"]),s(b.prototype,j),s(b.prototype,l),s(b.prototype,m),s(b.prototype,{get implementation(){var a=x.get(this);return a?a:(a=new g(u(this).implementation),x.set(this,a),a)}}),t(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&t(window.HTMLDocument,b),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),t(window.DOMImplementation,g),q([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=a.renderAllPending,j=window.Window;b.prototype=Object.create(c.prototype);var k=window.getComputedStyle;j.prototype.getComputedStyle=function(a,b){return i(),k.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){j.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return k.call(f(this),g(a),b)}}),e(j,b),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}a.isWrapperFor;var c={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",data:"HTMLDataElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",time:"HTMLTimeElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",track:"HTMLTrackElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};
+Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]}),a.knownElements=c}(window.ShadowDOMPolyfill),function(){var a=window.ShadowDOMPolyfill;a.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(b){function c(a){if(a instanceof d)return"NodeList";if(a instanceof e)return"ShadowRoot";if(window.MutationRecord&&a instanceof MutationRecord)return"MutationRecord";if(window.MutationObserver&&a instanceof MutationObserver)return"MutationObserver";if(a instanceof HTMLTemplateElement)return"HTMLTemplateElement";var c=f(a);if(a!==c){var g=a.constructor;if(g===c.constructor){var h=g._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(c),h=h.substring(8,h.length-1),g._ShadowDOMPolyfill$cacheTag_=h),h}a=c}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.unwrapIfNeeded;return c}}();var Platform={};!function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(n,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=b.sheet.cssRules;return b.parentNode.removeChild(b),d}function e(a){for(var b=0,c=[];b<a.length;b++)c.push(a[b].cssText);return c.join("\n\n")}function f(a){a&&g().appendChild(document.createTextNode(a))}function g(){return h||(h=document.createElement("style"),h.setAttribute("ShadowCSSShim","")),h}var h,i={strictStyling:!1,registry:{},shimStyling:function(a,b,d){var e=this.isTypeExtension(d),g=this.registerDefinition(a,b,d);this.strictStyling&&this.applyScopeToContent(a,b),this.insertPolyfillDirectives(g.rootStyles),this.insertPolyfillRules(g.rootStyles);var h=this.stylesToShimmedCssText(g.scopeStyles,b,e);h+=this.extractPolyfillUnscopedRules(g.rootStyles),g.shimmedStyle=c(h),a&&(a.shimmedStyle=g.shimmedStyle);for(var i,j=0,k=g.rootStyles.length;k>j&&(i=g.rootStyles[j]);j++)i.parentNode.removeChild(i);f(h)},registerDefinition:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=a?a.querySelectorAll("style"):[];e=e?Array.prototype.slice.call(e,0):[],d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return!f||a&&!a.querySelector("shadow")||(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},isTypeExtension:function(a){return a&&a.indexOf("-")<0},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertPolyfillDirectives:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillDirectivesInCssText(a.textContent)},this)},insertPolyfillDirectivesInCssText:function(a){return a.replace(o,function(a,b){return b.slice(0,-2)+"{"})},insertPolyfillRules:function(a){a&&Array.prototype.forEach.call(a,function(a){a.textContent=this.insertPolyfillRulesInCssText(a.textContent)},this)},insertPolyfillRulesInCssText:function(a){return a.replace(p,function(a,b){return b.slice(0,-1)})},extractPolyfillUnscopedRules:function(a){var b="";return a&&Array.prototype.forEach.call(a,function(a){b+=this.extractPolyfillUnscopedRulesFromCssText(a.textContent)+"\n\n"},this),b},extractPolyfillUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";return c},stylesToShimmedCssText:function(a,b,c){return this.shimAtHost(a,b,c)+this.shimScoping(a,b,c)},shimAtHost:function(a,b,c){return a?this.convertAtHostStyles(a,b,c):void 0},convertAtHostStyles:function(a,c,f){var g=b(a),h=this;return g=g.replace(j,function(a,b){return h.scopeHostCss(b,c,f)}),g=e(this.findAtHostRules(d(g),this.makeScopeMatcher(c,f)))},scopeHostCss:function(a,b,c){var d=this;return a.replace(k,function(a,e,f){return d.scopeHostSelector(e,b,c)+" "+f+"\n	"})},scopeHostSelector:function(a,b,c){var d=[],e=a.split(","),f="[is="+b+"]";return e.forEach(function(a){a=a.trim(),a.match(l)?a=a.replace(l,c?f+"$1$3":b+"$1$3"):a.match(m)&&(a=c?f+a:b+a),d.push(a)},this),d.join(", ")},findAtHostRules:function(a,b){return Array.prototype.filter.call(a,this.isHostRule.bind(this,b))},isHostRule:function(a,b){return b.selectorText&&b.selectorText.match(a)||b.cssRules&&this.findAtHostRules(b.cssRules,a).length||b.type==CSSRule.WEBKIT_KEYFRAMES_RULE},shimScoping:function(a,b,c){return a?this.convertScopedStyles(a,b,c):void 0},convertScopedStyles:function(a,c,e){var f=b(a).replace(j,"");f=this.insertPolyfillHostInCssText(f),f=this.convertColonHost(f),f=this.convertPseudos(f),f=this.convertParts(f),f=this.convertCombinators(f);var g=d(f);return f=this.scopeRules(g,c,e)},convertPseudos:function(a){return a.replace(r," [pseudo=$1]")},convertParts:function(a){return a.replace(s," [part=$1]")},convertColonHost:function(a){return a.replace(t,function(a,b,c,d){return b=y,c?c.match(x)?b+c.replace(x,"")+d:b+c+d+", "+c+" "+b+d:b+d})},convertCombinators:function(a){return a.replace(/\^\^/g," ").replace(/\^/g," ")},scopeRules:function(a,b,c){var d="";return Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(d+=this.scopeSelector(a.selectorText,b,c,this.strictStyling)+" {\n	",d+=this.propertiesFromRule(a)+"\n}\n\n"):a.media?(d+="@media "+a.media.mediaText+" {\n",d+=this.scopeRules(a.cssRules,b),d+="\n}\n\n"):a.cssText&&(d+=a.cssText+"\n\n")},this),d},scopeSelector:function(a,b,c,d){var e=[],f=a.split(",");return f.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b,c)&&(a=d?this.applyStrictSelectorScope(a,b):this.applySimpleSelectorScope(a,b,c)),e.push(a)},this),e.join(", ")},selectorNeedsScoping:function(a,b,c){var d=this.makeScopeMatcher(b,c);return!a.match(d)},makeScopeMatcher:function(a,b){var c=b?"\\[is=['\"]?"+a+"['\"]?\\]":a;return new RegExp("^("+c+")"+u,"m")},applySimpleSelectorScope:function(a,b,c){var d=c?"[is="+b+"]":b;return a.match(z)?(a=a.replace(y,d),a.replace(z,d+" ")):d+" "+a},applyStrictSelectorScope:function(a,b){var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(z,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(v,x).replace(w,x)},propertiesFromRule:function(a){var b=a.style.cssText;return a.style.content&&!a.style.content.match(/['"]+/)&&(b="content: '"+a.style.content+"';\n"+a.style.cssText.replace(/content:[^;]*;/g,"")),b}},j=/@host[^{]*{(([^}]*?{[^{]*?}[\s\S]*?)+)}/gim,k=/([^{]*)({[\s\S]*?})/gim,l=/(.*)((?:\*)|(?:\:scope))(.*)/,m=/^[.\[:]/,n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,o=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,p=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/::(x-[^\s{,(]*)/gim,s=/::part\(([^)]*)\)/gim,t=/(-host)(?:\(([^)]*)\))?([^,{]*)/gim,u="([>\\s~+[.,{:][\\s\\S]*)?$",v=/@host/gim,w=/\:host/gim,x="-host",y="-host-no-combinator",z=/-host/gim;if(window.ShadowDOMPolyfill){f("style { display: none !important; }\n");var A=document.querySelector("head");A.insertBefore(g(),A.childNodes[0])}a.ShadowCSS=i}(window.Platform)}
\ No newline at end of file
diff --git a/pkg/shadow_dom/pubspec.yaml b/pkg/shadow_dom/pubspec.yaml
index 38516cb..358945b 100644
--- a/pkg/shadow_dom/pubspec.yaml
+++ b/pkg/shadow_dom/pubspec.yaml
@@ -1,7 +1,7 @@
 name: shadow_dom
-version: 0.9.0
-author: "Web UI Team <web-ui-dev@dartlang.org>"
-homepage: https://github.com/dart-lang/ShadowDOM/tree/conditional_shadowdom
+version: 0.9.1-dev
+author: Polymer.dart Authors <web-ui-dev@dartlang.org>
+homepage: https://www.dartlang.org/polymer-dart/
 description: >
   Shadow DOM is designed to provide encapsulation by hiding DOM subtrees under
   shadow roots. It provides a method of establishing and maintaining functional
diff --git a/pkg/stack_trace/lib/src/frame.dart b/pkg/stack_trace/lib/src/frame.dart
index b15f651..74aafcd 100644
--- a/pkg/stack_trace/lib/src/frame.dart
+++ b/pkg/stack_trace/lib/src/frame.dart
@@ -69,7 +69,8 @@
   /// This will usually be the string form of [uri], but a relative URI will be
   /// used if possible.
   String get library {
-    if (uri.scheme != 'file') return uri.toString();
+    if (uri.scheme != Uri.base.scheme) return uri.toString();
+    if (path.style == path.Style.url) return path.relative(uri.toString());
     return path.relative(path.fromUri(uri));
   }
 
@@ -118,6 +119,10 @@
     // always be found. The column is optional.
     var member = match[1].replaceAll("<anonymous closure>", "<fn>");
     var uri = Uri.parse(match[2]);
+    // Work around issue 11901.
+    if (uri == new Uri(path: 'timer_impl.dart')) {
+      uri = Uri.parse('dart:async/timer_impl.dart');
+    }
     var line = int.parse(match[3]);
     var column = null;
     var columnMatch = match[4];
@@ -136,14 +141,17 @@
 
     // V8 stack frames can be in two forms.
     if (match[2] != null) {
-      // The first form looks like "  at FUNCTION (URI:LINE:COL)"
-      var uri = Uri.parse(match[2]);
+      // The first form looks like " at FUNCTION (PATH:LINE:COL)". PATH is
+      // usually an absolute URL, but it can be a path if the stack frame came
+      // from d8.
+      var uri = _uriOrPathToUri(match[2]);
       var member = match[1].replaceAll("<anonymous>", "<fn>");
       return new Frame(uri, int.parse(match[3]), int.parse(match[4]), member);
     } else {
-      // The second form looks like " at URI:LINE:COL", and is used for
-      // anonymous functions.
-      var uri = Uri.parse(match[5]);
+      // The second form looks like " at PATH:LINE:COL", and is used for
+      // anonymous functions. PATH is usually an absolute URL, but it can be a
+      // path if the stack frame came from d8.
+      var uri = _uriOrPathToUri(match[5]);
       return new Frame(uri, int.parse(match[6]), int.parse(match[7]), "<fn>");
     }
   }
@@ -162,7 +170,8 @@
           "Couldn't parse Firefox stack trace line '$frame'.");
     }
 
-    var uri = Uri.parse(match[3]);
+    // Normally this is a URI, but in a jsshell trace it can be a path.
+    var uri = _uriOrPathToUri(match[3]);
     var member = match[1];
     member += new List.filled('/'.allMatches(match[2]).length, ".<fn>").join();
     if (member == '') member = '<fn>';
@@ -215,6 +224,30 @@
     return new Frame(uri, line, column, match[4]);
   }
 
+  /// A regular expression matching an absolute URI.
+  static final _uriRegExp = new RegExp(r'^[a-zA-Z][-+.a-zA-Z\d]*://');
+
+  /// A regular expression matching a Windows path.
+  static final _windowsRegExp = new RegExp(r'^([a-zA-Z]:[\\/]|\\\\)');
+
+  /// Converts [uriOrPath], which can be a URI, a Windows path, or a Posix path,
+  /// to a URI (absolute if possible).
+  static Uri _uriOrPathToUri(String uriOrPath) {
+    if (uriOrPath.contains(_uriRegExp)) {
+      return Uri.parse(uriOrPath);
+    } else if (uriOrPath.contains(_windowsRegExp)) {
+      return new Uri.file(uriOrPath, windows: true);
+    } else if (uriOrPath.startsWith('/')) {
+      return new Uri.file(uriOrPath, windows: false);
+    }
+
+    // As far as I've seen, Firefox and V8 both always report absolute paths in
+    // their stack frames. However, if we do get a relative path, we should
+    // handle it gracefully.
+    if (uriOrPath.contains('\\')) return path.windows.toUri(uriOrPath);
+    return Uri.parse(uriOrPath);
+  }
+
   Frame(this.uri, this.line, this.column, this.member);
 
   String toString() => '$location in $member';
diff --git a/pkg/stack_trace/pubspec.yaml b/pkg/stack_trace/pubspec.yaml
index 63a1bf9..c71a781 100644
--- a/pkg/stack_trace/pubspec.yaml
+++ b/pkg/stack_trace/pubspec.yaml
@@ -6,7 +6,7 @@
   A package for manipulating stack traces and printing them readably.
 
 dependencies:
-  path: ">=0.9.0 <0.10.0"
+  path: ">=1.0.0-rc.1 <2.0.0"
 
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
diff --git a/pkg/stack_trace/test/frame_test.dart b/pkg/stack_trace/test/frame_test.dart
index 97cf48a..9722d38 100644
--- a/pkg/stack_trace/test/frame_test.dart
+++ b/pkg/stack_trace/test/frame_test.dart
@@ -30,6 +30,15 @@
       expect(frame.member, equals('Foo._bar'));
     });
 
+    test('parses a stack frame with timer_impl correctly', () {
+      var frame = new Frame.parseVM("#1      Foo._bar "
+          "(timer_impl.dart:24)");
+      expect(frame.uri, equals(Uri.parse("dart:async/timer_impl.dart")));
+      expect(frame.line, equals(24));
+      expect(frame.column, null);
+      expect(frame.member, equals('Foo._bar'));
+    });
+
     test('converts "<anonymous closure>" to "<fn>"', () {
       String parsedMember(String member) =>
           new Frame.parseVM('#0 $member (foo:0:0)').member;
@@ -72,6 +81,52 @@
       expect(frame.member, equals('VW.call\$0'));
     });
 
+    test('parses a stack frame with an absolute POSIX path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          "(/path/to/stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("file:///path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with an absolute Windows path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          r"(C:\path\to\stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("file:///C:/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a Windows UNC path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          r"(\\mount\path\to\stuff.dart.js:560:28)");
+      expect(frame.uri,
+          equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative POSIX path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          "(path/to/stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative Windows path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          r"(path\to\stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
     test('parses an anonymous stack frame correctly', () {
       var frame = new Frame.parseV8(
           "    at http://pub.dartlang.org/stuff.dart.js:560:28");
@@ -135,6 +190,52 @@
       expect(frame.member, equals('VW.call\$0'));
     });
 
+    test('parses a stack frame with an absolute POSIX path correctly', () {
+      var frame = new Frame.parseFirefox(
+          ".VW.call\$0@/path/to/stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("file:///path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with an absolute Windows path correctly', () {
+      var frame = new Frame.parseFirefox(
+          r".VW.call$0@C:\path\to\stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("file:///C:/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a Windows UNC path correctly', () {
+      var frame = new Frame.parseFirefox(
+          r".VW.call$0@\\mount\path\to\stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative POSIX path correctly', () {
+      var frame = new Frame.parseFirefox(
+          ".VW.call\$0@path/to/stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative Windows path correctly', () {
+      var frame = new Frame.parseFirefox(
+          r".VW.call$0@path\to\stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
     test('parses a simple anonymous stack frame correctly', () {
       var frame = new Frame.parseFirefox(
           "@http://pub.dartlang.org/stuff.dart.js:560");
@@ -394,5 +495,11 @@
       expect(new Frame.parseVM('#0 Foo (dart:core/uri.dart:5)').toString(),
           equals('dart:core/uri.dart 5 in Foo'));
     });
+
+    test('prints relative paths as relative', () {
+      var relative = path.normalize('relative/path/to/foo.dart');
+      expect(new Frame.parseFriendly('$relative 5:10  Foo').toString(),
+          equals('$relative 5:10 in Foo'));
+    });
   });
 }
diff --git a/pkg/stack_trace/test/vm_test.dart b/pkg/stack_trace/test/vm_test.dart
index 6570c24..7e00b7a 100644
--- a/pkg/stack_trace/test/vm_test.dart
+++ b/pkg/stack_trace/test/vm_test.dart
@@ -43,16 +43,14 @@
     test('.parse parses a real stack trace correctly', () {
       var string = getStackTraceString();
       var trace = new Trace.parse(string);
-      var builder = new path.Builder(style: path.Style.url);
-      expect(builder.basename(trace.frames.first.uri.path),
+      expect(path.url.basename(trace.frames.first.uri.path),
           equals('vm_test.dart'));
       expect(trace.frames.first.member, equals('getStackTraceString'));
     });
 
     test('converts from a native stack trace correctly', () {
       var trace = new Trace.from(getStackTraceObject());
-      var builder = new path.Builder(style: path.Style.url);
-      expect(builder.basename(trace.frames.first.uri.path),
+      expect(path.url.basename(trace.frames.first.uri.path),
           equals('vm_test.dart'));
       expect(trace.frames.first.member, equals('getStackTraceObject'));
     });
diff --git a/pkg/template_binding/lib/src/input_bindings.dart b/pkg/template_binding/lib/src/input_bindings.dart
index 8e5b3b0..06b744f 100644
--- a/pkg/template_binding/lib/src/input_bindings.dart
+++ b/pkg/template_binding/lib/src/input_bindings.dart
@@ -128,42 +128,31 @@
 }
 
 class _SelectBinding extends _InputBinding {
+  MutationObserver _onMutation;
+
   _SelectBinding(node, property, model, path)
       : super(node, property, model, path);
 
   SelectElement get node => super.node;
 
   void valueChanged(newValue) {
+    _cancelMutationObserver();
+
     if (_tryUpdateValue(newValue)) return;
 
-    // The binding may wish to bind to an <option> which has not yet been
-    // produced by a child <template>. Furthermore, we may need to wait for
-    // <optgroup> iterating and then for <option>.
-    //
-    // Unlike the JavaScript implemenation, we don't have a special
-    // "Object.observe" event loop to schedule on.
-    // (See the the "ensureScheduled" function:
-    // https://github.com/Polymer/mdv/commit/9a51ad7ed74a292bf71662cea28acbd151ff65c8)
-    //
-    // Instead we use scheduleMicrotask. Each <template repeat> needs a delay of
-    // 2:
-    //   * once to happen after the child _TemplateIterator is created
-    //   * once to be after _TemplateIterator's CompoundPathObserver resolve
-    // And then we need to do this delay sequence twice:
-    //   * once for OPTGROUP
-    //   * once for OPTION.
-    // The resulting 2 * 2 is our maxRetries.
-    //
-    // TODO(jmesserly): a much better approach would be to find the nested
-    // <template> and wait on some future that completes when it has expanded.
-    var maxRetries = 4;
-    delaySetSelectedIndex() {
-      if (!_tryUpdateValue(newValue) && maxRetries-- > 0) {
-        scheduleMicrotask(delaySetSelectedIndex);
-      }
-    }
+    // It could be that a template will expand an <option> child (or grandchild,
+    // if we have an <optgroup> in between). Since selected index cannot be set
+    // if the children aren't created yet, we need to wait for them to be
+    // created do this with a MutationObserver.
+    // Dart note: unlike JS we use mutation observers to avoid:
+    // https://github.com/Polymer/NodeBind/issues/5
 
-    scheduleMicrotask(delaySetSelectedIndex);
+    // Note: it doesn't matter when the children get added; even if they get
+    // added much later, presumably we want the selected index data binding to
+    // still take effect.
+    _onMutation = new MutationObserver((x, y) {
+      if (_tryUpdateValue(value)) _cancelMutationObserver();
+    })..observe(node, childList: true, subtree: true);
   }
 
   bool _tryUpdateValue(newValue) {
@@ -177,7 +166,16 @@
     }
   }
 
+  void _cancelMutationObserver() {
+    if (_onMutation != null) {
+      _onMutation.disconnect();
+      _onMutation = null;
+    }
+  }
+
   void nodeValueChanged(e) {
+    _cancelMutationObserver();
+
     if (property == 'selectedIndex') {
       value = node.selectedIndex;
     } else if (property == 'value') {
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index 7c0b71b..cc52811 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -1157,7 +1157,9 @@
     expect(div.nodes[i++].text, 'Item 2');
   });
 
-  observeTest('Attribute Template Option/Optgroup', () {
+  // Note: we don't need a zone for this test, and we don't want to alter timing
+  // since we're testing a rather subtle relationship between select and option.
+  test('Attribute Template Option/Optgroup', () {
     var div = createTestHtml(
         '<template bind>'
           '<select selectedIndex="{{ selected }}">'
@@ -1175,27 +1177,27 @@
     });
 
     recursivelySetTemplateModel(div, m);
-    performMicrotaskCheckpoint();
+    Observable.dirtyCheck();
 
-    var select = div.nodes[0].nextNode;
-    expect(select.nodes.length, 2);
+    // Use a timer so it's slower than mutation observers.
+    return new Future(() {
+      var select = div.nodes[0].nextNode;
+      expect(select.nodes.length, 2);
 
-    scheduleMicrotask(expectAsync0(() {
-      scheduleMicrotask(expectAsync0(() {
-        // TODO(jmesserly): this should be called sooner.
-        expect(select.selectedIndex, 1);
-      }));
-    }));
-    expect(select.nodes[0].tagName, 'TEMPLATE');
-    expect((templateBind(templateBind(select.nodes[0]).ref)
-        .content.nodes[0] as Element).tagName, 'OPTGROUP');
+      expect(select.selectedIndex, 1, reason: 'selected index should update by '
+          'animationFrame time');
 
-    var optgroup = select.nodes[1];
-    expect(optgroup.nodes[0].tagName, 'TEMPLATE');
-    expect(optgroup.nodes[1].tagName, 'OPTION');
-    expect(optgroup.nodes[1].text, '0');
-    expect(optgroup.nodes[2].tagName, 'OPTION');
-    expect(optgroup.nodes[2].text, '1');
+      expect(select.nodes[0].tagName, 'TEMPLATE');
+      expect((templateBind(templateBind(select.nodes[0]).ref)
+          .content.nodes[0] as Element).tagName, 'OPTGROUP');
+
+      var optgroup = select.nodes[1];
+      expect(optgroup.nodes[0].tagName, 'TEMPLATE');
+      expect(optgroup.nodes[1].tagName, 'OPTION');
+      expect(optgroup.nodes[1].text, '0');
+      expect(optgroup.nodes[2].tagName, 'OPTION');
+      expect(optgroup.nodes[2].text, '1');
+    });
   });
 
   observeTest('NestedIterateTableMixedSemanticNative', () {
diff --git a/pkg/third_party/html5lib/lib/dom.dart b/pkg/third_party/html5lib/lib/dom.dart
index d73edaa..1c0b6de 100644
--- a/pkg/third_party/html5lib/lib/dom.dart
+++ b/pkg/third_party/html5lib/lib/dom.dart
@@ -181,6 +181,8 @@
     nodes.addAll(parseFragment(value, container: tagName).nodes);
   }
 
+  Node get firstChild => nodes.isNotEmpty ? nodes[0] : null;
+
   void _addOuterHtml(StringBuffer str);
 
   void _addInnerHtml(StringBuffer str) {
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index 728b008..0e54366 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: html5lib
-version: 0.9.0
+version: 0.9.1-dev
 author: Dart Team <misc@dartlang.org>
 description: A library for working with HTML documents.
 homepage: http://pub.dartlang.org/packages/html5lib
diff --git a/pkg/unittest/lib/compact_vm_config.dart b/pkg/unittest/lib/compact_vm_config.dart
index 97c120a..7724599 100644
--- a/pkg/unittest/lib/compact_vm_config.dart
+++ b/pkg/unittest/lib/compact_vm_config.dart
@@ -190,7 +190,7 @@
 void useCompactVMConfiguration() {
   // If the test is running on the Dart buildbots, we don't want to use this
   // config since it's output may not be what the bots expect.
-  if (Platform.environment.containsKey('BUILDBOT_BUILDERNAME')) {
+  if (Platform.environment['LOGNAME'] == 'chrome-bot') {
     return;
   }
 
diff --git a/pkg/unittest/lib/src/test_case.dart b/pkg/unittest/lib/src/test_case.dart
index 1dc4264..820fce3 100644
--- a/pkg/unittest/lib/src/test_case.dart
+++ b/pkg/unittest/lib/src/test_case.dart
@@ -71,7 +71,6 @@
   bool get isComplete => !enabled || result != null;
 
   Function _errorHandler(String stage) => (e, stack) {
-    var stack;
     if (stack == null && e is Error) {
       stack = e.stackTrace;
     }
diff --git a/pkg/unittest/lib/test_controller.js b/pkg/unittest/lib/test_controller.js
index f78fbde..6f604cd 100644
--- a/pkg/unittest/lib/test_controller.js
+++ b/pkg/unittest/lib/test_controller.js
@@ -47,7 +47,7 @@
 }
 
 // testRunner is provided by content shell.
-// It is not available in selenium tests.
+// It is not available in browser tests.
 var testRunner = window.testRunner || window.layoutTestController;
 
 var waitForDone = false;
@@ -135,8 +135,8 @@
   if (message) {
     printMessage('Error: ' + String(message));
   }
-  // dart/tools/testing/run_selenium.py is looking for either PASS or
-  // FAIL and will continue polling until one of these words show up.
+  // dart/tools/testing/test_runner.dart is looking for either PASS or
+  // FAIL in a browser test's output.
   printMessage('FAIL');
   notifyDone();
 }
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index c13aa9d..41bfc92 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -295,13 +295,16 @@
 /** Time since we last gave non-sync code a chance to be scheduled. */
 var _lastBreath = new DateTime.now().millisecondsSinceEpoch;
 
-/** Test case result strings. */
+/* Test case result strings. */
 // TODO(gram) we should change these constants to use a different string
 // (so that writing 'FAIL' in the middle of a test doesn't
 // imply that the test fails). We can't do it without also changing
 // the testrunner and test.dart though.
+/// Result string for a passing test case.
 const PASS  = 'pass';
+/// Result string for a failing test case.
 const FAIL  = 'fail';
+/// Result string for an test case with an error.
 const ERROR = 'error';
 
 /**
diff --git a/pkg/unittest/test/missing_tick_test.dart b/pkg/unittest/test/missing_tick_test.dart
index 7b42fab..92ab891 100644
--- a/pkg/unittest/test/missing_tick_test.dart
+++ b/pkg/unittest/test/missing_tick_test.dart
@@ -6,6 +6,8 @@
 
 // TODO(gram): Convert to a shouldFail passing test.
 main() {
+  SimpleConfiguration config = unittestConfiguration;
+  config.timeout = const Duration(seconds: 2);
   group('Broken', () {
     test('test that should time out', () {
       expectAsync0(() {});
diff --git a/pkg/unmodifiable_collection/lib/unmodifiable_collection.dart b/pkg/unmodifiable_collection/lib/unmodifiable_collection.dart
index 9fd35e8..17e24e5 100644
--- a/pkg/unmodifiable_collection/lib/unmodifiable_collection.dart
+++ b/pkg/unmodifiable_collection/lib/unmodifiable_collection.dart
@@ -3,362 +3,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /**
- * Wrappers that prevent List, Set, or Map objects from being modified.
+ * This library used to introduce unmodifiable wrappers for collections.
  *
- * The [Set] and [Map] wrappers allow reading from the wrapped collection,
- * but prohibit writing.
+ * This functionality has been moved to the `collection_helpers` library.
  *
- * The [List] wrapper prevents changes to the length of the wrapped list,
- * but allows changes to the contents.
+ * Please replace the import of this library with:
+ *
+ *     import "package:collection_helpers/wrappers.dart";
+ *
+ * and change dependencies to match.
  */
+@deprecated
 library unmodifiable_collection;
 
-import "dart:math" show Random;
-export "dart:collection" show UnmodifiableListView;
-
-/**
- * A fixed-length list.
- *
- * A NonGrowableListView contains a [List] object and ensures that
- * its length does not change.
- * Methods that would change the length of the list,
- * such as [add] and [remove], throw an [UnsupportedError].
- *
- * This class _does_ allow changes to the contents of the wrapped list.
- * You can, for example, [sort] the list.
- * Permitted operations defer to the wrapped list.
- */
-class NonGrowableListView<E> extends _IterableView<E>
-                                     implements List<E> {
-  List<E> _source;
-  NonGrowableListView(List<E> source) : _source = source;
-
-  static void _throw() {
-    throw new UnsupportedError(
-        "Cannot change the length of a fixed-length list");
-  }
-
-  int get length => _source.length;
-
-  E operator [](int index) => _source[index];
-
-  int indexOf(E element, [int start = 0]) => _source.indexOf(element, start);
-
-  int lastIndexOf(E element, [int start])
-      => _source.lastIndexOf(element, start);
-
-  Iterable<E> getRange(int start, int end) => _source.getRange(start, end);
-
-  List<E> sublist(int start, [int end]) => _source.sublist(start, end);
-
-  Iterable<E> get reversed => _source.reversed;
-
-  Map<int, E> asMap() => _source.asMap();
-
-  void operator []=(int index, E value) { _source[index] = value; }
-
-  void sort([int compare(E a, E b)]) { _source.sort(compare); }
-
-  void shuffle([Random random]) { _source.shuffle(random); }
-
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    _source.setRange(start, end, iterable, skipCount);
-  }
-
-  void fillRange(int start, int end, [E fillValue]) {
-    _source.fillRange(start, end, fillValue);
-  }
-
-  void setAll(int index, Iterable<E> iterable) {
-    _source.setAll(index, iterable);
-  }
-
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void set length(int newLength) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  bool add(E value) {
-    _throw();
-  }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void addAll(Iterable<E> iterable) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void insert(int index, E element) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void insertAll(int index, Iterable<E> iterable) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  bool remove(Object value) { _throw(); }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  E removeAt(int index) { _throw(); }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  E removeLast() { _throw(); }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void removeWhere(bool test(E element)) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void retainWhere(bool test(E element)) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void removeRange(int start, int end) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void replaceRange(int start, int end, Iterable<E> iterable) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
-  void clear() => _throw();
-}
-
-/**
- * An unmodifiable set.
- *
- * An UnmodifiableSetView contains a [Set] object and ensures
- * that it does not change.
- * Methods that would change the set,
- * such as [add] and [remove], throw an [UnsupportedError].
- * Permitted operations defer to the wrapped set.
- */
-class UnmodifiableSetView<E> extends _IterableView<E>
-                                      implements Set<E> {
-  Set<E> _source;
-  UnmodifiableSetView(Set<E> source) : _source = source;
-
-  void _throw() {
-    throw new UnsupportedError("Cannot modify an unmodifiable Set");
-  }
-
-  bool containsAll(Iterable<E> other) => _source.containsAll(other);
-
-  Set<E> intersection(Set<E> other) => _source.intersection(other);
-
-  Set<E> union(Set<E> other) => _source.union(other);
-
-  Set<E> difference(Set<E> other) => _source.difference(other);
-
-  E lookup(Object object) => _source.lookup(object);
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  bool add(E value) {
-    _throw();
-  }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  void addAll(Iterable<E> elements) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  bool remove(Object value) { _throw(); }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  void removeAll(Iterable elements) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  void retainAll(Iterable elements) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  void removeWhere(bool test(E element)) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  void retainWhere(bool test(E element)) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
-  void clear() => _throw();
-}
-
-/**
- * An unmodifiable map.
- *
- * An UnmodifiableMapView contains a [Map] object and ensures
- * that it does not change.
- * Methods that would change the map,
- * such as [addAll] and [remove], throw an [UnsupportedError].
- * Permitted operations defer to the wrapped map.
- */
-class UnmodifiableMapView<K, V> implements Map<K, V> {
-  Map<K, V> _source;
-  UnmodifiableMapView(Map<K, V> source) : _source = source;
-
-  static void _throw() {
-    throw new UnsupportedError("Cannot modify an unmodifiable Map");
-  }
-
-  int get length => _source.length;
-
-  bool get isEmpty => _source.isEmpty;
-
-  bool get isNotEmpty => _source.isNotEmpty;
-
-  V operator [](K key) => _source[key];
-
-  bool containsKey(K key) => _source.containsKey(key);
-
-  bool containsValue(V value) => _source.containsValue(value);
-
-  void forEach(void f(K key, V value)) => _source.forEach(f);
-
-  Iterable<K> get keys => _source.keys;
-
-  Iterable<V> get values => _source.values;
-
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
-  void operator []=(K key, V value) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
-  V putIfAbsent(K key, V ifAbsent()) { _throw(); }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
-  void addAll(Map<K, V> other) => _throw();
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
-  V remove(K key) { _throw(); }
-
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
-  void clear() => _throw();
-}
-
-abstract class _IterableView<E> {
-  Iterable<E> get _source;
-
-  bool any(bool test(E element)) => _source.any(test);
-
-  bool contains(E element) => _source.contains(element);
-
-  E elementAt(int index) => _source.elementAt(index);
-
-  bool every(bool test(E element)) => _source.every(test);
-
-  Iterable expand(Iterable f(E element)) => _source.expand(f);
-
-  E get first => _source.first;
-
-  E firstWhere(bool test(E element), { E orElse() })
-      => _source.firstWhere(test, orElse: orElse);
-
-  dynamic fold(var initialValue,
-               dynamic combine(var previousValue, E element))
-      => _source.fold(initialValue, combine);
-
-  void forEach(void f(E element)) => _source.forEach(f);
-
-  bool get isEmpty => _source.isEmpty;
-
-  bool get isNotEmpty => _source.isNotEmpty;
-
-  Iterator<E> get iterator => _source.iterator;
-
-  String join([String separator = ""]) => _source.join(separator);
-
-  E get last => _source.last;
-
-  E lastWhere(bool test(E element), {E orElse()})
-      => _source.lastWhere(test, orElse: orElse);
-
-  int get length => _source.length;
-
-  Iterable map(f(E element)) => _source.map(f);
-
-  E reduce(E combine(E value, E element)) => _source.reduce(combine);
-
-  E get single => _source.single;
-
-  E singleWhere(bool test(E element)) => _source.singleWhere(test);
-
-  Iterable<E> skip(int n) => _source.skip(n);
-
-  Iterable<E> skipWhile(bool test(E value)) => _source.skipWhile(test);
-
-  Iterable<E> take(int n) => _source.take(n);
-
-  Iterable<E> takeWhile(bool test(E value)) => _source.takeWhile(test);
-
-  List<E> toList({ bool growable: true }) => _source.toList(growable: growable);
-
-  Set<E> toSet() => _source.toSet();
-
-  Iterable<E> where(bool test(E element)) => _source.where(test);
-}
+export "package:collection_helpers/wrappers.dart"
+    show UnmodifiableListView,
+         UnmodifiableSetView,
+         UnmodifiableMapView,
+         NonGrowableListView;
diff --git a/pkg/unmodifiable_collection/pubspec.yaml b/pkg/unmodifiable_collection/pubspec.yaml
index 17a035f..b4ee459 100644
--- a/pkg/unmodifiable_collection/pubspec.yaml
+++ b/pkg/unmodifiable_collection/pubspec.yaml
@@ -1,10 +1,12 @@
 name: unmodifiable_collection
-version: 0.9.0
+version: 0.9.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
+documentation: http://api.dartlang.org/docs/pkg/unmodifiable_collection
 description: >
-  Unmodifiable wrappers for base collection types.
-dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+ Discontinued library. Use package:collection_helpers/wrappers.dart instead.
+
+dependencies:
+  collection_helpers: ">=0.9.0 <0.10.0"
 environment:
   sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/utf/lib/constants.dart b/pkg/utf/lib/constants.dart
new file mode 100644
index 0000000..11d0cc2
--- /dev/null
+++ b/pkg/utf/lib/constants.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of utf;
+
+/**
+ * Invalid codepoints or encodings may be substituted with the value U+fffd.
+ */
+const int UNICODE_REPLACEMENT_CHARACTER_CODEPOINT = 0xfffd;
+const int UNICODE_BOM = 0xfeff;
+const int UNICODE_UTF_BOM_LO = 0xff;
+const int UNICODE_UTF_BOM_HI = 0xfe;
+
+const int UNICODE_BYTE_ZERO_MASK = 0xff;
+const int UNICODE_BYTE_ONE_MASK = 0xff00;
+const int UNICODE_VALID_RANGE_MAX = 0x10ffff;
+const int UNICODE_PLANE_ONE_MAX = 0xffff;
+const int UNICODE_UTF16_RESERVED_LO = 0xd800;
+const int UNICODE_UTF16_RESERVED_HI = 0xdfff;
+const int UNICODE_UTF16_OFFSET = 0x10000;
+const int UNICODE_UTF16_SURROGATE_UNIT_0_BASE = 0xd800;
+const int UNICODE_UTF16_SURROGATE_UNIT_1_BASE = 0xdc00;
+const int UNICODE_UTF16_HI_MASK = 0xffc00;
+const int UNICODE_UTF16_LO_MASK = 0x3ff;
diff --git a/pkg/utf/lib/list_range.dart b/pkg/utf/lib/list_range.dart
new file mode 100644
index 0000000..06adb76
--- /dev/null
+++ b/pkg/utf/lib/list_range.dart
@@ -0,0 +1,78 @@
+// 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.
+
+part of utf;
+
+/**
+ * _ListRange in an internal type used to create a lightweight Interable on a
+ * range within a source list. DO NOT MODIFY the underlying list while
+ * iterating over it. The results of doing so are undefined.
+ */
+// TODO(floitsch): Consider removing the extend and switch to implements since
+// that's cheaper to allocate.
+class _ListRange extends IterableBase {
+  final List _source;
+  final int _offset;
+  final int _length;
+
+  _ListRange(source, [offset = 0, length]) :
+      this._source = source,
+      this._offset = offset,
+      this._length = (length == null ? source.length - offset : length) {
+    if (_offset < 0 || _offset > _source.length) {
+      throw new RangeError.value(_offset);
+    }
+    if (_length != null && (_length < 0)) {
+      throw new RangeError.value(_length);
+    }
+    if (_length + _offset > _source.length) {
+      throw new RangeError.value(_length + _offset);
+    }
+  }
+
+  _ListRangeIterator get iterator =>
+      new _ListRangeIteratorImpl(_source, _offset, _offset + _length);
+
+  int get length => _length;
+}
+
+/**
+ * The _ListRangeIterator provides more capabilities than a standard iterator,
+ * including the ability to get the current position, count remaining items,
+ * and move forward/backward within the iterator.
+ */
+abstract class _ListRangeIterator implements Iterator<int> {
+  bool moveNext();
+  int get current;
+  int get position;
+  void backup([by]);
+  int get remaining;
+  void skip([count]);
+}
+
+class _ListRangeIteratorImpl implements _ListRangeIterator {
+  final List<int> _source;
+  int _offset;
+  final int _end;
+
+  _ListRangeIteratorImpl(this._source, int offset, this._end)
+      : _offset = offset - 1;
+
+  int get current => _source[_offset];
+
+  bool moveNext() => ++_offset < _end;
+
+  int get position => _offset;
+
+  void backup([int by = 1]) {
+    _offset -= by;
+  }
+
+  int get remaining => _end - _offset - 1;
+
+  void skip([int count = 1]) {
+    _offset += count;
+  }
+}
+
diff --git a/pkg/utf/lib/utf.dart b/pkg/utf/lib/utf.dart
index 002287a..1028990 100644
--- a/pkg/utf/lib/utf.dart
+++ b/pkg/utf/lib/utf.dart
@@ -11,261 +11,9 @@
 import "dart:async";
 import "dart:collection";
 
+part "constants.dart";
+part "list_range.dart";
 part "utf_stream.dart";
 part "utf8.dart";
 part "utf16.dart";
 part "utf32.dart";
-
-// TODO(jmesserly): would be nice to have this on String (dartbug.com/6501).
-/**
- * Provide a list of Unicode codepoints for a given string.
- */
-List<int> stringToCodepoints(String str) {
-  // Note: str.codeUnits gives us 16-bit code units on all Dart implementations.
-  // So we need to convert.
-  return _utf16CodeUnitsToCodepoints(str.codeUnits);
-}
-
-/**
- * Generate a string from the provided Unicode codepoints.
- *
- * *Deprecated* Use [String.fromCharCodes] instead.
- */
-String codepointsToString(List<int> codepoints) {
-  return new String.fromCharCodes(codepoints);
-}
-
-/**
- * Invalid codepoints or encodings may be substituted with the value U+fffd.
- */
-const int UNICODE_REPLACEMENT_CHARACTER_CODEPOINT = 0xfffd;
-const int UNICODE_BOM = 0xfeff;
-const int UNICODE_UTF_BOM_LO = 0xff;
-const int UNICODE_UTF_BOM_HI = 0xfe;
-
-const int UNICODE_BYTE_ZERO_MASK = 0xff;
-const int UNICODE_BYTE_ONE_MASK = 0xff00;
-const int UNICODE_VALID_RANGE_MAX = 0x10ffff;
-const int UNICODE_PLANE_ONE_MAX = 0xffff;
-const int UNICODE_UTF16_RESERVED_LO = 0xd800;
-const int UNICODE_UTF16_RESERVED_HI = 0xdfff;
-const int UNICODE_UTF16_OFFSET = 0x10000;
-const int UNICODE_UTF16_SURROGATE_UNIT_0_BASE = 0xd800;
-const int UNICODE_UTF16_SURROGATE_UNIT_1_BASE = 0xdc00;
-const int UNICODE_UTF16_HI_MASK = 0xffc00;
-const int UNICODE_UTF16_LO_MASK = 0x3ff;
-
-/**
- * Encode code points as UTF16 code units.
- */
-List<int> _codepointsToUtf16CodeUnits(
-    List<int> codepoints,
-    [int offset = 0,
-     int length,
-     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-
-  _ListRange listRange = new _ListRange(codepoints, offset, length);
-  int encodedLength = 0;
-  for (int value in listRange) {
-    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
-        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
-      encodedLength++;
-    } else if (value > UNICODE_PLANE_ONE_MAX &&
-        value <= UNICODE_VALID_RANGE_MAX) {
-      encodedLength += 2;
-    } else {
-      encodedLength++;
-    }
-  }
-
-  List<int> codeUnitsBuffer = new List<int>(encodedLength);
-  int j = 0;
-  for (int value in listRange) {
-    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
-        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
-      codeUnitsBuffer[j++] = value;
-    } else if (value > UNICODE_PLANE_ONE_MAX &&
-        value <= UNICODE_VALID_RANGE_MAX) {
-      int base = value - UNICODE_UTF16_OFFSET;
-      codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
-          ((base & UNICODE_UTF16_HI_MASK) >> 10);
-      codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_1_BASE +
-          (base & UNICODE_UTF16_LO_MASK);
-    } else if (replacementCodepoint != null) {
-      codeUnitsBuffer[j++] = replacementCodepoint;
-    } else {
-      throw new ArgumentError("Invalid encoding");
-    }
-  }
-  return codeUnitsBuffer;
-}
-
-/**
- * Decodes the utf16 codeunits to codepoints.
- */
-List<int> _utf16CodeUnitsToCodepoints(
-    List<int> utf16CodeUnits, [int offset = 0, int length,
-    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  _ListRangeIterator source =
-      (new _ListRange(utf16CodeUnits, offset, length)).iterator;
-  Utf16CodeUnitDecoder decoder = new Utf16CodeUnitDecoder
-      .fromListRangeIterator(source, replacementCodepoint);
-  List<int> codepoints = new List<int>(source.remaining);
-  int i = 0;
-  while (decoder.moveNext()) {
-    codepoints[i++] = decoder.current;
-  }
-  if (i == codepoints.length) {
-    return codepoints;
-  } else {
-    List<int> codepointTrunc = new List<int>(i);
-    codepointTrunc.setRange(0, i, codepoints);
-    return codepointTrunc;
-  }
-}
-
-/**
- * An Iterator<int> of codepoints built on an Iterator of UTF-16 code units.
- * The parameters can override the default Unicode replacement character. Set
- * the replacementCharacter to null to throw an ArgumentError
- * rather than replace the bad value.
- */
-class Utf16CodeUnitDecoder implements Iterator<int> {
-  final _ListRangeIterator utf16CodeUnitIterator;
-  final int replacementCodepoint;
-  int _current = null;
-
-  Utf16CodeUnitDecoder(List<int> utf16CodeUnits, [int offset = 0, int length,
-      int this.replacementCodepoint =
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      utf16CodeUnitIterator =
-          (new _ListRange(utf16CodeUnits, offset, length)).iterator;
-
-  Utf16CodeUnitDecoder.fromListRangeIterator(
-      _ListRangeIterator this.utf16CodeUnitIterator,
-      int this.replacementCodepoint);
-
-  Iterator<int> get iterator => this;
-
-  int get current => _current;
-
-  bool moveNext() {
-    _current = null;
-    if (!utf16CodeUnitIterator.moveNext()) return false;
-
-    int value = utf16CodeUnitIterator.current;
-    if (value < 0) {
-      if (replacementCodepoint != null) {
-        _current = replacementCodepoint;
-      } else {
-        throw new ArgumentError(
-            "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
-      }
-    } else if (value < UNICODE_UTF16_RESERVED_LO ||
-        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
-      // transfer directly
-      _current = value;
-    } else if (value < UNICODE_UTF16_SURROGATE_UNIT_1_BASE &&
-        utf16CodeUnitIterator.moveNext()) {
-      // merge surrogate pair
-      int nextValue = utf16CodeUnitIterator.current;
-      if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_1_BASE &&
-          nextValue <= UNICODE_UTF16_RESERVED_HI) {
-        value = (value - UNICODE_UTF16_SURROGATE_UNIT_0_BASE) << 10;
-        value += UNICODE_UTF16_OFFSET +
-            (nextValue - UNICODE_UTF16_SURROGATE_UNIT_1_BASE);
-        _current = value;
-      } else {
-        if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_0_BASE &&
-           nextValue < UNICODE_UTF16_SURROGATE_UNIT_1_BASE) {
-          utf16CodeUnitIterator.backup();
-        }
-        if (replacementCodepoint != null) {
-          _current = replacementCodepoint;
-        } else {
-          throw new ArgumentError(
-              "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
-        }
-      }
-    } else if (replacementCodepoint != null) {
-      _current = replacementCodepoint;
-    } else {
-      throw new ArgumentError(
-          "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
-    }
-    return true;
-  }
-}
-
-/**
- * _ListRange in an internal type used to create a lightweight Interable on a
- * range within a source list. DO NOT MODIFY the underlying list while
- * iterating over it. The results of doing so are undefined.
- */
-// TODO(floitsch): Consider removing the extend and switch to implements since
-// that's cheaper to allocate.
-class _ListRange extends IterableBase {
-  final List _source;
-  final int _offset;
-  final int _length;
-
-  _ListRange(source, [offset = 0, length]) :
-      this._source = source,
-      this._offset = offset,
-      this._length = (length == null ? source.length - offset : length) {
-    if (_offset < 0 || _offset > _source.length) {
-      throw new RangeError.value(_offset);
-    }
-    if (_length != null && (_length < 0)) {
-      throw new RangeError.value(_length);
-    }
-    if (_length + _offset > _source.length) {
-      throw new RangeError.value(_length + _offset);
-    }
-  }
-
-  _ListRangeIterator get iterator =>
-      new _ListRangeIteratorImpl(_source, _offset, _offset + _length);
-
-  int get length => _length;
-}
-
-/**
- * The _ListRangeIterator provides more capabilities than a standard iterator,
- * including the ability to get the current position, count remaining items,
- * and move forward/backward within the iterator.
- */
-abstract class _ListRangeIterator implements Iterator<int> {
-  bool moveNext();
-  int get current;
-  int get position;
-  void backup([by]);
-  int get remaining;
-  void skip([count]);
-}
-
-class _ListRangeIteratorImpl implements _ListRangeIterator {
-  final List<int> _source;
-  int _offset;
-  final int _end;
-
-  _ListRangeIteratorImpl(this._source, int offset, this._end)
-      : _offset = offset - 1;
-
-  int get current => _source[_offset];
-
-  bool moveNext() => ++_offset < _end;
-
-  int get position => _offset;
-
-  void backup([int by = 1]) {
-    _offset -= by;
-  }
-
-  int get remaining => _end - _offset - 1;
-
-  void skip([int count = 1]) {
-    _offset += count;
-  }
-}
-
diff --git a/pkg/utf/lib/utf16.dart b/pkg/utf/lib/utf16.dart
index 7de9e61..438c678 100644
--- a/pkg/utf/lib/utf16.dart
+++ b/pkg/utf/lib/utf16.dart
@@ -4,6 +4,167 @@
 
 part of utf;
 
+// TODO(jmesserly): would be nice to have this on String (dartbug.com/6501).
+/**
+ * Provide a list of Unicode codepoints for a given string.
+ */
+List<int> stringToCodepoints(String str) {
+  // Note: str.codeUnits gives us 16-bit code units on all Dart implementations.
+  // So we need to convert.
+  return _utf16CodeUnitsToCodepoints(str.codeUnits);
+}
+
+/**
+ * Generate a string from the provided Unicode codepoints.
+ *
+ * *Deprecated* Use [String.fromCharCodes] instead.
+ */
+String codepointsToString(List<int> codepoints) {
+  return new String.fromCharCodes(codepoints);
+}
+
+/**
+ * An Iterator<int> of codepoints built on an Iterator of UTF-16 code units.
+ * The parameters can override the default Unicode replacement character. Set
+ * the replacementCharacter to null to throw an ArgumentError
+ * rather than replace the bad value.
+ */
+class Utf16CodeUnitDecoder implements Iterator<int> {
+  final _ListRangeIterator utf16CodeUnitIterator;
+  final int replacementCodepoint;
+  int _current = null;
+
+  Utf16CodeUnitDecoder(List<int> utf16CodeUnits, [int offset = 0, int length,
+      int this.replacementCodepoint =
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      utf16CodeUnitIterator =
+          (new _ListRange(utf16CodeUnits, offset, length)).iterator;
+
+  Utf16CodeUnitDecoder.fromListRangeIterator(
+      _ListRangeIterator this.utf16CodeUnitIterator,
+      int this.replacementCodepoint);
+
+  Iterator<int> get iterator => this;
+
+  int get current => _current;
+
+  bool moveNext() {
+    _current = null;
+    if (!utf16CodeUnitIterator.moveNext()) return false;
+
+    int value = utf16CodeUnitIterator.current;
+    if (value < 0) {
+      if (replacementCodepoint != null) {
+        _current = replacementCodepoint;
+      } else {
+        throw new ArgumentError(
+            "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
+      }
+    } else if (value < UNICODE_UTF16_RESERVED_LO ||
+        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
+      // transfer directly
+      _current = value;
+    } else if (value < UNICODE_UTF16_SURROGATE_UNIT_1_BASE &&
+        utf16CodeUnitIterator.moveNext()) {
+      // merge surrogate pair
+      int nextValue = utf16CodeUnitIterator.current;
+      if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_1_BASE &&
+          nextValue <= UNICODE_UTF16_RESERVED_HI) {
+        value = (value - UNICODE_UTF16_SURROGATE_UNIT_0_BASE) << 10;
+        value += UNICODE_UTF16_OFFSET +
+            (nextValue - UNICODE_UTF16_SURROGATE_UNIT_1_BASE);
+        _current = value;
+      } else {
+        if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_0_BASE &&
+           nextValue < UNICODE_UTF16_SURROGATE_UNIT_1_BASE) {
+          utf16CodeUnitIterator.backup();
+        }
+        if (replacementCodepoint != null) {
+          _current = replacementCodepoint;
+        } else {
+          throw new ArgumentError(
+              "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
+        }
+      }
+    } else if (replacementCodepoint != null) {
+      _current = replacementCodepoint;
+    } else {
+      throw new ArgumentError(
+          "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
+    }
+    return true;
+  }
+}
+
+/**
+ * Encode code points as UTF16 code units.
+ */
+List<int> _codepointsToUtf16CodeUnits(
+    List<int> codepoints,
+    [int offset = 0,
+     int length,
+     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+
+  _ListRange listRange = new _ListRange(codepoints, offset, length);
+  int encodedLength = 0;
+  for (int value in listRange) {
+    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
+        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
+      encodedLength++;
+    } else if (value > UNICODE_PLANE_ONE_MAX &&
+        value <= UNICODE_VALID_RANGE_MAX) {
+      encodedLength += 2;
+    } else {
+      encodedLength++;
+    }
+  }
+
+  List<int> codeUnitsBuffer = new List<int>(encodedLength);
+  int j = 0;
+  for (int value in listRange) {
+    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
+        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
+      codeUnitsBuffer[j++] = value;
+    } else if (value > UNICODE_PLANE_ONE_MAX &&
+        value <= UNICODE_VALID_RANGE_MAX) {
+      int base = value - UNICODE_UTF16_OFFSET;
+      codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
+          ((base & UNICODE_UTF16_HI_MASK) >> 10);
+      codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_1_BASE +
+          (base & UNICODE_UTF16_LO_MASK);
+    } else if (replacementCodepoint != null) {
+      codeUnitsBuffer[j++] = replacementCodepoint;
+    } else {
+      throw new ArgumentError("Invalid encoding");
+    }
+  }
+  return codeUnitsBuffer;
+}
+
+/**
+ * Decodes the utf16 codeunits to codepoints.
+ */
+List<int> _utf16CodeUnitsToCodepoints(
+    List<int> utf16CodeUnits, [int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  _ListRangeIterator source =
+      (new _ListRange(utf16CodeUnits, offset, length)).iterator;
+  Utf16CodeUnitDecoder decoder = new Utf16CodeUnitDecoder
+      .fromListRangeIterator(source, replacementCodepoint);
+  List<int> codepoints = new List<int>(source.remaining);
+  int i = 0;
+  while (decoder.moveNext()) {
+    codepoints[i++] = decoder.current;
+  }
+  if (i == codepoints.length) {
+    return codepoints;
+  } else {
+    List<int> codepointTrunc = new List<int>(i);
+    codepointTrunc.setRange(0, i, codepoints);
+    return codepointTrunc;
+  }
+}
+
 /**
  * Decodes the UTF-16 bytes as an iterable. Thus, the consumer can only convert
  * as much of the input as needed. Determines the byte order from the BOM,
@@ -256,7 +417,12 @@
 
   bool moveNext() {
     _current = null;
-    if (utf16EncodedBytesIterator.remaining < 2) {
+    int remaining = utf16EncodedBytesIterator.remaining;
+    if (remaining == 0) {
+      _current = null;
+      return false;
+    }
+    if (remaining == 1) {
       utf16EncodedBytesIterator.moveNext();
       if (replacementCodepoint != null) {
         _current = replacementCodepoint;
@@ -265,10 +431,9 @@
         throw new ArgumentError(
             "Invalid UTF16 at ${utf16EncodedBytesIterator.position}");
       }
-    } else {
-      _current = decode();
-      return true;
     }
+    _current = decode();
+    return true;
   }
 
   int get position => utf16EncodedBytesIterator.position ~/ 2;
diff --git a/pkg/utf/lib/utf32.dart b/pkg/utf/lib/utf32.dart
index 885ed94..c481c81 100644
--- a/pkg/utf/lib/utf32.dart
+++ b/pkg/utf/lib/utf32.dart
@@ -234,7 +234,12 @@
 
   bool moveNext() {
     _current = null;
-    if (utf32EncodedBytesIterator.remaining < 4) {
+    int remaining = utf32EncodedBytesIterator.remaining;
+    if (remaining == 0) {
+      _current = null;
+      return false;
+    }
+    if (remaining < 4) {
       utf32EncodedBytesIterator.skip(utf32EncodedBytesIterator.remaining);
       if (replacementCodepoint != null) {
           _current = replacementCodepoint;
@@ -243,18 +248,17 @@
         throw new ArgumentError(
             "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
       }
+    }
+    int codepoint = decode();
+    if (_validCodepoint(codepoint)) {
+      _current = codepoint;
+      return true;
+    } else if (replacementCodepoint != null) {
+      _current = replacementCodepoint;
+      return true;
     } else {
-      int codepoint = decode();
-      if (_validCodepoint(codepoint)) {
-        _current = codepoint;
-        return true;
-      } else if (replacementCodepoint != null) {
-        _current = replacementCodepoint;
-        return true;
-      } else {
-        throw new ArgumentError(
-            "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
-      }
+      throw new ArgumentError(
+          "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
     }
   }
 
diff --git a/pkg/utf/test/unicode_core_test.dart b/pkg/utf/test/unicode_core_test.dart
new file mode 100755
index 0000000..129273b
--- /dev/null
+++ b/pkg/utf/test/unicode_core_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf;
+import 'package:expect/expect.dart';
+import 'dart:collection';
+
+part '../lib/constants.dart';
+part '../lib/list_range.dart';
+part '../lib/utf16.dart';
+
+main() {
+  testCodepointsToUtf16CodeUnits();
+  testUtf16bytesToCodepoints();
+}
+
+void testCodepointsToUtf16CodeUnits() {
+  // boundary conditions
+  Expect.listEquals([], _codepointsToUtf16CodeUnits([]), "no input");
+  Expect.listEquals([0x0], _codepointsToUtf16CodeUnits([0x0]), "0");
+  Expect.listEquals([0xd800, 0xdc00],
+      _codepointsToUtf16CodeUnits([0x10000]), "10000");
+
+  Expect.listEquals([0xffff],
+      _codepointsToUtf16CodeUnits([0xffff]), "ffff");
+  Expect.listEquals([0xdbff, 0xdfff],
+      _codepointsToUtf16CodeUnits([0x10ffff]), "10ffff");
+
+  Expect.listEquals([0xd7ff],
+      _codepointsToUtf16CodeUnits([0xd7ff]), "d7ff");
+  Expect.listEquals([0xe000],
+      _codepointsToUtf16CodeUnits([0xe000]), "e000");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      _codepointsToUtf16CodeUnits([0xd800]), "d800");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      _codepointsToUtf16CodeUnits([0xdfff]), "dfff");
+}
+
+void testUtf16bytesToCodepoints() {
+  // boundary conditions: First possible values
+  Expect.listEquals([], _utf16CodeUnitsToCodepoints([]), "no input");
+  Expect.listEquals([0x0], _utf16CodeUnitsToCodepoints([0x0]), "0");
+  Expect.listEquals([0x10000],
+      _utf16CodeUnitsToCodepoints([0xd800, 0xdc00]), "10000");
+
+  // boundary conditions: Last possible sequence of a certain length
+  Expect.listEquals([0xffff],
+      _utf16CodeUnitsToCodepoints([0xffff]), "ffff");
+  Expect.listEquals([0x10ffff],
+      _utf16CodeUnitsToCodepoints([0xdbff, 0xdfff]), "10ffff");
+
+  // other boundary conditions
+  Expect.listEquals([0xd7ff],
+      _utf16CodeUnitsToCodepoints([0xd7ff]), "d7ff");
+  Expect.listEquals([0xe000],
+      _utf16CodeUnitsToCodepoints([0xe000]), "e000");
+
+  // unexpected continuation bytes
+  Expect.listEquals([0xfffd],
+      _utf16CodeUnitsToCodepoints([0xdc00]),
+      "dc00 first unexpected continuation byte");
+  Expect.listEquals([0xfffd],
+      _utf16CodeUnitsToCodepoints([0xdfff]),
+      "dfff last unexpected continuation byte");
+  Expect.listEquals([0xfffd],
+      _utf16CodeUnitsToCodepoints([0xdc00]),
+      "1 unexpected continuation bytes");
+  Expect.listEquals([0xfffd, 0xfffd],
+      _utf16CodeUnitsToCodepoints([0xdc00, 0xdc00]),
+      "2 unexpected continuation bytes");
+  Expect.listEquals([0xfffd, 0xfffd ,0xfffd],
+      _utf16CodeUnitsToCodepoints([0xdc00, 0xdc00, 0xdc00]),
+      "3 unexpected continuation bytes");
+
+  // incomplete sequences
+  Expect.listEquals([0xfffd], _utf16CodeUnitsToCodepoints([0xd800]),
+      "d800 last byte missing");
+  Expect.listEquals([0xfffd], _utf16CodeUnitsToCodepoints([0xdbff]),
+      "dbff last byte missing");
+
+  // concatenation of incomplete sequences
+  Expect.listEquals([0xfffd, 0xfffd],
+      _utf16CodeUnitsToCodepoints([0xd800, 0xdbff]),
+      "d800 dbff last byte missing");
+
+  // impossible bytes
+  Expect.listEquals([0xfffd], _utf16CodeUnitsToCodepoints([0x110000]),
+      "110000 out of bounds");
+
+  // overlong sequences not possible in utf16 (nothing < x10000)
+  // illegal code positions d800-dfff not encodable (< x10000)
+}
diff --git a/pkg/utf/test/utf16_test.dart b/pkg/utf/test/utf16_test.dart
new file mode 100755
index 0000000..6af766f
--- /dev/null
+++ b/pkg/utf/test/utf16_test.dart
@@ -0,0 +1,127 @@
+// 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 utf16_tests;
+import 'package:expect/expect.dart';
+import 'package:utf/utf.dart';
+
+const String testKoreanCharSubset = """
+가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
+개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
+갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
+
+const String testHanWater = "水";
+
+const List<int> testKoreanCharSubsetUtf16beBom = const<int>[
+    0xfe, 0xff, 0xac, 0x00, 0xac, 0x01, 0xac, 0x02,
+    0xac, 0x03, 0xac, 0x04, 0xac, 0x05, 0xac, 0x06,
+    0xac, 0x07, 0xac, 0x08, 0xac, 0x09, 0xac, 0x0a,
+    0xac, 0x0b, 0xac, 0x0c, 0xac, 0x0d, 0xac, 0x0e,
+    0xac, 0x0f, 0xac, 0x10, 0xac, 0x11, 0xac, 0x12,
+    0xac, 0x13, 0xac, 0x14, 0xac, 0x15, 0xac, 0x16,
+    0xac, 0x17, 0xac, 0x18, 0xac, 0x19, 0xac, 0x1a,
+    0xac, 0x1b, 0x00, 0x0a, 0xac, 0x1c, 0xac, 0x1d,
+    0xac, 0x1e, 0xac, 0x1f, 0xac, 0x20, 0xac, 0x21,
+    0xac, 0x22, 0xac, 0x23, 0xac, 0x24, 0xac, 0x25,
+    0xac, 0x26, 0xac, 0x27, 0xac, 0x28, 0xac, 0x29,
+    0xac, 0x2a, 0xac, 0x2b, 0xac, 0x2c, 0xac, 0x2d,
+    0xac, 0x2e, 0xac, 0x2f, 0xac, 0x30, 0xac, 0x31,
+    0xac, 0x32, 0xac, 0x33, 0xac, 0x34, 0xac, 0x35,
+    0xac, 0x36, 0xac, 0x37, 0x00, 0x0a, 0xac, 0x38,
+    0xac, 0x39, 0xac, 0x3a, 0xac, 0x3b, 0xac, 0x3c,
+    0xac, 0x3d, 0xac, 0x3e, 0xac, 0x3f, 0xac, 0x40,
+    0xac, 0x41, 0xac, 0x42, 0xac, 0x43, 0xac, 0x44,
+    0xac, 0x45, 0xac, 0x46, 0xac, 0x47, 0xac, 0x48,
+    0xac, 0x49, 0xac, 0x4a, 0xac, 0x4b, 0xac, 0x4c,
+    0xac, 0x4d, 0xac, 0x4e, 0xac, 0x4f, 0xac, 0x50,
+    0xac, 0x51, 0xac, 0x52, 0xac, 0x53];
+
+const List<int> testKoreanCharSubsetUtf16le = const<int>    [
+    0x00, 0xac, 0x01, 0xac, 0x02, 0xac, 0x03, 0xac,
+    0x04, 0xac, 0x05, 0xac, 0x06, 0xac, 0x07, 0xac,
+    0x08, 0xac, 0x09, 0xac, 0x0a, 0xac, 0x0b, 0xac,
+    0x0c, 0xac, 0x0d, 0xac, 0x0e, 0xac, 0x0f, 0xac,
+    0x10, 0xac, 0x11, 0xac, 0x12, 0xac, 0x13, 0xac,
+    0x14, 0xac, 0x15, 0xac, 0x16, 0xac, 0x17, 0xac,
+    0x18, 0xac, 0x19, 0xac, 0x1a, 0xac, 0x1b, 0xac,
+    0x0a, 0x00, 0x1c, 0xac, 0x1d, 0xac, 0x1e, 0xac,
+    0x1f, 0xac, 0x20, 0xac, 0x21, 0xac, 0x22, 0xac,
+    0x23, 0xac, 0x24, 0xac, 0x25, 0xac, 0x26, 0xac,
+    0x27, 0xac, 0x28, 0xac, 0x29, 0xac, 0x2a, 0xac,
+    0x2b, 0xac, 0x2c, 0xac, 0x2d, 0xac, 0x2e, 0xac,
+    0x2f, 0xac, 0x30, 0xac, 0x31, 0xac, 0x32, 0xac,
+    0x33, 0xac, 0x34, 0xac, 0x35, 0xac, 0x36, 0xac,
+    0x37, 0xac, 0x0a, 0x00, 0x38, 0xac, 0x39, 0xac,
+    0x3a, 0xac, 0x3b, 0xac, 0x3c, 0xac, 0x3d, 0xac,
+    0x3e, 0xac, 0x3f, 0xac, 0x40, 0xac, 0x41, 0xac,
+    0x42, 0xac, 0x43, 0xac, 0x44, 0xac, 0x45, 0xac,
+    0x46, 0xac, 0x47, 0xac, 0x48, 0xac, 0x49, 0xac,
+    0x4a, 0xac, 0x4b, 0xac, 0x4c, 0xac, 0x4d, 0xac,
+    0x4e, 0xac, 0x4f, 0xac, 0x50, 0xac, 0x51, 0xac,
+    0x52, 0xac, 0x53, 0xac];
+
+void main() {
+  testEncodeToUtf16();
+  testUtf16BytesToString();
+  testIterableMethods();
+}
+
+void testEncodeToUtf16() {
+  Expect.listEquals([], encodeUtf16be("")); // TODO(dcarlson) should we skip bom if empty?
+  Expect.listEquals(testKoreanCharSubsetUtf16beBom,
+      encodeUtf16(testKoreanCharSubset),
+      "encode UTF-16(BE by default) Korean");
+
+  Expect.listEquals(testKoreanCharSubsetUtf16le,
+      encodeUtf16le(testKoreanCharSubset),
+      "encode UTF-16LE Korean");
+}
+
+void testUtf16BytesToString() {
+  Expect.stringEquals("", decodeUtf16([]));
+  Expect.stringEquals(testHanWater, decodeUtf16([0x6C, 0x34]),
+      "Water variation 1");
+  Expect.stringEquals(testHanWater, decodeUtf16([0xFE, 0xFF, 0x6C, 0x34]),
+      "Water variation 2");
+  Expect.stringEquals(testHanWater, decodeUtf16([0xFF, 0xFE, 0x34, 0x6C]),
+      "Water variation 3");
+
+  Expect.stringEquals(testHanWater, decodeUtf16be([0x6C, 0x34]),
+      "Water variation 4");
+  Expect.stringEquals(testHanWater,
+      decodeUtf16be([0xFE, 0xFF, 0x6C, 0x34]),
+      "Water variation 5");
+
+  Expect.stringEquals(testHanWater, decodeUtf16le([0x34, 0x6C]),
+      "Water variation 6");
+  Expect.stringEquals(testHanWater,
+      decodeUtf16le([0xFF, 0xFE, 0x34, 0x6C]),
+      "Water variation 7");
+
+  Expect.stringEquals(testKoreanCharSubset,
+      decodeUtf16(testKoreanCharSubsetUtf16beBom), "UTF-16BE Korean");
+}
+
+void testIterableMethods() {
+  // empty input
+  Expect.isFalse(decodeUtf16AsIterable([]).iterator.moveNext());
+
+  IterableUtf16Decoder koreanDecoder =
+    decodeUtf16AsIterable(testKoreanCharSubsetUtf16beBom);
+  // get the first character
+  Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testKoreanCharSubset,
+      new String.fromCharCodes(new List<int>.from(koreanDecoder)));
+
+  // specify types
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom)))[0]);
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf16leAsIterable(testKoreanCharSubsetUtf16le)))[0]);
+  bool stripBom = false;
+  Expect.equals(UNICODE_BOM, (new List<int>
+      .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom,
+            0, null, stripBom)))[0]);
+}
diff --git a/pkg/utf/test/utf32_test.dart b/pkg/utf/test/utf32_test.dart
new file mode 100755
index 0000000..4fcdf29
--- /dev/null
+++ b/pkg/utf/test/utf32_test.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:utf/utf.dart';
+
+const String testKoreanCharSubset = """
+가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
+개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
+갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
+
+const String testHanTwice = "二";
+
+const List<int> testKoreanCharSubsetUtf32beBom = const<int>[
+    0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xac, 0x00,
+    0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xac, 0x02,
+    0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x04,
+    0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xac, 0x06,
+    0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xac, 0x08,
+    0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xac, 0x0a,
+    0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xac, 0x0c,
+    0x00, 0x00, 0xac, 0x0d, 0x00, 0x00, 0xac, 0x0e,
+    0x00, 0x00, 0xac, 0x0f, 0x00, 0x00, 0xac, 0x10,
+    0x00, 0x00, 0xac, 0x11, 0x00, 0x00, 0xac, 0x12,
+    0x00, 0x00, 0xac, 0x13, 0x00, 0x00, 0xac, 0x14,
+    0x00, 0x00, 0xac, 0x15, 0x00, 0x00, 0xac, 0x16,
+    0x00, 0x00, 0xac, 0x17, 0x00, 0x00, 0xac, 0x18,
+    0x00, 0x00, 0xac, 0x19, 0x00, 0x00, 0xac, 0x1a,
+    0x00, 0x00, 0xac, 0x1b, 0x00, 0x00, 0x00, 0x0a,
+    0x00, 0x00, 0xac, 0x1c, 0x00, 0x00, 0xac, 0x1d,
+    0x00, 0x00, 0xac, 0x1e, 0x00, 0x00, 0xac, 0x1f,
+    0x00, 0x00, 0xac, 0x20, 0x00, 0x00, 0xac, 0x21,
+    0x00, 0x00, 0xac, 0x22, 0x00, 0x00, 0xac, 0x23,
+    0x00, 0x00, 0xac, 0x24, 0x00, 0x00, 0xac, 0x25,
+    0x00, 0x00, 0xac, 0x26, 0x00, 0x00, 0xac, 0x27,
+    0x00, 0x00, 0xac, 0x28, 0x00, 0x00, 0xac, 0x29,
+    0x00, 0x00, 0xac, 0x2a, 0x00, 0x00, 0xac, 0x2b,
+    0x00, 0x00, 0xac, 0x2c, 0x00, 0x00, 0xac, 0x2d,
+    0x00, 0x00, 0xac, 0x2e, 0x00, 0x00, 0xac, 0x2f,
+    0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x31,
+    0x00, 0x00, 0xac, 0x32, 0x00, 0x00, 0xac, 0x33,
+    0x00, 0x00, 0xac, 0x34, 0x00, 0x00, 0xac, 0x35,
+    0x00, 0x00, 0xac, 0x36, 0x00, 0x00, 0xac, 0x37,
+    0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xac, 0x38,
+    0x00, 0x00, 0xac, 0x39, 0x00, 0x00, 0xac, 0x3a,
+    0x00, 0x00, 0xac, 0x3b, 0x00, 0x00, 0xac, 0x3c,
+    0x00, 0x00, 0xac, 0x3d, 0x00, 0x00, 0xac, 0x3e,
+    0x00, 0x00, 0xac, 0x3f, 0x00, 0x00, 0xac, 0x40,
+    0x00, 0x00, 0xac, 0x41, 0x00, 0x00, 0xac, 0x42,
+    0x00, 0x00, 0xac, 0x43, 0x00, 0x00, 0xac, 0x44,
+    0x00, 0x00, 0xac, 0x45, 0x00, 0x00, 0xac, 0x46,
+    0x00, 0x00, 0xac, 0x47, 0x00, 0x00, 0xac, 0x48,
+    0x00, 0x00, 0xac, 0x49, 0x00, 0x00, 0xac, 0x4a,
+    0x00, 0x00, 0xac, 0x4b, 0x00, 0x00, 0xac, 0x4c,
+    0x00, 0x00, 0xac, 0x4d, 0x00, 0x00, 0xac, 0x4e,
+    0x00, 0x00, 0xac, 0x4f, 0x00, 0x00, 0xac, 0x50,
+    0x00, 0x00, 0xac, 0x51, 0x00, 0x00, 0xac, 0x52,
+    0x00, 0x00, 0xac, 0x53];
+
+const List<int> testKoreanCharSubsetUtf32le = const<int>[
+    0x00, 0xac, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00,
+    0x02, 0xac, 0x00, 0x00, 0x03, 0xac, 0x00, 0x00,
+    0x04, 0xac, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00,
+    0x06, 0xac, 0x00, 0x00, 0x07, 0xac, 0x00, 0x00,
+    0x08, 0xac, 0x00, 0x00, 0x09, 0xac, 0x00, 0x00,
+    0x0a, 0xac, 0x00, 0x00, 0x0b, 0xac, 0x00, 0x00,
+    0x0c, 0xac, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x00,
+    0x0e, 0xac, 0x00, 0x00, 0x0f, 0xac, 0x00, 0x00,
+    0x10, 0xac, 0x00, 0x00, 0x11, 0xac, 0x00, 0x00,
+    0x12, 0xac, 0x00, 0x00, 0x13, 0xac, 0x00, 0x00,
+    0x14, 0xac, 0x00, 0x00, 0x15, 0xac, 0x00, 0x00,
+    0x16, 0xac, 0x00, 0x00, 0x17, 0xac, 0x00, 0x00,
+    0x18, 0xac, 0x00, 0x00, 0x19, 0xac, 0x00, 0x00,
+    0x1a, 0xac, 0x00, 0x00, 0x1b, 0xac, 0x00, 0x00,
+    0x0a, 0x00, 0x00, 0x00, 0x1c, 0xac, 0x00, 0x00,
+    0x1d, 0xac, 0x00, 0x00, 0x1e, 0xac, 0x00, 0x00,
+    0x1f, 0xac, 0x00, 0x00, 0x20, 0xac, 0x00, 0x00,
+    0x21, 0xac, 0x00, 0x00, 0x22, 0xac, 0x00, 0x00,
+    0x23, 0xac, 0x00, 0x00, 0x24, 0xac, 0x00, 0x00,
+    0x25, 0xac, 0x00, 0x00, 0x26, 0xac, 0x00, 0x00,
+    0x27, 0xac, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00,
+    0x29, 0xac, 0x00, 0x00, 0x2a, 0xac, 0x00, 0x00,
+    0x2b, 0xac, 0x00, 0x00, 0x2c, 0xac, 0x00, 0x00,
+    0x2d, 0xac, 0x00, 0x00, 0x2e, 0xac, 0x00, 0x00,
+    0x2f, 0xac, 0x00, 0x00, 0x30, 0xac, 0x00, 0x00,
+    0x31, 0xac, 0x00, 0x00, 0x32, 0xac, 0x00, 0x00,
+    0x33, 0xac, 0x00, 0x00, 0x34, 0xac, 0x00, 0x00,
+    0x35, 0xac, 0x00, 0x00, 0x36, 0xac, 0x00, 0x00,
+    0x37, 0xac, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
+    0x38, 0xac, 0x00, 0x00, 0x39, 0xac, 0x00, 0x00,
+    0x3a, 0xac, 0x00, 0x00, 0x3b, 0xac, 0x00, 0x00,
+    0x3c, 0xac, 0x00, 0x00, 0x3d, 0xac, 0x00, 0x00,
+    0x3e, 0xac, 0x00, 0x00, 0x3f, 0xac, 0x00, 0x00,
+    0x40, 0xac, 0x00, 0x00, 0x41, 0xac, 0x00, 0x00,
+    0x42, 0xac, 0x00, 0x00, 0x43, 0xac, 0x00, 0x00,
+    0x44, 0xac, 0x00, 0x00, 0x45, 0xac, 0x00, 0x00,
+    0x46, 0xac, 0x00, 0x00, 0x47, 0xac, 0x00, 0x00,
+    0x48, 0xac, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00,
+    0x4a, 0xac, 0x00, 0x00, 0x4b, 0xac, 0x00, 0x00,
+    0x4c, 0xac, 0x00, 0x00, 0x4d, 0xac, 0x00, 0x00,
+    0x4e, 0xac, 0x00, 0x00, 0x4f, 0xac, 0x00, 0x00,
+    0x50, 0xac, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
+    0x52, 0xac, 0x00, 0x00, 0x53, 0xac, 0x00, 0x00];
+
+void main() {
+  testUtf32BytesToString();
+  testEncodeToUtf32();
+  testIterableMethods();
+}
+
+void testEncodeToUtf32() {
+  Expect.listEquals([], encodeUtf32le(""), "no input"); // TODO(dcarlson) skip bom on empty?
+  Expect.listEquals(testKoreanCharSubsetUtf32beBom,
+      encodeUtf32(testKoreanCharSubset),
+      "encode UTF-32(BE by default) Korean");
+  Expect.listEquals(testKoreanCharSubsetUtf32le,
+      encodeUtf32le(testKoreanCharSubset),
+      "encode UTF-32(LE by default) Korean");
+}
+
+void testUtf32BytesToString() {
+  Expect.stringEquals("", decodeUtf32([]), "no input");
+  Expect.stringEquals("\ufffd", decodeUtf32([0]), "single byte");
+  Expect.stringEquals("\ufffd", decodeUtf32([0, 0, 0x4e]),
+      "short a byte");
+  Expect.stringEquals("\u4e8c\ufffd", decodeUtf32([0, 0, 0x4e, 0x8c, 0]),
+      "extra byte");
+
+  Expect.stringEquals(testHanTwice, decodeUtf32([0, 0, 0x4e, 0x8c]),
+      "twice variation 1");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
+      "twice variation 2");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
+      "twice variation 3");
+
+  Expect.stringEquals(testHanTwice, decodeUtf32be([0, 0, 0x4e, 0x8c]),
+      "twice variation 4");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32be([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
+      "twice variation 5");
+
+  Expect.stringEquals(testHanTwice, decodeUtf32le([0x8c, 0x4e, 0, 0]),
+      "twice variation 6");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32le([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
+      "twice variation 7");
+
+  Expect.stringEquals(testKoreanCharSubset,
+      decodeUtf32(testKoreanCharSubsetUtf32beBom),
+      "UTF-32BE Korean");
+}
+
+void testIterableMethods() {
+  // empty input
+  Expect.isFalse(decodeUtf32AsIterable([]).iterator.moveNext());
+
+  IterableUtf32Decoder koreanDecoder =
+    decodeUtf32AsIterable(testKoreanCharSubsetUtf32beBom);
+  // get the first character
+  Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testKoreanCharSubset,
+      new String.fromCharCodes(new List<int>.from(koreanDecoder)));
+
+  // specify types
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom)))[0]);
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf32leAsIterable(testKoreanCharSubsetUtf32le)))[0]);
+  bool stripBom = false;
+  Expect.equals(UNICODE_BOM, (new List<int>
+      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom,
+          0, null, stripBom)))[0]);
+}
diff --git a/pkg/utf/test/utf82_test.dart b/pkg/utf/test/utf82_test.dart
new file mode 100755
index 0000000..f8d585c
--- /dev/null
+++ b/pkg/utf/test/utf82_test.dart
@@ -0,0 +1,463 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:utf/utf.dart';
+
+const String testEnglishPhrase =
+    "The quick brown fox jumps over the lazy dog.";
+
+const List<int> testEnglishUtf8 = const<int> [
+    0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
+    0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
+    0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
+    0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
+    0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20,
+    0x64, 0x6f, 0x67, 0x2e];
+
+const String testDanishPhrase = "Quizdeltagerne spiste jordbær med "
+    "fløde mens cirkusklovnen Wolther spillede på xylofon.";
+
+const List<int> testDanishUtf8 = const<int>[
+    0x51, 0x75, 0x69, 0x7a, 0x64, 0x65, 0x6c, 0x74,
+    0x61, 0x67, 0x65, 0x72, 0x6e, 0x65, 0x20, 0x73,
+    0x70, 0x69, 0x73, 0x74, 0x65, 0x20, 0x6a, 0x6f,
+    0x72, 0x64, 0x62, 0xc3, 0xa6, 0x72, 0x20, 0x6d,
+    0x65, 0x64, 0x20, 0x66, 0x6c, 0xc3, 0xb8, 0x64,
+    0x65, 0x20, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x63,
+    0x69, 0x72, 0x6b, 0x75, 0x73, 0x6b, 0x6c, 0x6f,
+    0x76, 0x6e, 0x65, 0x6e, 0x20, 0x57, 0x6f, 0x6c,
+    0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x69,
+    0x6c, 0x6c, 0x65, 0x64, 0x65, 0x20, 0x70, 0xc3,
+    0xa5, 0x20, 0x78, 0x79, 0x6c, 0x6f, 0x66, 0x6f,
+    0x6e, 0x2e];
+
+// unusual formatting due to strange editor interaction w/ text direction.
+const String
+    testHebrewPhrase = "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה";
+
+const List<int> testHebrewUtf8 = const<int>[
+    0xd7, 0x93, 0xd7, 0x92, 0x20, 0xd7, 0xa1, 0xd7,
+    0xa7, 0xd7, 0xa8, 0xd7, 0x9f, 0x20, 0xd7, 0xa9,
+    0xd7, 0x98, 0x20, 0xd7, 0x91, 0xd7, 0x99, 0xd7,
+    0x9d, 0x20, 0xd7, 0x9e, 0xd7, 0x90, 0xd7, 0x95,
+    0xd7, 0x9b, 0xd7, 0x96, 0xd7, 0x91, 0x20, 0xd7,
+    0x95, 0xd7, 0x9c, 0xd7, 0xa4, 0xd7, 0xaa, 0xd7,
+    0xa2, 0x20, 0xd7, 0x9e, 0xd7, 0xa6, 0xd7, 0x90,
+    0x20, 0xd7, 0x9c, 0xd7, 0x95, 0x20, 0xd7, 0x97,
+    0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x94, 0x20, 0xd7,
+    0x90, 0xd7, 0x99, 0xd7, 0x9a, 0x20, 0xd7, 0x94,
+    0xd7, 0xa7, 0xd7, 0x9c, 0xd7, 0x99, 0xd7, 0x98,
+    0xd7, 0x94];
+
+const String testRussianPhrase = "Съешь же ещё этих мягких "
+    "французских булок да выпей чаю";
+
+const List<int> testRussianUtf8 = const<int>[
+    0xd0, 0xa1, 0xd1, 0x8a, 0xd0, 0xb5, 0xd1, 0x88,
+    0xd1, 0x8c, 0x20, 0xd0, 0xb6, 0xd0, 0xb5, 0x20,
+    0xd0, 0xb5, 0xd1, 0x89, 0xd1, 0x91, 0x20, 0xd1,
+    0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0x20,
+    0xd0, 0xbc, 0xd1, 0x8f, 0xd0, 0xb3, 0xd0, 0xba,
+    0xd0, 0xb8, 0xd1, 0x85, 0x20, 0xd1, 0x84, 0xd1,
+    0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, 0x86, 0xd1,
+    0x83, 0xd0, 0xb7, 0xd1, 0x81, 0xd0, 0xba, 0xd0,
+    0xb8, 0xd1, 0x85, 0x20, 0xd0, 0xb1, 0xd1, 0x83,
+    0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xba, 0x20, 0xd0,
+    0xb4, 0xd0, 0xb0, 0x20, 0xd0, 0xb2, 0xd1, 0x8b,
+    0xd0, 0xbf, 0xd0, 0xb5, 0xd0, 0xb9, 0x20, 0xd1,
+    0x87, 0xd0, 0xb0, 0xd1, 0x8e];
+
+const String testGreekPhrase = "Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ "
+    "στὸ χρυσαφὶ ξέφωτο";
+
+const List<int> testGreekUtf8 = const<int>[
+    0xce, 0x93, 0xce, 0xb1, 0xce, 0xb6, 0xce, 0xad,
+    0xce, 0xb5, 0xcf, 0x82, 0x20, 0xce, 0xba, 0xce,
+    0xb1, 0xe1, 0xbd, 0xb6, 0x20, 0xce, 0xbc, 0xcf,
+    0x85, 0xcf, 0x81, 0xcf, 0x84, 0xce, 0xb9, 0xe1,
+    0xbd, 0xb2, 0xcf, 0x82, 0x20, 0xce, 0xb4, 0xe1,
+    0xbd, 0xb2, 0xce, 0xbd, 0x20, 0xce, 0xb8, 0xe1,
+    0xbd, 0xb0, 0x20, 0xce, 0xb2, 0xcf, 0x81, 0xe1,
+    0xbf, 0xb6, 0x20, 0xcf, 0x80, 0xce, 0xb9, 0xe1,
+    0xbd, 0xb0, 0x20, 0xcf, 0x83, 0xcf, 0x84, 0xe1,
+    0xbd, 0xb8, 0x20, 0xcf, 0x87, 0xcf, 0x81, 0xcf,
+    0x85, 0xcf, 0x83, 0xce, 0xb1, 0xcf, 0x86, 0xe1,
+    0xbd, 0xb6, 0x20, 0xce, 0xbe, 0xce, 0xad, 0xcf,
+    0x86, 0xcf, 0x89, 0xcf, 0x84, 0xce, 0xbf];
+
+const String testKatakanaPhrase = """
+イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム
+ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン""";
+
+const List<int> testKatakanaUtf8 = const<int>[
+    0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xad, 0xe3, 0x83,
+    0x8f, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x9b, 0xe3,
+    0x83, 0x98, 0xe3, 0x83, 0x88, 0x20, 0xe3, 0x83,
+    0x81, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0x8c, 0xe3,
+    0x83, 0xab, 0xe3, 0x83, 0xb2, 0x20, 0xe3, 0x83,
+    0xaf, 0xe3, 0x82, 0xab, 0xe3, 0x83, 0xa8, 0xe3,
+    0x82, 0xbf, 0xe3, 0x83, 0xac, 0xe3, 0x82, 0xbd,
+    0x20, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x8d, 0xe3,
+    0x83, 0x8a, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0,
+    0x0a, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
+    0x83, 0x8e, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xaf,
+    0xe3, 0x83, 0xa4, 0xe3, 0x83, 0x9e, 0x20, 0xe3,
+    0x82, 0xb1, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xb3,
+    0xe3, 0x82, 0xa8, 0xe3, 0x83, 0x86, 0x20, 0xe3,
+    0x82, 0xa2, 0xe3, 0x82, 0xb5, 0xe3, 0x82, 0xad,
+    0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xa1, 0xe3, 0x83,
+    0x9f, 0xe3, 0x82, 0xb7, 0x20, 0xe3, 0x83, 0xb1,
+    0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa2, 0xe3, 0x82,
+    0xbb, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0xb3];
+
+void main() {
+  testUtf8bytesToCodepoints();
+  testUtf8BytesToString();
+  testEncodeToUtf8();
+  testIterableMethods();
+}
+
+void testEncodeToUtf8() {
+  Expect.listEquals(testEnglishUtf8, encodeUtf8(testEnglishPhrase),
+      "english to utf8");
+
+  Expect.listEquals(testDanishUtf8, encodeUtf8(testDanishPhrase),
+      "encode danish to utf8");
+
+  Expect.listEquals(testHebrewUtf8, encodeUtf8(testHebrewPhrase),
+      "Hebrew to utf8");
+
+  Expect.listEquals(testRussianUtf8, encodeUtf8(testRussianPhrase),
+      "Russian to utf8");
+
+  Expect.listEquals(testGreekUtf8, encodeUtf8(testGreekPhrase),
+      "Greek to utf8");
+
+  Expect.listEquals(testKatakanaUtf8, encodeUtf8(testKatakanaPhrase),
+      "Katakana to utf8");
+}
+
+void testUtf8bytesToCodepoints() {
+  Expect.listEquals([954, 972, 963, 956, 949],
+      utf8ToCodepoints([0xce, 0xba, 0xcf, 0x8c, 0xcf,
+      0x83, 0xce, 0xbc, 0xce, 0xb5]), "κόσμε");
+
+  // boundary conditions: First possible sequence of a certain length
+  Expect.listEquals([], utf8ToCodepoints([]), "no input");
+  Expect.listEquals([0x0], utf8ToCodepoints([0x0]), "0");
+  Expect.listEquals([0x80], utf8ToCodepoints([0xc2, 0x80]), "80");
+  Expect.listEquals([0x800],
+      utf8ToCodepoints([0xe0, 0xa0, 0x80]), "800");
+  Expect.listEquals([0x10000],
+      utf8ToCodepoints([0xf0, 0x90, 0x80, 0x80]), "10000");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80, 0x80]), "200000");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x84, 0x80, 0x80, 0x80, 0x80]),
+      "4000000");
+
+  // boundary conditions: Last possible sequence of a certain length
+  Expect.listEquals([0x7f], utf8ToCodepoints([0x7f]), "7f");
+  Expect.listEquals([0x7ff], utf8ToCodepoints([0xdf, 0xbf]), "7ff");
+  Expect.listEquals([0xffff],
+      utf8ToCodepoints([0xef, 0xbf, 0xbf]), "ffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf7, 0xbf, 0xbf, 0xbf]), "1fffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf, 0xbf]), "3ffffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "4000000");
+
+  // other boundary conditions
+  Expect.listEquals([0xd7ff],
+      utf8ToCodepoints([0xed, 0x9f, 0xbf]), "d7ff");
+  Expect.listEquals([0xe000],
+      utf8ToCodepoints([0xee, 0x80, 0x80]), "e000");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xef, 0xbf, 0xbd]), "fffd");
+  Expect.listEquals([0x10ffff],
+      utf8ToCodepoints([0xf4, 0x8f, 0xbf, 0xbf]), "10ffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf4, 0x90, 0x80, 0x80]), "110000");
+
+  // unexpected continuation bytes
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0x80]), "80 => replacement character");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xbf]), "bf => replacement character");
+
+  List<int> allContinuationBytes = <int>[];
+  List<int> matchingReplacementChars = <int>[];
+  for (int i = 0x80; i < 0xc0; i++) {
+    allContinuationBytes.add(i);
+    matchingReplacementChars.add(UNICODE_REPLACEMENT_CHARACTER_CODEPOINT);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allContinuationBytes),
+      "80 - bf => replacement character x 64");
+
+  List<int> allFirstTwoByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xc0; i < 0xe0; i++) {
+    allFirstTwoByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstTwoByteSeq),
+      "c0 - df + space => replacement character + space x 32");
+
+  List<int> allFirstThreeByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xe0; i < 0xf0; i++) {
+    allFirstThreeByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstThreeByteSeq),
+      "e0 - ef + space => replacement character x 16");
+
+  List<int> allFirstFourByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xf0; i < 0xf8; i++) {
+    allFirstFourByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstFourByteSeq),
+      "f0 - f7 + space => replacement character x 8");
+
+  List<int> allFirstFiveByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xf8; i < 0xfc; i++) {
+    allFirstFiveByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstFiveByteSeq),
+      "f8 - fb + space => replacement character x 4");
+
+  List<int> allFirstSixByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xfc; i < 0xfe; i++) {
+    allFirstSixByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstSixByteSeq),
+      "fc - fd + space => replacement character x 2");
+
+  // Sequences with last continuation byte missing
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc2]),
+      "2-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x80]),
+      "3-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x80, 0x80]),
+      "4-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80]),
+      "5-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80]),
+      "6-byte sequence with last byte missing");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xdf]),
+      "2-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xef, 0xbf]),
+      "3-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf7, 0xbf, 0xbf]),
+      "4-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf]),
+      "5-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "6-byte sequence with last byte missing (hi)");
+
+  // Concatenation of incomplete sequences
+  Expect.listEquals(
+      [ UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT ],
+      utf8ToCodepoints(
+          [ 0xc2,
+            0xe0, 0x80,
+            0xf0, 0x80, 0x80,
+            0xf8, 0x88, 0x80, 0x80,
+            0xfc, 0x80, 0x80, 0x80, 0x80,
+            0xdf,
+            0xef, 0xbf,
+            0xf7, 0xbf, 0xbf,
+            0xfb, 0xbf, 0xbf, 0xbf,
+            0xfd, 0xbf, 0xbf, 0xbf, 0xbf ]),
+          "Concatenation of incomplete sequences");
+
+  // Impossible bytes
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfe]), "fe");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xff]), "ff");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfe, 0xfe, 0xff, 0xff]), "fe fe ff ff");
+
+  // Overlong sequences
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc0, 0xaf]), "c0 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x80, 0xaf]), "e0 80 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x80, 0x80, 0xaf]), "f0 80 80 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0xaf]), "f8 80 80 80 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0xaf]),
+      "fc 80 80 80 80 af");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc1, 0xbf]), "c1 bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x9f, 0xbf]), "e0 9f bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x8f, 0xbf, 0xbf]), "f0 8f bf bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x87, 0xbf, 0xbf, 0xbf]), "f8 87 bf bf bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x83, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "fc 83 bf bf bf bf");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc0, 0x80]), "c0 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x80, 0x80]), "e0 80 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x80, 0x80, 0x80]), "f0 80 80 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0x80]), "f8 80 80 80 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0x80]),
+      "fc 80 80 80 80 80");
+
+  // Illegal code positions
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xa0, 0x80]), "U+D800");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xad, 0xbf]), "U+DB7F");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xae, 0x80]), "U+DB80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xaf, 0xbf]), "U+DBFF");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xb0, 0x80]), "U+DC00");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xbe, 0x80]), "U+DF80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xbf, 0xbf]), "U+DFFF");
+
+  // Paired UTF-16 surrogates
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80]),
+      "U+D800 U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xbf, 0xbf]),
+      "U+D800 U+DFFF");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xb0, 0x80]),
+      "U+DB7F U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xbf, 0xbf]),
+      "U+DB7F U+DFFF");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xb0, 0x80]),
+      "U+DB80 U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xbf, 0xbf]),
+      "U+DB80 U+DFFF");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xb0, 0x80]),
+      "U+DBFF U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf]),
+      "U+DBFF U+DFFF");
+
+  // Other illegal code positions (???)
+  Expect.listEquals([0xfffe], utf8ToCodepoints([0xef, 0xbf, 0xbe]),
+      "U+FFFE");
+  Expect.listEquals([0xffff], utf8ToCodepoints([0xef, 0xbf, 0xbf]),
+      "U+FFFF");
+}
+
+void testUtf8BytesToString() {
+  Expect.stringEquals(testEnglishPhrase,
+      decodeUtf8(testEnglishUtf8), "English");
+
+  Expect.stringEquals(testDanishPhrase,
+      decodeUtf8(testDanishUtf8), "Danish");
+
+  Expect.stringEquals(testHebrewPhrase,
+      decodeUtf8(testHebrewUtf8), "Hebrew");
+
+  Expect.stringEquals(testRussianPhrase,
+      decodeUtf8(testRussianUtf8), "Russian");
+
+  Expect.stringEquals(testGreekPhrase,
+      decodeUtf8(testGreekUtf8), "Greek");
+
+  Expect.stringEquals(testKatakanaPhrase,
+      decodeUtf8(testKatakanaUtf8), "Katakana");
+}
+
+void testIterableMethods() {
+  IterableUtf8Decoder englishDecoder = decodeUtf8AsIterable(testEnglishUtf8);
+  // get the first character
+  Expect.equals(testEnglishUtf8[0], englishDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testEnglishPhrase,
+      new String.fromCharCodes(new List<int>.from(englishDecoder)));
+
+  IterableUtf8Decoder kataDecoder = decodeUtf8AsIterable(testKatakanaUtf8);
+  // get the first character
+  Expect.equals(testKatakanaPhrase.codeUnits[0], kataDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testKatakanaPhrase,
+      new String.fromCharCodes(new List<int>.from(kataDecoder)));
+}
diff --git a/pkg/watcher/lib/src/async_queue.dart b/pkg/watcher/lib/src/async_queue.dart
index 9456631..8ac0cdf 100644
--- a/pkg/watcher/lib/src/async_queue.dart
+++ b/pkg/watcher/lib/src/async_queue.dart
@@ -8,7 +8,6 @@
 import 'dart:collection';
 
 typedef Future ItemProcessor<T>(T item);
-typedef void ErrorHandler(error);
 
 /// A queue of items that are sequentially, asynchronously processed.
 ///
@@ -35,9 +34,9 @@
   /// The handler for errors thrown during processing.
   ///
   /// Used to avoid top-leveling asynchronous errors.
-  final ErrorHandler _errorHandler;
+  final Function _errorHandler;
 
-  AsyncQueue(this._processor, {ErrorHandler onError})
+  AsyncQueue(this._processor, {Function onError})
       : _errorHandler = onError;
 
   /// Enqueues [item] to be processed and starts asynchronously processing it
diff --git a/pkg/watcher/lib/src/constructable_file_system_event.dart b/pkg/watcher/lib/src/constructable_file_system_event.dart
new file mode 100644
index 0000000..010d297
--- /dev/null
+++ b/pkg/watcher/lib/src/constructable_file_system_event.dart
@@ -0,0 +1,60 @@
+// 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 watcher.constructable_file_system_event;
+
+import 'dart:io';
+
+abstract class _ConstructableFileSystemEvent implements FileSystemEvent {
+  final bool isDirectory;
+  final String path;
+  int get type;
+
+  _ConstructableFileSystemEvent(this.path, this.isDirectory);
+}
+
+class ConstructableFileSystemCreateEvent extends _ConstructableFileSystemEvent
+    implements FileSystemCreateEvent {
+  final type = FileSystemEvent.CREATE;
+
+  ConstructableFileSystemCreateEvent(String path, bool isDirectory)
+      : super(path, isDirectory);
+
+  String toString() => "FileSystemCreateEvent('$path')";
+}
+
+class ConstructableFileSystemDeleteEvent extends _ConstructableFileSystemEvent
+    implements FileSystemDeleteEvent {
+  final type = FileSystemEvent.DELETE;
+
+  ConstructableFileSystemDeleteEvent(String path, bool isDirectory)
+      : super(path, isDirectory);
+
+  String toString() => "FileSystemDeleteEvent('$path')";
+}
+
+class ConstructableFileSystemModifyEvent extends _ConstructableFileSystemEvent
+    implements FileSystemModifyEvent {
+  final bool contentChanged;
+  final type = FileSystemEvent.MODIFY;
+
+  ConstructableFileSystemModifyEvent(String path, bool isDirectory,
+          this.contentChanged)
+      : super(path, isDirectory);
+
+  String toString() =>
+    "FileSystemModifyEvent('$path', contentChanged=$contentChanged)";
+}
+
+class ConstructableFileSystemMoveEvent extends _ConstructableFileSystemEvent
+    implements FileSystemMoveEvent {
+  final String destination;
+  final type = FileSystemEvent.MOVE;
+
+  ConstructableFileSystemMoveEvent(String path, bool isDirectory,
+          this.destination)
+      : super(path, isDirectory);
+
+  String toString() => "FileSystemMoveEvent('$path', '$destination')";
+}
diff --git a/pkg/watcher/lib/src/directory_watcher.dart b/pkg/watcher/lib/src/directory_watcher.dart
index 679e227..78b1174 100644
--- a/pkg/watcher/lib/src/directory_watcher.dart
+++ b/pkg/watcher/lib/src/directory_watcher.dart
@@ -7,18 +7,16 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:crypto/crypto.dart';
-
-import 'async_queue.dart';
-import 'stat.dart';
-import 'utils.dart';
 import 'watch_event.dart';
+import 'directory_watcher/linux.dart';
+import 'directory_watcher/mac_os.dart';
+import 'directory_watcher/polling.dart';
 
 /// Watches the contents of a directory and emits [WatchEvent]s when something
 /// in the directory has changed.
-class DirectoryWatcher {
+abstract class DirectoryWatcher {
   /// The directory whose contents are being monitored.
-  final String directory;
+  String get directory;
 
   /// The broadcast [Stream] of events that have occurred to files in
   /// [directory].
@@ -26,10 +24,12 @@
   /// Changes will only be monitored while this stream has subscribers. Any
   /// file changes that occur during periods when there are no subscribers
   /// will not be reported the next time a subscriber is added.
-  Stream<WatchEvent> get events => _events.stream;
-  StreamController<WatchEvent> _events;
+  Stream<WatchEvent> get events;
 
-  _WatchState _state = _WatchState.UNSUBSCRIBED;
+  /// Whether the watcher is initialized and watching for file changes.
+  ///
+  /// This is true if and only if [ready] is complete.
+  bool get isReady;
 
   /// A [Future] that completes when the watcher is initialized and watching
   /// for file changes.
@@ -41,241 +41,21 @@
   ///
   /// If the watcher is already monitoring, this returns an already complete
   /// future.
-  Future get ready => _ready.future;
-  Completer _ready = new Completer();
-
-  /// The amount of time the watcher pauses between successive polls of the
-  /// directory contents.
-  final Duration pollingDelay;
-
-  /// The previous status of the files in the directory.
-  ///
-  /// Used to tell which files have been modified.
-  final _statuses = new Map<String, _FileStatus>();
-
-  /// The subscription used while [directory] is being listed.
-  ///
-  /// Will be `null` if a list is not currently happening.
-  StreamSubscription<FileSystemEntity> _listSubscription;
-
-  /// The queue of files waiting to be processed to see if they have been
-  /// modified.
-  ///
-  /// Processing a file is asynchronous, as is listing the directory, so the
-  /// queue exists to let each of those proceed at their own rate. The lister
-  /// will enqueue files as quickly as it can. Meanwhile, files are dequeued
-  /// and processed sequentially.
-  AsyncQueue<String> _filesToProcess;
-
-  /// The set of files that have been seen in the current directory listing.
-  ///
-  /// Used to tell which files have been removed: files that are in [_statuses]
-  /// but not in here when a poll completes have been removed.
-  final _polledFiles = new Set<String>();
+  Future get ready;
 
   /// Creates a new [DirectoryWatcher] monitoring [directory].
   ///
-  /// If [pollingDelay] is passed, it specifies the amount of time the watcher
-  /// will pause between successive polls of the directory contents. Making
-  /// this shorter will give more immediate feedback at the expense of doing
-  /// more IO and higher CPU usage. Defaults to one second.
-  DirectoryWatcher(this.directory, {Duration pollingDelay})
-      : pollingDelay = pollingDelay != null ? pollingDelay :
-                                              new Duration(seconds: 1) {
-    _events = new StreamController<WatchEvent>.broadcast(
-        onListen: _watch, onCancel: _cancel);
-
-    _filesToProcess = new AsyncQueue<String>(_processFile,
-        onError: _events.addError);
-  }
-
-  /// Scans to see which files were already present before the watcher was
-  /// subscribed to, and then starts watching the directory for changes.
-  void _watch() {
-    assert(_state == _WatchState.UNSUBSCRIBED);
-    _state = _WatchState.SCANNING;
-    _poll();
-  }
-
-  /// Stops watching the directory when there are no more subscribers.
-  void _cancel() {
-    assert(_state != _WatchState.UNSUBSCRIBED);
-    _state = _WatchState.UNSUBSCRIBED;
-
-    // If we're in the middle of listing the directory, stop.
-    if (_listSubscription != null) _listSubscription.cancel();
-
-    // Don't process any remaining files.
-    _filesToProcess.clear();
-    _polledFiles.clear();
-    _statuses.clear();
-
-    _ready = new Completer();
-  }
-
-  /// Scans the contents of the directory once to see which files have been
-  /// added, removed, and modified.
-  void _poll() {
-    _filesToProcess.clear();
-    _polledFiles.clear();
-
-    endListing() {
-      assert(_state != _WatchState.UNSUBSCRIBED);
-      _listSubscription = null;
-
-      // Null tells the queue consumer that we're done listing.
-      _filesToProcess.add(null);
-    }
-
-    var stream = new Directory(directory).list(recursive: true);
-    _listSubscription = stream.listen((entity) {
-      assert(_state != _WatchState.UNSUBSCRIBED);
-
-      if (entity is! File) return;
-      _filesToProcess.add(entity.path);
-    }, onError: (error, StackTrace stackTrace) {
-      if (!isDirectoryNotFoundException(error)) {
-        // It's some unknown error. Pipe it over to the event stream so the
-        // user can see it.
-        _events.addError(error, stackTrace);
-      }
-
-      // When an error occurs, we end the listing normally, which has the
-      // desired effect of marking all files that were in the directory as
-      // being removed.
-      endListing();
-    }, onDone: endListing, cancelOnError: true);
-  }
-
-  /// Processes [file] to determine if it has been modified since the last
-  /// time it was scanned.
-  Future _processFile(String file) {
-    assert(_state != _WatchState.UNSUBSCRIBED);
-
-    // `null` is the sentinel which means the directory listing is complete.
-    if (file == null) return _completePoll();
-
-    return getModificationTime(file).then((modified) {
-      if (_checkForCancel()) return null;
-
-      var lastStatus = _statuses[file];
-
-      // If its modification time hasn't changed, assume the file is unchanged.
-      if (lastStatus != null && lastStatus.modified == modified) {
-        // The file is still here.
-        _polledFiles.add(file);
-        return null;
-      }
-
-      return _hashFile(file).then((hash) {
-        if (_checkForCancel()) return;
-
-        var status = new _FileStatus(modified, hash);
-        _statuses[file] = status;
-        _polledFiles.add(file);
-
-        // Only notify while in the watching state.
-        if (_state != _WatchState.WATCHING) return;
-
-        // And the file is different.
-        var changed = lastStatus == null || !_sameHash(lastStatus.hash, hash);
-        if (!changed) return;
-
-        var type = lastStatus == null ? ChangeType.ADD : ChangeType.MODIFY;
-        _events.add(new WatchEvent(type, file));
-      });
-    });
-  }
-
-  /// After the directory listing is complete, this determines which files were
-  /// removed and then restarts the next poll.
-  Future _completePoll() {
-    // Any files that were not seen in the last poll but that we have a
-    // status for must have been removed.
-    var removedFiles = _statuses.keys.toSet().difference(_polledFiles);
-    for (var removed in removedFiles) {
-      if (_state == _WatchState.WATCHING) {
-        _events.add(new WatchEvent(ChangeType.REMOVE, removed));
-      }
-      _statuses.remove(removed);
-    }
-
-    if (_state == _WatchState.SCANNING) {
-      _state = _WatchState.WATCHING;
-      _ready.complete();
-    }
-
-    // Wait and then poll again.
-    return new Future.delayed(pollingDelay).then((_) {
-      if (_checkForCancel()) return;
-      _poll();
-    });
-  }
-
-  /// Returns `true` and clears the processing queue if the watcher has been
-  /// unsubscribed.
-  bool _checkForCancel() {
-    if (_state != _WatchState.UNSUBSCRIBED) return false;
-
-    // Don't process any more files.
-    _filesToProcess.clear();
-    return true;
-  }
-
-  /// Calculates the SHA-1 hash of the file at [path].
-  Future<List<int>> _hashFile(String path) {
-    return new File(path).readAsBytes().then((bytes) {
-      var sha1 = new SHA1();
-      sha1.add(bytes);
-      return sha1.close();
-    });
-  }
-
-  /// Returns `true` if [a] and [b] are the same hash value, i.e. the same
-  /// series of byte values.
-  bool _sameHash(List<int> a, List<int> b) {
-    // Hashes should always be the same size.
-    assert(a.length == b.length);
-
-    for (var i = 0; i < a.length; i++) {
-      if (a[i] != b[i]) return false;
-    }
-
-    return true;
-  }
-}
-
-/// Enum class for the states that the [DirectoryWatcher] can be in.
-class _WatchState {
-  /// There are no subscribers to the watcher's event stream and no watching
-  /// is going on.
-  static const UNSUBSCRIBED = const _WatchState("unsubscribed");
-
-  /// There are subscribers and the watcher is doing an initial scan of the
-  /// directory to see which files were already present before watching started.
+  /// If a native directory watcher is available for this platform, this will
+  /// use it. Otherwise, it will fall back to a [PollingDirectoryWatcher].
   ///
-  /// The watcher does not send notifications for changes that occurred while
-  /// there were no subscribers, or for files already present before watching.
-  /// The initial scan is used to determine what "before watching" state of
-  /// the file system was.
-  static const SCANNING = const _WatchState("scanning");
-
-  /// There are subscribers and the watcher is polling the directory to look
-  /// for changes.
-  static const WATCHING = const _WatchState("watching");
-
-  /// The name of the state.
-  final String name;
-
-  const _WatchState(this.name);
+  /// If [_pollingDelay] is passed, it specifies the amount of time the watcher
+  /// will pause between successive polls of the directory contents. Making this
+  /// shorter will give more immediate feedback at the expense of doing more IO
+  /// and higher CPU usage. Defaults to one second. Ignored for non-polling
+  /// watchers.
+  factory DirectoryWatcher(String directory, {Duration pollingDelay}) {
+    if (Platform.isLinux) return new LinuxDirectoryWatcher(directory);
+    if (Platform.isMacOS) return new MacOSDirectoryWatcher(directory);
+    return new PollingDirectoryWatcher(directory, pollingDelay: pollingDelay);
+  }
 }
-
-class _FileStatus {
-  /// The last time the file was modified.
-  DateTime modified;
-
-  /// The SHA-1 hash of the contents of the file.
-  List<int> hash;
-
-  _FileStatus(this.modified, this.hash);
-}
\ No newline at end of file
diff --git a/pkg/watcher/lib/src/directory_watcher/linux.dart b/pkg/watcher/lib/src/directory_watcher/linux.dart
new file mode 100644
index 0000000..5196078
--- /dev/null
+++ b/pkg/watcher/lib/src/directory_watcher/linux.dart
@@ -0,0 +1,295 @@
+// 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 watcher.directory_watcher.linux;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../utils.dart';
+import '../watch_event.dart';
+import 'resubscribable.dart';
+
+/// Uses the inotify subsystem to watch for filesystem events.
+///
+/// Inotify doesn't suport recursively watching subdirectories, nor does
+/// [Directory.watch] polyfill that functionality. This class polyfills it
+/// instead.
+///
+/// This class also compensates for the non-inotify-specific issues of
+/// [Directory.watch] producing multiple events for a single logical action
+/// (issue 14372) and providing insufficient information about move events
+/// (issue 14424).
+class LinuxDirectoryWatcher extends ResubscribableDirectoryWatcher {
+  LinuxDirectoryWatcher(String directory)
+      : super(directory, () => new _LinuxDirectoryWatcher(directory));
+}
+
+class _LinuxDirectoryWatcher implements ManuallyClosedDirectoryWatcher {
+  final String directory;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  final _eventsController = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  final _readyCompleter = new Completer();
+
+  /// The last known state for each entry in this directory.
+  ///
+  /// The keys in this map are the paths to the directory entries; the values
+  /// are [_EntryState]s indicating whether the entries are files or
+  /// directories.
+  final _entries = new Map<String, _EntryState>();
+
+  /// The watchers for subdirectories of [directory].
+  final _subWatchers = new Map<String, _LinuxDirectoryWatcher>();
+
+  /// A set of all subscriptions that this watcher subscribes to.
+  ///
+  /// These are gathered together so that they may all be canceled when the
+  /// watcher is closed.
+  final _subscriptions = new Set<StreamSubscription>();
+
+  _LinuxDirectoryWatcher(String directory)
+      : directory = directory {
+    // Batch the inotify changes together so that we can dedup events.
+    var innerStream = new Directory(directory).watch().transform(
+        new BatchedStreamTransformer<FileSystemEvent>());
+    _listen(innerStream, _onBatch,
+        onError: _eventsController.addError,
+        onDone: _onDone);
+
+    _listen(new Directory(directory).list(), (entity) {
+      _entries[entity.path] = new _EntryState(entity is Directory);
+      if (entity is! Directory) return;
+      _watchSubdir(entity.path);
+    }, onError: (error, stackTrace) {
+      _eventsController.addError(error, stackTrace);
+      close();
+    }, onDone: () {
+      _waitUntilReady().then((_) => _readyCompleter.complete());
+    }, cancelOnError: true);
+  }
+
+  /// Returns a [Future] that completes once all the subdirectory watchers are
+  /// fully initialized.
+  Future _waitUntilReady() {
+    return Future.wait(_subWatchers.values.map((watcher) => watcher.ready))
+        .then((_) {
+      if (_subWatchers.values.every((watcher) => watcher.isReady)) return null;
+      return _waitUntilReady();
+    });
+  }
+
+  void close() {
+    for (var subscription in _subscriptions) {
+      subscription.cancel();
+    }
+    for (var watcher in _subWatchers.values) {
+      watcher.close();
+    }
+
+    _subWatchers.clear();
+    _subscriptions.clear();
+    _eventsController.close();
+  }
+
+  /// Returns all files (not directories) that this watcher knows of are
+  /// recursively in the watched directory.
+  Set<String> get _allFiles {
+    var files = new Set<String>();
+    _getAllFiles(files);
+    return files;
+  }
+
+  /// Helper function for [_allFiles].
+  ///
+  /// Adds all files that this watcher knows of to [files].
+  void _getAllFiles(Set<String> files) {
+    files.addAll(_entries.keys
+        .where((path) => _entries[path] == _EntryState.FILE).toSet());
+    for (var watcher in _subWatchers.values) {
+      watcher._getAllFiles(files);
+    }
+  }
+
+  /// Watch a subdirectory of [directory] for changes.
+  ///
+  /// If the subdirectory was added after [this] began emitting events, its
+  /// contents will be emitted as ADD events.
+  void _watchSubdir(String path) {
+    if (_subWatchers.containsKey(path)) return;
+    var watcher = new _LinuxDirectoryWatcher(path);
+    _subWatchers[path] = watcher;
+
+    // TODO(nweiz): Catch any errors here that indicate that the directory in
+    // question doesn't exist and silently stop watching it instead of
+    // propagating the errors.
+    _listen(watcher.events, (event) {
+      if (isReady) _eventsController.add(event);
+    }, onError: (error, stackTrace) {
+      _eventsController.addError(error, stackTrace);
+      _eventsController.close();
+    }, onDone: () {
+      if (_subWatchers[path] == watcher) _subWatchers.remove(path);
+
+      // It's possible that a directory was removed and recreated very quickly.
+      // If so, make sure we're still watching it.
+      if (new Directory(path).existsSync()) _watchSubdir(path);
+    });
+
+    // TODO(nweiz): Right now it's possible for the watcher to emit an event for
+    // a file before the directory list is complete. This could lead to the user
+    // seeing a MODIFY or REMOVE event for a file before they see an ADD event,
+    // which is bad. We should handle that.
+    //
+    // One possibility is to provide a general means (e.g.
+    // `DirectoryWatcher.eventsAndExistingFiles`) to tell a watcher to emit
+    // events for all the files that already exist. This would be useful for
+    // top-level clients such as barback as well, and could be implemented with
+    // a wrapper similar to how listening/canceling works now.
+
+    // If a directory is added after we're finished with the initial scan, emit
+    // an event for each entry in it. This gives the user consistently gets an
+    // event for every new file.
+    watcher.ready.then((_) {
+      if (!isReady || _eventsController.isClosed) return;
+      _listen(new Directory(path).list(recursive: true), (entry) {
+        if (entry is Directory) return;
+        _eventsController.add(new WatchEvent(ChangeType.ADD, entry.path));
+      }, onError: (error, stackTrace) {
+        // Ignore an exception caused by the dir not existing. It's fine if it
+        // was added and then quickly removed.
+        if (error is FileSystemException) return;
+
+        _eventsController.addError(error, stackTrace);
+        _eventsController.close();
+      }, cancelOnError: true);
+    });
+  }
+
+  /// The callback that's run when a batch of changes comes in.
+  void _onBatch(List<FileSystemEvent> batch) {
+    var changedEntries = new Set<String>();
+    var oldEntries = new Map.from(_entries);
+
+    // inotify event batches are ordered by occurrence, so we treat them as a
+    // log of what happened to a file.
+    for (var event in batch) {
+      // If the watched directory is deleted or moved, we'll get a deletion
+      // event for it. Ignore it; we handle closing [this] when the underlying
+      // stream is closed.
+      if (event.path == directory) continue;
+
+      changedEntries.add(event.path);
+
+      if (event is FileSystemMoveEvent) {
+        changedEntries.add(event.destination);
+        _changeEntryState(event.path, ChangeType.REMOVE, event.isDirectory);
+        _changeEntryState(event.destination, ChangeType.ADD, event.isDirectory);
+      } else {
+        _changeEntryState(event.path, _changeTypeFor(event), event.isDirectory);
+      }
+    }
+
+    for (var path in changedEntries) {
+      emitEvent(ChangeType type) {
+        if (isReady) _eventsController.add(new WatchEvent(type, path));
+      }
+
+      var oldState = oldEntries[path];
+      var newState = _entries[path];
+
+      if (oldState != _EntryState.FILE && newState == _EntryState.FILE) {
+        emitEvent(ChangeType.ADD);
+      } else if (oldState == _EntryState.FILE && newState == _EntryState.FILE) {
+        emitEvent(ChangeType.MODIFY);
+      } else if (oldState == _EntryState.FILE && newState != _EntryState.FILE) {
+        emitEvent(ChangeType.REMOVE);
+      }
+
+      if (oldState == _EntryState.DIRECTORY) {
+        var watcher = _subWatchers.remove(path);
+        if (watcher == null) return;
+        for (var path in watcher._allFiles) {
+          _eventsController.add(new WatchEvent(ChangeType.REMOVE, path));
+        }
+        watcher.close();
+      }
+
+      if (newState == _EntryState.DIRECTORY) _watchSubdir(path);
+    }
+  }
+
+  /// Changes the known state of the entry at [path] based on [change] and
+  /// [isDir].
+  void _changeEntryState(String path, ChangeType change, bool isDir) {
+    if (change == ChangeType.ADD || change == ChangeType.MODIFY) {
+      _entries[path] = new _EntryState(isDir);
+    } else {
+      assert(change == ChangeType.REMOVE);
+      _entries.remove(path);
+    }
+  }
+
+  /// Determines the [ChangeType] associated with [event].
+  ChangeType _changeTypeFor(FileSystemEvent event) {
+    if (event is FileSystemDeleteEvent) return ChangeType.REMOVE;
+    if (event is FileSystemCreateEvent) return ChangeType.ADD;
+
+    assert(event is FileSystemModifyEvent);
+    return ChangeType.MODIFY;
+  }
+
+  /// Handles the underlying event stream closing, indicating that the directory
+  /// being watched was removed.
+  void _onDone() {
+    // The parent directory often gets a close event before the subdirectories
+    // are done emitting events. We wait for them to finish before we close
+    // [events] so that we can be sure to emit a remove event for every file
+    // that used to exist.
+    Future.wait(_subWatchers.values.map((watcher) {
+      try {
+        return watcher.events.toList();
+      } on StateError catch (_) {
+        // It's possible that [watcher.events] is closed but the onDone event
+        // hasn't reached us yet. It's fine if so.
+        return new Future.value();
+      }
+    })).then((_) => close());
+  }
+
+  /// Like [Stream.listen], but automatically adds the subscription to
+  /// [_subscriptions] so that it can be canceled when [close] is called.
+  void _listen(Stream stream, void onData(event), {Function onError,
+      void onDone(), bool cancelOnError}) {
+    var subscription;
+    subscription = stream.listen(onData, onError: onError, onDone: () {
+      _subscriptions.remove(subscription);
+      if (onDone != null) onDone();
+    }, cancelOnError: cancelOnError);
+    _subscriptions.add(subscription);
+  }
+}
+
+/// An enum for the possible states of entries in a watched directory.
+class _EntryState {
+  final String _name;
+
+  /// The entry is a file.
+  static const FILE = const _EntryState._("file");
+
+  /// The entry is a directory.
+  static const DIRECTORY = const _EntryState._("directory");
+
+  const _EntryState._(this._name);
+
+  /// Returns [DIRECTORY] if [isDir] is true, and [FILE] otherwise.
+  factory _EntryState(bool isDir) =>
+      isDir ? _EntryState.DIRECTORY : _EntryState.FILE;
+
+  String toString() => _name;
+}
diff --git a/pkg/watcher/lib/src/directory_watcher/mac_os.dart b/pkg/watcher/lib/src/directory_watcher/mac_os.dart
new file mode 100644
index 0000000..5b1feb3
--- /dev/null
+++ b/pkg/watcher/lib/src/directory_watcher/mac_os.dart
@@ -0,0 +1,353 @@
+// 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 watcher.directory_watcher.mac_os;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../constructable_file_system_event.dart';
+import '../path_set.dart';
+import '../utils.dart';
+import '../watch_event.dart';
+import 'resubscribable.dart';
+
+/// Uses the FSEvents subsystem to watch for filesystem events.
+///
+/// FSEvents has two main idiosyncrasies that this class works around. First, it
+/// will occasionally report events that occurred before the filesystem watch
+/// was initiated. Second, if multiple events happen to the same file in close
+/// succession, it won't report them in the order they occurred. See issue
+/// 14373.
+///
+/// This also works around issues 14793, 14806, and 14849 in the implementation
+/// of [Directory.watch].
+class MacOSDirectoryWatcher extends ResubscribableDirectoryWatcher {
+  MacOSDirectoryWatcher(String directory)
+      : super(directory, () => new _MacOSDirectoryWatcher(directory));
+}
+
+class _MacOSDirectoryWatcher implements ManuallyClosedDirectoryWatcher {
+  final String directory;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  final _eventsController = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  final _readyCompleter = new Completer();
+
+  /// The number of event batches that have been received from
+  /// [Directory.watch].
+  ///
+  /// This is used to determine if the [Directory.watch] stream was falsely
+  /// closed due to issue 14849. A close caused by events in the past will only
+  /// happen before or immediately after the first batch of events.
+  int batches = 0;
+
+  /// The set of files that are known to exist recursively within the watched
+  /// directory.
+  ///
+  /// The state of files on the filesystem is compared against this to determine
+  /// the real change that occurred when working around issue 14373. This is
+  /// also used to emit REMOVE events when subdirectories are moved out of the
+  /// watched directory.
+  final PathSet _files;
+
+  /// The subscription to the stream returned by [Directory.watch].
+  ///
+  /// This is separate from [_subscriptions] because this stream occasionally
+  /// needs to be resubscribed in order to work around issue 14849.
+  StreamSubscription<FileSystemEvent> _watchSubscription;
+
+  /// A set of subscriptions that this watcher subscribes to.
+  ///
+  /// These are gathered together so that they may all be canceled when the
+  /// watcher is closed. This does not include [_watchSubscription].
+  final _subscriptions = new Set<StreamSubscription>();
+
+  _MacOSDirectoryWatcher(String directory)
+      : directory = directory,
+        _files = new PathSet(directory) {
+    _startWatch();
+
+    _listen(new Directory(directory).list(recursive: true),
+        (entity) {
+      if (entity is! Directory) _files.add(entity.path);
+    },
+        onError: _emitError,
+        onDone: _readyCompleter.complete,
+        cancelOnError: true);
+  }
+
+  void close() {
+    for (var subscription in _subscriptions) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    if (_watchSubscription != null) _watchSubscription.cancel();
+    _watchSubscription = null;
+    _eventsController.close();
+  }
+
+  /// The callback that's run when [Directory.watch] emits a batch of events.
+  void _onBatch(List<FileSystemEvent> batch) {
+    batches++;
+
+    _sortEvents(batch).forEach((path, events) {
+      var canonicalEvent = _canonicalEvent(events);
+      events = canonicalEvent == null ?
+          _eventsBasedOnFileSystem(path) : [canonicalEvent];
+
+      for (var event in events) {
+        if (event is FileSystemCreateEvent) {
+          if (!event.isDirectory) {
+            _emitEvent(ChangeType.ADD, path);
+            _files.add(path);
+            continue;
+          }
+
+          _listen(new Directory(path).list(recursive: true), (entity) {
+            if (entity is Directory) return;
+            _emitEvent(ChangeType.ADD, entity.path);
+            _files.add(entity.path);
+          }, onError: _emitError, cancelOnError: true);
+        } else if (event is FileSystemModifyEvent) {
+          assert(!event.isDirectory);
+          _emitEvent(ChangeType.MODIFY, path);
+        } else {
+          assert(event is FileSystemDeleteEvent);
+          for (var removedPath in _files.remove(path)) {
+            _emitEvent(ChangeType.REMOVE, removedPath);
+          }
+        }
+      }
+    });
+  }
+
+  /// Sort all the events in a batch into sets based on their path.
+  ///
+  /// A single input event may result in multiple events in the returned map;
+  /// for example, a MOVE event becomes a DELETE event for the source and a
+  /// CREATE event for the destination.
+  ///
+  /// The returned events won't contain any [FileSystemMoveEvent]s, nor will it
+  /// contain any events relating to [directory].
+  Map<String, Set<FileSystemEvent>> _sortEvents(List<FileSystemEvent> batch) {
+    var eventsForPaths = {};
+
+    // FSEvents can report past events, including events on the root directory
+    // such as it being created. We want to ignore these. If the directory is
+    // really deleted, that's handled by [_onDone].
+    batch = batch.where((event) => event.path != directory).toList();
+
+    // Events within directories that already have events are superfluous; the
+    // directory's full contents will be examined anyway, so we ignore such
+    // events. Emitting them could cause useless or out-of-order events.
+    var directories = unionAll(batch.map((event) {
+      if (!event.isDirectory) return new Set();
+      if (event is! FileSystemMoveEvent) return new Set.from([event.path]);
+      return new Set.from([event.path, event.destination]);
+    }));
+
+    isInModifiedDirectory(path) =>
+        directories.any((dir) => path != dir && path.startsWith(dir));
+
+    addEvent(path, event) {
+      if (isInModifiedDirectory(path)) return;
+      var set = eventsForPaths.putIfAbsent(path, () => new Set());
+      set.add(event);
+    }
+
+    for (var event in batch.where((event) => event is! FileSystemMoveEvent)) {
+      addEvent(event.path, event);
+    }
+
+    // Issue 14806 means that move events can be misleading if they're in the
+    // same batch as another modification of a related file. If they are, we
+    // make the event set empty to ensure we check the state of the filesystem.
+    // Otherwise, treat them as a DELETE followed by an ADD.
+    for (var event in batch.where((event) => event is FileSystemMoveEvent)) {
+      if (eventsForPaths.containsKey(event.path) ||
+          eventsForPaths.containsKey(event.destination)) {
+
+        if (!isInModifiedDirectory(event.path)) {
+          eventsForPaths[event.path] = new Set();
+        }
+        if (!isInModifiedDirectory(event.destination)) {
+          eventsForPaths[event.destination] = new Set();
+        }
+
+        continue;
+      }
+
+      addEvent(event.path, new ConstructableFileSystemDeleteEvent(
+          event.path, event.isDirectory));
+      addEvent(event.destination, new ConstructableFileSystemCreateEvent(
+          event.path, event.isDirectory));
+    }
+
+    return eventsForPaths;
+  }
+
+  /// Returns the canonical event from a batch of events on the same path, if
+  /// one exists.
+  ///
+  /// If [batch] doesn't contain any contradictory events (e.g. DELETE and
+  /// CREATE, or events with different values for [isDirectory]), this returns a
+  /// single event that describes what happened to the path in question.
+  ///
+  /// If [batch] does contain contradictory events, this returns `null` to
+  /// indicate that the state of the path on the filesystem should be checked to
+  /// determine what occurred.
+  FileSystemEvent _canonicalEvent(Set<FileSystemEvent> batch) {
+    // An empty batch indicates that we've learned earlier that the batch is
+    // contradictory (e.g. because of a move).
+    if (batch.isEmpty) return null;
+
+    var type = batch.first.type;
+    var isDir = batch.first.isDirectory;
+
+    for (var event in batch.skip(1)) {
+      // If one event reports that the file is a directory and another event
+      // doesn't, that's a contradiction.
+      if (isDir != event.isDirectory) return null;
+
+      // Modify events don't contradict either CREATE or REMOVE events. We can
+      // safely assume the file was modified after a CREATE or before the
+      // REMOVE; otherwise there will also be a REMOVE or CREATE event
+      // (respectively) that will be contradictory.
+      if (event is FileSystemModifyEvent) continue;
+      assert(event is FileSystemCreateEvent || event is FileSystemDeleteEvent);
+
+      // If we previously thought this was a MODIFY, we now consider it to be a
+      // CREATE or REMOVE event. This is safe for the same reason as above.
+      if (type == FileSystemEvent.MODIFY) {
+        type = event.type;
+        continue;
+      }
+
+      // A CREATE event contradicts a REMOVE event and vice versa.
+      assert(type == FileSystemEvent.CREATE || type == FileSystemEvent.DELETE);
+      if (type != event.type) return null;
+    }
+
+    switch (type) {
+      case FileSystemEvent.CREATE:
+        // Issue 14793 means that CREATE events can actually mean DELETE, so we
+        // should always check the filesystem for them.
+        return null;
+      case FileSystemEvent.DELETE:
+        return new ConstructableFileSystemDeleteEvent(batch.first.path, isDir);
+      case FileSystemEvent.MODIFY:
+        return new ConstructableFileSystemModifyEvent(
+            batch.first.path, isDir, false);
+      default: assert(false);
+    }
+  }
+
+  /// Returns one or more events that describe the change between the last known
+  /// state of [path] and its current state on the filesystem.
+  ///
+  /// This returns a list whose order should be reflected in the events emitted
+  /// to the user, unlike the batched events from [Directory.watch]. The
+  /// returned list may be empty, indicating that no changes occurred to [path]
+  /// (probably indicating that it was created and then immediately deleted).
+  List<FileSystemEvent> _eventsBasedOnFileSystem(String path) {
+    var fileExisted = _files.contains(path);
+    var dirExisted = _files.containsDir(path);
+    var fileExists = new File(path).existsSync();
+    var dirExists = new Directory(path).existsSync();
+
+    var events = [];
+    if (fileExisted) {
+      if (fileExists) {
+        events.add(new ConstructableFileSystemModifyEvent(path, false, false));
+      } else {
+        events.add(new ConstructableFileSystemDeleteEvent(path, false));
+      }
+    } else if (dirExisted) {
+      if (dirExists) {
+        // If we got contradictory events for a directory that used to exist and
+        // still exists, we need to rescan the whole thing in case it was
+        // replaced with a different directory.
+        events.add(new ConstructableFileSystemDeleteEvent(path, true));
+        events.add(new ConstructableFileSystemCreateEvent(path, true));
+      } else {
+        events.add(new ConstructableFileSystemDeleteEvent(path, true));
+      }
+    }
+
+    if (!fileExisted && fileExists) {
+      events.add(new ConstructableFileSystemCreateEvent(path, false));
+    } else if (!dirExisted && dirExists) {
+      events.add(new ConstructableFileSystemCreateEvent(path, true));
+    }
+
+    return events;
+  }
+
+  /// The callback that's run when the [Directory.watch] stream is closed.
+  void _onDone() {
+    _watchSubscription = null;
+
+    // If the directory still exists and we haven't seen more than one batch,
+    // this is probably issue 14849 rather than a real close event. We should
+    // just restart the watcher.
+    if (batches < 2 && new Directory(directory).existsSync()) {
+      _startWatch();
+      return;
+    }
+
+    // FSEvents can fail to report the contents of the directory being removed
+    // when the directory itself is removed, so we need to manually mark the as
+    // removed.
+    for (var file in _files.toSet()) {
+      _emitEvent(ChangeType.REMOVE, file);
+    }
+    _files.clear();
+    close();
+  }
+
+  /// Start or restart the underlying [Directory.watch] stream.
+  void _startWatch() {
+    // Batch the FSEvent changes together so that we can dedup events.
+    var innerStream = new Directory(directory).watch(recursive: true).transform(
+        new BatchedStreamTransformer<FileSystemEvent>());
+    _watchSubscription = innerStream.listen(_onBatch,
+        onError: _eventsController.addError,
+        onDone: _onDone);
+  }
+
+  /// Emit an event with the given [type] and [path].
+  void _emitEvent(ChangeType type, String path) {
+    if (!isReady) return;
+
+    // Don't emit ADD events for files that we already know about. Such an event
+    // probably comes from FSEvents reporting an add that happened prior to the
+    // watch beginning.
+    if (type == ChangeType.ADD && _files.contains(path)) return;
+
+    _eventsController.add(new WatchEvent(type, path));
+  }
+
+  /// Emit an error, then close the watcher.
+  void _emitError(error, StackTrace stackTrace) {
+    _eventsController.addError(error, stackTrace);
+    close();
+  }
+
+  /// Like [Stream.listen], but automatically adds the subscription to
+  /// [_subscriptions] so that it can be canceled when [close] is called.
+  void _listen(Stream stream, void onData(event), {Function onError,
+      void onDone(), bool cancelOnError}) {
+    var subscription;
+    subscription = stream.listen(onData, onError: onError, onDone: () {
+      _subscriptions.remove(subscription);
+      if (onDone != null) onDone();
+    }, cancelOnError: cancelOnError);
+    _subscriptions.add(subscription);
+  }
+}
diff --git a/pkg/watcher/lib/src/directory_watcher/polling.dart b/pkg/watcher/lib/src/directory_watcher/polling.dart
new file mode 100644
index 0000000..e50a0c0
--- /dev/null
+++ b/pkg/watcher/lib/src/directory_watcher/polling.dart
@@ -0,0 +1,218 @@
+// 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 watcher.directory_watcher.polling;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:crypto/crypto.dart';
+
+import '../async_queue.dart';
+import '../stat.dart';
+import '../utils.dart';
+import '../watch_event.dart';
+import 'resubscribable.dart';
+
+/// Periodically polls a directory for changes.
+class PollingDirectoryWatcher extends ResubscribableDirectoryWatcher {
+  /// Creates a new polling watcher monitoring [directory].
+  ///
+  /// If [_pollingDelay] is passed, it specifies the amount of time the watcher
+  /// will pause between successive polls of the directory contents. Making this
+  /// shorter will give more immediate feedback at the expense of doing more IO
+  /// and higher CPU usage. Defaults to one second.
+  PollingDirectoryWatcher(String directory, {Duration pollingDelay})
+      : super(directory, () {
+        return new _PollingDirectoryWatcher(directory,
+            pollingDelay != null ? pollingDelay : new Duration(seconds: 1));
+      });
+}
+
+class _PollingDirectoryWatcher implements ManuallyClosedDirectoryWatcher {
+  final String directory;
+
+  Stream<WatchEvent> get events => _events.stream;
+  final _events = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _ready.isCompleted;
+
+  Future get ready => _ready.future;
+  final _ready = new Completer();
+
+  /// The amount of time the watcher pauses between successive polls of the
+  /// directory contents.
+  final Duration _pollingDelay;
+
+  /// The previous status of the files in the directory.
+  ///
+  /// Used to tell which files have been modified.
+  final _statuses = new Map<String, _FileStatus>();
+
+  /// The subscription used while [directory] is being listed.
+  ///
+  /// Will be `null` if a list is not currently happening.
+  StreamSubscription<FileSystemEntity> _listSubscription;
+
+  /// The queue of files waiting to be processed to see if they have been
+  /// modified.
+  ///
+  /// Processing a file is asynchronous, as is listing the directory, so the
+  /// queue exists to let each of those proceed at their own rate. The lister
+  /// will enqueue files as quickly as it can. Meanwhile, files are dequeued
+  /// and processed sequentially.
+  AsyncQueue<String> _filesToProcess;
+
+  /// The set of files that have been seen in the current directory listing.
+  ///
+  /// Used to tell which files have been removed: files that are in [_statuses]
+  /// but not in here when a poll completes have been removed.
+  final _polledFiles = new Set<String>();
+
+  _PollingDirectoryWatcher(this.directory, this._pollingDelay) {
+    _filesToProcess = new AsyncQueue<String>(_processFile,
+        onError: (e, stackTrace) {
+      if (!_events.isClosed) _events.addError(e, stackTrace);
+    });
+
+    _poll();
+  }
+
+  void close() {
+    _events.close();
+
+    // If we're in the middle of listing the directory, stop.
+    if (_listSubscription != null) _listSubscription.cancel();
+
+    // Don't process any remaining files.
+    _filesToProcess.clear();
+    _polledFiles.clear();
+    _statuses.clear();
+  }
+
+  /// Scans the contents of the directory once to see which files have been
+  /// added, removed, and modified.
+  void _poll() {
+    _filesToProcess.clear();
+    _polledFiles.clear();
+
+    endListing() {
+      assert(!_events.isClosed);
+      _listSubscription = null;
+
+      // Null tells the queue consumer that we're done listing.
+      _filesToProcess.add(null);
+    }
+
+    var stream = new Directory(directory).list(recursive: true);
+    _listSubscription = stream.listen((entity) {
+      assert(!_events.isClosed);
+
+      if (entity is! File) return;
+      _filesToProcess.add(entity.path);
+    }, onError: (error, stackTrace) {
+      if (!isDirectoryNotFoundException(error)) {
+        // It's some unknown error. Pipe it over to the event stream so the
+        // user can see it.
+        _events.addError(error, stackTrace);
+      }
+
+      // When an error occurs, we end the listing normally, which has the
+      // desired effect of marking all files that were in the directory as
+      // being removed.
+      endListing();
+    }, onDone: endListing, cancelOnError: true);
+  }
+
+  /// Processes [file] to determine if it has been modified since the last
+  /// time it was scanned.
+  Future _processFile(String file) {
+    // `null` is the sentinel which means the directory listing is complete.
+    if (file == null) return _completePoll();
+
+    return getModificationTime(file).then((modified) {
+      if (_events.isClosed) return null;
+
+      var lastStatus = _statuses[file];
+
+      // If its modification time hasn't changed, assume the file is unchanged.
+      if (lastStatus != null && lastStatus.modified == modified) {
+        // The file is still here.
+        _polledFiles.add(file);
+        return null;
+      }
+
+      return _hashFile(file).then((hash) {
+        if (_events.isClosed) return;
+
+        var status = new _FileStatus(modified, hash);
+        _statuses[file] = status;
+        _polledFiles.add(file);
+
+        // Only notify if we're ready to emit events.
+        if (!isReady) return;
+
+        // And the file is different.
+        var changed = lastStatus == null || !_sameHash(lastStatus.hash, hash);
+        if (!changed) return;
+
+        var type = lastStatus == null ? ChangeType.ADD : ChangeType.MODIFY;
+        _events.add(new WatchEvent(type, file));
+      });
+    });
+  }
+
+  /// After the directory listing is complete, this determines which files were
+  /// removed and then restarts the next poll.
+  Future _completePoll() {
+    // Any files that were not seen in the last poll but that we have a
+    // status for must have been removed.
+    var removedFiles = _statuses.keys.toSet().difference(_polledFiles);
+    for (var removed in removedFiles) {
+      if (isReady) _events.add(new WatchEvent(ChangeType.REMOVE, removed));
+      _statuses.remove(removed);
+    }
+
+    if (!isReady) _ready.complete();
+
+    // Wait and then poll again.
+    return new Future.delayed(_pollingDelay).then((_) {
+      if (_events.isClosed) return;
+      _poll();
+    });
+  }
+
+  /// Calculates the SHA-1 hash of the file at [path].
+  Future<List<int>> _hashFile(String path) {
+    return new File(path).readAsBytes().then((bytes) {
+      var sha1 = new SHA1();
+      sha1.add(bytes);
+      return sha1.close();
+    });
+  }
+
+  /// Returns `true` if [a] and [b] are the same hash value, i.e. the same
+  /// series of byte values.
+  bool _sameHash(List<int> a, List<int> b) {
+    // Hashes should always be the same size.
+    assert(a.length == b.length);
+
+    for (var i = 0; i < a.length; i++) {
+      if (a[i] != b[i]) return false;
+    }
+
+    return true;
+  }
+}
+
+class _FileStatus {
+  /// The last time the file was modified.
+  DateTime modified;
+
+  /// The SHA-1 hash of the contents of the file.
+  List<int> hash;
+
+  _FileStatus(this.modified, this.hash);
+}
+
diff --git a/pkg/watcher/lib/src/directory_watcher/resubscribable.dart b/pkg/watcher/lib/src/directory_watcher/resubscribable.dart
new file mode 100644
index 0000000..7d99fc0
--- /dev/null
+++ b/pkg/watcher/lib/src/directory_watcher/resubscribable.dart
@@ -0,0 +1,77 @@
+// 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 watcher.directory_watcher.resubscribable;
+
+import 'dart:async';
+
+import '../directory_watcher.dart';
+import '../watch_event.dart';
+
+typedef ManuallyClosedDirectoryWatcher WatcherFactory();
+
+/// A wrapper for [ManuallyClosedDirectoryWatcher] that encapsulates support for
+/// closing the watcher when it has no subscribers and re-opening it when it's
+/// re-subscribed.
+///
+/// It's simpler to implement watchers without worrying about this behavior.
+/// This class wraps a watcher class which can be written with the simplifying
+/// assumption that it can continue emitting events until an explicit `close`
+/// method is called, at which point it will cease emitting events entirely. The
+/// [ManuallyClosedDirectoryWatcher] interface is used for these watchers.
+///
+/// This would be more cleanly implemented as a function that takes a class and
+/// emits a new class, but Dart doesn't support that sort of thing. Instead it
+/// takes a factory function that produces instances of the inner class.
+abstract class ResubscribableDirectoryWatcher implements DirectoryWatcher {
+  /// The factory function that produces instances of the inner class.
+  final WatcherFactory _factory;
+
+  final String directory;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  StreamController<WatchEvent> _eventsController;
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  var _readyCompleter = new Completer();
+
+  /// Creates a new [ResubscribableDirectoryWatcher] wrapping the watchers
+  /// emitted by [_factory].
+  ResubscribableDirectoryWatcher(this.directory, this._factory) {
+    var watcher;
+    var subscription;
+
+    _eventsController = new StreamController<WatchEvent>.broadcast(
+        onListen: () {
+      watcher = _factory();
+      subscription = watcher.events.listen(_eventsController.add,
+          onError: _eventsController.addError,
+          onDone: _eventsController.close);
+
+      // It's important that we complete the value of [_readyCompleter] at the
+      // time [onListen] is called, as opposed to the value when [watcher.ready]
+      // fires. A new completer may be created by that time.
+      watcher.ready.then(_readyCompleter.complete);
+    }, onCancel: () {
+      // Cancel the subscription before closing the watcher so that the
+      // watcher's `onDone` event doesn't close [events].
+      subscription.cancel();
+      watcher.close();
+      _readyCompleter = new Completer();
+    }, sync: true);
+  }
+}
+
+/// An interface for watchers with an explicit, manual [close] method.
+///
+/// See [ResubscribableDirectoryWatcher].
+abstract class ManuallyClosedDirectoryWatcher implements DirectoryWatcher {
+  /// Closes the watcher.
+  ///
+  /// Subclasses should close their [events] stream and release any internal
+  /// resources.
+  void close();
+}
diff --git a/pkg/watcher/lib/src/path_set.dart b/pkg/watcher/lib/src/path_set.dart
new file mode 100644
index 0000000..01d4208
--- /dev/null
+++ b/pkg/watcher/lib/src/path_set.dart
@@ -0,0 +1,168 @@
+// 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 watcher.path_dart;
+
+import 'dart:collection';
+
+import 'package:path/path.dart' as p;
+
+/// A set of paths, organized into a directory hierarchy.
+///
+/// When a path is [add]ed, it creates an implicit directory structure above
+/// that path. Directories can be inspected using [containsDir] and removed
+/// using [remove]. If they're removed, their contents are removed as well.
+///
+/// The paths in the set are normalized so that they all begin with [root].
+class PathSet {
+  /// The root path, which all paths in the set must be under.
+  final String root;
+
+  /// The path set's directory hierarchy.
+  ///
+  /// Each level of this hierarchy has the same structure: a map from strings to
+  /// other maps, which are further levels of the hierarchy. A map with no
+  /// elements indicates a path that was added to the set that has no paths
+  /// beneath it. Such a path should not be treated as a directory by
+  /// [containsDir].
+  final _entries = new Map<String, Map>();
+
+  /// The set of paths that were explicitly added to this set.
+  ///
+  /// This is needed to disambiguate a directory that was explicitly added to
+  /// the set from a directory that was implicitly added by adding a path
+  /// beneath it.
+  final _paths = new Set<String>();
+
+  PathSet(this.root);
+
+  /// Adds [path] to the set.
+  void add(String path) {
+    path = _normalize(path);
+    _paths.add(path);
+
+    var parts = _split(path);
+    var dir = _entries;
+    for (var part in parts) {
+      dir = dir.putIfAbsent(part, () => {});
+    }
+  }
+
+  /// Removes [path] and any paths beneath it from the set and returns the
+  /// removed paths.
+  ///
+  /// Even if [path] itself isn't in the set, if it's a directory containing
+  /// paths that are in the set those paths will be removed and returned.
+  ///
+  /// If neither [path] nor any paths beneath it are in the set, returns an
+  /// empty set.
+  Set<String> remove(String path) {
+    path = _normalize(path);
+    var parts = new Queue.from(_split(path));
+
+    // Remove the children of [dir], as well as [dir] itself if necessary.
+    //
+    // [partialPath] is the path to [dir], and a prefix of [path]; the remaining
+    // components of [path] are in [parts].
+    recurse(dir, partialPath) {
+      if (parts.length > 1) {
+        // If there's more than one component left in [path], recurse down to
+        // the next level.
+        var part = parts.removeFirst();
+        var entry = dir[part];
+        if (entry.isEmpty) return new Set();
+
+        partialPath = p.join(partialPath, part);
+        var paths = recurse(entry, partialPath);
+        // After removing this entry's children, if it has no more children and
+        // it's not in the set in its own right, remove it as well.
+        if (entry.isEmpty && !_paths.contains(partialPath)) dir.remove(part);
+        return paths;
+      }
+
+      // If there's only one component left in [path], we should remove it.
+      var entry = dir.remove(parts.first);
+      if (entry == null) return new Set();
+
+      if (entry.isEmpty) {
+        _paths.remove(path);
+        return new Set.from([path]);
+      }
+
+      var set = _removePathsIn(entry, path);
+      if (_paths.contains(path)) {
+        _paths.remove(path);
+        set.add(path);
+      }
+      return set;
+    }
+
+    return recurse(_entries, root);
+  }
+
+  /// Recursively removes and returns all paths in [dir].
+  ///
+  /// [root] should be the path to [dir].
+  Set<String> _removePathsIn(Map dir, String root) {
+    var removedPaths = new Set();
+    recurse(dir, path) {
+      dir.forEach((name, entry) {
+        var entryPath = p.join(path, name);
+        if (_paths.remove(entryPath)) removedPaths.add(entryPath);
+        recurse(entry, entryPath);
+      });
+    }
+
+    recurse(dir, root);
+    return removedPaths;
+  }
+
+  /// Returns whether [this] contains [path].
+  ///
+  /// This only returns true for paths explicitly added to [this].
+  /// Implicitly-added directories can be inspected using [containsDir].
+  bool contains(String path) => _paths.contains(_normalize(path));
+
+  /// Returns whether [this] contains paths beneath [path].
+  bool containsDir(String path) {
+    path = _normalize(path);
+    var dir = _entries;
+
+    for (var part in _split(path)) {
+      dir = dir[part];
+      if (dir == null) return false;
+    }
+
+    return !dir.isEmpty;
+  }
+
+  /// Returns a [Set] of all paths in [this].
+  Set<String> toSet() => _paths.toSet();
+
+  /// Removes all paths from [this].
+  void clear() {
+    _paths.clear();
+    _entries.clear();
+  }
+
+  String toString() => _paths.toString();
+
+  /// Returns a normalized version of [path].
+  ///
+  /// This removes any extra ".." or "."s and ensure that the returned path
+  /// begins with [root]. It's an error if [path] isn't within [root].
+  String _normalize(String path) {
+    var relative = p.relative(p.normalize(path), from: root);
+    var parts = p.split(relative);
+    // TODO(nweiz): replace this with [p.isWithin] when that exists (issue
+    // 14980).
+    if (!p.isRelative(relative) || parts.first == '..' || parts.first == '.') {
+      throw new ArgumentError('Path "$path" is not inside "$root".');
+    }
+    return p.join(root, relative);
+  }
+
+  /// Returns the segments of [path] beneath [root].
+  List<String> _split(String path) => p.split(p.relative(path, from: root));
+}
diff --git a/pkg/watcher/lib/src/utils.dart b/pkg/watcher/lib/src/utils.dart
index 3d00c08..a235f7d 100644
--- a/pkg/watcher/lib/src/utils.dart
+++ b/pkg/watcher/lib/src/utils.dart
@@ -4,7 +4,9 @@
 
 library watcher.utils;
 
+import 'dart:async';
 import 'dart:io';
+import 'dart:collection';
 
 /// Returns `true` if [error] is a [FileSystemException] for a missing
 /// directory.
@@ -15,3 +17,89 @@
   var notFoundCode = Platform.operatingSystem == "windows" ? 3 : 2;
   return error.osError.errorCode == notFoundCode;
 }
+
+/// Returns the union of all elements in each set in [sets].
+Set unionAll(Iterable<Set> sets) =>
+  sets.fold(new Set(), (union, set) => union.union(set));
+
+/// Returns a buffered stream that will emit the same values as the stream
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+  var subscription;
+  var controller;
+
+  future = future.catchError((e, stackTrace) {
+    // Since [controller] is synchronous, it's likely that emitting an error
+    // will cause it to be cancelled before we call close.
+    if (controller != null) controller.addError(e, stackTrace);
+    if (controller != null) controller.close();
+    controller = null;
+  });
+
+  onListen() {
+    future.then((stream) {
+      if (controller == null) return;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: controller.close);
+    });
+  }
+
+  onCancel() {
+    if (subscription != null) subscription.cancel();
+    subscription = null;
+    controller = null;
+  }
+
+  if (broadcast) {
+    controller = new StreamController.broadcast(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  } else {
+    controller = new StreamController(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  }
+  return controller.stream;
+}
+
+/// Like [new Future], but avoids around issue 11911 by using [new Future.value]
+/// under the covers.
+Future newFuture(callback()) => new Future.value().then((_) => callback());
+
+/// A stream transformer that batches all events that are sent at the same time.
+///
+/// When multiple events are synchronously added to a stream controller, the
+/// [StreamController] implementation uses [scheduleMicrotask] to schedule the
+/// asynchronous firing of each event. In order to recreate the synchronous
+/// batches, this collates all the events that are received in "nearby"
+/// microtasks.
+class BatchedStreamTransformer<T> implements StreamTransformer<T, List<T>> {
+  Stream<List<T>> bind(Stream<T> input) {
+    var batch = new Queue();
+    return new StreamTransformer<T, List<T>>.fromHandlers(
+        handleData: (event, sink) {
+      batch.add(event);
+
+      // [Timer.run] schedules an event that runs after any microtasks that have
+      // been scheduled.
+      Timer.run(() {
+        if (batch.isEmpty) return;
+        sink.add(batch.toList());
+        batch.clear();
+      });
+    }, handleDone: (sink) {
+      if (batch.isNotEmpty) {
+        sink.add(batch.toList());
+        batch.clear();
+      }
+      sink.close();
+    }).bind(input);
+  }
+}
diff --git a/pkg/watcher/lib/watcher.dart b/pkg/watcher/lib/watcher.dart
index c4824b8..88531f2 100644
--- a/pkg/watcher/lib/watcher.dart
+++ b/pkg/watcher/lib/watcher.dart
@@ -6,3 +6,4 @@
 
 export 'src/watch_event.dart';
 export 'src/directory_watcher.dart';
+export 'src/directory_watcher/polling.dart';
diff --git a/pkg/watcher/test/directory_watcher/linux_test.dart b/pkg/watcher/test/directory_watcher/linux_test.dart
new file mode 100644
index 0000000..ba69569
--- /dev/null
+++ b/pkg/watcher/test/directory_watcher/linux_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/linux.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new LinuxDirectoryWatcher(dir);
+
+  setUp(() {
+    // Increase the timeout because closing a [Directory.watch] stream blocks
+    // the main isolate for a very long time on Goobuntu, as of kernel
+    // 3.2.5-gg1336 (see issue 14606).
+    currentSchedule.timeout *= 3;
+
+    createSandbox();
+  });
+
+  sharedTests();
+
+  test('DirectoryWatcher creates a LinuxDirectoryWatcher on Linux', () {
+    expect(new DirectoryWatcher('.'),
+        new isInstanceOf<LinuxDirectoryWatcher>());
+  });
+
+  test('notifies even if the file contents are unchanged', () {
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "before");
+    startWatcher();
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "after");
+    expectModifyEvent("a.txt");
+    expectModifyEvent("b.txt");
+  });
+
+  test('emits events for many nested files moved out then immediately back in',
+      () {
+    withPermutations((i, j, k) =>
+        writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+    startWatcher(dir: "dir");
+
+    renameDir("dir/sub", "sub");
+    renameDir("sub", "dir/sub");
+
+    inAnyOrder(() {
+      withPermutations((i, j, k) =>
+          expectRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+    });
+
+    inAnyOrder(() {
+      withPermutations((i, j, k) =>
+          expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+    });
+  });
+}
diff --git a/pkg/watcher/test/directory_watcher/mac_os_test.dart b/pkg/watcher/test/directory_watcher/mac_os_test.dart
new file mode 100644
index 0000000..7d31221
--- /dev/null
+++ b/pkg/watcher/test/directory_watcher/mac_os_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/mac_os.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new MacOSDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+
+  test('DirectoryWatcher creates a MacOSDirectoryWatcher on Mac OS', () {
+    expect(new DirectoryWatcher('.'),
+        new isInstanceOf<MacOSDirectoryWatcher>());
+  });
+
+  test('does not notify about the watched directory being deleted and '
+      'recreated immediately before watching', () {
+    createDir("dir");
+    writeFile("dir/old.txt");
+    deleteDir("dir");
+    createDir("dir");
+
+    startWatcher(dir: "dir");
+    writeFile("dir/newer.txt");
+    expectAddEvent("dir/newer.txt");
+  });
+
+  test('notifies even if the file contents are unchanged', () {
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "before");
+    startWatcher();
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "after");
+    expectModifyEvent("a.txt");
+    expectModifyEvent("b.txt");
+  });
+
+  test('emits events for many nested files moved out then immediately back in',
+      () {
+    withPermutations((i, j, k) =>
+        writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+
+    // We sleep here because a narrow edge case caused by two interacting bugs
+    // can produce events that aren't expected if we start the watcher too
+    // soon after creating the files above. Here's what happens:
+    //
+    // * We create "dir/sub" and its contents above.
+    //
+    // * We initialize the watcher watching "dir".
+    //
+    // * Due to issue 14373, the watcher can receive native events describing
+    //   the creation of "dir/sub" and its contents despite the fact that they
+    //   occurred before the watcher was started.
+    //
+    // * Usually the above events will occur while the watcher is doing its
+    //   initial scan of "dir/sub" and be ignored, but occasionally they will
+    //   occur afterwards.
+    //
+    // * When processing the bogus CREATE events, the watcher has to assume that
+    //   they could mean something other than CREATE (issue 14793). Thus it
+    //   assumes that the files or directories in question could have changed
+    //   and emits CHANGE events or additional REMOVE/CREATE pairs for them.
+    schedule(() => new Future.delayed(new Duration(seconds: 2)));
+
+    startWatcher(dir: "dir");
+
+    renameDir("dir/sub", "sub");
+    renameDir("sub", "dir/sub");
+
+    inAnyOrder(() {
+      withPermutations((i, j, k) =>
+          expectRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+    });
+
+    inAnyOrder(() {
+      withPermutations((i, j, k) =>
+          expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+    });
+  });
+}
diff --git a/pkg/watcher/test/directory_watcher/polling_test.dart b/pkg/watcher/test/directory_watcher/polling_test.dart
new file mode 100644
index 0000000..02ed5d2
--- /dev/null
+++ b/pkg/watcher/test/directory_watcher/polling_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  // Use a short delay to make the tests run quickly.
+  watcherFactory = (dir) => new PollingDirectoryWatcher(dir,
+      pollingDelay: new Duration(milliseconds: 100));
+
+  setUp(createSandbox);
+
+  sharedTests();
+
+  test('does not notify if the file contents are unchanged', () {
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "before");
+    startWatcher();
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "after");
+    expectModifyEvent("b.txt");
+  });
+
+  test('does not notify if the modification time did not change', () {
+    writeFile("a.txt", contents: "before");
+    writeFile("b.txt", contents: "before");
+    startWatcher();
+    writeFile("a.txt", contents: "after", updateModified: false);
+    writeFile("b.txt", contents: "after");
+    expectModifyEvent("b.txt");
+  });
+}
diff --git a/pkg/watcher/test/directory_watcher/shared.dart b/pkg/watcher/test/directory_watcher/shared.dart
new file mode 100644
index 0000000..fe76a03
--- /dev/null
+++ b/pkg/watcher/test/directory_watcher/shared.dart
@@ -0,0 +1,238 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+sharedTests() {
+  test('does not notify for files that already exist when started', () {
+    // Make some pre-existing files.
+    writeFile("a.txt");
+    writeFile("b.txt");
+
+    startWatcher();
+
+    // Change one after the watcher is running.
+    writeFile("b.txt", contents: "modified");
+
+    // We should get a modify event for the changed file, but no add events
+    // for them before this.
+    expectModifyEvent("b.txt");
+  });
+
+  test('notifies when a file is added', () {
+    startWatcher();
+    writeFile("file.txt");
+    expectAddEvent("file.txt");
+  });
+
+  test('notifies when a file is modified', () {
+    writeFile("file.txt");
+    startWatcher();
+    writeFile("file.txt", contents: "modified");
+    expectModifyEvent("file.txt");
+  });
+
+  test('notifies when a file is removed', () {
+    writeFile("file.txt");
+    startWatcher();
+    deleteFile("file.txt");
+    expectRemoveEvent("file.txt");
+  });
+
+  test('notifies when a file is modified multiple times', () {
+    writeFile("file.txt");
+    startWatcher();
+    writeFile("file.txt", contents: "modified");
+    expectModifyEvent("file.txt");
+    writeFile("file.txt", contents: "modified again");
+    expectModifyEvent("file.txt");
+  });
+
+  test('when the watched directory is deleted, removes all files', () {
+    writeFile("dir/a.txt");
+    writeFile("dir/b.txt");
+
+    startWatcher(dir: "dir");
+
+    deleteDir("dir");
+    inAnyOrder(() {
+      expectRemoveEvent("dir/a.txt");
+      expectRemoveEvent("dir/b.txt");
+    });
+  });
+
+  group("moves", () {
+    test('notifies when a file is moved within the watched directory', () {
+      writeFile("old.txt");
+      startWatcher();
+      renameFile("old.txt", "new.txt");
+
+      inAnyOrder(() {
+        expectAddEvent("new.txt");
+        expectRemoveEvent("old.txt");
+      });
+    });
+
+    test('notifies when a file is moved from outside the watched directory',
+        () {
+      writeFile("old.txt");
+      createDir("dir");
+      startWatcher(dir: "dir");
+
+      renameFile("old.txt", "dir/new.txt");
+      expectAddEvent("dir/new.txt");
+    });
+
+    test('notifies when a file is moved outside the watched directory', () {
+      writeFile("dir/old.txt");
+      startWatcher(dir: "dir");
+
+      renameFile("dir/old.txt", "new.txt");
+      expectRemoveEvent("dir/old.txt");
+    });
+  });
+
+  group("clustered changes", () {
+    test("doesn't notify when a file is created and then immediately removed",
+        () {
+      startWatcher();
+      writeFile("file.txt");
+      deleteFile("file.txt");
+
+      // [startWatcher] will assert that no events were fired.
+    });
+
+    test("reports a modification when a file is deleted and then immediately "
+        "recreated", () {
+      writeFile("file.txt");
+      startWatcher();
+
+      deleteFile("file.txt");
+      writeFile("file.txt", contents: "re-created");
+      expectModifyEvent("file.txt");
+    });
+
+    test("reports a modification when a file is moved and then immediately "
+        "recreated", () {
+      writeFile("old.txt");
+      startWatcher();
+
+      renameFile("old.txt", "new.txt");
+      writeFile("old.txt", contents: "re-created");
+      inAnyOrder(() {
+        expectModifyEvent("old.txt");
+        expectAddEvent("new.txt");
+      });
+    });
+
+    test("reports a removal when a file is modified and then immediately "
+        "removed", () {
+      writeFile("file.txt");
+      startWatcher();
+
+      writeFile("file.txt", contents: "modified");
+      deleteFile("file.txt");
+      expectRemoveEvent("file.txt");
+    });
+
+    test("reports an add when a file is added and then immediately modified",
+        () {
+      startWatcher();
+
+      writeFile("file.txt");
+      writeFile("file.txt", contents: "modified");
+      expectAddEvent("file.txt");
+    });
+  });
+
+  group("subdirectories", () {
+    test('watches files in subdirectories', () {
+      startWatcher();
+      writeFile("a/b/c/d/file.txt");
+      expectAddEvent("a/b/c/d/file.txt");
+    });
+
+    test('notifies when a subdirectory is moved within the watched directory '
+        'and then its contents are modified', () {
+      writeFile("old/file.txt");
+      startWatcher();
+
+      renameDir("old", "new");
+      inAnyOrder(() {
+        expectRemoveEvent("old/file.txt");
+        expectAddEvent("new/file.txt");
+      });
+
+      writeFile("new/file.txt", contents: "modified");
+      expectModifyEvent("new/file.txt");
+    });
+
+    test('emits events for many nested files added at once', () {
+      withPermutations((i, j, k) =>
+          writeFile("sub/sub-$i/sub-$j/file-$k.txt"));
+
+      createDir("dir");
+      startWatcher(dir: "dir");
+      renameDir("sub", "dir/sub");
+
+      inAnyOrder(() {
+        withPermutations((i, j, k)  =>
+            expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+      });
+    });
+
+    test('emits events for many nested files removed at once', () {
+      withPermutations((i, j, k) =>
+          writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+
+      createDir("dir");
+      startWatcher(dir: "dir");
+
+      // Rename the directory rather than deleting it because native watchers
+      // report a rename as a single DELETE event for the directory, whereas
+      // they report recursive deletion with DELETE events for every file in the
+      // directory.
+      renameDir("dir/sub", "sub");
+
+      inAnyOrder(() {
+        withPermutations((i, j, k) =>
+            expectRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+      });
+    });
+
+    test('emits events for many nested files moved at once', () {
+      withPermutations((i, j, k) =>
+          writeFile("dir/old/sub-$i/sub-$j/file-$k.txt"));
+
+      createDir("dir");
+      startWatcher(dir: "dir");
+      renameDir("dir/old", "dir/new");
+
+      inAnyOrder(() {
+        withPermutations((i, j, k) {
+          expectRemoveEvent("dir/old/sub-$i/sub-$j/file-$k.txt");
+          expectAddEvent("dir/new/sub-$i/sub-$j/file-$k.txt");
+        });
+      });
+    });
+
+    test("emits events for many files added at once in a subdirectory with the "
+        "same name as a removed file", () {
+      writeFile("dir/sub");
+      withPermutations((i, j, k) =>
+          writeFile("old/sub-$i/sub-$j/file-$k.txt"));
+      startWatcher(dir: "dir");
+
+      deleteFile("dir/sub");
+      renameDir("old", "dir/sub");
+      inAnyOrder(() {
+        expectRemoveEvent("dir/sub");
+        withPermutations((i, j, k)  =>
+            expectAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+      });
+    });
+  });
+}
diff --git a/pkg/watcher/test/directory_watcher_test.dart b/pkg/watcher/test/directory_watcher_test.dart
deleted file mode 100644
index 841dd08..0000000
--- a/pkg/watcher/test/directory_watcher_test.dart
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import 'utils.dart';
-
-main() {
-  initConfig();
-
-  setUp(createSandbox);
-
-  test('does not notify for files that already exist when started', () {
-    // Make some pre-existing files.
-    writeFile("a.txt");
-    writeFile("b.txt");
-
-    createWatcher();
-
-    // Change one after the watcher is running.
-    writeFile("b.txt", contents: "modified");
-
-    // We should get a modify event for the changed file, but no add events
-    // for them before this.
-    expectModifyEvent("b.txt");
-  });
-
-  test('notifies when a file is added', () {
-    createWatcher();
-    writeFile("file.txt");
-    expectAddEvent("file.txt");
-  });
-
-  test('notifies when a file is modified', () {
-    writeFile("file.txt");
-    createWatcher();
-    writeFile("file.txt", contents: "modified");
-    expectModifyEvent("file.txt");
-  });
-
-  test('notifies when a file is removed', () {
-    writeFile("file.txt");
-    createWatcher();
-    deleteFile("file.txt");
-    expectRemoveEvent("file.txt");
-  });
-
-  test('notifies when a file is moved', () {
-    writeFile("old.txt");
-    createWatcher();
-    renameFile("old.txt", "new.txt");
-    expectAddEvent("new.txt");
-    expectRemoveEvent("old.txt");
-  });
-
-  test('notifies when a file is modified multiple times', () {
-    writeFile("file.txt");
-    createWatcher();
-    writeFile("file.txt", contents: "modified");
-    expectModifyEvent("file.txt");
-    writeFile("file.txt", contents: "modified again");
-    expectModifyEvent("file.txt");
-  });
-
-  test('does not notify if the file contents are unchanged', () {
-    writeFile("a.txt", contents: "same");
-    writeFile("b.txt", contents: "before");
-    createWatcher();
-    writeFile("a.txt", contents: "same");
-    writeFile("b.txt", contents: "after");
-    expectModifyEvent("b.txt");
-  });
-
-  test('does not notify if the modification time did not change', () {
-    writeFile("a.txt", contents: "before");
-    writeFile("b.txt", contents: "before");
-    createWatcher();
-    writeFile("a.txt", contents: "after", updateModified: false);
-    writeFile("b.txt", contents: "after");
-    expectModifyEvent("b.txt");
-  });
-
-  test('watches files in subdirectories', () {
-    createWatcher();
-    writeFile("a/b/c/d/file.txt");
-    expectAddEvent("a/b/c/d/file.txt");
-  });
-
-  test('watches a directory created after the watcher', () {
-    // Watch a subdirectory that doesn't exist yet.
-    createWatcher(dir: "a");
-
-    // This implicity creates it.
-    writeFile("a/b/c/d/file.txt");
-    expectAddEvent("a/b/c/d/file.txt");
-  });
-
-  test('when the watched directory is deleted, removes all files', () {
-    writeFile("dir/a.txt");
-    writeFile("dir/b.txt");
-
-    createWatcher(dir: "dir");
-
-    deleteDir("dir");
-    expectRemoveEvents(["dir/a.txt", "dir/b.txt"]);
-  });
-}
diff --git a/pkg/watcher/test/no_subscription/linux_test.dart b/pkg/watcher/test/no_subscription/linux_test.dart
new file mode 100644
index 0000000..7978830
--- /dev/null
+++ b/pkg/watcher/test/no_subscription/linux_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/linux.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new LinuxDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
\ No newline at end of file
diff --git a/pkg/watcher/test/no_subscription/mac_os_test.dart b/pkg/watcher/test/no_subscription/mac_os_test.dart
new file mode 100644
index 0000000..3862134
--- /dev/null
+++ b/pkg/watcher/test/no_subscription/mac_os_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/mac_os.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+// This is currently failing due to issue 14793. The reason is fairly complex:
+//
+// 1. As part of the test, an "unwatched.txt" file is created while there are no
+//    active watchers on the containing directory.
+//
+// 2. A watcher is then added.
+//
+// 3. The watcher lists the contents of the directory and notices that
+//    "unwatched.txt" already exists.
+//
+// 4. Since FSEvents reports past changes (issue 14373), the IO event stream
+//    emits a CREATED event for "unwatched.txt".
+//
+// 5. Due to issue 14793, the watcher cannot trust that this is really a CREATED
+//    event and checks the status of "unwatched.txt" on the filesystem against
+//    its internal state.
+//
+// 6. "unwatched.txt" exists on the filesystem and the watcher knows about it
+//    internally as well. It assumes this means that the file was modified.
+//
+// 7. The watcher emits an unexpected MODIFIED event for "unwatched.txt",
+//    causing the test to fail.
+//
+// Once issue 14793 is fixed, this will no longer be the case and the test will
+// work again.
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new MacOSDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
\ No newline at end of file
diff --git a/pkg/watcher/test/no_subscription/polling_test.dart b/pkg/watcher/test/no_subscription/polling_test.dart
new file mode 100644
index 0000000..fa4f0cb
--- /dev/null
+++ b/pkg/watcher/test/no_subscription/polling_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new PollingDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
\ No newline at end of file
diff --git a/pkg/watcher/test/no_subscription_test.dart b/pkg/watcher/test/no_subscription/shared.dart
similarity index 63%
rename from pkg/watcher/test/no_subscription_test.dart
rename to pkg/watcher/test/no_subscription/shared.dart
index 2e7b6d3..de625d5 100644
--- a/pkg/watcher/test/no_subscription_test.dart
+++ b/pkg/watcher/test/no_subscription/shared.dart
@@ -3,18 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:watcher/watcher.dart';
 
-import 'utils.dart';
+import '../utils.dart';
 
-main() {
-  initConfig();
-
-  setUp(createSandbox);
-
-  test('does not notify for changes when there were no subscribers', () {
+sharedTests() {
+  test('does not notify for changes when there are no subscribers', () {
     // Note that this test doesn't rely as heavily on the test functions in
     // utils.dart because it needs to be very explicit about when the event
     // stream is and is not subscribed.
@@ -23,8 +20,7 @@
     // Subscribe to the events.
     var completer = new Completer();
     var subscription = watcher.events.listen(wrapAsync((event) {
-      expect(event.type, equals(ChangeType.ADD));
-      expect(event.path, endsWith("file.txt"));
+      expect(event, isWatchEvent(ChangeType.ADD, "file.txt"));
       completer.complete();
     }));
 
@@ -45,22 +41,25 @@
     schedule(() {
       completer = new Completer();
       subscription = watcher.events.listen(wrapAsync((event) {
+        // TODO(nweiz): Remove this when either issue 14373 or 14793 is fixed.
+        // Issue 14373 means that the new [Directory.watch] will emit an event
+        // for "unwatched.txt" being created, and issue 14793 means we have to
+        // check the filesystem, which leads us to assume that the file has been
+        // modified.
+        if (Platform.isMacOS && event.path.endsWith("unwatched.txt")) {
+          expect(event, isWatchEvent(ChangeType.MODIFY, "unwatched.txt"));
+          return;
+        }
+
         // We should get an event for the third file, not the one added while
         // we weren't subscribed.
-        expect(event.type, equals(ChangeType.ADD));
-        expect(event.path, endsWith("added.txt"));
+        expect(event, isWatchEvent(ChangeType.ADD, "added.txt"));
         completer.complete();
       }));
-    });
 
-    // The watcher will have been cancelled and then resumed in the middle of
-    // its pause between polling loops. That means the second scan to skip
-    // what changed while we were unsubscribed won't happen until after that
-    // delay is done. Wait long enough for that to happen.
-    //
-    // We're doing * 4 here because that seems to give the slower bots enough
-    // time for this to complete.
-    schedule(() => new Future.delayed(watcher.pollingDelay * 4));
+      // Wait until the watcher is ready to dispatch events again.
+      return watcher.ready;
+    });
 
     // And add a third file.
     writeFile("added.txt");
diff --git a/pkg/watcher/test/path_set_test.dart b/pkg/watcher/test/path_set_test.dart
new file mode 100644
index 0000000..f433ad3
--- /dev/null
+++ b/pkg/watcher/test/path_set_test.dart
@@ -0,0 +1,235 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+import 'package:unittest/unittest.dart';
+import 'package:watcher/src/path_set.dart';
+
+import 'utils.dart';
+
+Matcher containsPath(String path) => predicate((set) =>
+    set is PathSet && set.contains(path),
+    'set contains "$path"');
+
+Matcher containsDir(String path) => predicate((set) =>
+    set is PathSet && set.containsDir(path),
+    'set contains directory "$path"');
+
+void main() {
+  initConfig();
+
+  var set;
+  setUp(() => set = new PathSet("root"));
+
+  group("adding a path", () {
+    test("stores the path in the set", () {
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's a subdir of another path keeps both in the set", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/path"));
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's not normalized normalizes the path before storing it", () {
+      set.add("root/../root/path/to/../to/././file");
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's absolute normalizes the path before storing it", () {
+      set.add(p.absolute("root/path/to/file"));
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's not beneath the root throws an error", () {
+      expect(() => set.add("path/to/file"), throwsArgumentError);
+    });
+  });
+
+  group("removing a path", () {
+    test("that's in the set removes and returns that path", () {
+      set.add("root/path/to/file");
+      expect(set.remove("root/path/to/file"),
+          unorderedEquals([p.normalize("root/path/to/file")]));
+      expect(set, isNot(containsPath("root/path/to/file")));
+    });
+
+    test("that's not in the set returns an empty set", () {
+      set.add("root/path/to/file");
+      expect(set.remove("root/path/to/nothing"), isEmpty);
+    });
+
+    test("that's a directory removes and returns all files beneath it", () {
+      set.add("root/outside");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+      set.add("root/path/to/sub/three");
+
+      expect(set.remove("root/path"), unorderedEquals([
+        "root/path/to/one",
+        "root/path/to/two",
+        "root/path/to/sub/three"
+      ].map(p.normalize)));
+
+      expect(set, containsPath("root/outside"));
+      expect(set, isNot(containsPath("root/path/to/one")));
+      expect(set, isNot(containsPath("root/path/to/two")));
+      expect(set, isNot(containsPath("root/path/to/sub/three")));
+    });
+  
+    test("that's a directory in the set removes and returns it and all files "
+        "beneath it", () {
+      set.add("root/path");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+      set.add("root/path/to/sub/three");
+
+      expect(set.remove("root/path"), unorderedEquals([
+        "root/path",
+        "root/path/to/one",
+        "root/path/to/two",
+        "root/path/to/sub/three"
+      ].map(p.normalize)));
+
+      expect(set, isNot(containsPath("root/path")));
+      expect(set, isNot(containsPath("root/path/to/one")));
+      expect(set, isNot(containsPath("root/path/to/two")));
+      expect(set, isNot(containsPath("root/path/to/sub/three")));
+    });
+
+    test("that's not normalized removes and returns the normalized path", () {
+      set.add("root/path/to/file");
+      expect(set.remove("root/../root/path/to/../to/./file"),
+          unorderedEquals([p.normalize("root/path/to/file")]));
+    });
+
+    test("that's absolute removes and returns the normalized path", () {
+      set.add("root/path/to/file");
+      expect(set.remove(p.absolute("root/path/to/file")),
+          unorderedEquals([p.normalize("root/path/to/file")]));
+    });
+
+    test("that's not beneath the root throws an error", () {
+      expect(() => set.remove("path/to/file"), throwsArgumentError);
+    });
+  });
+
+  group("containsPath()", () {
+    test("returns false for a non-existent path", () {
+      set.add("root/path/to/file");
+      expect(set, isNot(containsPath("root/path/to/nothing")));
+    });
+
+    test("returns false for a directory that wasn't added explicitly", () {
+      set.add("root/path/to/file");
+      expect(set, isNot(containsPath("root/path")));
+    });
+
+    test("returns true for a directory that was added explicitly", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/path"));
+    });
+
+    test("with a non-normalized path normalizes the path before looking it up",
+        () {
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/../root/path/to/../to/././file"));
+    });
+
+    test("with an absolute path normalizes the path before looking it up", () {
+      set.add("root/path/to/file");
+      expect(set, containsPath(p.absolute("root/path/to/file")));
+    });
+
+    test("with a path that's not beneath the root throws an error", () {
+      expect(() => set.contains("path/to/file"), throwsArgumentError);
+    });
+  });
+
+  group("containsDir()", () {
+    test("returns true for a directory that was added implicitly", () {
+      set.add("root/path/to/file");
+      expect(set, containsDir("root/path"));
+      expect(set, containsDir("root/path/to"));
+    });
+
+    test("returns true for a directory that was added explicitly", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      expect(set, containsDir("root/path"));
+    });
+
+    test("returns false for a directory that wasn't added", () {
+      expect(set, isNot(containsDir("root/nothing")));
+    });
+
+    test("returns false for a non-directory path that was added", () {
+      set.add("root/path/to/file");
+      expect(set, isNot(containsDir("root/path/to/file")));
+    });
+
+    test("returns false for a directory that was added implicitly and then "
+        "removed implicitly", () {
+      set.add("root/path/to/file");
+      set.remove("root/path/to/file");
+      expect(set, isNot(containsDir("root/path")));
+    });
+
+    test("returns false for a directory that was added explicitly whose "
+        "children were then removed", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      set.remove("root/path/to/file");
+      expect(set, isNot(containsDir("root/path")));
+    });
+
+    test("with a non-normalized path normalizes the path before looking it up",
+        () {
+      set.add("root/path/to/file");
+      expect(set, containsDir("root/../root/path/to/../to/."));
+    });
+
+    test("with an absolute path normalizes the path before looking it up", () {
+      set.add("root/path/to/file");
+      expect(set, containsDir(p.absolute("root/path")));
+    });
+  });
+
+  group("toSet", () {
+    test("returns paths added to the set", () {
+      set.add("root/path");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+
+      expect(set.toSet(), unorderedEquals([
+        "root/path",
+        "root/path/to/one",
+        "root/path/to/two",
+      ].map(p.normalize)));
+    });
+
+    test("doesn't return paths removed from the set", () {
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+      set.remove("root/path/to/two");
+
+      expect(set.toSet(), unorderedEquals([p.normalize("root/path/to/one")]));
+    });
+  });
+
+  group("clear", () {
+    test("removes all paths from the set", () {
+      set.add("root/path");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+
+      set.clear();
+      expect(set.toSet(), isEmpty);
+    });
+  });
+}
diff --git a/pkg/watcher/test/ready/linux_test.dart b/pkg/watcher/test/ready/linux_test.dart
new file mode 100644
index 0000000..7978830
--- /dev/null
+++ b/pkg/watcher/test/ready/linux_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/linux.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new LinuxDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
\ No newline at end of file
diff --git a/pkg/watcher/test/ready/mac_os_test.dart b/pkg/watcher/test/ready/mac_os_test.dart
new file mode 100644
index 0000000..e0275c4
--- /dev/null
+++ b/pkg/watcher/test/ready/mac_os_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/mac_os.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new MacOSDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
\ No newline at end of file
diff --git a/pkg/watcher/test/ready/polling_test.dart b/pkg/watcher/test/ready/polling_test.dart
new file mode 100644
index 0000000..fa4f0cb
--- /dev/null
+++ b/pkg/watcher/test/ready/polling_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  watcherFactory = (dir) => new PollingDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
\ No newline at end of file
diff --git a/pkg/watcher/test/ready_test.dart b/pkg/watcher/test/ready/shared.dart
similarity index 95%
rename from pkg/watcher/test/ready_test.dart
rename to pkg/watcher/test/ready/shared.dart
index 11b77e0..af1b58f 100644
--- a/pkg/watcher/test/ready_test.dart
+++ b/pkg/watcher/test/ready/shared.dart
@@ -2,17 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import 'utils.dart';
+import '../utils.dart';
 
-main() {
-  initConfig();
-
-  setUp(createSandbox);
-
+sharedTests() {
   test('ready does not complete until after subscription', () {
     var watcher = createWatcher(waitForReady: false);
 
diff --git a/pkg/watcher/test/utils.dart b/pkg/watcher/test/utils.dart
index 28d57b0..567bdb2 100644
--- a/pkg/watcher/test/utils.dart
+++ b/pkg/watcher/test/utils.dart
@@ -5,6 +5,7 @@
 library watcher.test.utils;
 
 import 'dart:async';
+import 'dart:collection';
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
@@ -12,6 +13,7 @@
 import 'package:unittest/compact_vm_config.dart';
 import 'package:watcher/watcher.dart';
 import 'package:watcher/src/stat.dart';
+import 'package:watcher/src/utils.dart';
 
 /// The path to the temporary sandbox created for each test. All file
 /// operations are implicitly relative to this directory.
@@ -36,6 +38,14 @@
 /// increment the mod time for that file instantly.
 Map<String, int> _mockFileModificationTimes;
 
+typedef DirectoryWatcher WatcherFactory(String directory);
+
+/// Sets the function used to create the directory watcher.
+set watcherFactory(WatcherFactory factory) {
+  _watcherFactory = factory;
+}
+WatcherFactory _watcherFactory;
+
 void initConfig() {
   useCompactVMConfiguration();
   filterStacks = true;
@@ -54,10 +64,10 @@
     path = p.normalize(p.relative(path, from: _sandboxDir));
 
     // Make sure we got a path in the sandbox.
-    assert(p.isRelative(path)  && !path.startsWith(".."));
+    assert(p.isRelative(path) && !path.startsWith(".."));
 
-    return new DateTime.fromMillisecondsSinceEpoch(
-        _mockFileModificationTimes[path]);
+    var mtime = _mockFileModificationTimes[path];
+    return new DateTime.fromMillisecondsSinceEpoch(mtime == null ? 0 : mtime);
   });
 
   // Delete the sandbox when done.
@@ -86,68 +96,119 @@
     dir = p.join(_sandboxDir, dir);
   }
 
-  // Use a short delay to make the tests run quickly.
-  _watcher = new DirectoryWatcher(dir,
-      pollingDelay: new Duration(milliseconds: 100));
+  var watcher = _watcherFactory(dir);
 
   // Wait until the scan is finished so that we don't miss changes to files
   // that could occur before the scan completes.
   if (waitForReady != false) {
-    schedule(() => _watcher.ready, "wait for watcher to be ready");
+    schedule(() => watcher.ready, "wait for watcher to be ready");
   }
 
-  currentSchedule.onComplete.schedule(() {
-    _nextEvent = 0;
-    _watcher = null;
-  }, "reset watcher");
-
-  return _watcher;
+  return watcher;
 }
 
-/// Expects that the next set of events will all be changes of [type] on
-/// [paths].
+/// The stream of events from the watcher started with [startWatcher].
+Stream _watcherEvents;
+
+/// Creates a new [DirectoryWatcher] that watches a temporary directory and
+/// starts monitoring it for events.
 ///
-/// Validates that events are delivered for all paths in [paths], but allows
-/// them in any order.
-void expectEvents(ChangeType type, Iterable<String> paths) {
-  var pathSet = paths
-      .map((path) => p.join(_sandboxDir, path))
-      .map(p.normalize)
-      .toSet();
+/// If [dir] is provided, watches a subdirectory in the sandbox with that name.
+void startWatcher({String dir}) {
+  // We want to wait until we're ready *after* we subscribe to the watcher's
+  // events.
+  _watcher = createWatcher(dir: dir, waitForReady: false);
 
-  // Create an expectation for as many paths as we have.
-  var futures = [];
+  // Schedule [_watcher.events.listen] so that the watcher doesn't start
+  // watching [dir] before it exists. Expose [_watcherEvents] immediately so
+  // that it can be accessed synchronously after this.
+  _watcherEvents = futureStream(schedule(() {
+    var allEvents = new Queue();
+    var subscription = _watcher.events.listen(allEvents.add,
+        onError: currentSchedule.signalError);
 
-  for (var i = 0; i < paths.length; i++) {
-    // Immediately create the futures. This ensures we don't register too
-    // late and drop the event before we receive it.
-    var future = _watcher.events.elementAt(_nextEvent++).then((event) {
-      expect(event.type, equals(type));
-      expect(pathSet, contains(event.path));
+    currentSchedule.onComplete.schedule(() {
+      var numEvents = _nextEvent;
+      subscription.cancel();
+      _nextEvent = 0;
+      _watcher = null;
 
-      pathSet.remove(event.path);
-    });
+      // If there are already errors, don't add this to the output and make
+      // people think it might be the root cause.
+      if (currentSchedule.errors.isEmpty) {
+        expect(allEvents, hasLength(numEvents));
+      } else {
+        currentSchedule.addDebugInfo("Events fired:\n${allEvents.join('\n')}");
+      }
+    }, "reset watcher");
 
-    // Make sure the schedule is watching it in case it fails.
-    currentSchedule.wrapFuture(future);
+    return _watcher.events;
+  }, "create watcher"), broadcast: true);
 
-    futures.add(future);
+  schedule(() => _watcher.ready, "wait for watcher to be ready");
+}
+
+/// A future set by [inAnyOrder] that will complete to the set of events that
+/// occur in the [inAnyOrder] block.
+Future<Set<WatchEvent>> _unorderedEventFuture;
+
+/// Runs [block] and allows multiple [expectEvent] calls in that block to match
+/// events in any order.
+void inAnyOrder(block()) {
+  var oldFuture = _unorderedEventFuture;
+  try {
+    var firstEvent = _nextEvent;
+    var completer = new Completer();
+    _unorderedEventFuture = completer.future;
+    block();
+
+    _watcherEvents.skip(firstEvent).take(_nextEvent - firstEvent).toSet()
+        .then(completer.complete, onError: completer.completeError);
+    currentSchedule.wrapFuture(_unorderedEventFuture,
+        "waiting for ${_nextEvent - firstEvent} events");
+  } finally {
+    _unorderedEventFuture = oldFuture;
   }
-
-  // Schedule it so that later file modifications don't occur until after this
-  // event is received.
-  schedule(() => Future.wait(futures),
-      "wait for $type events on ${paths.join(', ')}");
 }
 
-void expectAddEvent(String path) => expectEvents(ChangeType.ADD, [path]);
-void expectModifyEvent(String path) => expectEvents(ChangeType.MODIFY, [path]);
-void expectRemoveEvent(String path) => expectEvents(ChangeType.REMOVE, [path]);
+/// Expects that the next set of event will be a change of [type] on [path].
+///
+/// Multiple calls to [expectEvent] require that the events are received in that
+/// order unless they're called in an [inAnyOrder] block.
+void expectEvent(ChangeType type, String path) {
+  if (_unorderedEventFuture != null) {
+    // Assign this to a local variable since it will be un-assigned by the time
+    // the scheduled callback runs.
+    var future = _unorderedEventFuture;
 
-void expectRemoveEvents(Iterable<String> paths) {
-  expectEvents(ChangeType.REMOVE, paths);
+    expect(
+        schedule(() => future, "should fire $type event on $path"),
+        completion(contains(isWatchEvent(type, path))));
+  } else {
+    var future = currentSchedule.wrapFuture(
+        _watcherEvents.elementAt(_nextEvent),
+        "waiting for $type event on $path");
+
+    expect(
+        schedule(() => future, "should fire $type event on $path"),
+        completion(isWatchEvent(type, path)));
+  }
+  _nextEvent++;
 }
 
+/// Returns a matcher that matches a [WatchEvent] with the given [type] and
+/// [path].
+Matcher isWatchEvent(ChangeType type, String path) {
+  return predicate((e) {
+    return e is WatchEvent && e.type == type &&
+        e.path == p.join(_sandboxDir, p.normalize(path));
+  }, "is $type $path");
+}
+
+void expectAddEvent(String path) => expectEvent(ChangeType.ADD, path);
+void expectModifyEvent(String path) => expectEvent(ChangeType.MODIFY, path);
+void expectRemoveEvent(String path) => expectEvent(ChangeType.REMOVE, path);
+
 /// Schedules writing a file in the sandbox at [path] with [contents].
 ///
 /// If [contents] is omitted, creates an empty file. If [updatedModified] is
@@ -201,6 +262,21 @@
   }, "rename file $from to $to");
 }
 
+/// Schedules creating a directory in the sandbox at [path].
+void createDir(String path) {
+  schedule(() {
+    new Directory(p.join(_sandboxDir, path)).createSync();
+  }, "create directory $path");
+}
+
+/// Schedules renaming a directory in the sandbox from [from] to [to].
+void renameDir(String from, String to) {
+  schedule(() {
+    new Directory(p.join(_sandboxDir, from))
+        .renameSync(p.join(_sandboxDir, to));
+  }, "rename directory $from to $to");
+}
+
 /// Schedules deleting a directory in the sandbox at [path].
 void deleteDir(String path) {
   schedule(() {
@@ -208,22 +284,17 @@
   }, "delete directory $path");
 }
 
-/// A [Matcher] for [WatchEvent]s.
-class _ChangeMatcher extends Matcher {
-  /// The expected change.
-  final ChangeType type;
-
-  /// The expected path.
-  final String path;
-
-  _ChangeMatcher(this.type, this.path);
-
-  Description describe(Description description) {
-    description.add("$type $path");
+/// Runs [callback] with every permutation of non-negative [i], [j], and [k]
+/// less than [limit].
+///
+/// [limit] defaults to 3.
+void withPermutations(callback(int i, int j, int k), {int limit}) {
+  if (limit == null) limit = 3;
+  for (var i = 0; i < limit; i++) {
+    for (var j = 0; j < limit; j++) {
+      for (var k = 0; k < limit; k++) {
+        callback(i, j, k);
+      }
+    }
   }
-
-  bool matches(item, Map matchState) =>
-      item is WatchEvent &&
-      item.type == type &&
-      p.normalize(item.path) == p.normalize(path);
 }
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 8d8145e..9f241b1 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -75,18 +75,22 @@
   _httpRequestResponseCode = 0;
   _httpRequestStatusString = null;
   _httpRequestResponse = null;
-  Uri requestUri = Uri.parse(uri);
-  _client.getUrl(requestUri)
-      .then((HttpClientRequest request) => request.close())
-      .then((HttpClientResponse response) {
-        return response
-            .fold(new BytesBuilder(), (b, d) => b..add(d))
-            .then((builder) {
-              _requestCompleted(builder.takeBytes(), response);
-            });
-      }).catchError((error) {
-        _requestFailed(error);
-      });
+  try {
+    Uri requestUri = Uri.parse(uri);
+    _client.getUrl(requestUri)
+        .then((HttpClientRequest request) => request.close())
+        .then((HttpClientResponse response) {
+          return response
+              .fold(new BytesBuilder(), (b, d) => b..add(d))
+              .then((builder) {
+                _requestCompleted(builder.takeBytes(), response);
+              });
+        }).catchError((error) {
+          _requestFailed(error);
+        });
+  } catch (error) {
+    _requestFailed(error);
+  }
 }
 
 
@@ -163,7 +167,13 @@
 
 _setPackageRoot(String packageRoot) {
   packageRoot = _enforceTrailingSlash(packageRoot);
-  _packageRoot = _workingDirectoryUri.resolve(packageRoot);
+  if (packageRoot.startsWith('file:') ||
+      packageRoot.startsWith('http:') ||
+      packageRoot.startsWith('https:')) {
+    _packageRoot = _workingDirectoryUri.resolve(packageRoot);
+  } else {
+    _packageRoot = _workingDirectoryUri.resolveUri(new Uri.file(packageRoot));
+  }
   _logResolution('# Package root: $packageRoot -> $_packageRoot');
 }
 
@@ -214,73 +224,33 @@
 }
 
 
+// Returns either a file path or a URI starting with http:, as a String.
 String _filePathFromUri(String userUri) {
   var uri = Uri.parse(userUri);
   _logResolution('# Getting file path from: $uri');
 
   var path;
   switch (uri.scheme) {
+    case '':
     case 'file':
-      path = _filePathFromFileUri(uri);
+      return uri.toFilePath();
       break;
     case 'dart-ext':
-      path = _filePathFromOtherUri(uri);
+      return new Uri(scheme: 'file',
+                     host: uri.host,
+                     path: uri.path).toFilePath();
       break;
     case 'package':
-      path = _filePathFromPackageUri(uri);
+      return _filePathFromPackageUri(uri);
       break;
     case 'http':
-      path = _filePathFromHttpUri(uri);
-      break;
+      return uri.toString();
     default:
-      // Only handling file and package URIs in standalone binary.
+      // Only handling file, dart-ext, http, and package URIs
+      // in standalone binary.
       _logResolution('# Unknown scheme (${uri.scheme}) in $uri.');
       throw 'Not a known scheme: $uri';
   }
-
-  if (_isWindows && path.startsWith('/')) {
-    // For Windows we need to massage the paths a bit according to
-    // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx
-    //
-    // Drop the leading / before the drive letter.
-    // TODO(14577): Handle paths like \\server\share\dir\file.
-    path = path.substring(1);
-    _logResolution('# Path: Removed leading / -> $path');
-  }
-
-  return path;
-}
-
-
-String _filePathFromFileUri(Uri uri) {
-  if (!uri.host.isEmpty) {
-    throw "URIs using the 'file:' scheme may not contain a host.";
-  }
-
-  String path = uri.path;
-  _logResolution('# Path: $uri -> ${path}');
-  // Check that the path is not already in the form of /X:.
-  if (_isWindows && (path.length > 2) && path.startsWith('/') &&
-      (path[2] != ':')) {
-    // Absolute path on Windows without a drive letter.
-    if (_workingWindowsDrivePrefix == null) {
-      throw 'Could not determine windows drive letter prefix.';
-    }
-    _logResolution('# Path: Windows absolute path needs a drive letter.'
-                   ' Prepending $_workingWindowsDrivePrefix.');
-    path = '$_workingWindowsDrivePrefix$path';
-  }
-  return path;
-}
-
-
-String _filePathFromOtherUri(Uri uri) {
-  if (!uri.host.isEmpty) {
-    throw 'URIs whose paths are used as file paths may not contain a host.';
-  }
-
-  _logResolution('# Path: $uri -> ${uri.path}');
-  return uri.path;
 }
 
 
@@ -294,27 +264,8 @@
           "'$right', not '$wrong'.";
   }
 
-  var packageUri;
-  var path;
-  if (_packageRoot != null) {
-    // Resolve against package root.
-    packageUri = _packageRoot.resolve(uri.path);
-  } else {
-    // Resolve against working directory.
-    packageUri = _entryPointScript.resolve('packages/${uri.path}');
-  }
-
-  if (packageUri.scheme == 'file') {
-    path = packageUri.path;
-  } else {
-    path = packageUri.toString();
-  }
-  _logResolution('# Package: $uri -> $path');
-  return path;
-}
-
-
-String _filePathFromHttpUri(Uri uri) {
-  _logResolution('# Path: $uri -> $uri');
-  return uri.toString();
+  var packageRoot = _packageRoot == null ?
+                    _entryPointScript.resolve('packages/') :
+                    _packageRoot;
+  return _filePathFromUri(packageRoot.resolve(uri.path).toString());
 }
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index daed270..d9df5b3 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -227,29 +227,47 @@
 
 
 static void FormatValue(dart::TextBuffer* buf, Dart_Handle object) {
+  bool print_text_field = true;
   if (Dart_IsNumber(object)) {
-    buf->Printf("\"kind\":\"number\",");
+    buf->Printf("\"kind\":\"number\"");
   } else if (Dart_IsString(object)) {
-    buf->Printf("\"kind\":\"string\",");
+    buf->Printf("\"kind\":\"string\"");
   } else if (Dart_IsBoolean(object)) {
-    buf->Printf("\"kind\":\"boolean\",");
+    buf->Printf("\"kind\":\"boolean\"");
   } else if (Dart_IsList(object)) {
     intptr_t len = 0;
     Dart_Handle res = Dart_ListLength(object, &len);
     ASSERT_NOT_ERROR(res);
-    buf->Printf("\"kind\":\"list\",\"length\":%" Pd ",", len);
+    buf->Printf("\"kind\":\"list\",\"length\":%" Pd "", len);
+  } else if (Dart_IsClosure(object)) {
+    Dart_Handle name, signature;
+    Dart_CodeLocation location;
+    Dart_Handle res = Dart_GetClosureInfo(object, &name, &signature, &location);
+    ASSERT_NOT_ERROR(res);
+    buf->Printf("\"kind\":\"function\",\"name\":\"%s\"", GetStringChars(name));
+    buf->Printf(",\"signature\":\"%s\"", GetStringChars(signature));
+    if (!Dart_IsNull(location.script_url)) {
+      ASSERT(Dart_IsString(location.script_url));
+      buf->Printf(",\"location\": { \"url\":");
+      FormatEncodedString(buf, location.script_url);
+      buf->Printf(",\"libraryId\":%d,", location.library_id);
+      buf->Printf("\"tokenOffset\":%d}", location.token_pos);
+    }
+    print_text_field = false;
   } else {
-    buf->Printf("\"kind\":\"object\",");
+    buf->Printf("\"kind\":\"object\"");
     intptr_t class_id = 0;
     Dart_Handle res = Dart_GetObjClassId(object, &class_id);
     if (!Dart_IsError(res)) {
-      buf->Printf("\"classId\":%" Pd ",", class_id);
+      buf->Printf(",\"classId\":%" Pd "", class_id);
     }
   }
-  buf->Printf("\"text\":\"");
-  const intptr_t max_chars = 250;
-  FormatTextualValue(buf, object, max_chars, true);
-  buf->Printf("\"");
+  if (print_text_field) {
+    buf->Printf(",\"text\":\"");
+    const intptr_t max_chars = 250;
+    FormatTextualValue(buf, object, max_chars, true);
+    buf->Printf("\"");
+  }
 }
 
 
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index 0bb07e7..d4960ec 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -130,10 +130,10 @@
         // readdir_r. For those and for links we use stat to determine
         // the actual entry type. Notice that stat returns the type of
         // the file pointed to.
-        struct stat entry_info;
+        struct stat64 entry_info;
         int stat_success;
         stat_success = TEMP_FAILURE_RETRY(
-            lstat(listing->path_buffer().AsString(), &entry_info));
+            lstat64(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
         }
@@ -152,7 +152,7 @@
             previous = previous->next;
           }
           stat_success = TEMP_FAILURE_RETRY(
-              stat(listing->path_buffer().AsString(), &entry_info));
+              stat64(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
             return kListLink;
@@ -231,8 +231,8 @@
 static bool DeleteRecursively(PathBuffer* path) {
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
-  struct stat st;
-  if (TEMP_FAILURE_RETRY(lstat(path->AsString(), &st)) == -1) {
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(lstat64(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
     return (unlink(path->AsString()) == 0);
@@ -274,16 +274,16 @@
         success = success && DeleteFile(entry.d_name, path);
         break;
       case DT_UNKNOWN: {
-        // On some file systems the entry type is not determined by
-        // readdir_r. For those we use lstat to determine the entry
-        // type.
-        struct stat entry_info;
         if (!path->Add(entry.d_name)) {
           success = false;
           break;
         }
+        // On some file systems the entry type is not determined by
+        // readdir_r. For those we use lstat to determine the entry
+        // type.
+        struct stat64 entry_info;
         int lstat_success = TEMP_FAILURE_RETRY(
-            lstat(path->AsString(), &entry_info));
+            lstat64(path->AsString(), &entry_info));
         if (lstat_success == -1) {
           success = false;
           break;
@@ -315,8 +315,8 @@
 
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
-  struct stat entry_info;
-  int success = TEMP_FAILURE_RETRY(stat(dir_name, &entry_info));
+  struct stat64 entry_info;
+  int success = TEMP_FAILURE_RETRY(stat64(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
diff --git a/runtime/bin/eventhandler.cc b/runtime/bin/eventhandler.cc
index 8de036e..e19e928 100644
--- a/runtime/bin/eventhandler.cc
+++ b/runtime/bin/eventhandler.cc
@@ -90,13 +90,18 @@
   if (Dart_IsNull(sender)) {
     id = kTimerId;
   } else {
-    Socket::GetSocketIdNativeField(sender, &id);
+    id = Socket::GetSocketIdNativeField(sender);
   }
   Dart_Handle handle = Dart_GetNativeArgument(args, 1);
   Dart_Port dart_port =
       DartUtils::GetIntegerField(handle, DartUtils::kIdFieldName);
   int64_t data = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2));
-  event_handler->SendData(id, dart_port, data);
+  if (id == kTimerId && data == 0) {
+    // This is a 0-timer. Simply queue a 'null' on the port.
+    DartUtils::PostNull(dart_port);
+  } else {
+    event_handler->SendData(id, dart_port, data);
+  }
 }
 
 }  // namespace bin
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 9064be1..6a339b3 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -74,6 +74,9 @@
   event.events = sd->GetPollEvents();
   event.data.ptr = sd;
   if (sd->port() != 0 && event.events != 0) {
+    // Only report events once and wait for them to be re-enabled after the
+    // event has been handled by the Dart code.
+    event.events |= EPOLLONESHOT;
     int status = 0;
     if (sd->tracked_by_epoll()) {
       status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
@@ -175,47 +178,30 @@
 }
 
 
-bool EventHandlerImplementation::GetInterruptMessage(InterruptMessage* msg) {
-  char* dst = reinterpret_cast<char*>(msg);
-  int total_read = 0;
-  int bytes_read =
-      TEMP_FAILURE_RETRY(read(interrupt_fds_[0], dst, kInterruptMessageSize));
-  if (bytes_read < 0) {
-    return false;
-  }
-  total_read = bytes_read;
-  while (total_read < kInterruptMessageSize) {
-    bytes_read = TEMP_FAILURE_RETRY(read(interrupt_fds_[0],
-                                         dst + total_read,
-                                         kInterruptMessageSize - total_read));
-    if (bytes_read > 0) {
-      total_read = total_read + bytes_read;
-    }
-  }
-  return (total_read == kInterruptMessageSize) ? true : false;
-}
-
 void EventHandlerImplementation::HandleInterruptFd() {
-  InterruptMessage msg;
-  while (GetInterruptMessage(&msg)) {
-    if (msg.id == kTimerId) {
-      timeout_queue_.UpdateTimeout(msg.dart_port, msg.data);
-    } else if (msg.id == kShutdownId) {
+  const intptr_t MAX_MESSAGES = kInterruptMessageSize;
+  InterruptMessage msg[MAX_MESSAGES];
+  ssize_t bytes = TEMP_FAILURE_RETRY(
+      read(interrupt_fds_[0], msg, MAX_MESSAGES * kInterruptMessageSize));
+  for (ssize_t i = 0; i < bytes / kInterruptMessageSize; i++) {
+    if (msg[i].id == kTimerId) {
+      timeout_queue_.UpdateTimeout(msg[i].dart_port, msg[i].data);
+    } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
-      SocketData* sd = GetSocketData(msg.id);
-      if ((msg.data & (1 << kShutdownReadCommand)) != 0) {
-        ASSERT(msg.data == (1 << kShutdownReadCommand));
+      SocketData* sd = GetSocketData(msg[i].id);
+      if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownReadCommand));
         // Close the socket for reading.
         sd->ShutdownRead();
         UpdateEpollInstance(epoll_fd_, sd);
-      } else if ((msg.data & (1 << kShutdownWriteCommand)) != 0) {
-        ASSERT(msg.data == (1 << kShutdownWriteCommand));
+      } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
         // Close the socket for writing.
         sd->ShutdownWrite();
         UpdateEpollInstance(epoll_fd_, sd);
-      } else if ((msg.data & (1 << kCloseCommand)) != 0) {
-        ASSERT(msg.data == (1 << kCloseCommand));
+      } 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);
@@ -231,10 +217,10 @@
         }
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         delete sd;
-        DartUtils::PostInt32(msg.dart_port, 1 << kDestroyedEvent);
+        DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
       } else {
         // Setup events to wait for.
-        sd->SetPortAndMask(msg.dart_port, msg.data);
+        sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
         UpdateEpollInstance(epoll_fd_, sd);
       }
     }
@@ -348,22 +334,28 @@
 
 void EventHandlerImplementation::HandleEvents(struct epoll_event* events,
                                               int size) {
+  bool interrupt_seen = false;
   for (int i = 0; i < size; i++) {
-    if (events[i].data.ptr != NULL) {
+    if (events[i].data.ptr == NULL) {
+      interrupt_seen = true;
+    } else {
       SocketData* sd = reinterpret_cast<SocketData*>(events[i].data.ptr);
       intptr_t event_mask = GetPollEvents(events[i].events, sd);
-      if (event_mask != 0) {
-        // Unregister events for the file descriptor. Events will be
-        // registered again when the current event has been handled in
-        // Dart code.
-        RemoveFromEpollInstance(epoll_fd_, sd);
+      if (event_mask == 0) {
+        // Event not handled, re-add to epoll.
+        UpdateEpollInstance(epoll_fd_, sd);
+      } else {
         Dart_Port port = sd->port();
         ASSERT(port != 0);
         DartUtils::PostInt32(port, event_mask);
       }
     }
   }
-  HandleInterruptFd();
+  if (interrupt_seen) {
+    // Handle after socket events, so we avoid closing a socket before we handle
+    // the current events.
+    HandleInterruptFd();
+  }
 }
 
 
@@ -408,8 +400,9 @@
       if (errno != EWOULDBLOCK) {
         perror("Poll failed");
       }
-    } else {
+    } else if (result == 0) {
       handler->HandleTimeout();
+    } else {
       handler->HandleEvents(events, result);
     }
   }
diff --git a/runtime/bin/eventhandler_android.h b/runtime/bin/eventhandler_android.h
index 212193a..2056b27 100644
--- a/runtime/bin/eventhandler_android.h
+++ b/runtime/bin/eventhandler_android.h
@@ -104,7 +104,6 @@
 
  private:
   int64_t GetTimeout();
-  bool GetInterruptMessage(InterruptMessage* msg);
   void HandleEvents(struct epoll_event* events, int size);
   void HandleTimeout();
   static void Poll(uword args);
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index a14f125..c7e1969 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -74,6 +74,9 @@
   event.events = sd->GetPollEvents();
   event.data.ptr = sd;
   if (sd->port() != 0 && event.events != 0) {
+    // Only report events once and wait for them to be re-enabled after the
+    // event has been handled by the Dart code.
+    event.events |= EPOLLONESHOT;
     int status = 0;
     if (sd->tracked_by_epoll()) {
       status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
@@ -180,48 +183,30 @@
 }
 
 
-bool EventHandlerImplementation::GetInterruptMessage(InterruptMessage* msg) {
-  char* dst = reinterpret_cast<char*>(msg);
-  int total_read = 0;
-  int bytes_read =
-      TEMP_FAILURE_RETRY(read(interrupt_fds_[0], dst, kInterruptMessageSize));
-  if (bytes_read < 0) {
-    return false;
-  }
-  total_read = bytes_read;
-  while (total_read < kInterruptMessageSize) {
-    bytes_read = TEMP_FAILURE_RETRY(read(interrupt_fds_[0],
-                                         dst + total_read,
-                                         kInterruptMessageSize - total_read));
-    if (bytes_read > 0) {
-      total_read = total_read + bytes_read;
-    }
-  }
-  return (total_read == kInterruptMessageSize) ? true : false;
-}
-
-
 void EventHandlerImplementation::HandleInterruptFd() {
-  InterruptMessage msg;
-  while (GetInterruptMessage(&msg)) {
-    if (msg.id == kTimerId) {
-      timeout_queue_.UpdateTimeout(msg.dart_port, msg.data);
-    } else if (msg.id == kShutdownId) {
+  const intptr_t MAX_MESSAGES = kInterruptMessageSize;
+  InterruptMessage msg[MAX_MESSAGES];
+  ssize_t bytes = TEMP_FAILURE_RETRY(
+      read(interrupt_fds_[0], msg, MAX_MESSAGES * kInterruptMessageSize));
+  for (ssize_t i = 0; i < bytes / kInterruptMessageSize; i++) {
+    if (msg[i].id == kTimerId) {
+      timeout_queue_.UpdateTimeout(msg[i].dart_port, msg[i].data);
+    } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
-      SocketData* sd = GetSocketData(msg.id);
-      if ((msg.data & (1 << kShutdownReadCommand)) != 0) {
-        ASSERT(msg.data == (1 << kShutdownReadCommand));
+      SocketData* sd = GetSocketData(msg[i].id);
+      if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownReadCommand));
         // Close the socket for reading.
         sd->ShutdownRead();
         UpdateEpollInstance(epoll_fd_, sd);
-      } else if ((msg.data & (1 << kShutdownWriteCommand)) != 0) {
-        ASSERT(msg.data == (1 << kShutdownWriteCommand));
+      } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
         // Close the socket for writing.
         sd->ShutdownWrite();
         UpdateEpollInstance(epoll_fd_, sd);
-      } else if ((msg.data & (1 << kCloseCommand)) != 0) {
-        ASSERT(msg.data == (1 << kCloseCommand));
+      } 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);
@@ -237,13 +222,13 @@
         }
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         delete sd;
-        DartUtils::PostInt32(msg.dart_port, 1 << kDestroyedEvent);
+        DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
       } else {
-        if ((msg.data & (1 << kInEvent)) != 0 && sd->IsClosedRead()) {
-          DartUtils::PostInt32(msg.dart_port, 1 << kCloseEvent);
+        if ((msg[i].data & (1 << kInEvent)) != 0 && sd->IsClosedRead()) {
+          DartUtils::PostInt32(msg[i].dart_port, 1 << kCloseEvent);
         } else {
           // Setup events to wait for.
-          sd->SetPortAndMask(msg.dart_port, msg.data);
+          sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
           UpdateEpollInstance(epoll_fd_, sd);
         }
       }
@@ -349,24 +334,28 @@
 
 void EventHandlerImplementation::HandleEvents(struct epoll_event* events,
                                               int size) {
+  bool interrupt_seen = false;
   for (int i = 0; i < size; i++) {
-    if (events[i].data.ptr != NULL) {
+    if (events[i].data.ptr == NULL) {
+      interrupt_seen = true;
+    } else {
       SocketData* sd = reinterpret_cast<SocketData*>(events[i].data.ptr);
       intptr_t event_mask = GetPollEvents(events[i].events, sd);
-      if (event_mask != 0) {
-        // Unregister events for the file descriptor. Events will be
-        // registered again when the current event has been handled in
-        // Dart code.
-        RemoveFromEpollInstance(epoll_fd_, sd);
+      if (event_mask == 0) {
+        // Event not handled, re-add to epoll.
+        UpdateEpollInstance(epoll_fd_, sd);
+      } else {
         Dart_Port port = sd->port();
         ASSERT(port != 0);
         DartUtils::PostInt32(port, event_mask);
       }
     }
   }
-  // Handle after socket events, so we avoid closing a socket before we handle
-  // the current events.
-  HandleInterruptFd();
+  if (interrupt_seen) {
+    // Handle after socket events, so we avoid closing a socket before we handle
+    // the current events.
+    HandleInterruptFd();
+  }
 }
 
 
@@ -412,8 +401,9 @@
       if (errno != EWOULDBLOCK) {
         perror("Poll failed");
       }
-    } else {
+    } else if (result == 0) {
       handler_impl->HandleTimeout();
+    } else {
       handler_impl->HandleEvents(events, result);
     }
   }
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index 3a2fe83..6a96aa2 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -103,7 +103,6 @@
 
  private:
   int64_t GetTimeout();
-  bool GetInterruptMessage(InterruptMessage* msg);
   void HandleEvents(struct epoll_event* events, int size);
   void HandleTimeout();
   static void Poll(uword args);
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 8964e3b..67f5c46 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -198,47 +198,30 @@
 }
 
 
-bool EventHandlerImplementation::GetInterruptMessage(InterruptMessage* msg) {
-  char* dst = reinterpret_cast<char*>(msg);
-  int total_read = 0;
-  int bytes_read =
-      TEMP_FAILURE_RETRY(read(interrupt_fds_[0], dst, kInterruptMessageSize));
-  if (bytes_read < 0) {
-    return false;
-  }
-  total_read = bytes_read;
-  while (total_read < kInterruptMessageSize) {
-    bytes_read = TEMP_FAILURE_RETRY(read(interrupt_fds_[0],
-                                         dst + total_read,
-                                         kInterruptMessageSize - total_read));
-    if (bytes_read > 0) {
-      total_read = total_read + bytes_read;
-    }
-  }
-  return (total_read == kInterruptMessageSize) ? true : false;
-}
-
 void EventHandlerImplementation::HandleInterruptFd() {
-  InterruptMessage msg;
-  while (GetInterruptMessage(&msg)) {
-    if (msg.id == kTimerId) {
-      timeout_queue_.UpdateTimeout(msg.dart_port, msg.data);
-    } else if (msg.id == kShutdownId) {
+  const intptr_t MAX_MESSAGES = kInterruptMessageSize;
+  InterruptMessage msg[MAX_MESSAGES];
+  ssize_t bytes = TEMP_FAILURE_RETRY(
+      read(interrupt_fds_[0], msg, MAX_MESSAGES * kInterruptMessageSize));
+  for (ssize_t i = 0; i < bytes / kInterruptMessageSize; i++) {
+    if (msg[i].id == kTimerId) {
+      timeout_queue_.UpdateTimeout(msg[i].dart_port, msg[i].data);
+    } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
-      SocketData* sd = GetSocketData(msg.id);
-      if ((msg.data & (1 << kShutdownReadCommand)) != 0) {
-        ASSERT(msg.data == (1 << kShutdownReadCommand));
+      SocketData* sd = GetSocketData(msg[i].id);
+      if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownReadCommand));
         // Close the socket for reading.
         sd->ShutdownRead();
         UpdateKqueue(kqueue_fd_, sd);
-      } else if ((msg.data & (1 << kShutdownWriteCommand)) != 0) {
-        ASSERT(msg.data == (1 << kShutdownWriteCommand));
+      } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
         // Close the socket for writing.
         sd->ShutdownWrite();
         UpdateKqueue(kqueue_fd_, sd);
-      } else if ((msg.data & (1 << kCloseCommand)) != 0) {
-        ASSERT(msg.data == (1 << kCloseCommand));
+      } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kCloseCommand));
         // Close the socket and free system resources.
         RemoveFromKqueue(kqueue_fd_, sd);
         intptr_t fd = sd->fd();
@@ -253,13 +236,13 @@
         }
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         delete sd;
-        DartUtils::PostInt32(msg.dart_port, 1 << kDestroyedEvent);
+        DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
       } else {
-        if ((msg.data & (1 << kInEvent)) != 0 && sd->IsClosedRead()) {
-          DartUtils::PostInt32(msg.dart_port, 1 << kCloseEvent);
+        if ((msg[i].data & (1 << kInEvent)) != 0 && sd->IsClosedRead()) {
+          DartUtils::PostInt32(msg[i].dart_port, 1 << kCloseEvent);
         } else {
           // Setup events to wait for.
-          sd->SetPortAndMask(msg.dart_port, msg.data);
+          sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
           UpdateKqueue(kqueue_fd_, sd);
         }
       }
@@ -343,6 +326,7 @@
 
 void EventHandlerImplementation::HandleEvents(struct kevent* events,
                                               int size) {
+  bool interrupt_seen = false;
   for (int i = 0; i < size; i++) {
     // If flag EV_ERROR is set it indicates an error in kevent processing.
     if ((events[i].flags & EV_ERROR) != 0) {
@@ -351,7 +335,9 @@
       strerror_r(events[i].data, error_message, kBufferSize);
       FATAL1("kevent failed %s\n", error_message);
     }
-    if (events[i].udata != NULL) {
+    if (events[i].udata == NULL) {
+      interrupt_seen = true;
+    } else {
       SocketData* sd = reinterpret_cast<SocketData*>(events[i].udata);
       intptr_t event_mask = GetEvents(events + i, sd);
       if (event_mask != 0) {
@@ -365,7 +351,11 @@
       }
     }
   }
-  HandleInterruptFd();
+  if (interrupt_seen) {
+    // Handle after socket events, so we avoid closing a socket before we handle
+    // the current events.
+    HandleInterruptFd();
+  }
 }
 
 
diff --git a/runtime/bin/eventhandler_macos.h b/runtime/bin/eventhandler_macos.h
index 0a17ed6..cb765c6 100644
--- a/runtime/bin/eventhandler_macos.h
+++ b/runtime/bin/eventhandler_macos.h
@@ -116,7 +116,6 @@
 
  private:
   int64_t GetTimeout();
-  bool GetInterruptMessage(InterruptMessage* msg);
   void HandleEvents(struct kevent* events, int size);
   void HandleTimeout();
   static void EventHandlerEntry(uword args);
diff --git a/runtime/bin/extensions.cc b/runtime/bin/extensions.cc
index d28d1e1..bdfd587 100644
--- a/runtime/bin/extensions.cc
+++ b/runtime/bin/extensions.cc
@@ -16,23 +16,31 @@
 namespace dart {
 namespace bin {
 
-Dart_Handle Extensions::LoadExtension(const char* extension_url,
+Dart_Handle Extensions::LoadExtension(const char* extension_path,
                                       Dart_Handle parent_library) {
-  char* library_path = strdup(extension_url);
+  char* library_path = strdup(extension_path);
 
   if (library_path == NULL) {
     return Dart_NewApiError("Out of memory in LoadExtension");
   }
 
-  // Extract the path and the extension name from the url.
+  // Extract the directory and the extension name from the path.
   char* last_path_separator = strrchr(library_path, '/');
+  if (last_path_separator == NULL) {
+    last_path_separator = strrchr(library_path, '\\');
+  }
+  if (last_path_separator == NULL) {
+    free(library_path);
+    return Dart_NewApiError("Cannot find extension library directory");
+  }
   char* extension_name = last_path_separator + 1;
+
   *last_path_separator = '\0';  // Terminate library_path at last separator.
 
   void* library_handle = LoadExtensionLibrary(library_path, extension_name);
   if (library_handle == NULL) {
     free(library_path);
-    return Dart_NewApiError("cannot find extension library");
+    return Dart_NewApiError("Cannot find extension library");
   }
 
   const char* strings[] = { extension_name, "_Init", NULL };
@@ -44,7 +52,7 @@
   free(library_path);
 
   if (fn == NULL) {
-    return Dart_NewApiError("cannot find initialization function in extension");
+    return Dart_NewApiError("Cannot find initialization function in extension");
   }
   return (*fn)(parent_library);
 }
diff --git a/runtime/bin/fdutils_android.cc b/runtime/bin/fdutils_android.cc
index 7a60387..2048667 100644
--- a/runtime/bin/fdutils_android.cc
+++ b/runtime/bin/fdutils_android.cc
@@ -20,12 +20,10 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
   if (status < 0) {
-    perror("fcntl F_GETFD failed");
     return false;
   }
   status |= FD_CLOEXEC;
   if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
-    perror("fcntl F_SETFD failed");
     return false;
   }
   return true;
@@ -36,12 +34,10 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
   if (status < 0) {
-    perror("fcntl F_GETFL failed");
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
   if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
-    perror("fcntl F_SETFL failed");
     return false;
   }
   return true;
@@ -62,7 +58,6 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
   if (status < 0) {
-    perror("fcntl F_GETFL failed");
     return false;
   }
   *is_blocking = (status & O_NONBLOCK) == 0;
diff --git a/runtime/bin/fdutils_linux.cc b/runtime/bin/fdutils_linux.cc
index a763c9b..3bb1ce1 100644
--- a/runtime/bin/fdutils_linux.cc
+++ b/runtime/bin/fdutils_linux.cc
@@ -20,12 +20,10 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
   if (status < 0) {
-    perror("fcntl F_GETFD failed");
     return false;
   }
   status |= FD_CLOEXEC;
   if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
-    perror("fcntl F_SETFD failed");
     return false;
   }
   return true;
@@ -36,12 +34,10 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
   if (status < 0) {
-    perror("fcntl F_GETFL failed");
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
   if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
-    perror("fcntl F_SETFL failed");
     return false;
   }
   return true;
@@ -62,7 +58,6 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
   if (status < 0) {
-    perror("fcntl F_GETFL failed");
     return false;
   }
   *is_blocking = (status & O_NONBLOCK) == 0;
diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
index 65f2832..bbc442d 100644
--- a/runtime/bin/fdutils_macos.cc
+++ b/runtime/bin/fdutils_macos.cc
@@ -20,12 +20,10 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
   if (status < 0) {
-    perror("fcntl F_GETFD failed");
     return false;
   }
   status |= FD_CLOEXEC;
   if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
-    perror("fcntl F_SETFD failed");
     return false;
   }
   return true;
@@ -36,12 +34,10 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
   if (status < 0) {
-    perror("fcntl F_GETFL failed");
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
   if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
-    perror("fcntl F_SETFL failed");
     return false;
   }
   return true;
@@ -62,7 +58,6 @@
   intptr_t status;
   status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
   if (status < 0) {
-    perror("fcntl F_GETFL failed");
     return false;
   }
   *is_blocking = (status & O_NONBLOCK) == 0;
@@ -74,7 +69,6 @@
   int available;  // ioctl for FIONREAD expects an 'int*' argument.
   int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
   if (result < 0) {
-    perror("ioctl FIONREAD failed");
     return result;
   }
 #ifdef DEBUG
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 71e5325..f0205fb 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -334,7 +334,7 @@
 void FUNCTION_NAME(File_Length)(Dart_NativeArguments args) {
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
-  intptr_t return_value = file->Length();
+  off64_t return_value = file->Length();
   if (return_value >= 0) {
     Dart_SetReturnValue(args, Dart_NewInteger(return_value));
   } else {
@@ -348,7 +348,7 @@
 void FUNCTION_NAME(File_LengthFromPath)(Dart_NativeArguments args) {
   const char* path =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
-  intptr_t return_value = File::LengthFromPath(path);
+  off64_t return_value = File::LengthFromPath(path);
   if (return_value >= 0) {
     Dart_SetReturnValue(args, Dart_NewInteger(return_value));
   } else {
@@ -760,7 +760,7 @@
     File* file = CObjectToFilePointer(request[0]);
     ASSERT(file != NULL);
     if (!file->IsClosed()) {
-      int64_t position = CObjectInt32OrInt64ToInt64(request[1]);
+      off64_t position = CObjectInt32OrInt64ToInt64(request[1]);
       if (file->SetPosition(position)) {
         return CObject::True();
       } else {
@@ -800,7 +800,7 @@
     File* file = CObjectToFilePointer(request[0]);
     ASSERT(file != NULL);
     if (!file->IsClosed()) {
-      off_t return_value = file->Length();
+      off64_t return_value = file->Length();
       if (return_value >= 0) {
         return new CObjectInt64(CObject::NewInt64(return_value));
       } else {
@@ -817,7 +817,7 @@
 CObject* File::LengthFromPathRequest(const CObjectArray& request) {
   if (request.Length() == 1 && request[0]->IsString()) {
     CObjectString filepath(request[0]);
-    off_t return_value = File::LengthFromPath(filepath.CString());
+    off64_t return_value = File::LengthFromPath(filepath.CString());
     if (return_value >= 0) {
       return new CObjectInt64(CObject::NewInt64(return_value));
     } else {
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index 41efb4c..1f3eb11 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -90,17 +90,17 @@
 
   // Get the length of the file. Returns a negative value if the length cannot
   // be determined (e.g. not seekable device).
-  off_t Length();
+  off64_t Length();
 
   // Get the current position in the file.
   // Returns a negative value if position cannot be determined.
-  off_t Position();
+  off64_t Position();
 
   // Set the byte position in the file.
-  bool SetPosition(int64_t position);
+  bool SetPosition(off64_t position);
 
   // Truncate (or extend) the file to the given length in bytes.
-  bool Truncate(int64_t length);
+  bool Truncate(off64_t length);
 
   // Flush contents of file.
   bool Flush();
@@ -126,7 +126,7 @@
   static bool DeleteLink(const char* path);
   static bool Rename(const char* old_path, const char* new_path);
   static bool RenameLink(const char* old_path, const char* new_path);
-  static off_t LengthFromPath(const char* path);
+  static off64_t LengthFromPath(const char* path);
   static void Stat(const char* path, int64_t* data);
   static time_t LastModified(const char* path);
   static char* LinkTarget(const char* pathname);
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 54ad86a..917e83e 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -10,6 +10,7 @@
 #include <errno.h>  // NOLINT
 #include <fcntl.h>  // NOLINT
 #include <sys/stat.h>  // NOLINT
+#include <sys/types.h>  // NOLINT
 #include <unistd.h>  // NOLINT
 #include <libgen.h>  // NOLINT
 
@@ -73,19 +74,19 @@
 }
 
 
-off_t File::Position() {
+off64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY(lseek(handle_->fd(), 0, SEEK_CUR));
+  return lseek64(handle_->fd(), 0, SEEK_CUR);
 }
 
 
-bool File::SetPosition(int64_t position) {
+bool File::SetPosition(off64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY(lseek(handle_->fd(), position, SEEK_SET) != -1);
+  return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
 }
 
 
-bool File::Truncate(int64_t length) {
+bool File::Truncate(off64_t length) {
   ASSERT(handle_->fd() >= 0);
   return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length) != -1);
 }
@@ -97,7 +98,7 @@
 }
 
 
-off_t File::Length() {
+off64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
   if (TEMP_FAILURE_RETRY(fstat(handle_->fd(), &st)) == 0) {
@@ -129,7 +130,7 @@
     return NULL;
   }
   if (((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) {
-    int position = TEMP_FAILURE_RETRY(lseek(fd, 0, SEEK_END));
+    off64_t position = lseek64(fd, 0, SEEK_END);
     if (position < 0) {
       return NULL;
     }
@@ -218,7 +219,7 @@
 }
 
 
-off_t File::LengthFromPath(const char* name) {
+off64_t File::LengthFromPath(const char* name) {
   struct stat st;
   if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) {
     return st.st_size;
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 1e9b49e..f5db4e5 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -10,6 +10,7 @@
 #include <errno.h>  // NOLINT
 #include <fcntl.h>  // NOLINT
 #include <sys/stat.h>  // NOLINT
+#include <sys/types.h>  // NOLINT
 #include <unistd.h>  // NOLINT
 #include <libgen.h>  // NOLINT
 
@@ -72,21 +73,21 @@
 }
 
 
-off_t File::Position() {
+off64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY(lseek(handle_->fd(), 0, SEEK_CUR));
+  return lseek64(handle_->fd(), 0, SEEK_CUR);
 }
 
 
-bool File::SetPosition(int64_t position) {
+bool File::SetPosition(off64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY(lseek(handle_->fd(), position, SEEK_SET) != -1);
+  return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
 }
 
 
-bool File::Truncate(int64_t length) {
+bool File::Truncate(off64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length) != -1);
+  return TEMP_FAILURE_RETRY(ftruncate64(handle_->fd(), length) != -1);
 }
 
 
@@ -96,10 +97,10 @@
 }
 
 
-off_t File::Length() {
+off64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
-  struct stat st;
-  if (TEMP_FAILURE_RETRY(fstat(handle_->fd(), &st)) == 0) {
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(fstat64(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -108,8 +109,8 @@
 
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
-  struct stat st;
-  if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) {
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     // Only accept regular files and character devices.
     if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -124,12 +125,12 @@
     flags = flags | O_TRUNC;
   }
   flags |= O_CLOEXEC;
-  int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
+  int fd = TEMP_FAILURE_RETRY(open64(name, flags, 0666));
   if (fd < 0) {
     return NULL;
   }
   if (((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) {
-    int position = TEMP_FAILURE_RETRY(lseek(fd, 0, SEEK_END));
+    off64_t position = lseek64(fd, 0, SEEK_END);
     if (position < 0) {
       return NULL;
     }
@@ -145,8 +146,8 @@
 
 
 bool File::Exists(const char* name) {
-  struct stat st;
-  if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) {
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -155,7 +156,8 @@
 
 
 bool File::Create(const char* name) {
-  int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
+  int fd = TEMP_FAILURE_RETRY(
+      open64(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
   if (fd < 0) {
     return false;
   }
@@ -218,9 +220,9 @@
 }
 
 
-off_t File::LengthFromPath(const char* name) {
-  struct stat st;
-  if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) {
+off64_t File::LengthFromPath(const char* name) {
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -228,8 +230,8 @@
 
 
 void File::Stat(const char* name, int64_t* data) {
-  struct stat st;
-  if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) {
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -251,8 +253,8 @@
 
 
 time_t File::LastModified(const char* name) {
-  struct stat st;
-  if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) {
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -260,8 +262,8 @@
 
 
 char* File::LinkTarget(const char* pathname) {
-  struct stat link_stats;
-  if (lstat(pathname, &link_stats) != 0) return NULL;
+  struct stat64 link_stats;
+  if (lstat64(pathname, &link_stats) != 0) return NULL;
   if (!S_ISLNK(link_stats.st_mode)) {
     errno = ENOENT;
     return NULL;
@@ -307,8 +309,8 @@
 
 File::StdioHandleType File::GetStdioHandleType(int fd) {
   ASSERT(0 <= fd && fd <= 2);
-  struct stat buf;
-  int result = fstat(fd, &buf);
+  struct stat64 buf;
+  int result = fstat64(fd, &buf);
   if (result == -1) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -324,12 +326,12 @@
 
 
 File::Type File::GetType(const char* pathname, bool follow_links) {
-  struct stat entry_info;
+  struct stat64 entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = TEMP_FAILURE_RETRY(stat(pathname, &entry_info));
+    stat_success = TEMP_FAILURE_RETRY(stat64(pathname, &entry_info));
   } else {
-    stat_success = TEMP_FAILURE_RETRY(lstat(pathname, &entry_info));
+    stat_success = TEMP_FAILURE_RETRY(lstat64(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -340,10 +342,10 @@
 
 
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
-  struct stat file_1_info;
-  struct stat file_2_info;
-  if (TEMP_FAILURE_RETRY(lstat(file_1, &file_1_info)) == -1 ||
-      TEMP_FAILURE_RETRY(lstat(file_2, &file_2_info)) == -1) {
+  struct stat64 file_1_info;
+  struct stat64 file_2_info;
+  if (TEMP_FAILURE_RETRY(lstat64(file_1, &file_1_info)) == -1 ||
+      TEMP_FAILURE_RETRY(lstat64(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 7b3815a..46c77cb 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -75,19 +75,19 @@
 }
 
 
-off_t File::Position() {
+off64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY(lseek(handle_->fd(), 0, SEEK_CUR));
+  return lseek(handle_->fd(), 0, SEEK_CUR);
 }
 
 
-bool File::SetPosition(int64_t position) {
+bool File::SetPosition(off64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY(lseek(handle_->fd(), position, SEEK_SET) != -1);
+  return lseek(handle_->fd(), position, SEEK_SET) >= 0;
 }
 
 
-bool File::Truncate(int64_t length) {
+bool File::Truncate(off64_t length) {
   ASSERT(handle_->fd() >= 0);
   return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length) != -1);
 }
@@ -99,7 +99,7 @@
 }
 
 
-off_t File::Length() {
+off64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
   if (TEMP_FAILURE_RETRY(fstat(handle_->fd(), &st)) == 0) {
@@ -132,7 +132,7 @@
   }
   FDUtils::SetCloseOnExec(fd);
   if (((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) {
-    int position = TEMP_FAILURE_RETRY(lseek(fd, 0, SEEK_END));
+    off64_t position = lseek(fd, 0, SEEK_END);
     if (position < 0) {
       return NULL;
     }
@@ -221,7 +221,7 @@
 }
 
 
-off_t File::LengthFromPath(const char* name) {
+off64_t File::LengthFromPath(const char* name) {
   struct stat st;
   if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) {
     return st.st_size;
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 8e0f615..4c3c853 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -72,21 +72,21 @@
 }
 
 
-off_t File::Position() {
+off64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return lseek(handle_->fd(), 0, SEEK_CUR);
+  return _lseeki64(handle_->fd(), 0, SEEK_CUR);
 }
 
 
-bool File::SetPosition(int64_t position) {
+bool File::SetPosition(off64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return (lseek(handle_->fd(), position, SEEK_SET) != -1);
+  return _lseeki64(handle_->fd(), position, SEEK_SET) >= 0;
 }
 
 
-bool File::Truncate(int64_t length) {
+bool File::Truncate(off64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return (chsize(handle_->fd(), length) != -1);
+  return _chsize_s(handle_->fd(), length) == 0;
 }
 
 
@@ -96,10 +96,10 @@
 }
 
 
-off_t File::Length() {
+off64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
-  struct stat st;
-  if (fstat(handle_->fd(), &st) == 0) {
+  struct __stat64 st;
+  if (_fstat64(handle_->fd(), &st) == 0) {
     return st.st_size;
   }
   return -1;
@@ -121,7 +121,7 @@
     return NULL;
   }
   if (((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) {
-    int position = lseek(fd, 0, SEEK_END);
+    off64_t position = _lseeki64(fd, 0, SEEK_END);
     if (position < 0) {
       return NULL;
     }
@@ -137,9 +137,9 @@
 
 
 bool File::Exists(const char* name) {
-  struct _stat st;
+  struct __stat64 st;
   const wchar_t* system_name = StringUtils::Utf8ToWide(name);
-  bool stat_status = _wstat(system_name, &st);
+  bool stat_status = _wstat64(system_name, &st);
   free(const_cast<wchar_t*>(system_name));
   if (stat_status == 0) {
     return ((st.st_mode & S_IFMT) == S_IFREG);
@@ -322,10 +322,10 @@
 }
 
 
-off_t File::LengthFromPath(const char* name) {
-  struct _stat st;
+off64_t File::LengthFromPath(const char* name) {
+  struct __stat64 st;
   const wchar_t* system_name = StringUtils::Utf8ToWide(name);
-  int stat_status = _wstat(system_name, &st);
+  int stat_status = _wstat64(system_name, &st);
   free(const_cast<wchar_t*>(system_name));
   if (stat_status == 0) {
     return st.st_size;
@@ -448,9 +448,9 @@
 
 
 time_t File::LastModified(const char* name) {
-  struct _stat st;
+  struct __stat64 st;
   const wchar_t* system_name = StringUtils::Utf8ToWide(name);
-  int stat_status = _wstat(system_name, &st);
+  int stat_status = _wstat64(system_name, &st);
   free(const_cast<wchar_t*>(system_name));
   if (stat_status == 0) {
     return st.st_mtime;
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index ff77b1d..8a182d8 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -28,6 +28,7 @@
   V(Filter_Process, 4)                                                         \
   V(Filter_Processed, 3)                                                       \
   V(InternetAddress_Fixed, 1)                                                  \
+  V(InternetAddress_Parse, 2)                                                  \
   V(IOService_NewServicePort, 0)                                               \
   V(Platform_NumberOfProcessors, 0)                                            \
   V(Platform_OperatingSystem, 0)                                               \
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index c696a9d..ef204de 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -59,9 +59,6 @@
 // Global flag that is used to indicate that we want to compile all the
 // dart functions and not run anything.
 static bool has_compile_all = false;
-// Global flag that is used to indicate that we want to check function
-// fingerprints.
-static bool has_check_function_fingerprints = false;
 
 // Global flag that is used to indicate that we want to print the source code
 // for script that is being run.
@@ -187,16 +184,6 @@
 }
 
 
-static bool ProcessFingerprintedFunctions(const char* arg) {
-  ASSERT(arg != NULL);
-  if (*arg != '\0') {
-    return false;
-  }
-  has_check_function_fingerprints = true;
-  return true;
-}
-
-
 static bool ProcessDebugOption(const char* port) {
   // TODO(hausner): Add support for specifying an IP address on which
   // the debugger should listen.
@@ -298,7 +285,6 @@
   { "--debug", ProcessDebugOption },
   { "--snapshot=", ProcessGenScriptSnapshotOption },
   { "--print-script", ProcessPrintScriptOption },
-  { "--check-function-fingerprints", ProcessFingerprintedFunctions },
   { "--enable-vm-service", ProcessEnableVmServiceOption },
   { "--trace-debug-protocol", ProcessTraceDebugProtocolOption },
   { NULL, NULL }
@@ -913,13 +899,6 @@
       }
     }
 
-    if (has_check_function_fingerprints) {
-      result = Dart_CheckFunctionFingerprints();
-      if (Dart_IsError(result)) {
-        return DartErrorExit(result);
-      }
-    }
-
     if (Dart_IsNull(root_lib)) {
       return ErrorExit(kErrorExitCode,
                        "Unable to find root library for '%s'\n",
@@ -1012,6 +991,8 @@
     free(environment);
   }
 
+  Platform::Cleanup();
+
   return Process::GlobalExitCode();
 }
 
diff --git a/runtime/bin/platform.h b/runtime/bin/platform.h
index 16be960..9579072 100644
--- a/runtime/bin/platform.h
+++ b/runtime/bin/platform.h
@@ -65,6 +65,9 @@
   static void PrintBlocking(FILE* file, const char* format, ...)
       PRINTF_ATTRIBUTE(2, 3);
 
+  // Perform platform-specific cleanups.
+  static void Cleanup();
+
  private:
   static const char* executable_name_;
   static const char* package_root_;
diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
index 445ea01..dbf56d2 100644
--- a/runtime/bin/platform_android.cc
+++ b/runtime/bin/platform_android.cc
@@ -78,6 +78,12 @@
   FDUtils::SetNonBlocking(fd);
 }
 
+
+void Platform::Cleanup() {
+  FDUtils::SetBlocking(fileno(stdout));
+  FDUtils::SetBlocking(fileno(stderr));
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc
index 80aa0af..89031a1 100644
--- a/runtime/bin/platform_linux.cc
+++ b/runtime/bin/platform_linux.cc
@@ -78,6 +78,12 @@
   FDUtils::SetNonBlocking(fd);
 }
 
+
+void Platform::Cleanup() {
+  FDUtils::SetBlocking(fileno(stdout));
+  FDUtils::SetBlocking(fileno(stderr));
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 5af6c5a..0b920b6 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -82,6 +82,12 @@
   FDUtils::SetNonBlocking(fd);
 }
 
+
+void Platform::Cleanup() {
+  FDUtils::SetBlocking(fileno(stdout));
+  FDUtils::SetBlocking(fileno(stderr));
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index cd0f0f2..2d7a5a1 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -74,6 +74,10 @@
   va_end(args);
 }
 
+
+void Platform::Cleanup() {
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index f3ed86a..d7dd894 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -4,6 +4,7 @@
 
 #include "bin/dartutils.h"
 #include "bin/io_buffer.h"
+#include "bin/platform.h"
 #include "bin/process.h"
 #include "bin/socket.h"
 
@@ -157,18 +158,14 @@
 
 void FUNCTION_NAME(Process_Wait)(Dart_NativeArguments args) {
   Dart_Handle process =  Dart_GetNativeArgument(args, 0);
-  Dart_Handle stdin_handle =  Dart_GetNativeArgument(args, 1);
-  Dart_Handle stdout_handle =  Dart_GetNativeArgument(args, 2);
-  Dart_Handle stderr_handle =  Dart_GetNativeArgument(args, 3);
-  Dart_Handle exit_handle =  Dart_GetNativeArgument(args, 4);
-  intptr_t process_stdin;
-  intptr_t process_stdout;
-  intptr_t process_stderr;
-  intptr_t exit_event;
-  Socket::GetSocketIdNativeField(stdin_handle, &process_stdin);
-  Socket::GetSocketIdNativeField(stdout_handle, &process_stdout);
-  Socket::GetSocketIdNativeField(stderr_handle, &process_stderr);
-  Socket::GetSocketIdNativeField(exit_handle, &exit_event);
+  intptr_t process_stdin =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 1));
+  intptr_t process_stdout =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 2));
+  intptr_t process_stderr =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 3));
+  intptr_t exit_event =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 4));
   ProcessResult result;
   intptr_t pid;
   Process::GetProcessIdNativeField(process, &pid);
@@ -211,6 +208,8 @@
   int64_t status = 0;
   // Ignore result if passing invalid argument and just exit 0.
   DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status);
+  // Be sure to do platform-specific cleanups.
+  Platform::Cleanup();
   exit(static_cast<int>(status));
 }
 
diff --git a/runtime/bin/resources_sources.gypi b/runtime/bin/resources_sources.gypi
index f14cae9..941f67d 100644
--- a/runtime/bin/resources_sources.gypi
+++ b/runtime/bin/resources_sources.gypi
@@ -15,15 +15,15 @@
     'vmservice/vmservice.dart',
     'vmservice/vmservice_io.dart',
 # VM Service frontend sources
-    'vmservice/client/out/web/index.html',
-    'vmservice/client/out/web/favicon.ico',
-    'vmservice/client/out/web/index.html_bootstrap.dart.js',
-    'vmservice/client/out/web/img/isolate_icon.png',
-    'vmservice/client/out/web/bootstrap_css/fonts/glyphicons-halflings-regular.ttf',
-    'vmservice/client/out/web/bootstrap_css/fonts/glyphicons-halflings-regular.svg',
-    'vmservice/client/out/web/bootstrap_css/fonts/glyphicons-halflings-regular.eot',
-    'vmservice/client/out/web/bootstrap_css/fonts/glyphicons-halflings-regular.woff',
-    'vmservice/client/out/web/bootstrap_css/css/bootstrap.min.css',
+    'vmservice/client/deployed/web/index.html',
+    'vmservice/client/deployed/web/favicon.ico',
+    'vmservice/client/deployed/web/index.html_bootstrap.dart.js',
+    'vmservice/client/deployed/web/img/isolate_icon.png',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.ttf',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.svg',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.eot',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.woff',
+    'vmservice/client/deployed/web/bootstrap_css/css/bootstrap.min.css',
   ],
 }
 
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 48acaf3..e4ee1ab 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -26,23 +26,21 @@
 int Socket::service_ports_index_ = 0;
 
 
-static Dart_Handle GetSockAddr(Dart_Handle obj, RawAddr* addr) {
+static void GetSockAddr(Dart_Handle obj, RawAddr* addr) {
   Dart_TypedData_Type data_type;
   uint8_t* data = NULL;
   intptr_t len;
   Dart_Handle result = Dart_TypedDataAcquireData(
       obj, &data_type, reinterpret_cast<void**>(&data), &len);
-  if (Dart_IsError(result)) return result;
+  if (Dart_IsError(result)) Dart_PropagateError(result);
   memmove(reinterpret_cast<void *>(addr), data, len);
-  return Dart_Null();
+  Dart_TypedDataReleaseData(obj);
 }
 
 
 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) {
-  Dart_Handle id_obj = Dart_GetNativeArgument(args, 0);
-  ASSERT(!Dart_IsError(id_obj));
   int64_t id = 0;
-  bool ok = DartUtils::GetInt64Value(id_obj, &id);
+  bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id);
   ASSERT(ok);
   USE(ok);
   RawAddr raw;
@@ -73,28 +71,44 @@
       if (Dart_IsError(error)) Dart_PropagateError(error);
       Dart_ThrowException(error);
   }
-  int len = SocketAddress::GetAddrLength(&raw);
-  Dart_Handle result = Dart_NewTypedData(Dart_TypedData_kUint8, len);
-  if (Dart_IsError(result)) Dart_PropagateError(result);
-  Dart_ListSetAsBytes(result, 0, reinterpret_cast<uint8_t *>(&raw), len);
-  Dart_SetReturnValue(args, result);
+  Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw));
+}
+
+
+void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
+  int64_t type = 0;
+  bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &type);
+  ASSERT(ok);
+  USE(ok);
+  const char* address =
+      DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+  ASSERT(address != NULL);
+  RawAddr raw;
+  memset(&raw, 0, sizeof(raw));
+  if (type == SocketAddress::TYPE_IPV4) {
+    raw.addr.sa_family = AF_INET;
+  } else {
+    ASSERT(type == SocketAddress::TYPE_IPV6);
+    raw.addr.sa_family = AF_INET6;
+  }
+  ok = Socket::ParseAddress(type, address, &raw);
+  if (!ok) {
+    Dart_SetReturnValue(args, Dart_Null());
+  } else {
+    Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw));
+  }
 }
 
 
 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  Dart_Handle host_obj = Dart_GetNativeArgument(args, 1);
   RawAddr addr;
-  Dart_Handle result = GetSockAddr(host_obj, &addr);
+  GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
   int64_t port = 0;
-  if (!Dart_IsError(result) &&
-      DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) {
+  if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) {
     intptr_t socket = Socket::CreateConnect(addr, port);
     OSError error;
-    Dart_TypedDataReleaseData(host_obj);
     if (socket >= 0) {
-      Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
-      if (Dart_IsError(err)) Dart_PropagateError(err);
+      Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
       Dart_SetReturnValue(args, Dart_True());
     } else {
       Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
@@ -109,10 +123,8 @@
 
 
 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   intptr_t available = Socket::Available(socket);
   if (available >= 0) {
     Dart_SetReturnValue(args, Dart_NewInteger(available));
@@ -124,15 +136,12 @@
 
 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) {
   static bool short_socket_reads = Dart_IsVMFlagSet("short_socket_read");
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   intptr_t available = Socket::Available(socket);
   if (available > 0) {
     int64_t length = 0;
-    Dart_Handle length_obj = Dart_GetNativeArgument(args, 1);
-    if (DartUtils::GetInt64Value(length_obj, &length)) {
+    if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &length)) {
       if (length == -1 || available < length) {
         length = available;
       }
@@ -179,10 +188,8 @@
 
 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) {
   static bool short_socket_writes = Dart_IsVMFlagSet("short_socket_write");
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
   ASSERT(Dart_IsList(buffer_obj));
   intptr_t offset =
@@ -214,10 +221,8 @@
 
 
 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   OSError os_error;
   intptr_t port = Socket::GetPort(socket);
   if (port > 0) {
@@ -229,10 +234,8 @@
 
 
 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   OSError os_error;
   intptr_t port = 0;
   SocketAddress* addr = Socket::GetRemotePeer(socket, &port);
@@ -260,10 +263,8 @@
 
 
 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   OSError os_error;
   Socket::GetError(socket, &os_error);
   Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
@@ -271,9 +272,8 @@
 
 
 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Socket::GetSocketIdNativeField(socket_obj, &socket);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   OSError os_error;
   intptr_t type = Socket::GetType(socket);
   if (type >= 0) {
@@ -285,47 +285,35 @@
 
 
 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t num =
       DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
   ASSERT(num == 0 || num == 1 || num == 2);
   intptr_t socket = Socket::GetStdioHandle(num);
-  Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
   Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0));
 }
 
 
 void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t id =
       DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
-  Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, id);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), id);
 }
 
 
 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  Dart_Handle host_obj = Dart_GetNativeArgument(args, 1);
   RawAddr addr;
-  Dart_Handle result = GetSockAddr(host_obj, &addr);
-  Dart_Handle port_obj = Dart_GetNativeArgument(args, 2);
-  Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3);
-  Dart_Handle v6_only_obj = Dart_GetNativeArgument(args, 4);
-  bool v6_only = DartUtils::GetBooleanValue(v6_only_obj);
   int64_t port = 0;
   int64_t backlog = 0;
-  if (!Dart_IsError(result) &&
-      DartUtils::GetInt64Value(port_obj, &port) &&
-      DartUtils::GetInt64Value(backlog_obj, &backlog)) {
+  GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
+  if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port) &&
+      DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 3), &backlog)) {
+    bool v6_only = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4));
     intptr_t socket = ServerSocket::CreateBindListen(
         addr, port, backlog, v6_only);
     OSError error;
-    Dart_TypedDataReleaseData(host_obj);
     if (socket >= 0) {
-      Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
-      if (Dart_IsError(err)) Dart_PropagateError(err);
+      Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket);
       Dart_SetReturnValue(args, Dart_True());
     } else {
       if (socket == -5) {
@@ -345,16 +333,11 @@
 
 
 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
-  Dart_Handle result_socket_obj = Dart_GetNativeArgument(args, 1);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   intptr_t new_socket = ServerSocket::Accept(socket);
   if (new_socket >= 0) {
-    Dart_Handle err = Socket::SetSocketIdNativeField(result_socket_obj,
-                                                     new_socket);
-    if (Dart_IsError(err)) Dart_PropagateError(err);
+    Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 1), new_socket);
     Dart_SetReturnValue(args, Dart_True());
   } else if (new_socket == ServerSocket::kTemporaryFailure) {
     Dart_SetReturnValue(args, Dart_False());
@@ -488,14 +471,12 @@
 
 
 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) {
-  Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
-  intptr_t socket = 0;
   bool result = false;
-  Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
-  if (Dart_IsError(err)) Dart_PropagateError(err);
+  intptr_t socket =
+      Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   Dart_Handle option_obj = Dart_GetNativeArgument(args, 1);
   int64_t option;
-  err = Dart_IntegerToInt64(option_obj, &option);
+  Dart_Handle err = Dart_IntegerToInt64(option_obj, &option);
   if (Dart_IsError(err)) Dart_PropagateError(err);
   Dart_Handle enabled_obj = Dart_GetNativeArgument(args, 2);
   bool enabled;
@@ -512,13 +493,19 @@
 }
 
 
-Dart_Handle Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) {
-  return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id);
+void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) {
+  Dart_Handle err =
+      Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id);
+  if (Dart_IsError(err)) Dart_PropagateError(err);
 }
 
 
-Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) {
-  return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id);
+intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) {
+  intptr_t socket = 0;
+  Dart_Handle err =
+      Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket);
+  if (Dart_IsError(err)) Dart_PropagateError(err);
+  return socket;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index ce94c5e..1bec3e6 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -92,6 +92,14 @@
     }
   }
 
+  static Dart_Handle ToTypedData(RawAddr* addr) {
+    int len = GetAddrLength(addr);
+    Dart_Handle result = Dart_NewTypedData(Dart_TypedData_kUint8, len);
+    if (Dart_IsError(result)) Dart_PropagateError(result);
+    Dart_ListSetAsBytes(result, 0, reinterpret_cast<uint8_t *>(addr), len);
+    return result;
+  }
+
  private:
   char as_string_[INET6_ADDRSTRLEN];
   RawAddr addr_;
@@ -181,6 +189,8 @@
                             intptr_t host_len,
                             OSError** os_error);
 
+  static bool ParseAddress(int type, const char* address, RawAddr* addr);
+
   // List interfaces. Returns a AddressList of InterfaceSocketAddress's.
   static AddressList<InterfaceSocketAddress>* ListInterfaces(
       int type,
@@ -192,8 +202,8 @@
 
   static Dart_Port GetServicePort();
 
-  static Dart_Handle SetSocketIdNativeField(Dart_Handle socket, intptr_t id);
-  static Dart_Handle GetSocketIdNativeField(Dart_Handle socket, intptr_t* id);
+  static void SetSocketIdNativeField(Dart_Handle socket, intptr_t id);
+  static intptr_t GetSocketIdNativeField(Dart_Handle socket);
 
  private:
   static dart::Mutex* mutex_;
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 02aed0b..98af9a6 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -244,6 +244,18 @@
 }
 
 
+bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
+  int result;
+  if (type == SocketAddress::TYPE_IPV4) {
+    result = inet_pton(AF_INET, address, &addr->in.sin_addr);
+  } else {
+    ASSERT(type == SocketAddress::TYPE_IPV6);
+    result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr);
+  }
+  return result == 1;
+}
+
+
 AddressList<InterfaceSocketAddress>* Socket::ListInterfaces(
     int type,
     OSError** os_error) {
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index c3c01cc..c36a66e 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -168,8 +168,8 @@
 
 
 int Socket::GetType(intptr_t fd) {
-  struct stat buf;
-  int result = fstat(fd, &buf);
+  struct stat64 buf;
+  int result = fstat64(fd, &buf);
   if (result == -1) return -1;
   if (S_ISCHR(buf.st_mode)) return File::kTerminal;
   if (S_ISFIFO(buf.st_mode)) return File::kPipe;
@@ -244,6 +244,18 @@
 }
 
 
+bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
+  int result;
+  if (type == SocketAddress::TYPE_IPV4) {
+    result = inet_pton(AF_INET, address, &addr->in.sin_addr);
+  } else {
+    ASSERT(type == SocketAddress::TYPE_IPV6);
+    result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr);
+  }
+  return result == 1;
+}
+
+
 static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
   if (ifa->ifa_addr == NULL) {
     // OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 4b6ead6..6568379 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -244,6 +244,18 @@
 }
 
 
+bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
+  int result;
+  if (type == SocketAddress::TYPE_IPV4) {
+    result = inet_pton(AF_INET, address, &addr->in.sin_addr);
+  } else {
+    ASSERT(type == SocketAddress::TYPE_IPV6);
+    result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr);
+  }
+  return result == 1;
+}
+
+
 static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
   if (ifa->ifa_addr == NULL) {
     // OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index fb93b8b..789dd00 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -36,6 +36,10 @@
     return _InternetAddress.ANY_IP_V6;
   }
 
+  /* patch */ factory InternetAddress(String address) {
+    return new _InternetAddress.parse(address);
+  }
+
   /* patch */ static Future<List<InternetAddress>> lookup(
       String host, {InternetAddressType type: InternetAddressType.ANY}) {
     return _NativeSocket.lookup(host, type: type);
@@ -73,9 +77,11 @@
 
   final InternetAddressType type;
   final String address;
-  final String host;
+  final String _host;
   final Uint8List _sockaddr_storage;
 
+  String get host => _host != null ? _host : address;
+
   bool get isLoopback {
     switch (type) {
       case InternetAddressType.IP_V4:
@@ -104,22 +110,46 @@
     }
   }
 
+  bool get isMulticast {
+    switch (type) {
+      case InternetAddressType.IP_V4:
+        // Checking for 224.0.0.0 through 239.255.255.255.
+        return _sockaddr_storage[_IPV4_ADDR_OFFSET] >= 224 &&
+            _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240;
+
+      case InternetAddressType.IP_V6:
+        // Checking for ff00::/8.
+        return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF;
+    }
+  }
+
   Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this);
 
   _InternetAddress(InternetAddressType this.type,
                    String this.address,
-                   String this.host,
+                   String this._host,
                    List<int> this._sockaddr_storage);
 
+  factory _InternetAddress.parse(String address) {
+    var type = address.indexOf(':') == -1
+        ? InternetAddressType.IP_V4
+        : InternetAddressType.IP_V6;
+    var raw = _parse(type._value, address);
+    if (raw == null) {
+      throw new ArgumentError("Invalid internet address $address");
+    }
+    return new _InternetAddress(type, address, null, raw);
+  }
+
   factory _InternetAddress.fixed(int id) {
     var sockaddr = _fixed(id);
     switch (id) {
       case _ADDRESS_LOOPBACK_IP_V4:
         return new _InternetAddress(
-            InternetAddressType.IP_V4, "127.0.0.1", "localhost", sockaddr);
+            InternetAddressType.IP_V4, "127.0.0.1", null, sockaddr);
       case _ADDRESS_LOOPBACK_IP_V6:
         return new _InternetAddress(
-            InternetAddressType.IP_V6, "::1", "ip6-localhost", sockaddr);
+            InternetAddressType.IP_V6, "::1", null, sockaddr);
       case _ADDRESS_ANY_IP_V4:
         return new _InternetAddress(
             InternetAddressType.IP_V4, "0.0.0.0", "0.0.0.0", sockaddr);
@@ -138,11 +168,31 @@
         type, address, host, new Uint8List.fromList(_sockaddr_storage));
   }
 
+  bool operator ==(other) {
+    if (!(other is _InternetAddress)) return false;
+    if (other.type != type) return false;
+    bool equals = true;
+    for (int i = 0; i < _sockaddr_storage.length && equals; i++) {
+      equals = other._sockaddr_storage[i] == _sockaddr_storage[i];
+    }
+    return equals;
+  }
+
+  int get hashCode {
+    int result = 1;
+    for (int i = 0; i < _sockaddr_storage.length; i++) {
+      result = (result * 31 + _sockaddr_storage[i]) & 0x3FFFFFFF;
+    }
+    return result;
+  }
+
   String toString() {
     return "InternetAddress('$address', ${type.name})";
   }
 
   static Uint8List _fixed(int id) native "InternetAddress_Fixed";
+  static Uint8List _parse(int type, String address)
+      native "InternetAddress_Parse";
 }
 
 class _NetworkInterface implements NetworkInterface {
@@ -443,7 +493,7 @@
   InternetAddress get remoteAddress {
     var result = nativeGetRemotePeer()[0];
     var type = new InternetAddressType._from(result[0]);
-    return new _InternetAddress(type, result[1], "", result[2]);
+    return new _InternetAddress(type, result[1], null, result[2]);
   }
 
   // Multiplexes socket events to the socket handlers.
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 32b690d..d8cd9f9 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -268,6 +268,20 @@
 }
 
 
+bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
+  int result;
+  const wchar_t* system_address = StringUtils::Utf8ToWide(address);
+  if (type == SocketAddress::TYPE_IPV4) {
+    result = InetPton(AF_INET, system_address, &addr->in.sin_addr);
+  } else {
+    ASSERT(type == SocketAddress::TYPE_IPV6);
+    result = InetPton(AF_INET6, system_address, &addr->in6.sin6_addr);
+  }
+  free(const_cast<wchar_t*>(system_address));
+  return result == 1;
+}
+
+
 AddressList<InterfaceSocketAddress>* Socket::ListInterfaces(
     int type,
     OSError** os_error) {
diff --git a/runtime/bin/utils_linux.cc b/runtime/bin/utils_linux.cc
index 66e6929..4506f6f 100644
--- a/runtime/bin/utils_linux.cc
+++ b/runtime/bin/utils_linux.cc
@@ -96,7 +96,17 @@
 }
 
 void TimerUtils::Sleep(int64_t millis) {
-  usleep(millis * 1000);
+  // We must loop here because SIGPROF will interrupt usleep.
+  int64_t micros = millis * 1000;
+  int64_t start = GetCurrentTimeMicros();
+  while (micros > 0) {
+    usleep(micros);
+    int64_t now = GetCurrentTimeMicros();
+    int64_t delta = now - start;
+    ASSERT(delta >= 0);
+    start = now;
+    micros -= delta;
+  }
 }
 
 }  // namespace bin
diff --git a/runtime/bin/utils_macos.cc b/runtime/bin/utils_macos.cc
index c47fedd..1c83afd 100644
--- a/runtime/bin/utils_macos.cc
+++ b/runtime/bin/utils_macos.cc
@@ -98,7 +98,17 @@
 }
 
 void TimerUtils::Sleep(int64_t millis) {
-  usleep(millis * 1000);
+  // We must loop here because SIGPROF will interrupt usleep.
+  int64_t micros = millis * 1000;
+  int64_t start = GetCurrentTimeMicros();
+  while (micros > 0) {
+    usleep(micros);
+    int64_t now = GetCurrentTimeMicros();
+    int64_t delta = now - start;
+    ASSERT(delta >= 0);
+    start = now;
+    micros -= delta;
+  }
 }
 
 }  // namespace bin
diff --git a/runtime/bin/vmservice/client/build.dart b/runtime/bin/vmservice/client/build.dart
index 43f82a3..71faf8b 100644
--- a/runtime/bin/vmservice/client/build.dart
+++ b/runtime/bin/vmservice/client/build.dart
@@ -13,10 +13,18 @@
 
 compileToJs(_) {
   print("Running dart2js");
+	var dart_path = Platform.executable;
+	var bin_path = dart_path.substring(0, dart_path.lastIndexOf(Platform.pathSeparator));
+	var dart2js_path = "$bin_path${Platform.pathSeparator}dart2js";
   var result =
-    Process.runSync('dart2js',
+    Process.runSync(dart2js_path,
         [ '--minify', '-o', 'out/web/index.html_bootstrap.dart.js',
         'out/web/index.html_bootstrap.dart'], runInShell: true);
   print(result.stdout);
+  print(result.stderr);
+  if (result.exitCode != 0) {
+    print("Running dart2js failed.");
+    exit(result.exitCode);
+  }
   print("Done");
 }
diff --git a/runtime/bin/vmservice/client/out/web/.gitignore b/runtime/bin/vmservice/client/deployed/web/.gitignore
similarity index 100%
rename from runtime/bin/vmservice/client/out/web/.gitignore
rename to runtime/bin/vmservice/client/deployed/web/.gitignore
diff --git a/runtime/bin/vmservice/client/out/web/favicon.ico b/runtime/bin/vmservice/client/deployed/web/favicon.ico
similarity index 100%
rename from runtime/bin/vmservice/client/out/web/favicon.ico
rename to runtime/bin/vmservice/client/deployed/web/favicon.ico
Binary files differ
diff --git a/runtime/bin/vmservice/client/out/web/img/isolate_icon.png b/runtime/bin/vmservice/client/deployed/web/img/isolate_icon.png
similarity index 100%
rename from runtime/bin/vmservice/client/out/web/img/isolate_icon.png
rename to runtime/bin/vmservice/client/deployed/web/img/isolate_icon.png
Binary files differ
diff --git a/runtime/bin/vmservice/client/out/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
similarity index 86%
rename from runtime/bin/vmservice/client/out/web/index.html
rename to runtime/bin/vmservice/client/deployed/web/index.html
index b74ab37..fedfc5f 100644
--- a/runtime/bin/vmservice/client/out/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -1,4 +1,6 @@
-<!DOCTYPE html><html><head>
+<!DOCTYPE html><html><head><script src="packages/shadow_dom/shadow_dom.debug.js"></script>
+<script src="packages/custom_element/custom-elements.debug.js"></script>
+<script src="packages/browser/interop.js"></script>
 
   <title>Dart VM Observatory</title>
   <meta charset="utf-8">
@@ -9,6 +11,25 @@
 </head>
 <body><polymer-element name="observatory-element">
   
+</polymer-element><polymer-element name="error-view" extends="observatory-element">
+  <template>
+    <div class="row">
+    <div class="col-md-8 col-md-offset-2">
+      <div class="panel panel-danger">
+        <div class="panel-heading">Error</div>
+        <div class="panel-body">
+	        <template if="{{ (error_obj == null) || (error_obj['type'] != '@LanguageError') }}">
+	          <p>{{ error }}</p>
+	        </template>
+	        <template if="{{ (error_obj != null) &amp;&amp; (error_obj['type'] == '@LanguageError') }}">
+	          <pre>{{ error_obj['error_msg'] }}</pre>
+	        </template>
+        </div>
+      </div>
+    </div>
+    </div>
+  </template>
+  
 </polymer-element><polymer-element name="class-view" extends="observatory-element">
   <template>
     <div class="row">
@@ -46,36 +67,41 @@
               </tr>
             </tbody>
           </table>
-          <blockquote><strong>Fields</strong></blockquote>
-          <table class="table table-hover">
-            <thead>
-              <tr>
-                <th>User Name</th>
-                <th>VM Name</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr template="" repeat="{{ field in cls['fields'] }}">
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['user_name'] }}</a></td>
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['name'] }}</a></td>
-              </tr>
-            </tbody>
-          </table>
-          <blockquote><strong>Functions</strong></blockquote>
-          <table class="table table-hover">
-            <thead>
-              <tr>
-                <th>User Name</th>
-                <th>VM Name</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr template="" repeat="{{ function in cls['functions'] }}">
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['user_name'] }}</a></td>
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['name'] }}</a></td>
-              </tr>
-            </tbody>
-          </table>
+          <template if="{{ cls['error'] == null }}">
+            <blockquote><strong>Fields</strong></blockquote>
+            <table class="table table-hover">
+              <thead>
+                <tr>
+                  <th>User Name</th>
+                  <th>VM Name</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr template="" repeat="{{ field in cls['fields'] }}">
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['user_name'] }}</a></td>
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['name'] }}</a></td>
+                </tr>
+              </tbody>
+            </table>
+            <blockquote><strong>Functions</strong></blockquote>
+            <table class="table table-hover">
+              <thead>
+                <tr>
+                  <th>User Name</th>
+                  <th>VM Name</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr template="" repeat="{{ function in cls['functions'] }}">
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['user_name'] }}</a></td>
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['name'] }}</a></td>
+                </tr>
+              </tbody>
+            </table>
+          </template>
+          <template if="{{ cls['error'] != null }}">
+            <error-view error_obj="{{ cls['error'] }}"></error-view>
+          </template>
         </div>
       </div>
     </div>
@@ -138,20 +164,6 @@
     </div>
   </template>
   
-</polymer-element><polymer-element name="error-view" extends="observatory-element">
-  <template>
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-danger">
-        <div class="panel-heading">Error</div>
-        <div class="panel-body">
-          <p>{{ error }}</p>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
 </polymer-element><polymer-element name="field-view" extends="observatory-element">
   <template>
   <div class="row">
@@ -248,7 +260,7 @@
   <template>
   	<div class="row">
   	  <div class="col-md-1">
-  	  	<img src="img/isolate_icon.png" class="img-polaroid">	
+  	  	<img src="packages/observatory/src/observatory_elements/img/isolate_icon.png" class="img-polaroid">	
   	  </div>
   	  <div class="col-md-1">{{ isolate }}</div>
   	  <div class="col-md-10">{{ name }}</div>
@@ -435,4 +447,4 @@
 </polymer-element>
   <observatory-application></observatory-application>
 
-</body></html>
+</body></html>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/out/web/index.html_bootstrap.dart b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart
similarity index 100%
rename from runtime/bin/vmservice/client/out/web/index.html_bootstrap.dart
rename to runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart
diff --git a/runtime/bin/vmservice/client/out/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
similarity index 70%
rename from runtime/bin/vmservice/client/out/web/index.html_bootstrap.dart.js
rename to runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index 5a9fa60..f838e39 100644
--- a/runtime/bin/vmservice/client/out/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -32,24 +32,66 @@
 (function(global) {
   'use strict';
 
+  var PROP_ADD_TYPE = 'add';
+  var PROP_UPDATE_TYPE = 'update';
+  var PROP_RECONFIGURE_TYPE = 'reconfigure';
+  var PROP_DELETE_TYPE = 'delete';
+  var ARRAY_SPLICE_TYPE = 'splice';
+
+  // Detect and do basic sanity checking on Object/Array.observe.
   function detectObjectObserve() {
     if (typeof Object.observe !== 'function' ||
         typeof Array.observe !== 'function') {
       return false;
     }
 
-    var gotSplice = false;
-    function callback(records) {
-      if (records[0].type === 'splice' && records[1].type === 'splice')
-        gotSplice = true;
+    var records = [];
+
+    function callback(recs) {
+      records = recs;
     }
 
-    var test = [0];
+    var test = {};
+    Object.observe(test, callback);
+    test.id = 1;
+    test.id = 2;
+    delete test.id;
+    Object.deliverChangeRecords(callback);
+    if (records.length !== 3)
+      return false;
+
+    // TODO(rafaelw): Remove this when new change record type names make it to
+    // chrome release.
+    if (records[0].type == 'new' &&
+        records[1].type == 'updated' &&
+        records[2].type == 'deleted') {
+      PROP_ADD_TYPE = 'new';
+      PROP_UPDATE_TYPE = 'updated';
+      PROP_RECONFIGURE_TYPE = 'reconfigured';
+      PROP_DELETE_TYPE = 'deleted';
+    } else if (records[0].type != 'add' ||
+               records[1].type != 'update' ||
+               records[2].type != 'delete') {
+      console.error('Unexpected change record names for Object.observe. ' +
+                    'Using dirty-checking instead');
+      return false;
+    }
+    Object.unobserve(test, callback);
+
+    test = [0];
     Array.observe(test, callback);
     test[1] = 1;
     test.length = 0;
     Object.deliverChangeRecords(callback);
-    return gotSplice;
+    if (records.length != 2)
+      return false;
+    if (records[0].type != ARRAY_SPLICE_TYPE ||
+        records[1].type != ARRAY_SPLICE_TYPE) {
+      return false;
+    }
+    Array.unobserve(test, callback);
+
+    return true;
   }
 
   var hasObserve = detectObjectObserve();
@@ -750,6 +792,7 @@
     },
 
     start: function() {
+      this.started = true;
       this.connect();
       this.sync(true);
     },
@@ -835,11 +878,10 @@
     }
   });
 
-  var knownRecordTypes = {
-    'new': true,
-    'updated': true,
-    'deleted': true
-  };
+  var expectedRecordTypes = {};
+  expectedRecordTypes[PROP_ADD_TYPE] = true;
+  expectedRecordTypes[PROP_UPDATE_TYPE] = true;
+  expectedRecordTypes[PROP_DELETE_TYPE] = true;
 
   function notifyFunction(object, name) {
     if (typeof Object.observe !== 'function')
@@ -871,7 +913,7 @@
     var observer = new PathObserver(obj, descriptor.path,
         function(newValue, oldValue) {
           if (notify)
-            notify('updated', oldValue);
+            notify(PROP_UPDATE_TYPE, oldValue);
         }
     );
 
@@ -906,7 +948,7 @@
 
     for (var i = 0; i < changeRecords.length; i++) {
       var record = changeRecords[i];
-      if (!knownRecordTypes[record.type]) {
+      if (!expectedRecordTypes[record.type]) {
         console.error('Unknown changeRecord type: ' + record.type);
         console.error(record);
         continue;
@@ -915,10 +957,10 @@
       if (!(record.name in oldValues))
         oldValues[record.name] = record.oldValue;
 
-      if (record.type == 'updated')
+      if (record.type == PROP_UPDATE_TYPE)
         continue;
 
-      if (record.type == 'new') {
+      if (record.type == PROP_ADD_TYPE) {
         if (record.name in removed)
           delete removed[record.name];
         else
@@ -927,7 +969,7 @@
         continue;
       }
 
-      // type = 'deleted'
+      // type = 'delete'
       if (record.name in added) {
         delete added[record.name];
         delete oldValues[record.name];
@@ -1315,12 +1357,12 @@
     for (var i = 0; i < changeRecords.length; i++) {
       var record = changeRecords[i];
       switch(record.type) {
-        case 'splice':
+        case ARRAY_SPLICE_TYPE:
           mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
           break;
-        case 'new':
-        case 'updated':
-        case 'deleted':
+        case PROP_ADD_TYPE:
+        case PROP_UPDATE_TYPE:
+        case PROP_DELETE_TYPE:
           if (!isIndex(record.name))
             continue;
           var index = toNumber(record.name);
@@ -1367,6 +1409,16 @@
   global.PathObserver = PathObserver;
   global.CompoundPathObserver = CompoundPathObserver;
   global.Path = Path;
+
+  // TODO(rafaelw): Only needed for testing until new change record names
+  // make it to release.
+  global.Observer.changeRecordTypes = {
+    add: PROP_ADD_TYPE,
+    update: PROP_UPDATE_TYPE,
+    reconfigure: PROP_RECONFIGURE_TYPE,
+    'delete': PROP_DELETE_TYPE,
+    splice: ARRAY_SPLICE_TYPE
+  };
 })(typeof global !== 'undefined' && global ? global : this);
 
 /*
@@ -1429,6 +1481,7 @@
       var f = new Function('', 'return true;');
       hasEval = f();
     } catch (ex) {
+      hasEval = false;
     }
   }
 
@@ -1511,20 +1564,24 @@
     return /^on[a-z]+$/.test(name);
   }
 
+  function isIdentifierName(name) {
+    return /^\w[a-zA-Z_0-9]*$/.test(name);
+  }
+
   function getGetter(name) {
-    return hasEval ?
+    return hasEval && isIdentifierName(name) ?
         new Function('return this.impl.' + name) :
         function() { return this.impl[name]; };
   }
 
   function getSetter(name) {
-    return hasEval ?
+    return hasEval && isIdentifierName(name) ?
         new Function('v', 'this.impl.' + name + ' = v') :
         function(v) { this.impl[name] = v; };
   }
 
   function getMethod(name) {
-    return hasEval ?
+    return hasEval && isIdentifierName(name) ?
         new Function('return this.impl.' + name +
                      '.apply(this.impl, arguments)') :
         function() { return this.impl[name].apply(this.impl, arguments); };
@@ -1775,6 +1832,7 @@
   scope.wrappers = wrappers;
 
 })(this.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -1826,7 +1884,7 @@
 
     // 1.
     if (isShadowRoot(node))
-      return getInsertionParent(node) || scope.getHostForShadowRoot(node);
+      return getInsertionParent(node) || node.host;
 
     // 2.
     var eventParents = scope.eventParentsTable.get(node);
@@ -1922,7 +1980,7 @@
         ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.
       }
       if (isShadowRoot(target))  // 3.5.
-        target = scope.getHostForShadowRoot(target);
+        target = target.host;
       else
         target = target.parentNode;  // 3.6.
     }
@@ -1951,10 +2009,8 @@
   function enclosedBy(a, b) {
     if (a === b)
       return true;
-    if (a instanceof wrappers.ShadowRoot) {
-      var host = scope.getHostForShadowRoot(a);
-      return enclosedBy(rootOfNode(host), b);
-    }
+    if (a instanceof wrappers.ShadowRoot)
+      return enclosedBy(rootOfNode(a.host), b);
     return false;
   }
 
@@ -2376,7 +2432,7 @@
 
   function getTargetToListenAt(wrapper) {
     if (wrapper instanceof wrappers.ShadowRoot)
-      wrapper = scope.getHostForShadowRoot(wrapper);
+      wrapper = wrapper.host;
     return unwrap(wrapper);
   }
 
@@ -2613,11 +2669,13 @@
     }
 
     var nodes = [];
-    var firstChild;
-    while (firstChild = node.firstChild) {
-      node.removeChild(firstChild);
-      nodes.push(firstChild);
-      firstChild.parentNode_ = parentNode;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      nodes.push(child);
+    }
+
+    for (var i = nodes.length - 1; i >= 0; i--) {
+      node.removeChild(nodes[i]);
+      nodes[i].parentNode_ = parentNode;
     }
 
     for (var i = 0; i < nodes.length; i++) {
@@ -2767,12 +2825,28 @@
     this.previousSibling_ = undefined;
   };
 
+  var OriginalDocumentFragment = window.DocumentFragment;
   var originalAppendChild = OriginalNode.prototype.appendChild;
-  var originalInsertBefore = OriginalNode.prototype.insertBefore;
-  var originalReplaceChild = OriginalNode.prototype.replaceChild;
-  var originalRemoveChild = OriginalNode.prototype.removeChild;
   var originalCompareDocumentPosition =
       OriginalNode.prototype.compareDocumentPosition;
+  var originalInsertBefore = OriginalNode.prototype.insertBefore;
+  var originalRemoveChild = OriginalNode.prototype.removeChild;
+  var originalReplaceChild = OriginalNode.prototype.replaceChild;
+
+  var isIe = /Trident/.test(navigator.userAgent);
+
+  var removeChildOriginalHelper = isIe ?
+      function(parent, child) {
+        try {
+          originalRemoveChild.call(parent, child);
+        } catch (ex) {
+          if (!(parent instanceof OriginalDocumentFragment))
+            throw ex;
+        }
+      } :
+      function(parent, child) {
+        originalRemoveChild.call(parent, child);
+      };
 
   Node.prototype = Object.create(EventTarget.prototype);
   mixin(Node.prototype, {
@@ -2848,8 +2922,20 @@
     removeChild: function(childWrapper) {
       assertIsNodeWrapper(childWrapper);
       if (childWrapper.parentNode !== this) {
-        // TODO(arv): DOMException
-        throw new Error('NotFoundError');
+        // IE has invalid DOM trees at times.
+        var found = false;
+        var childNodes = this.childNodes;
+        for (var ieChild = this.firstChild; ieChild;
+             ieChild = ieChild.nextSibling) {
+          if (ieChild === childWrapper) {
+            found = true;
+            break;
+          }
+        }
+        if (!found) {
+          // TODO(arv): DOMException
+          throw new Error('NotFoundError');
+        }
       }
 
       var childNode = unwrap(childWrapper);
@@ -2865,7 +2951,7 @@
 
         var parentNode = childNode.parentNode;
         if (parentNode)
-          originalRemoveChild.call(parentNode, childNode);
+          removeChildOriginalHelper(parentNode, childNode);
 
         if (thisFirstChild === childWrapper)
           this.firstChild_ = childWrapperNextSibling;
@@ -2881,7 +2967,7 @@
         childWrapper.previousSibling_ = childWrapper.nextSibling_ =
             childWrapper.parentNode_ = undefined;
       } else {
-        originalRemoveChild.call(this.impl, childNode);
+        removeChildOriginalHelper(this.impl, childNode);
       }
 
       return childWrapper;
@@ -3592,7 +3678,8 @@
     }
   });
 
-  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement);
+  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,
+                  document.createElement('canvas'));
 
   scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
 })(this.ShadowDOMPolyfill);
@@ -3646,6 +3733,50 @@
   'use strict';
 
   var HTMLElement = scope.wrappers.HTMLElement;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var rewrap = scope.rewrap;
+
+  var OriginalHTMLImageElement = window.HTMLImageElement;
+
+  function HTMLImageElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
+
+  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,
+                  document.createElement('img'));
+
+  function Image(width, height) {
+    if (!(this instanceof Image)) {
+      throw new TypeError(
+          'DOM object constructor cannot be called as a function.');
+    }
+
+    var node = unwrap(document.createElement('img'));
+    HTMLElement.call(this, node);
+    rewrap(node, this);
+
+    if (width !== undefined)
+      node.width = width;
+    if (height !== undefined)
+      node.height = height;
+  }
+
+  Image.prototype = HTMLImageElement.prototype;
+
+  scope.wrappers.HTMLImageElement = HTMLImageElement;
+  scope.wrappers.Image = Image;
+})(this.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
 
@@ -3756,6 +3887,136 @@
 (function(scope) {
   'use strict';
 
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var registerWrapper = scope.registerWrapper;
+
+  var OriginalHTMLMediaElement = window.HTMLMediaElement;
+
+  function HTMLMediaElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
+
+  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,
+                  document.createElement('audio'));
+
+  scope.wrappers.HTMLMediaElement = HTMLMediaElement;
+})(this.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var rewrap = scope.rewrap;
+
+  var OriginalHTMLAudioElement = window.HTMLAudioElement;
+
+  function HTMLAudioElement(node) {
+    HTMLMediaElement.call(this, node);
+  }
+  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
+
+  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,
+                  document.createElement('audio'));
+
+  function Audio(src) {
+    if (!(this instanceof Audio)) {
+      throw new TypeError(
+          'DOM object constructor cannot be called as a function.');
+    }
+
+    var node = unwrap(document.createElement('audio'));
+    HTMLMediaElement.call(this, node);
+    rewrap(node, this);
+
+    node.setAttribute('preload', 'auto');
+    if (src !== undefined)
+      node.setAttribute('src', src);
+  }
+
+  Audio.prototype = HTMLAudioElement.prototype;
+
+  scope.wrappers.HTMLAudioElement = HTMLAudioElement;
+  scope.wrappers.Audio = Audio;
+})(this.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var rewrap = scope.rewrap;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var OriginalHTMLOptionElement = window.HTMLOptionElement;
+
+  function trimText(s) {
+    return s.replace(/\s+/g, ' ').trim();
+  }
+
+  function HTMLOptionElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLOptionElement.prototype, {
+    get text() {
+      return trimText(this.textContent);
+    },
+    set text(value) {
+      this.textContent = trimText(String(value));
+    },
+    get form() {
+      return wrap(unwrap(this).form);
+    }
+  });
+
+  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,
+                  document.createElement('option'));
+
+  function Option(text, value, defaultSelected, selected) {
+    if (!(this instanceof Option)) {
+      throw new TypeError(
+          'DOM object constructor cannot be called as a function.');
+    }
+
+    var node = unwrap(document.createElement('option'));
+    HTMLElement.call(this, node);
+    rewrap(node, this);
+
+    if (text !== undefined)
+      node.text = text;
+    if (value !== undefined)
+      node.setAttribute('value', value);
+    if (defaultSelected === true)
+      node.setAttribute('selected', '');
+    node.selected = selected === true;
+  }
+
+  Option.prototype = HTMLOptionElement.prototype;
+
+  scope.wrappers.HTMLOptionElement = HTMLOptionElement;
+  scope.wrappers.Option = Option;
+})(this.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
   var HTMLContentElement = scope.wrappers.HTMLContentElement;
   var HTMLElement = scope.wrappers.HTMLElement;
   var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
@@ -3790,6 +4051,7 @@
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
   var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
 
   var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
@@ -3804,7 +4066,7 @@
     },
 
     drawImage: function() {
-      arguments[0] = unwrap(arguments[0]);
+      arguments[0] = unwrapIfNeeded(arguments[0]);
       this.impl.drawImage.apply(this.impl, arguments);
     },
 
@@ -3828,7 +4090,7 @@
 
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
 
   var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
@@ -3847,12 +4109,12 @@
     },
 
     texImage2D: function() {
-      arguments[5] = unwrap(arguments[5]);
+      arguments[5] = unwrapIfNeeded(arguments[5]);
       this.impl.texImage2D.apply(this.impl, arguments);
     },
 
     texSubImage2D: function() {
-      arguments[6] = unwrap(arguments[6]);
+      arguments[6] = unwrapIfNeeded(arguments[6]);
       this.impl.texSubImage2D.apply(this.impl, arguments);
     }
   });
@@ -3934,6 +4196,10 @@
       return nextOlderShadowTreeTable.get(this) || null;
     },
 
+    get host() {
+      return shadowHostTable.get(this) || null;
+    },
+
     invalidateShadowRenderer: function() {
       return shadowHostTable.get(this).invalidateShadowRenderer();
     },
@@ -3948,9 +4214,6 @@
   });
 
   scope.wrappers.ShadowRoot = ShadowRoot;
-  scope.getHostForShadowRoot = function(node) {
-    return shadowHostTable.get(node);
-  };
 })(this.ShadowDOMPolyfill);
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -3965,7 +4228,6 @@
   var Node = scope.wrappers.Node;
   var ShadowRoot = scope.wrappers.ShadowRoot;
   var assert = scope.assert;
-  var getHostForShadowRoot = scope.getHostForShadowRoot;
   var mixin = scope.mixin;
   var muteMutationEvents = scope.muteMutationEvents;
   var oneOf = scope.oneOf;
@@ -4207,7 +4469,7 @@
   }
 
   function getRendererForShadowRoot(shadowRoot) {
-    return getRendererForHost(getHostForShadowRoot(shadowRoot));
+    return getRendererForHost(shadowRoot.host);
   }
 
   var spliceDiff = new ArraySplice();
@@ -4636,7 +4898,7 @@
     'HTMLLabelElement',
     'HTMLLegendElement',
     'HTMLObjectElement',
-    'HTMLOptionElement',
+    // HTMLOptionElement is handled in HTMLOptionElement.js
     'HTMLOutputElement',
     'HTMLSelectElement',
     'HTMLTextAreaElement',
@@ -4821,12 +5083,19 @@
         };
       });
 
-      var nativeConstructor = originalRegister.call(unwrap(this), tagName,
-          {prototype: newPrototype});
+      var p = {prototype: newPrototype};
+      if (object.extends)
+        p.extends = object.extends;
+      var nativeConstructor = originalRegister.call(unwrap(this), tagName, p);
 
       function GeneratedWrapper(node) {
-        if (!node)
-          return document.createElement(tagName);
+        if (!node) {
+          if (object.extends) {
+            return document.createElement(object.extends, tagName);
+          } else {
+            return document.createElement(tagName);
+          }
+        }
         this.impl = node;
       }
       GeneratedWrapper.prototype = prototype;
@@ -5200,15 +5469,14 @@
     'a': 'HTMLAnchorElement',
     'applet': 'HTMLAppletElement',
     'area': 'HTMLAreaElement',
-    'audio': 'HTMLAudioElement',
     'br': 'HTMLBRElement',
     'base': 'HTMLBaseElement',
     'body': 'HTMLBodyElement',
     'button': 'HTMLButtonElement',
-    'canvas': 'HTMLCanvasElement',
     // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.
     'dl': 'HTMLDListElement',
     'datalist': 'HTMLDataListElement',
+    'data': 'HTMLDataElement',
     'dir': 'HTMLDirectoryElement',
     'div': 'HTMLDivElement',
     'embed': 'HTMLEmbedElement',
@@ -5222,18 +5490,13 @@
     'h1': 'HTMLHeadingElement',
     'html': 'HTMLHtmlElement',
     'iframe': 'HTMLIFrameElement',
-
-    // Uses HTMLSpanElement in Firefox.
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=843881
-    // 'image',
-
     'input': 'HTMLInputElement',
     'li': 'HTMLLIElement',
     'label': 'HTMLLabelElement',
     'legend': 'HTMLLegendElement',
     'link': 'HTMLLinkElement',
     'map': 'HTMLMapElement',
-    // 'media', Covered by audio and video
+    'marquee': 'HTMLMarqueeElement',
     'menu': 'HTMLMenuElement',
     'menuitem': 'HTMLMenuItemElement',
     'meta': 'HTMLMetaElement',
@@ -5254,6 +5517,7 @@
     'source': 'HTMLSourceElement',
     'span': 'HTMLSpanElement',
     'style': 'HTMLStyleElement',
+    'time': 'HTMLTimeElement',
     'caption': 'HTMLTableCaptionElement',
     // WebKit and Moz are wrong:
     // https://bugs.webkit.org/show_bug.cgi?id=111469
@@ -5265,6 +5529,7 @@
     'thead': 'HTMLTableSectionElement',
     'tbody': 'HTMLTableSectionElement',
     'textarea': 'HTMLTextAreaElement',
+    'track': 'HTMLTrackElement',
     'title': 'HTMLTitleElement',
     'ul': 'HTMLUListElement',
     'video': 'HTMLVideoElement',
@@ -5375,10 +5640,10 @@
 /*
   This is a limited shim for ShadowDOM css styling.
   https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
-
-  The intention here is to support only the styling features which can be
-  relatively simply implemented. The goal is to allow users to avoid the
-  most obvious pitfalls and do so without compromising performance significantly.
+  
+  The intention here is to support only the styling features which can be 
+  relatively simply implemented. The goal is to allow users to avoid the 
+  most obvious pitfalls and do so without compromising performance significantly. 
   For ShadowDOM styling that's not covered here, a set of best practices
   can be provided that should allow users to accomplish more complex styling.
 
@@ -5387,57 +5652,57 @@
 
   Shimmed features:
 
-  * @host: ShadowDOM allows styling of the shadowRoot's host element using the
-  @host rule. To shim this feature, the @host styles are reformatted and
+  * @host: ShadowDOM allows styling of the shadowRoot's host element using the 
+  @host rule. To shim this feature, the @host styles are reformatted and 
   prefixed with a given scope name and promoted to a document level stylesheet.
   For example, given a scope name of .foo, a rule like this:
-
+  
     @host {
       * {
         background: red;
       }
     }
-
+  
   becomes:
-
+  
     .foo {
       background: red;
     }
-
-  * encapsultion: Styles defined within ShadowDOM, apply only to
+  
+  * encapsultion: Styles defined within ShadowDOM, apply only to 
   dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
   this feature.
-
-  By default, rules are prefixed with the host element tag name
+  
+  By default, rules are prefixed with the host element tag name 
   as a descendant selector. This ensures styling does not leak out of the 'top'
   of the element's ShadowDOM. For example,
 
   div {
       font-weight: bold;
     }
-
+  
   becomes:
 
   x-foo div {
       font-weight: bold;
     }
-
+  
   becomes:
 
 
-  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then
+  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then 
   selectors are scoped by adding an attribute selector suffix to each
-  simple selector that contains the host element tag name. Each element
-  in the element's ShadowDOM template is also given the scope attribute.
+  simple selector that contains the host element tag name. Each element 
+  in the element's ShadowDOM template is also given the scope attribute. 
   Thus, these rules match only elements that have the scope attribute.
   For example, given a scope name of x-foo, a rule like this:
-
+  
     div {
       font-weight: bold;
     }
-
+  
   becomes:
-
+  
     div[x-foo] {
       font-weight: bold;
     }
@@ -5469,39 +5734,39 @@
 
   becomes:
 
-    x-foo [part=special] { ... }
-
+    x-foo [part=special] { ... }    
+  
   Unaddressed ShadowDOM styling features:
-
+  
   * upper/lower bound encapsulation: Styles which are defined outside a
   shadowRoot should not cross the ShadowDOM boundary and should not apply
   inside a shadowRoot.
 
-  This styling behavior is not emulated. Some possible ways to do this that
+  This styling behavior is not emulated. Some possible ways to do this that 
   were rejected due to complexity and/or performance concerns include: (1) reset
   every possible property for every possible selector for a given scope name;
   (2) re-implement css in javascript.
-
+  
   As an alternative, users should make sure to use selectors
   specific to the scope in which they are working.
-
+  
   * ::distributed: This behavior is not emulated. It's often not necessary
   to style the contents of a specific insertion point and instead, descendants
-  of the host element can be styled selectively. Users can also create an
+  of the host element can be styled selectively. Users can also create an 
   extra node around an insertion point and style that node's contents
   via descendent selectors. For example, with a shadowRoot like this:
-
+  
     <style>
       content::-webkit-distributed(div) {
         background: red;
       }
     </style>
     <content></content>
-
+  
   could become:
-
+  
     <style>
-      / *@polyfill .content-container div * /
+      / *@polyfill .content-container div * / 
       content::-webkit-distributed(div) {
         background: red;
       }
@@ -5509,9 +5774,9 @@
     <div class="content-container">
       <content></content>
     </div>
-
+  
   Note the use of @polyfill in the comment above a ShadowDOM specific style
-  declaration. This is a directive to the styling shim to use the selector
+  declaration. This is a directive to the styling shim to use the selector 
   in comments in lieu of the next selector when running under polyfill.
 */
 (function(scope) {
@@ -5547,7 +5812,7 @@
       root.shimmedStyle = def.shimmedStyle;
     }
     // remove existing style elements
-    for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]);
+    for (var i=0, l=def.rootStyles.length, s; (i<l) && (s=def.rootStyles[i]); 
         i++) {
       s.parentNode.removeChild(s);
     }
@@ -5591,14 +5856,14 @@
   /*
    * Process styles to convert native ShadowDOM rules that will trip
    * up the css parser; we rely on decorating the stylesheet with comments.
-   *
+   * 
    * For example, we convert this rule:
-   *
+   * 
    * (comment start) @polyfill :host menu-item (comment end)
    * shadow::-webkit-distributed(menu-item) {
-   *
+   * 
    * to this:
-   *
+   * 
    * scopeName menu-item {
    *
   **/
@@ -5617,14 +5882,14 @@
   },
   /*
    * Process styles to add rules which will only apply under the polyfill
-   *
+   * 
    * For example, we convert this rule:
-   *
-   * (comment start) @polyfill-rule :host menu-item {
+   * 
+   * (comment start) @polyfill-rule :host menu-item { 
    * ... } (comment end)
-   *
+   * 
    * to this:
-   *
+   * 
    * scopeName menu-item {...}
    *
   **/
@@ -5643,15 +5908,15 @@
   },
   /*
    * Process styles to add rules which will only apply under the polyfill
-   * and do not process via CSSOM. (CSSOM is destructive to rules on rare
+   * and do not process via CSSOM. (CSSOM is destructive to rules on rare 
    * occasions, e.g. -webkit-calc on Safari.)
    * For example, we convert this rule:
-   *
-   * (comment start) @polyfill-unscoped-rule menu-item {
+   * 
+   * (comment start) @polyfill-unscoped-rule menu-item { 
    * ... } (comment end)
-   *
+   * 
    * to this:
-   *
+   * 
    * menu-item {...}
    *
   **/
@@ -5690,7 +5955,7 @@
       return self.scopeHostCss(p1, name, typeExtension);
     });
     cssText = rulesToCss(this.findAtHostRules(cssToRules(cssText),
-      new RegExp('^' + name + selectorReSuffix, 'm')));
+        this.makeScopeMatcher(name, typeExtension)));
     return cssText;
   },
   scopeHostCss: function(cssText, name, typeExtension) {
@@ -5717,10 +5982,10 @@
     return r.join(', ');
   },
   // consider styles that do not include component name in the selector to be
-  // unscoped and in need of promotion;
+  // unscoped and in need of promotion; 
   // for convenience, also consider keyframe rules this way.
   findAtHostRules: function(cssRules, matcher) {
-    return Array.prototype.filter.call(cssRules,
+    return Array.prototype.filter.call(cssRules, 
       this.isHostRule.bind(this, matcher));
   },
   isHostRule: function(matcher, cssRule) {
@@ -5729,11 +5994,11 @@
       (cssRule.type == CSSRule.WEBKIT_KEYFRAMES_RULE);
   },
   /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
-   *
-   *  .foo {... }
-   *
+   * 
+   *  .foo {... } 
+   *  
    *  and converts this to
-   *
+   *  
    *  scopeName .foo { ... }
   */
   shimScoping: function(styles, name, typeExtension) {
@@ -5764,15 +6029,28 @@
    * to
    *
    * scopeName.foo > .bar, .foo scopeName > .bar { }
-   * TODO(sorvell): file bug since native impl does not do the former yet.
-   * http://jsbin.com/OganOCI/2/edit
+   * 
+   * and
+   *
+   * :host(.foo:host) .bar { ... }
+   * 
+   * to
+   * 
+   * scopeName.foo .bar { ... }
   */
   convertColonHost: function(cssText) {
     // p1 = :host, p2 = contents of (), p3 rest of rule
     return cssText.replace(cssColonHostRe, function(m, p1, p2, p3) {
-      return p2 ? polyfillHostNoCombinator + p2 + p3 + ', '
-          + p2 + ' ' + p1 + p3 :
-          p1 + p3;
+      p1 = polyfillHostNoCombinator;
+      if (p2) {
+        if (p2.match(polyfillHost)) {
+          return p1 + p2.replace(polyfillHost, '') + p3;
+        } else {
+          return p1 + p2 + p3 + ', ' + p2 + ' ' + p1 + p3;
+        }
+      } else {
+        return p1 + p3;
+      }
     });
   },
   /*
@@ -5786,7 +6064,7 @@
     var cssText = '';
     Array.prototype.forEach.call(cssRules, function(rule) {
       if (rule.selectorText && (rule.style && rule.style.cssText)) {
-        cssText += this.scopeSelector(rule.selectorText, name, typeExtension,
+        cssText += this.scopeSelector(rule.selectorText, name, typeExtension, 
           this.strictStyling) + ' {\n\t';
         cssText += this.propertiesFromRule(rule) + '\n}\n\n';
       } else if (rule.media) {
@@ -5812,10 +6090,13 @@
     return r.join(', ');
   },
   selectorNeedsScoping: function(selector, name, typeExtension) {
-    var matchScope = typeExtension ? name : '\\[is=' + name + '\\]';
-    var re = new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');
+    var re = this.makeScopeMatcher(name, typeExtension);
     return !selector.match(re);
   },
+  makeScopeMatcher: function(name, typeExtension) {
+    var matchScope = typeExtension ? '\\[is=[\'"]?' + name + '[\'"]?\\]' : name;
+    return new RegExp('^(' + matchScope + ')' + selectorReSuffix, 'm');
+  },
   // scope via name and [is=name]
   applySimpleSelectorScope: function(selector, name, typeExtension) {
     var scoper = typeExtension ? '[is=' + name + ']' : name;
@@ -5854,7 +6135,7 @@
     // TODO(sorvell): Chrome cssom incorrectly removes quotes from the content
     // property. (https://code.google.com/p/chromium/issues/detail?id=247231)
     if (rule.style.content && !rule.style.content.match(/['"]+/)) {
-      properties = 'content: \'' + rule.style.content + '\';\n' +
+      properties = 'content: \'' + rule.style.content + '\';\n' + 
         rule.style.cssText.replace(/content:[^;]*;/g, '');
     }
     return properties;
@@ -5940,7 +6221,6 @@
 scope.ShadowCSS = ShadowCSS;
 
 })(window.Platform);
-
 }// Copyright (c) 2012 The Polymer Authors. All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
@@ -7414,540 +7694,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.
 
-// ---------------------------------------------------------------------------
-// Support for JS interoperability
-// ---------------------------------------------------------------------------
-function SendPortSync() {
-}
-
-function ReceivePortSync() {
-  this.id = ReceivePortSync.id++;
-  ReceivePortSync.map[this.id] = this;
-}
-
 // Type for remote proxies to Dart objects with dart2js.
+// WARNING: do not call this constructor or rely on it being
+// in the global namespace, as it may be removed.
 function DartObject(o) {
   this.o = o;
 }
-
-(function() {
-  // Serialize the following types as follows:
-  //  - primitives / null: unchanged
-  //  - lists: [ 'list', internal id, list of recursively serialized elements ]
-  //  - maps: [ 'map', internal id, map of keys and recursively serialized values ]
-  //  - send ports: [ 'sendport', type, isolate id, port id ]
-  //
-  // Note, internal id's are for cycle detection.
-  function serialize(message) {
-    var visited = [];
-    function checkedSerialization(obj, serializer) {
-      // Implementation detail: for now use linear search.
-      // Another option is expando, but it may prohibit
-      // VM optimizations (like putting object into slow mode
-      // on property deletion.)
-      var id = visited.indexOf(obj);
-      if (id != -1) return [ 'ref', id ];
-      var id = visited.length;
-      visited.push(obj);
-      return serializer(id);
-    }
-
-    function doSerialize(message) {
-      if (message == null) {
-        return null;  // Convert undefined to null.
-      } else if (typeof(message) == 'string' ||
-                 typeof(message) == 'number' ||
-                 typeof(message) == 'boolean') {
-        return message;
-      } else if (message instanceof Array) {
-        return checkedSerialization(message, function(id) {
-          var values = new Array(message.length);
-          for (var i = 0; i < message.length; i++) {
-            values[i] = doSerialize(message[i]);
-          }
-          return [ 'list', id, values ];
-        });
-      } else if (message instanceof LocalSendPortSync) {
-        return [ 'sendport', 'nativejs', message.receivePort.id ];
-      } else if (message instanceof DartSendPortSync) {
-        return [ 'sendport', 'dart', message.isolateId, message.portId ];
-      } else {
-        return checkedSerialization(message, function(id) {
-          var keys = Object.getOwnPropertyNames(message);
-          var values = new Array(keys.length);
-          for (var i = 0; i < keys.length; i++) {
-            values[i] = doSerialize(message[keys[i]]);
-          }
-          return [ 'map', id, keys, values ];
-        });
-      }
-    }
-    return doSerialize(message);
-  }
-
-  function deserialize(message) {
-    return deserializeHelper(message);
-  }
-
-  function deserializeHelper(message) {
-    if (message == null ||
-        typeof(message) == 'string' ||
-        typeof(message) == 'number' ||
-        typeof(message) == 'boolean') {
-      return message;
-    }
-    switch (message[0]) {
-      case 'map': return deserializeMap(message);
-      case 'sendport': return deserializeSendPort(message);
-      case 'list': return deserializeList(message);
-      default: throw 'unimplemented';
-    }
-  }
-
-  function deserializeMap(message) {
-    var result = { };
-    var id = message[1];
-    var keys = message[2];
-    var values = message[3];
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = deserializeHelper(keys[i]);
-      var value = deserializeHelper(values[i]);
-      result[key] = value;
-    }
-    return result;
-  }
-
-  function deserializeSendPort(message) {
-    var tag = message[1];
-    switch (tag) {
-      case 'nativejs':
-        var id = message[2];
-        return new LocalSendPortSync(ReceivePortSync.map[id]);
-      case 'dart':
-        var isolateId = message[2];
-        var portId = message[3];
-        return new DartSendPortSync(isolateId, portId);
-      default:
-        throw 'Illegal SendPortSync type: $tag';
-    }
-  }
-
-  function deserializeList(message) {
-    var values = message[2];
-    var length = values.length;
-    var result = new Array(length);
-    for (var i = 0; i < length; i++) {
-      result[i] = deserializeHelper(values[i]);
-    }
-    return result;
-  }
-
-  window.registerPort = function(name, port) {
-    var stringified = JSON.stringify(serialize(port));
-    var attrName = 'dart-port:' + name;
-    document.documentElement.setAttribute(attrName, stringified);
-  };
-
-  window.lookupPort = function(name) {
-    var attrName = 'dart-port:' + name;
-    var stringified = document.documentElement.getAttribute(attrName);
-    return deserialize(JSON.parse(stringified));
-  };
-
-  ReceivePortSync.id = 0;
-  ReceivePortSync.map = {};
-
-  ReceivePortSync.dispatchCall = function(id, message) {
-    // TODO(vsm): Handle and propagate exceptions.
-    var deserialized = deserialize(message);
-    var result = ReceivePortSync.map[id].callback(deserialized);
-    return serialize(result);
-  };
-
-  ReceivePortSync.prototype.receive = function(callback) {
-    this.callback = callback;
-  };
-
-  ReceivePortSync.prototype.toSendPort = function() {
-    return new LocalSendPortSync(this);
-  };
-
-  ReceivePortSync.prototype.close = function() {
-    delete ReceivePortSync.map[this.id];
-  };
-
-  if (navigator.webkitStartDart) {
-    window.addEventListener('js-sync-message', function(event) {
-      var data = JSON.parse(getPortSyncEventData(event));
-      var deserialized = deserialize(data.message);
-      var result = ReceivePortSync.map[data.id].callback(deserialized);
-      // TODO(vsm): Handle and propagate exceptions.
-      dispatchEvent('js-result', serialize(result));
-    }, false);
-  }
-
-  function LocalSendPortSync(receivePort) {
-    this.receivePort = receivePort;
-  }
-
-  LocalSendPortSync.prototype = new SendPortSync();
-
-  LocalSendPortSync.prototype.callSync = function(message) {
-    // TODO(vsm): Do a direct deepcopy.
-    message = deserialize(serialize(message));
-    return this.receivePort.callback(message);
-  }
-
-  function DartSendPortSync(isolateId, portId) {
-    this.isolateId = isolateId;
-    this.portId = portId;
-  }
-
-  DartSendPortSync.prototype = new SendPortSync();
-
-  function dispatchEvent(receiver, message) {
-    var string = JSON.stringify(message);
-    var event = document.createEvent('CustomEvent');
-    event.initCustomEvent(receiver, false, false, string);
-    window.dispatchEvent(event);
-  }
-
-  function getPortSyncEventData(event) {
-    return event.detail;
-  }
-
-  DartSendPortSync.prototype.callSync = function(message) {
-    var serialized = serialize(message);
-    var target = 'dart-port-' + this.isolateId + '-' + this.portId;
-    // TODO(vsm): Make this re-entrant.
-    // TODO(vsm): Set this up set once, on the first call.
-    var source = target + '-result';
-    var result = null;
-    var listener = function (e) {
-      result = JSON.parse(getPortSyncEventData(e));
-    };
-    window.addEventListener(source, listener, false);
-    dispatchEvent(target, [source, serialized]);
-    window.removeEventListener(source, listener, false);
-    return deserialize(result);
-  }
-})();
-
-(function() {
-  // Proxy support for js.dart.
-
-  // We don't use 'window' because we might be in a web worker, but we don't
-  // use 'self' because not all browsers support it
-  var globalContext = function() { return this; }();
-
-  // Table for local objects and functions that are proxied.
-  function ProxiedObjectTable() {
-    // Name for debugging.
-    this.name = 'js-ref';
-
-    // Table from IDs to JS objects.
-    this.map = {};
-
-    // Generator for new IDs.
-    this._nextId = 0;
-
-    // Ports for managing communication to proxies.
-    this.port = new ReceivePortSync();
-    this.sendPort = this.port.toSendPort();
-  }
-
-  // Number of valid IDs.  This is the number of objects (global and local)
-  // kept alive by this table.
-  ProxiedObjectTable.prototype.count = function () {
-    return Object.keys(this.map).length;
-  }
-
-  var _dartRefPropertyName = "_$dart_ref";
-
-  // attempts to add an unenumerable property to o. If that is not allowed
-  // it silently fails.
-  function _defineProperty(o, name, value) {
-    if (Object.isExtensible(o)) {
-      try {
-        Object.defineProperty(o, name, { 'value': value });
-      } catch (e) {
-        // object is native and lies about being extensible
-        // see https://bugzilla.mozilla.org/show_bug.cgi?id=775185
-      }
-    }
-  }
-
-  // Adds an object to the table and return an ID for serialization.
-  ProxiedObjectTable.prototype.add = function (obj, id) {
-    if (id != null) {
-      this.map[id] = obj;
-      return id;
-    } else {
-      var ref = obj[_dartRefPropertyName];
-      if (ref == null) {
-        ref = this.name + '-' + this._nextId++;
-        this.map[ref] = obj;
-        _defineProperty(obj, _dartRefPropertyName, ref);
-      }
-      return ref;
-    }
-  }
-
-  // Gets the object or function corresponding to this ID.
-  ProxiedObjectTable.prototype.contains = function (id) {
-    return this.map.hasOwnProperty(id);
-  }
-
-  // Gets the object or function corresponding to this ID.
-  ProxiedObjectTable.prototype.get = function (id) {
-    if (!this.map.hasOwnProperty(id)) {
-      throw 'Proxy ' + id + ' has been invalidated.'
-    }
-    return this.map[id];
-  }
-
-  ProxiedObjectTable.prototype._initialize = function () {
-    // Configure this table's port to forward methods, getters, and setters
-    // from the remote proxy to the local object.
-    var table = this;
-
-    this.port.receive(function (message) {
-      // TODO(vsm): Support a mechanism to register a handler here.
-      try {
-        var receiver = table.get(message[0]);
-        var member = message[1];
-        var kind = message[2];
-        var args = message[3].map(deserialize);
-        if (kind == 'get') {
-          // Getter.
-          var field = member;
-          if (field in receiver && args.length == 0) {
-            return [ 'return', serialize(receiver[field]) ];
-          }
-        } else if (kind == 'set') {
-          // Setter.
-          var field = member;
-          if (args.length == 1) {
-            return [ 'return', serialize(receiver[field] = args[0]) ];
-          }
-        } else if (kind == 'hasProperty') {
-          var field = member;
-          return [ 'return', field in receiver ];
-        } else if (kind == 'apply') {
-          // Direct function invocation.
-          return [ 'return',
-              serialize(receiver.apply(args[0], args.slice(1))) ];
-        } else if (member == '[]' && args.length == 1) {
-          // Index getter.
-          return [ 'return', serialize(receiver[args[0]]) ];
-        } else if (member == '[]=' && args.length == 2) {
-          // Index setter.
-          return [ 'return', serialize(receiver[args[0]] = args[1]) ];
-        } else {
-          // Member function invocation.
-          var f = receiver[member];
-          if (f) {
-            var result = f.apply(receiver, args);
-            return [ 'return', serialize(result) ];
-          }
-        }
-        return [ 'none' ];
-      } catch (e) {
-        return [ 'throws', e.toString() ];
-      }
-    });
-  }
-
-  // Singleton for local proxied objects.
-  var proxiedObjectTable = new ProxiedObjectTable();
-  proxiedObjectTable._initialize()
-
-  // Type for remote proxies to Dart objects.
-  function DartObject(id, sendPort) {
-    this.id = id;
-    this.port = sendPort;
-  }
-
-  // Serializes JS types to SendPortSync format:
-  // - primitives -> primitives
-  // - sendport -> sendport
-  // - Function -> [ 'funcref', function-id, sendport ]
-  // - Object -> [ 'objref', object-id, sendport ]
-  function serialize(message) {
-    if (message == null) {
-      return null;  // Convert undefined to null.
-    } else if (typeof(message) == 'string' ||
-               typeof(message) == 'number' ||
-               typeof(message) == 'boolean') {
-      // Primitives are passed directly through.
-      return message;
-    } else if (message instanceof SendPortSync) {
-      // Non-proxied objects are serialized.
-      return message;
-    } else if (typeof(message) == 'function') {
-      if ('_dart_id' in message) {
-        // Remote function proxy.
-        var remoteId = message._dart_id;
-        var remoteSendPort = message._dart_port;
-        return [ 'funcref', remoteId, remoteSendPort ];
-      } else {
-        // Local function proxy.
-        return [ 'funcref',
-                 proxiedObjectTable.add(message),
-                 proxiedObjectTable.sendPort ];
-      }
-    } else if (message instanceof DartObject) {
-      // Remote object proxy.
-      return [ 'objref', message.id, message.port ];
-    } else {
-      // Local object proxy.
-      return [ 'objref',
-               proxiedObjectTable.add(message),
-               proxiedObjectTable.sendPort ];
-    }
-  }
-
-  function deserialize(message) {
-    if (message == null) {
-      return null;  // Convert undefined to null.
-    } else if (typeof(message) == 'string' ||
-               typeof(message) == 'number' ||
-               typeof(message) == 'boolean') {
-      // Primitives are passed directly through.
-      return message;
-    } else if (message instanceof SendPortSync) {
-      // Serialized type.
-      return message;
-    }
-    var tag = message[0];
-    switch (tag) {
-      case 'funcref': return deserializeFunction(message);
-      case 'objref': return deserializeObject(message);
-    }
-    throw 'Unsupported serialized data: ' + message;
-  }
-
-  // Create a local function that forwards to the remote function.
-  function deserializeFunction(message) {
-    var id = message[1];
-    var port = message[2];
-    // TODO(vsm): Add a more robust check for a local SendPortSync.
-    if ("receivePort" in port) {
-      // Local function.
-      return proxiedObjectTable.get(id);
-    } else {
-      // Remote function.  Forward to its port.
-      if (proxiedObjectTable.contains(id)) {
-        return proxiedObjectTable.get(id);
-      }
-      var f = function () {
-        var args = Array.prototype.slice.apply(arguments);
-        args.splice(0, 0, this);
-        args = args.map(serialize);
-        var result = port.callSync([id, '#call', args]);
-        if (result[0] == 'throws') throw deserialize(result[1]);
-        return deserialize(result[1]);
-      };
-      // Cache the remote id and port.
-      f._dart_id = id;
-      f._dart_port = port;
-      proxiedObjectTable.add(f, id);
-      return f;
-    }
-  }
-
-  // Creates a DartObject to forwards to the remote object.
-  function deserializeObject(message) {
-    var id = message[1];
-    var port = message[2];
-    // TODO(vsm): Add a more robust check for a local SendPortSync.
-    if ("receivePort" in port) {
-      // Local object.
-      return proxiedObjectTable.get(id);
-    } else {
-      // Remote object.
-      if (proxiedObjectTable.contains(id)) {
-        return proxiedObjectTable.get(id);
-      }
-      var proxy = new DartObject(id, port);
-      proxiedObjectTable.add(proxy, id);
-      return proxy;
-    }
-  }
-
-  // Remote handler to construct a new JavaScript object given its
-  // serialized constructor and arguments.
-  function construct(args) {
-    args = args.map(deserialize);
-    var constructor = args[0];
-
-    // The following code solves the problem of invoking a JavaScript
-    // constructor with an unknown number arguments.
-    // First bind the constructor to the argument list using bind.apply().
-    // The first argument to bind() is the binding of 'this', make it 'null'
-    // After that, use the JavaScript 'new' operator which overrides any binding
-    // of 'this' with the new instance.
-    args[0] = null;
-    var factoryFunction = constructor.bind.apply(constructor, args);
-    return serialize(new factoryFunction());
-  }
-
-  // Remote handler to return the top-level JavaScript context.
-  function context(data) {
-    return serialize(globalContext);
-  }
-
-  // Return true if a JavaScript proxy is instance of a given type (instanceof).
-  function proxyInstanceof(args) {
-    var obj = deserialize(args[0]);
-    var type = deserialize(args[1]);
-    return obj instanceof type;
-  }
-
-  // Return true if a JavaScript proxy is instance of a given type (instanceof).
-  function proxyDeleteProperty(args) {
-    var obj = deserialize(args[0]);
-    var member = deserialize(args[1]);
-    delete obj[member];
-  }
-
-  function proxyConvert(args) {
-    return serialize(deserializeDataTree(args));
-  }
-
-  function deserializeDataTree(data) {
-    var type = data[0];
-    var value = data[1];
-    if (type === 'map') {
-      var obj = {};
-      for (var i = 0; i < value.length; i++) {
-        obj[value[i][0]] = deserializeDataTree(value[i][1]);
-      }
-      return obj;
-    } else if (type === 'list') {
-      var list = [];
-      for (var i = 0; i < value.length; i++) {
-        list.push(deserializeDataTree(value[i]));
-      }
-      return list;
-    } else /* 'simple' */ {
-      return deserialize(value);
-    }
-  }
-
-  function makeGlobalPort(name, f) {
-    var port = new ReceivePortSync();
-    port.receive(f);
-    window.registerPort(name, port.toSendPort());
-  }
-
-  makeGlobalPort('dart-js-context', context);
-  makeGlobalPort('dart-js-create', construct);
-  makeGlobalPort('dart-js-instanceof', proxyInstanceof);
-  makeGlobalPort('dart-js-delete-property', proxyDeleteProperty);
-  makeGlobalPort('dart-js-convert', proxyConvert);
-})();
-// Generated by dart2js, the Dart to JavaScript compiler.
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.0.0.3_r30188.
 (function($){var A={}
 delete A.x
 var B={}
@@ -8002,74 +7755,40 @@
 init()
 $=I.p
 var $$={}
-$$.C7=[J,{"":"v;nw,jm,EP,RA",
-call$1:function(a){return this.jm.call(this.nw,this.EP,a)},
+$$.YP=[H,{"":"v;wc,nn,lv,Pp",
+call$0:function(){return this.nn.call(this.wc,this.lv)},
+$is_X0:true}]
+$$.Pm=[H,{"":"v;wc,nn,lv,Pp",
+call$1:function(a){return this.nn.call(this.wc,a)},
 $is_HB:true,
 $is_Dv:true}]
-$$.Ip=[H,{"":"v;nw,jm,EP,RA",
-call$0:function(){return this.jm.call(this.nw)},
+$$.Ip=[P,{"":"v;wc,nn,lv,Pp",
+call$0:function(){return this.nn.call(this.wc)},
 $is_X0:true}]
-$$.MT=[H,{"":"v;nw,jm,EP,RA",
-call$0:function(){return this.jm.call(this.nw,this.EP)},
-$is_X0:true}]
-$$.Pm=[H,{"":"v;nw,jm,EP,RA",
-call$1:function(a){return this.jm.call(this.nw,a)},
+$$.C7=[P,{"":"v;wc,nn,lv,Pp",
+call$1:function(a){return this.nn.call(this.wc,this.lv,a)},
 $is_HB:true,
 $is_Dv:true}]
-$$.CQ=[P,{"":"v;nw,jm,EP,RA",
-call$2:function(a,b){return this.jm.call(this.nw,a,b)},
+$$.CQ=[P,{"":"v;wc,nn,lv,Pp",
+call$2:function(a,b){return this.nn.call(this.wc,a,b)},
 call$1:function(a){return this.call$2(a,null)},
 "+call:1:0":0,
 $is_bh:true,
 $is_HB:true,
 $is_Dv:true}]
-$$.P0=[P,{"":"v;nw,jm,EP,RA",
-call$1:function(a){return this.jm.call(this.nw,this.EP,a)},
-call$0:function(){return this.call$1(null)},
-"+call:0:0":0,
-$is_HB:true,
-$is_Dv:true,
-$is_X0:true}]
-$$.eO=[P,{"":"v;nw,jm,EP,RA",
-call$2:function(a,b){return this.jm.call(this.nw,a,b)},
+$$.eO=[P,{"":"v;wc,nn,lv,Pp",
+call$2:function(a,b){return this.nn.call(this.wc,a,b)},
 $is_bh:true}]
-$$.Dw=[P,{"":"v;nw,jm,EP,RA",
-call$3:function(a,b,c){return this.jm.call(this.nw,a,b,c)}}]
-$$.cP=[P,{"":"v;nw,jm,EP,RA",
-call$4:function(a,b,c,d){return this.jm.call(this.nw,a,b,c,d)}}]
-$$.SV=[P,{"":"v;nw,jm,EP,RA",
-call$2:function(a,b){return this.jm.call(this.nw,this.EP,a,b)},
+$$.Y7=[A,{"":"v;wc,nn,lv,Pp",
+call$2:function(a,b){return this.nn.call(this.wc,this.lv,a,b)},
 $is_bh:true}]
-$$.bq=[P,{"":"v;nw,jm,EP,RA",
-call$2$specification$zoneValues:function(a,b){return this.jm.call(this.nw,a,b)},
-call$1$specification:function(a){return this.call$2$specification$zoneValues(a,null)},
-"+call:1:0:specification":0,
-call$0:function(){return this.call$2$specification$zoneValues(null,null)},
-"+call:0:0":0,
-call$catchAll:function(){return{specification:null,zoneValues:null}},
-$is_X0:true}]
-$$.jY=[B,{"":"v;nw,jm,EP,RA",
-call$7:function(a,b,c,d,e,f,g){return this.jm.call(this.nw,a,b,c,d,e,f,g)},
-call$1:function(a){return this.call$7(a,null,null,null,null,null,null)},
-"+call:1:0":0,
-call$2:function(a,b){return this.call$7(a,b,null,null,null,null,null)},
-"+call:2:0":0,
-call$3:function(a,b,c){return this.call$7(a,b,c,null,null,null,null)},
-"+call:3:0":0,
-call$4:function(a,b,c,d){return this.call$7(a,b,c,d,null,null,null)},
-"+call:4:0":0,
-call$5:function(a,b,c,d,e){return this.call$7(a,b,c,d,e,null,null)},
-"+call:5:0":0,
-call$6:function(a,b,c,d,e,f){return this.call$7(a,b,c,d,e,f,null)},
-"+call:6:0":0,
-$is_bh:true,
-$is_HB:true,
-$is_Dv:true}]
-$$.Wv=[H,{"":"Tp;call$2,$name",$is_bh:true}]
+$$.Dw=[T,{"":"v;wc,nn,lv,Pp",
+call$3:function(a,b,c){return this.nn.call(this.wc,a,b,c)}}]
+$$.zy=[H,{"":"Tp;call$2,$name",$is_bh:true}]
 $$.Nb=[H,{"":"Tp;call$1,$name",$is_HB:true,$is_Dv:true}]
-$$.Fy=[H,{"":"Tp;call$0,$name",$is_X0:true}]
+$$.HB=[H,{"":"Tp;call$0,$name",$is_X0:true}]
 $$.eU=[H,{"":"Tp;call$7,$name"}]
-$$.WvQ=[P,{"":"Tp;call$2,$name",
+$$.ADW=[P,{"":"Tp;call$2,$name",
 call$1:function(a){return this.call$2(a,null)},
 "+call:1:0":0,
 $is_bh:true,
@@ -8086,13 +7805,13 @@
 call$catchAll:function(){return{onError:null,radix:null}},
 $is_HB:true,
 $is_Dv:true}]
-;init.mangledNames={gAQ:"iconClass",gB:"length",gDb:"_cachedDeclarations",gEI:"prefix",gEl:"_collapsed",gF1:"isolate",gFT:"__$instruction",gFU:"_cachedMethodsMap",gG1:"message",gGj:"_message",gH8:"_fieldsDescriptor",gHt:"_fieldsMetadata",gKM:"$",gM2:"_cachedVariables",gMR:"app",gMj:"function",gNI:"instruction",gOL:"__$field",gOk:"_cachedMetadata",gP:"value",gPw:"__$isolate",gPy:"__$error",gQq:"__$trace",gRu:"cls",gT1:"_cachedGetters",gTn:"json",gTx:"_jsConstructorOrInterceptor",gUF:"_cachedTypeVariables",gVA:"__$displayValue",gWL:"_mangledName",gXf:"__$iconClass",gZ6:"locationManager",gZw:"__$code",ga:"a",gb0:"_cachedConstructors",geb:"__$json",gfX:"_cachedSetters",gi0:"__$name",gi2:"isolates",giI:"__$library",gjO:"id",gjd:"_cachedMethods",gjr:"__$function",gkc:"error",gkf:"_count",glb:"__$cls",gle:"_metadata",glw:"requestManager",gn2:"responses",gnI:"isolateManager",gnz:"_owner",goc:"name",gpz:"_jsConstructorCache",gqN:"_superclass",gqm:"_cachedSuperinterfaces",grk:"hash",gt0:"field",gtB:"_cachedFields",gtD:"library",gtH:"__$app",gtN:"trace",gtT:"code",guA:"_cachedMembers",gvH:"index",gvu:"displayValue",gxj:"collapsed",gzd:"currentHash"};init.mangledGlobalNames={AL:"_openIconClass",DI:"_closeIconClass"};(function (reflectionData) {
+;init.mangledNames={gAQ:"iconClass",gB:"length",gDb:"_cachedDeclarations",gEI:"prefix",gF1:"isolate",gFJ:"__$cls",gFT:"__$instruction",gFU:"_cachedMethodsMap",gG1:"message",gH8:"_fieldsDescriptor",gHt:"_fieldsMetadata",gKM:"$",gLy:"_cachedSetters",gM2:"_cachedVariables",gMj:"function",gNI:"instruction",gOk:"_cachedMetadata",gP:"value",gP2:"_collapsed",gPw:"__$isolate",gPy:"__$error",gQG:"app",gQq:"__$trace",gRu:"cls",gT1:"_cachedGetters",gTn:"json",gTx:"_jsConstructorOrInterceptor",gUF:"_cachedTypeVariables",gVA:"__$displayValue",gVB:"error_obj",gWL:"_mangledName",gXB:"_message",gXf:"__$iconClass",gZ6:"locationManager",gZw:"__$code",ga:"a",gai:"displayValue",gb:"b",gb0:"_cachedConstructors",gcC:"hash",geb:"__$json",ghO:"__$error_obj",gi0:"__$name",gi2:"isolates",giI:"__$library",gjO:"id",gjd:"_cachedMethods",gkc:"error",gkf:"_count",gle:"_metadata",glw:"requestManager",gn2:"responses",gnI:"isolateManager",gnz:"_owner",goc:"name",gpz:"_jsConstructorCache",gqN:"_superclass",gql:"__$function",gqm:"_cachedSuperinterfaces",gt0:"field",gtB:"_cachedFields",gtD:"library",gtH:"__$app",gtN:"trace",gtT:"code",guA:"_cachedMembers",gvH:"index",gvt:"__$field",gxj:"collapsed",gzd:"currentHash"};init.mangledGlobalNames={DI:"_closeIconClass",Vl:"_openIconClass"};(function (reflectionData) {
   function map(x){x={x:x};delete x.x;return x}
   if (!init.libraries) init.libraries = [];
   if (!init.mangledNames) init.mangledNames = map();
   if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
   if (!init.statics) init.statics = map();
-  if (!init.interfaces) init.interfaces = map();
+  if (!init.typeInformation) init.typeInformation = map();
   if (!init.globalFunctions) init.globalFunctions = map();
   var libraries = init.libraries;
   var mangledNames = init.mangledNames;
@@ -8120,7 +7839,7 @@
         if (firstChar === "+") {
           mangledGlobalNames[previousProperty] = property.substring(1);
           if (descriptor[property] == 1) descriptor[previousProperty].$reflectable = 1;
-          if (element && element.length) init.interfaces[previousProperty] = element;
+          if (element && element.length) init.typeInformation[previousProperty] = element;
         } else if (firstChar === "@") {
           property = property.substring(1);
           $[property]["@"] = element;
@@ -8169,7 +7888,7 @@
     libraries.push([name, uri, classes, functions, metadata, fields, isRoot,
                     globalObject]);
   }
-})([["_foreign_helper","dart:_foreign_helper",,H,{Lt:{"":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{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
+})([["_foreign_helper","dart:_foreign_helper",,H,{Lt:{"":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{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
@@ -8177,10 +7896,9 @@
 if(!0===y)return a
 x=Object.getPrototypeOf(a)
 if(y===x)return z.i
-if(z.e===x)return y(a,z)}z=H.Px(a)
-if(z==null)return C.Ku
-Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
-return J.ks(a)},e1:function(a){var z,y,x,w
+if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
+if(w==null)return C.vB
+return w},e1:function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
 y=z
@@ -8195,32 +7913,31 @@
 if(z==null)return
 y=$.Au
 if(typeof z!=="number")throw z.g()
-return J.UQ(y,z+2)[b]},vB:{"":"a;",
+return J.UQ(y,z+2)[b]},Gv:{"":"a;",
 n:function(a,b){return a===b},
-gEo:function(a){return H.eQ(a)},
+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))},
+"+noSuchMethod:1:0":0,
 gbx:function(a){return new H.cu(H.dJ(a),null)},
-$isvB:true},yE:{"":"bool/vB;",
+$isGv:true,
+"%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},kn:{"":"bool/Gv;",
 bu:function(a){return String(a)},
-gEo:function(a){return a?519018:218159},
+giO:function(a){return a?519018:218159},
 gbx:function(a){return C.HL},
-$isbool:true},PE:{"":"vB;",
+$isbool:true},PE:{"":"Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
-gEo:function(a){return 0},
-gbx:function(a){return C.GX}},QI:{"":"vB;",
-gEo:function(a){return 0},
-gbx:function(a){return C.CS}},Tm:{"":"QI;"},kd:{"":"QI;"},Q:{"":"List/vB;",
+giO:function(a){return 0},
+gbx:function(a){return C.GX}},QI:{"":"Gv;",
+giO:function(a){return 0},
+gbx:function(a){return C.CS}},Tm:{"":"QI;"},is:{"":"QI;"},Q:{"":"List/Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
-ght:function(a){return new J.C7(this,J.Q.prototype.h,a,"h")},
-W4:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
+W4:function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-kF:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
+xe:function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
 mv:function(a){if(!!a.fixed$length)H.vh(P.f("removeLast"))
@@ -8240,12 +7957,12 @@
 H.VM(z,[null,null])
 return z},
 zV:function(a,b){var z,y,x,w
-z=P.A(a.length,null)
-for(y=z.length,x=0;x<a.length;++x){w=H.d(a[x])
-if(x>=y)throw H.e(z,x)
-z[x]=w}return z.join(b)},
-DX:function(a,b,c){return H.nE(a,b,c)},
-XG:function(a,b){return this.DX(a,b,null)},
+z=a.length
+y=P.A(z,null)
+for(x=0;x<a.length;++x){w=H.d(a[x])
+if(x>=z)throw H.e(y,x)
+y[x]=w}return y.join(b)},
+eR:function(a,b){return H.j5(a,b,null,null)},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
 return a[b]},
 D6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
@@ -8256,9 +7973,9 @@
 return a.slice(b,c)},
 Jk:function(a,b){return this.D6(a,b,null)},
 Mu:function(a,b,c){H.S6(a,b,c)
-return H.q9(a,b,c,null)},
+return H.j5(a,b,c,null)},
 gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+throw H.b(new P.lj("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
@@ -8273,12 +7990,10 @@
 H.Zi(a,c,a,b,z-c)
 if(typeof b!=="number")throw H.s(b)
 this.sB(a,z-(c-b))},
-YW:function(a,b,c,d,e){if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b,c,d,e)},
 Vr:function(a,b){return H.Ck(a,b)},
 XU:function(a,b,c){return H.Ub(a,b,c,a.length)},
 u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return H.ED(a,b,c)},
+Pk:function(a,b,c){return H.Wv(a,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
 tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
@@ -8288,37 +8003,37 @@
 gor:function(a){return a.length!==0},
 "+isNotEmpty":0,
 bu:function(a){return H.mx(a,"[","]")},
-tt:function(a,b){return P.F(a,b,H.ip(a,"Q",0))},
+tt:function(a,b){return P.F(a,b,H.W8(a,"Q",0))},
 br:function(a){return this.tt(a,!0)},
-gA:function(a){var z=new H.wi(a,a.length,0,null)
-H.VM(z,[H.ip(a,"Q",0)])
+gA:function(a){var z=new H.a7(a,a.length,0,null)
+H.VM(z,[H.W8(a,"Q",0)])
 return z},
-gEo:function(a){return H.eQ(a)},
+giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
 "+length":0,
 sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b<0)throw H.b(new P.bJ("value "+b))
+if(b<0)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("set length"))
 a.length=b},
 "+length=":0,
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b>=a.length||b<0)throw H.b(new P.bJ("value "+b))
+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]},
 "+[]:1:0":0,
 u:function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b>=a.length||b<0)throw H.b(new P.bJ("value "+b))
+if(b>=a.length||b<0)throw H.b(P.N(b))
 a[b]=c},
 "+[]=:2:0":0,
 $isList:true,
 $asWO:null,
 $ascX:null,
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true},jx:{"":"Q;",$isjx:true,
 $asQ:function(){return[null]},
 $asWO:function(){return[null]},
-$ascX:function(){return[null]}},y4:{"":"jx;"},Jt:{"":"jx;",$isJt:true},P:{"":"num/vB;",
+$ascX:function(){return[null]}},ZC:{"":"jx;"},Jt:{"":"jx;",$isJt:true},P:{"":"num/Gv;",
 iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a<b)return-1
@@ -8339,15 +8054,13 @@
 HG:function(a){return this.yu(this.UD(a))},
 UD:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
-WZ:function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},
 bu:function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},
-gEo:function(a){return a&0x1FFFFFFF},
+giO:function(a){return a&0x1FFFFFFF},
 J:function(a){return-a},
 g:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return a+b},
-W:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a-b},
 V:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return a/b},
@@ -8359,7 +8072,7 @@
 O:function(a,b){if(b<0)throw H.b(new P.AT(b))
 if(b>31)return 0
 return a<<b>>>0},
-m:function(a,b){if(b<0)throw H.b(new P.AT(b))
+m:function(a,b){if(b<0)throw H.b(P.u(b))
 if(a>0){if(b>31)return 0
 return a>>>b}if(b>31)b=31
 return a>>b>>>0},
@@ -8371,7 +8084,7 @@
 return a>b},
 E:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return a<=b},
-F:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
 $isnum:true,
 static:{"":"Cv,nr",}},im:{"":"int/P;",
@@ -8381,8 +8094,8 @@
 $isint:true},Pp:{"":"double/P;",
 gbx:function(a){return C.O4},
 $isdouble:true,
-$isnum:true},O:{"":"String/vB;",
-j:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+$isnum:true},O:{"":"String/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))
 return a.charCodeAt(b)},
@@ -8393,12 +8106,12 @@
 y=b.length
 if(c+z>y)return
 for(x=0;x<z;++x){w=c+x
-if(w<0)H.vh(new P.bJ("value "+H.d(w)))
-if(w>=y)H.vh(new P.bJ("value "+H.d(w)))
+if(typeof w!=="number"||Math.floor(w)!==w)H.vh(new P.AT(w))
+if(w<0)H.vh(P.N(w))
+if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
-if(x>=z)H.vh(new P.bJ("value "+x))
+if(x>=z)H.vh(P.N(x))
 if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},
-R4:function(a,b){return this.wL(a,b,0)},
 g:function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
 return a+b},
 Tc:function(a,b){var z,y
@@ -8412,12 +8125,12 @@
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string"){z=c+b.length
 if(z>a.length)return!1
-return b==a.substring(c,z)}return J.Br(b,a,c)!=null},
+return b===a.substring(c,z)}return J.I8(b,a,c)!=null},
 nC:function(a,b){return this.Ys(a,b,0)},
 JT:function(a,b,c){var z
-if(typeof b!=="number")H.vh(P.u(b))
+if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
-if(typeof c!=="number")H.vh(P.u(c))
+if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
 z=J.Wx(b)
 if(z.C(b,0))throw H.b(P.N(b))
 if(z.D(b,c))throw H.b(P.N(b))
@@ -8426,13 +8139,13 @@
 yn:function(a,b){return this.JT(a,b,null)},
 hc:function(a){return a.toLowerCase()},
 bS:function(a){var z,y,x,w,v
-for(z=a.length,y=0;y<z;){if(y>=z)H.vh(new P.bJ("value "+y))
+for(z=a.length,y=0;y<z;){if(y>=z)H.vh(P.N(y))
 x=a.charCodeAt(y)
 if(x===32||x===13||J.Ga(x))++y
 else break}if(y===z)return""
 for(w=z;!0;w=v){v=w-1
-if(v<0)H.vh(new P.bJ("value "+v))
-if(v>=z)H.vh(new P.bJ("value "+v))
+if(v<0)H.vh(P.N(v))
+if(v>=z)H.vh(P.N(v))
 x=a.charCodeAt(v)
 if(x===32||x===13||J.Ga(x));else break}if(y===0&&w===z)return a
 return a.substring(y,w)},
@@ -8466,7 +8179,7 @@
 else z=a<b?-1:1
 return z},
 bu:function(a){return a},
-gEo:function(a){var z,y,x
+giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
@@ -8475,8 +8188,8 @@
 gbx:function(a){return C.Db},
 gB:function(a){return a.length},
 "+length":0,
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b>=a.length||b<0)throw H.b(new P.bJ("value "+b))
+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]},
 "+[]:1:0":0,
 $isString:true,
@@ -8484,15 +8197,14 @@
 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}}}}}],["_isolate_helper","dart:_isolate_helper",,H,{zd:function(a,b){var z=a.vV(b)
 $globalState.Xz.bL()
-return z},wW:function(a){var z,y
+return z},Vg:function(a){var z
 $globalState=H.SK(a)
 if($globalState.EF===!0)return
 z=H.CO()
-$globalState.yc=z
+$globalState.Nr=z
 $globalState.N0=z
-y=J.x(a)
-if(!!y.$is_Dv)z.vV(new H.PK(a))
-else if(!!y.$is_bh)z.vV(new H.JO(a))
+if(!!a.$is_Dv)z.vV(new H.PK(a))
+else if(!!a.$is_bh)z.vV(new H.JO(a))
 else z.vV(a)
 $globalState.Xz.bL()},yl:function(){var z=init.currentScript
 if(z!=null)return String(z.src)
@@ -8506,15 +8218,15 @@
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+z+"\""))},Mg:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=H.BK(b.data)
+z=H.Hh(b.data)
 y=J.U6(z)
-switch(y.t(z,"command")){case"start":$globalState.NO=y.t(z,"id")
+switch(y.t(z,"command")){case"start":$globalState.oL=y.t(z,"id")
 x=y.t(z,"functionName")
-w=x==null?$globalState.zz:init.globalFunctions[x]
+w=x==null?$globalState.w2:init.globalFunctions[x]
 v=y.t(z,"args")
-u=H.BK(y.t(z,"msg"))
+u=H.Hh(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
-s=H.BK(y.t(z,"replyTo"))
+s=H.Hh(y.t(z,"replyTo"))
 r=H.CO()
 $globalState.Xz.Rk.NZ(new H.IY(r,new H.jl(w,v,u,t,s),"worker-start"))
 $globalState.N0=r
@@ -8534,21 +8246,21 @@
 case"log":H.ZF(y.t(z,"msg"))
 break
 case"print":if($globalState.EF===!0){y=$globalState.rj
-q=H.t0(H.B7(["command","print","msg",z],P.L5(null,null,null,null,null)))
+q=H.Gy(H.B7(["command","print","msg",z],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))
 default:}},ZF:function(a){var z,y,x,w
 if($globalState.EF===!0){y=$globalState.rj
-x=H.t0(H.B7(["command","log","msg",a],P.L5(null,null,null,null,null)))
+x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,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))}},Di:function(a,b,c,d,e){var z
+throw H.b(P.FM(z))}},Kc:function(a,b,c,d,e){var z
 H.nC($globalState.N0.jO)
-$.XE=H.Ty()
-z=$.XE
+$.lE=H.Ty()
+z=$.lE
 z.toString
 J.H4(e,["spawned",new H.JM(z,$globalState.N0.jO)])
 if(d!==!0)a.call$1(c)
@@ -8556,7 +8268,7 @@
 if(!!z.$is_bh)a.call$2(b,c)
 else if(!!z.$is_Dv)a.call$1(b)
 else a.call$0()}},oT:function(a,b,c,d,e,f){var z,y,x
-if(b==null)b=$.Rs()
+if(b==null)b=$.Cl()
 z=new Worker(b)
 z.onmessage=function(e) { H.NB.call$2(z, e); }
 y=$globalState
@@ -8566,14 +8278,14 @@
 y.u(y,z,x)
 y=$globalState.XC
 y.u(y,x,z)
-z.postMessage(H.t0(H.B7(["command","start","id",x,"replyTo",H.t0(f),"args",c,"msg",H.t0(d),"isSpawnUri",e,"functionName",a],P.L5(null,null,null,null,null))))},ff:function(a,b){var z=H.kU()
-z.h7(a)
-P.pH(z.Gx).ml(new H.yc(b))},t0:function(a){var z
+z.postMessage(H.Gy(H.B7(["command","start","id",x,"replyTo",H.Gy(f),"args",c,"msg",H.Gy(d),"isSpawnUri",e,"functionName",a],P.L5(null,null,null,null,null))))},ff:function(a,b){var z=H.kU()
+z.YQ(a)
+P.pH(z.Gx).ml(new H.yc(b))},Gy:function(a){var z
 if($globalState.ji===!0){z=new H.Bj(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)}},BK:function(a){if($globalState.ji===!0)return new H.II(null).QS(a)
+z.mR=new H.aJ(null)
+return z.YQ(a)}else{z=new H.NO(new H.X1())
+z.mR=new H.aJ(null)
+return z.YQ(a)}},Hh:function(a){if($globalState.ji===!0)return new H.II(null).QS(a)
 else return a},vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},kV:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},PK:{"":"Tp;a",
 call$0:function(){this.a.call$1([])},
 "+call:0:0":0,
@@ -8582,15 +8294,15 @@
 call$0:function(){this.b.call$2([],null)},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},O2:{"":"a;Hg,NO,hJ,N0,yc,Xz,Ai,EF,ji,i2@,rj,XC,zz",
+$is_X0:true},O2:{"":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2@,rj,XC,w2",
 Jh:function(){var z,y
 z=$.Qm()==null
 y=$.Nl()
 this.EF=z&&$.JU()===!0
-if(this.EF!==!0)y=y!=null&&$.Rs()!=null
+if(this.EF!==!0)y=y!=null&&$.Cl()!=null
 else y=!0
 this.ji=y
-this.Ai=z&&this.EF!==!0},
+this.vu=z&&this.EF!==!0},
 hn:function(){var z=function (e) { H.NB.call$2(this.rj, e); }
 $.jk().onmessage=z
 $.jk().dartPrint = function (object) {}},
@@ -8598,7 +8310,7 @@
 this.Xz=new H.cC(P.NZ(null,H.IY),0)
 this.i2=P.L5(null,null,null,J.im,H.aX)
 this.XC=P.L5(null,null,null,J.im,null)
-if(this.EF===!0){this.rj=new H.In()
+if(this.EF===!0){this.rj=new H.JH()
 this.hn()}},
 static:{SK:function(a){var z=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
 z.i6(a)
@@ -8618,9 +8330,9 @@
 z.u(z,b,c)
 z=$globalState.i2
 z.u(z,this.jO,this)},
-Xn:function(a){var z=this.Gx
+IJ:function(a){var z=this.Gx
 z.Rz(z,a)
-if(this.Gx.hr===0){z=$globalState.i2
+if(this.Gx.X5===0){z=$globalState.i2
 z.Rz(z,this.jO)}},
 iZ:function(){var z,y
 z=$globalState
@@ -8633,16 +8345,16 @@
 static:{CO:function(){var z=new H.aX(null,null,null)
 z.iZ()
 return z}}},cC:{"":"a;Rk,bZ",
-MK:function(){var z=this.Rk
+Jc:function(){var z=this.Rk
 if(z.av===z.HV)return
 return z.Ux()},
-LM:function(){if($globalState.yc!=null&&$globalState.i2.x4($globalState.yc.jO)&&$globalState.Ai===!0&&$globalState.yc.Gx.hr===0)throw H.b(P.FM("Program exited with open ReceivePorts."))},
+LM:function(){if($globalState.Nr!=null&&$globalState.i2.x4($globalState.Nr.jO)&&$globalState.vu===!0&&$globalState.Nr.Gx.X5===0)throw H.b(P.FM("Program exited with open ReceivePorts."))},
 xB:function(){var z,y,x
-z=this.MK()
+z=this.Jc()
 if(z==null){this.LM()
 y=$globalState
-if(y.EF===!0&&y.i2.hr===0&&y.Xz.bZ===0){y=y.rj
-x=H.t0(H.B7(["command","close"],P.L5(null,null,null,null,null)))
+if(y.EF===!0&&y.i2.X5===0&&y.Xz.bZ===0){y=y.rj
+x=H.Gy(H.B7(["command","close"],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}return!1}z.VU()
 return!0},
@@ -8654,42 +8366,40 @@
 z=w
 y=new H.XO(x,null)
 w=$globalState.rj
-v=H.t0(H.B7(["command","error","msg",H.d(z)+"\n"+H.d(y)],P.L5(null,null,null,null,null)))
+v=H.Gy(H.B7(["command","error","msg",H.d(z)+"\n"+H.d(y)],P.L5(null,null,null,null,null)))
 w.toString
-self.postMessage(v)}},
-gcP:function(){return new H.Ip(this,H.cC.prototype.bL,null,"bL")}},RA:{"":"Tp;a",
+self.postMessage(v)}}},RA:{"":"Tp;a",
 call$0:function(){if(!this.a.xB())return
 P.rT(C.RT,this)},
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true},IY:{"":"a;F1*,i3,G1*",
 VU:function(){this.F1.vV(this.i3)},
-$isIY:true},In:{"":"a;"},jl:{"":"Tp;a,b,c,d,e",
-call$0:function(){H.Di(this.a,this.b,this.c,this.d,this.e)},
+$isIY:true},JH:{"":"a;"},jl:{"":"Tp;a,b,c,d,e",
+call$0:function(){H.Kc(this.a,this.b,this.c,this.d,this.e)},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},BR:{"":"a;",$isbC:true},JM:{"":"BR;JE,Jz",
-LV:function(a,b,c){H.ff(b,new H.Ua(this,b))},
-wR:function(a,b){return this.LV(a,b,null)},
+$is_X0:true},Iy:{"":"a;",$isbC:true},JM:{"":"Iy;JE,tv",
+wR:function(a,b){H.ff(b,new H.Ua(this,b))},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 return typeof b==="object"&&b!==null&&!!z.$isJM&&J.xC(this.JE,b.JE)},
-gEo:function(a){return this.JE.gqK()},
+giO:function(a){return this.JE.gng()},
 $isJM:true,
 $isbC:true},Ua:{"":"Tp;b,c",
 call$0:function(){var z,y,x,w,v,u,t
 z={}
 y=$globalState.i2
 x=this.b
-w=x.Jz
+w=x.tv
 v=y.t(y,w)
 if(v==null)return
 if((x.JE.gda().Gv&4)!==0)return
 u=$globalState.N0!=null&&$globalState.N0.jO!==w
 t=this.c
 z.a=t
-if(u)z.a=H.t0(z.a)
+if(u)z.a=H.Gy(z.a)
 y=$globalState.Xz
 w="receive "+H.d(t)
 y.Rk.NZ(new H.IY(v,new H.JG(z,x,u),w))},
@@ -8699,24 +8409,21 @@
 call$0:function(){var z,y
 z=this.d.JE
 if((z.gda().Gv&4)===0){if(this.e){y=this.a
-y.a=H.BK(y.a)}z=z.gda()
+y.a=H.Hh(y.a)}z=z.gda()
 y=this.a.a
 if(z.Gv>=4)H.vh(z.BW())
 z.Rg(y)}},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},ns:{"":"BR;Ws,bv,Jz",
-LV:function(a,b,c){H.ff(b,new H.wd(this,b))},
-wR:function(a,b){return this.LV(a,b,null)},
+$is_X0:true},ns:{"":"Iy;Ws,bv,tv",
+wR:function(a,b){H.ff(b,new H.wd(this,b))},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isns)z=J.xC(this.Ws,b.Ws)&&J.xC(this.Jz,b.Jz)&&J.xC(this.bv,b.bv)
-else z=!1
-return z},
-gEo:function(a){var z,y,x
+return typeof b==="object"&&b!==null&&!!z.$isns&&J.xC(this.Ws,b.Ws)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
+giO:function(a){var z,y,x
 z=J.Eh(this.Ws,16)
-y=J.Eh(this.Jz,8)
+y=J.Eh(this.tv,8)
 x=this.bv
 if(typeof x!=="number")throw H.s(x)
 return(z^y^x)>>>0},
@@ -8724,29 +8431,29 @@
 $isbC:true},wd:{"":"Tp;a,b",
 call$0:function(){var z,y,x,w
 z=this.a
-y=H.t0(H.B7(["command","message","port",z,"msg",this.b],P.L5(null,null,null,null,null)))
+y=H.Gy(H.B7(["command","message","port",z,"msg",this.b],P.L5(null,null,null,null,null)))
 if($globalState.EF===!0){$globalState.rj.toString
 self.postMessage(y)}else{x=$globalState.XC
 w=x.t(x,z.Ws)
 if(w!=null)w.postMessage(y)}},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},TA:{"":"qh;qK<,da<",
-X5:function(a,b,c,d){var z=this.da
+$is_X0:true},TA:{"":"qh;ng<,da<",
+KR:function(a,b,c,d){var z=this.da
 z.toString
 z=new P.O9(z)
 H.VM(z,[null])
-return z.X5(a,b,c,d)},
-zC:function(a,b,c){return this.X5(a,null,b,c)},
-yI:function(a){return this.X5(a,null,null,null)},
+return z.KR(a,b,c,d)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 cO:function(a){var z=this.da
 if((z.Gv&4)!==0)return
 z.cO(z)
-$globalState.N0.Xn(this.qK)},
-gJK:function(a){return new H.MT(this,H.TA.prototype.cO,a,"cO")},
+$globalState.N0.IJ(this.ng)},
+gJK:function(a){return new H.YP(this,H.TA.prototype.cO,a,"cO")},
 Oe:function(){this.da=P.Ve(this.gJK(this),null,null,null,!0,null)
 var z=$globalState.N0
-z.jT(z,this.qK,this)},
+z.jT(z,this.ng,this)},
 $asqh:function(){return[null]},
 $isHI:true,
 $isqh:true,
@@ -8759,47 +8466,47 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},I9:{"":"HU;Gx,il",
+$is_Dv:true},I9:{"":"HU;Gx,mR",
 Pq:function(a){},
-wb:function(a){var z=this.il
+wb:function(a){var z=this.mR
 if(z.t(z,a)!=null)return
-z=this.il
+z=this.mR
 z.u(z,a,!0)
 J.kH(a,this.gRQ())},
-OI:function(a){var z=this.il
+OI:function(a){var z=this.mR
 if(z.t(z,a)!=null)return
-z=this.il
+z=this.mR
 z.u(z,a,!0)
 J.kH(a.gUQ(a),this.gRQ())},
 DE:function(a){},
-Iy:function(){this.il=new H.fP(null)},
+IW:function(){this.mR=new H.aJ(null)},
 static:{kU:function(){var z=new H.I9([],new H.X1())
-z.Iy()
-return z}}},Bj:{"":"jP;CN,il",
-DE:function(a){if(!!a.$isJM)return["sendport",$globalState.NO,a.Jz,a.JE.gqK()]
-if(!!a.$isns)return["sendport",a.Ws,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))}},NO:{"":"oo;il",
-DE:function(a){if(!!a.$isJM)return new H.JM(a.JE,a.Jz)
-if(!!a.$isns)return new H.ns(a.Ws,a.bv,a.Jz)
+z.IW()
+return z}}},Bj:{"":"Dd;CN,mR",
+DE:function(a){if(!!a.$isJM)return["sendport",$globalState.oL,a.tv,a.JE.gng()]
+if(!!a.$isns)return["sendport",a.Ws,a.tv,a.bv]
+throw H.b("Illegal underlying port "+H.d(a))}},NO:{"":"oo;mR",
+DE:function(a){if(!!a.$isJM)return new H.JM(a.JE,a.tv)
+if(!!a.$isns)return new H.ns(a.Ws,a.bv,a.tv)
 throw H.b("Illegal underlying port "+H.d(a))}},II:{"":"AP;RZ",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.t(a,1)
 x=z.t(a,2)
 w=z.t(a,3)
-if(J.xC(y,$globalState.NO)){z=$globalState.i2
+if(J.xC(y,$globalState.oL)){z=$globalState.i2
 v=z.t(z,x)
 if(v==null)return
 u=v.Zt(w)
 if(u==null)return
-return new H.JM(u,x)}else return new H.ns(y,w,x)}},fP:{"":"a;MD",
+return new H.JM(u,x)}else return new H.ns(y,w,x)}},aJ:{"":"a;MD",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
 "+[]:1:0":0,
 u:function(a,b,c){this.MD.push(b)
 b.__MessageTraverser__attached_info__=c},
 "+[]=:2:0":0,
-CH:function(a){this.MD=P.A(null,null)},
-Xq:function(){var z,y,x
+Hn:function(a){this.MD=P.A(null,null)},
+F4:function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
 if(y>=x.length)throw H.e(x,y)
 x[y].__MessageTraverser__attached_info__=null}this.MD=null}},X1:{"":"a;",
@@ -8807,32 +8514,32 @@
 "+[]:1:0":0,
 u:function(a,b,c){},
 "+[]=:2:0":0,
-CH:function(a){},
-Xq:function(){}},HU:{"":"a;",
-h7:function(a){var z,y
+Hn:function(a){},
+F4:function(){}},HU:{"":"a;",
+YQ:function(a){var z,y
 if(H.vM(a))return this.Pq(a)
-y=this.il
-y.CH(y)
+y=this.mR
+y.Hn(y)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},
+try{z=this.I8(a)}finally{this.mR.F4()}return z},
 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(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.OI(a)
+if(typeof a==="object"&&a!==null&&!!z.$isL8)return this.OI(a)
 if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
 return this.YZ(a)},
 gRQ:function(){return new H.Pm(this,H.HU.prototype.I8,null,"I8")},
 YZ:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},oo:{"":"HU;",
 Pq:function(a){return a},
 wb:function(a){var z,y,x,w,v,u
-z=this.il
+z=this.mR
 y=z.t(z,a)
 if(y!=null)return y
 z=J.U6(a)
 x=z.gB(a)
 y=P.A(x,null)
-w=this.il
+w=this.mR
 w.u(w,a,y)
 if(typeof x!=="number")throw H.s(x)
 w=y.length
@@ -8842,12 +8549,12 @@
 y[v]=u}return y},
 OI:function(a){var z,y
 z={}
-y=this.il
+y=this.mR
 z.a=y.t(y,a)
 y=z.a
 if(y!=null)return y
 z.a=P.L5(null,null,null,null,null)
-y=this.il
+y=this.mR
 y.u(y,a,z.a)
 a.aN(a,new H.OW(z,this))
 return z.a}},OW:{"":"Tp;a,b",
@@ -8855,26 +8562,26 @@
 J.kW(this.a.a,z.I8(a),z.I8(b))},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},jP:{"":"HU;",
+$is_bh:true},Dd:{"":"HU;",
 Pq:function(a){return a},
 wb:function(a){var z,y,x
-z=this.il
+z=this.mR
 y=z.t(z,a)
 if(y!=null)return["ref",y]
 x=this.CN
 this.CN=x+1
-z=this.il
+z=this.mR
 z.u(z,a,x)
 return["list",x,this.mE(a)]},
 OI:function(a){var z,y,x
-z=this.il
+z=this.mR
 y=z.t(z,a)
 if(y!=null)return["ref",y]
 x=this.CN
 this.CN=x+1
-z=this.il
+z=this.mR
 z.u(z,a,x)
-return["map",x,this.mE(J.Nd(a.gvc(a))),this.mE(J.Nd(a.gUQ(a)))]},
+return["map",x,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},
 mE:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -8895,7 +8602,7 @@
 z=this.RZ
 return z.t(z,y)
 case"list":return this.Dj(a)
-case"map":return this.tv(a)
+case"map":return this.GD(a)
 case"sendport":return this.Vf(a)
 default:return this.PR(a)}},
 Dj:function(a){var z,y,x,w,v
@@ -8910,7 +8617,7 @@
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
 return x},
-tv:function(a){var z,y,x,w,v,u,t,s
+GD:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
 x=y.t(a,1)
@@ -8967,7 +8674,7 @@
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-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."))},nC:function(a){$.z7=$.z7+("_"+H.d(a))
+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."))},nC:function(a){$.te=$.te+("_"+H.d(a))
 $.eb=$.eb+("_"+H.d(a))},eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},vx:function(a){throw H.b(P.cD(a))},BU:function(a,b,c){var z,y,x,w,v,u
@@ -8980,11 +8687,11 @@
 if(3>=y)throw H.e(z,3)
 if(z[3]!=null)return parseInt(a,10)
 return c.call$1(a)}b=10}else{if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT("Radix is not an integer"))
-if(b<2||b>36)throw H.b(P.C3("Radix "+b+" not in range 2..36"))
+if(b<2||b>36)throw H.b(P.C3("Radix "+H.d(b)+" not in range 2..36"))
 if(z!=null){if(b===10){if(3>=z.length)throw H.e(z,3)
 y=z[3]!=null}else y=!1
 if(y)return parseInt(a,10)
-if(b>=10){if(3>=z.length)throw H.e(z,3)
+if(!(b<10)){if(3>=z.length)throw H.e(z,3)
 y=z[3]==null}else y=!0
 if(y){x=b<=10?48+b-1:97+b-10-1
 if(1>=z.length)throw H.e(z,1)
@@ -8996,7 +8703,7 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},mO:function(a,b){var z,y
+return parseInt(a,b)},IH:function(a,b){var z,y
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(b==null)b=H.Rm
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.call$1(a)
@@ -9004,31 +8711,34 @@
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
 return b.call$1(a)}return z},lh:function(a){var z,y,x
-z=H.xb(J.x(a))
-if(J.xC(z,"Object")){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
+z=C.Mo(J.x(a))
+if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
 if(typeof y==="string")z=y}x=J.rY(z)
 if(x.j(z,0)===36)z=x.yn(z,1)
 x=H.oX(a)
-return H.d(z)+H.ia(x,0)},a5:function(a){return"Instance of '"+H.lh(a)+"'"},RF:function(a){var z,y,x,w,v,u
+return H.d(z)+H.ia(x,0,null)},a5:function(a){return"Instance of '"+H.lh(a)+"'"},rD:function(a){var z=new Array(a)
+z.fixed$length=!0
+return z},VK: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},Cq:function(a){var z,y,x,w,v
 z=[]
+z.$builtinTypeInfo=[J.im]
 y=H.Y9(a.$asQ,H.oX(a))
 x=y==null?null:y[0]
-w=new H.wi(a,a.length,0,null)
+w=new H.a7(a,a.length,0,null)
 w.$builtinTypeInfo=[x]
-for(;w.G();){v=w.M4
-if(typeof v!=="number"||Math.floor(v)!==v)throw H.b(new P.AT(v))
+for(;w.G();){v=w.mD
+if(typeof v!=="number"||Math.floor(v)!==v)throw H.b(P.u(v))
 if(v<=65535)z.push(v)
 else if(v<=1114111){z.push(55296+(C.jn.m(v-65536,10)&1023))
-z.push(56320+(v&1023))}else throw H.b(new P.AT(v))}return H.RF(z)},eT:function(a){var z,y
-for(z=new H.wi(a,a.length,0,null),H.VM(z,[H.ip(a,"Q",0)]);z.G();){y=z.M4
-if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(new P.AT(y))
-if(y<0)throw H.b(new P.AT(y))
-if(y>65535)return H.Cq(a)}return H.RF(a)},zW:function(a,b,c,d,e,f,g,h){var z,y,x
+z.push(56320+(v&1023))}else throw H.b(P.u(v))}return H.VK(z)},eT:function(a){var z,y
+for(z=new H.a7(a,a.length,0,null),H.VM(z,[H.W8(a,"Q",0)]);z.G();){y=z.mD
+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.Cq(a)}return H.VK(a)},zW:function(a,b,c,d,e,f,g,h){var z,y,x
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(new P.AT(c))
@@ -9043,15 +8753,15 @@
 return y},uM:function(a,b,c){var z=new Date(a)
 if(c)z.setUTCFullYear(b)
 else z.setFullYear(b)
-return z.valueOf()},U8:function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},tJ:function(a){return a.aL?H.U8(a).getUTCFullYear()+0:H.U8(a).getFullYear()+0},NS:function(a){return a.aL?H.U8(a).getUTCMonth()+1:H.U8(a).getMonth()+1},jA:function(a){return a.aL?H.U8(a).getUTCDate()+0:H.U8(a).getDate()+0},KL:function(a){return a.aL?H.U8(a).getUTCHours()+0:H.U8(a).getHours()+0},ch:function(a){return a.aL?H.U8(a).getUTCMinutes()+0:H.U8(a).getMinutes()+0},Jd:function(a){return a.aL?H.U8(a).getUTCSeconds()+0:H.U8(a).getSeconds()+0},o1:function(a){return a.aL?H.U8(a).getUTCMilliseconds()+0:H.U8(a).getMilliseconds()+0},VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
+return z.valueOf()},U8:function(a){if(a.date===void 0)a.date=new Date(a.rq)
+return a.date},tJ:function(a){return a.aL?H.U8(a).getUTCFullYear()+0:H.U8(a).getFullYear()+0},NS:function(a){return a.aL?H.U8(a).getUTCMonth()+1:H.U8(a).getMonth()+1},jA:function(a){return a.aL?H.U8(a).getUTCDate()+0:H.U8(a).getDate()+0},KL:function(a){return a.aL?H.U8(a).getUTCHours()+0:H.U8(a).getHours()+0},ch:function(a){return a.aL?H.U8(a).getUTCMinutes()+0:H.U8(a).getMinutes()+0},XJ:function(a){return a.aL?H.U8(a).getUTCSeconds()+0:H.U8(a).getSeconds()+0},o1:function(a){return a.aL?H.U8(a).getUTCMilliseconds()+0:H.U8(a).getMilliseconds()+0},of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
 return a[b]},aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
 a[b]=c},Ek:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.a=0
 y=P.p9("")
 x=[]
-z.a=z.a+J.q8(b)
+z.a=z.a+b.length
 C.Nm.Ay(x,b)
 if("call$catchAll" in a){w=a.call$catchAll()
 if(c!=null&&!c.gl0(c))c.aN(c,new H.u8(w))
@@ -9066,7 +8776,7 @@
 q=a[r]
 if(q==null){if(c==null)z=[]
 else{z=c.gvc(c)
-z=P.F(z,!0,H.ip(z,"mW",0))}return J.jf(a,new H.LI(C.Ka,r,0,x,z,null))}return q.apply(a,x)},pL:function(a){if(a=="String")return C.Kn
+z=P.F(z,!0,H.W8(z,"mW",0))}return J.jf(a,new H.LI(C.Ka,r,0,x,z,null))}return q.apply(a,x)},pL: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
@@ -9095,15 +8805,15 @@
 w=x&65535
 if((C.jn.m(x,16)&8191)===10)switch(w){case 438:return z.call$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
-return z.call$1(new H.W0(v,null))
+return z.call$1(new H.ZQ(v,null))
 default:}}if(a instanceof TypeError){v=$.WD()
 u=$.OI()
 t=$.PH()
 s=$.D1()
 r=$.rx()
 q=$.Kr()
-p=$.zO()
-$.uN()
+p=$.W6()
+$.Bi()
 o=$.eA()
 n=$.ko()
 m=v.qS(y)
@@ -9120,10 +8830,10 @@
 if(m==null){m=n.qS(y)
 v=m!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
 if(v){v=m==null?null:m.method
-return z.call$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
+return z.call$1(new H.ZQ(y,v))}}}v=typeof y==="string"?y:""
 return z.call$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.call$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},CU:function(a){if(a==null||typeof a!='object')return J.le(a)
+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
@@ -9148,22 +8858,23 @@
 H.SE(a,b)},ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},mm:function(a){return new H.cu(a,null)
 "6,7,8"},"+createRuntimeType:1:0":1,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]},Ko:function(a){if(a==null)return"dynamic"
-else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1)
+return a.$builtinTypeInfo},IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},W8:function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},mS:function(a,b){return a[0].builtin$cls+H.ia(a,1,b)},Ko:function(a,b){if(a==null)return"dynamic"
+else if(typeof a==="object"&&a!==null&&a.constructor===Array)return H.mS(a,b)
 else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.bu(a)
-else return},ia:function(a,b){var z,y,x,w,v,u
+else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
+else return b.call$1(a)
+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
 else z.vM=z.vM+", "
 v=a[y]
 if(v!=null)w=!1
-u=H.Ko(v)
-u=typeof u==="string"?u:u
+u=H.Ko(v,c)
+u=typeof u==="string"?u:H.d(u)
 z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},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)},Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+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},RB:function(a,b,c,d){var z,y
@@ -9188,7 +8899,7 @@
 v=H.ml(w,z,null)
 if(typeof x=="function")if(e!=null)x=H.ml(x,null,e)
 else x=d!=null?H.ml(x,null,H.IM(d,c)):H.ml(x,null,null)
-return H.Ly(v,x)},XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},jH:function(a){return a==null||a.builtin$cls==="a"||a.builtin$cls==="c8"},Gq:function(a,b){var z,y
+return H.Ly(v,x)},IG:function(a,b,c){return H.ml(a,b,H.IM(b,c))},jH:function(a){return a==null||a.builtin$cls==="a"||a.builtin$cls==="c8"},Gq:function(a,b){var z,y
 if(a==null)return H.jH(b)
 if(b==null)return!0
 z=H.oX(a)
@@ -9206,8 +8917,8 @@
 x=y?a[0]:a
 w=typeof b==="object"&&b!==null&&b.constructor===Array
 v=w?b[0]:b
-if(!("$is"+H.Ko(v) in x))return!1
-u=v!==x?x["$as"+H.Ko(v)]:null
+if(!("$is"+H.d(H.Ko(v,null)) in x))return!1
+u=v!==x?x["$as"+H.d(H.Ko(v,null))]:null
 if(!y&&u==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
@@ -9256,60 +8967,68 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(l=0;m<q;++l,++m){o=u[l]
 n=u[m]
-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)},Ph:function(a){return a.constructor.name},f4:function(a){return H.xb(a)},vK:function(a){return H.xb(a)},mv:function(a){var z=H.xb(a)
-if(z==="BeforeUnloadEvent")return"Event"
-if(z==="DataTransfer")return"Clipboard"
-if(z==="GeoGeolocation")return"Geolocation"
-if(z==="WorkerMessageEvent")return"MessageEvent"
-if(z==="XMLDocument")return"Document"
-return z},Tx:function(a){var z=H.xb(a)
-if(z==="Document"){if(!!a.xmlVersion)return"Document"
-return"HTMLDocument"}if(z==="BeforeUnloadEvent")return"Event"
-if(z==="DataTransfer")return"Clipboard"
-if(z==="HTMLDDElement")return"HTMLElement"
-if(z==="HTMLDTElement")return"HTMLElement"
-if(z==="HTMLPhraseElement")return"HTMLElement"
-if(z==="Position")return"Geoposition"
-if(z==="Object")if(window.DataView&&a instanceof window.DataView)return"DataView"
-return z},xb:function(a){var z,y,x,w
-if(a==null)return"Null"
-z=a.constructor
-if(typeof z==="function"){y=z.builtin$cls
-if(y!=null)return y
-y=z.name
-if(typeof y==="string")x=y!==""&&y!=="Object"&&y!=="Function.prototype"
-else x=!1
-if(x)return y}w=Object.prototype.toString.call(a)
-return w.substring(8,w.length-1)},YE:function(a,b){if(!!/^HTML[A-Z].*Element$/.test(b)){if(Object.prototype.toString.call(a)==="[object Object]")return
-return"HTMLElement"}return},VP:function(){var z=H.IG()
-if(typeof dartExperimentalFixupGetTag=="function")return H.I8(dartExperimentalFixupGetTag,z)
-return z},IG:function(){if(typeof navigator!=="object")return H.qA
-var z=navigator.userAgent
-if(z.indexOf("Chrome")!==-1||z.indexOf("DumpRenderTree")!==-1)return H.qA
-else if(z.indexOf("Firefox")!==-1)return H.Bi
-else if(z.indexOf("Trident/")!==-1)return H.tu
-else if(z.indexOf("Opera")!==-1)return H.D3
-else if(z.indexOf("AppleWebKit")!==-1)return H.nY
-else return H.DA},I8:function(a,b){return new H.Vs(a((function(invoke, closure){return function(arg){ return invoke(closure, arg); };})(H.dq.call$2, b)))},jm:function(a,b){return a.call$1(b)},uc:function(a){return"Instance of "+$.nn().call$1(a)},bw:function(a){return H.eQ(a)},iw:function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},JC:function(a,b){var z=init.interceptorsByTag
-return a.call(z,b)?z[b]:null},Px:function(a){var z,y,x,w,v
-z=Object.prototype.hasOwnProperty
-y=$.nn().call$1(a)
-x=H.JC(z,y)
-if(x==null){w=H.YE(a,y)
-if(w!=null)x=H.JC(z,w)}if(x==null)return
-v=x.prototype
-if(init.leafTags[y]===true)return H.Va(v)
-else return J.Qu(v,Object.getPrototypeOf(a),null,null)},Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},VF:function(a,b,c){var z=b.prototype
+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)},uc:function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},bw: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.call$1(a)
+y=$.nw[z]
+if(y!=null){Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+return y.i}x=$.vv[z]
+if(x!=null)return x
+w=init.interceptorsByTag[z]
+if(w==null){z=$.TX.call$2(a,z)
+if(z!=null){y=$.nw[z]
+if(y!=null){Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+return y.i}x=$.vv[z]
+if(x!=null)return x
+w=init.interceptorsByTag[z]}}if(w==null)return
+x=w.prototype
+v=z[0]
+if(v==="!"){y=H.Va(x)
+$.nw[z]=y
+Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+return y.i}if(v==="~"){$.vv[z]=x
+return x}if(v==="-"){u=H.Va(x)
+Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
+return u.i}if(v==="+")return H.Lc(a,x)
+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)},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},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)},XD:function(){var z,y,x,w,v,u,t
+else return J.Qu(z,c,null,null)},XD:function(){if(!0===$.Bv)return
 $.Bv=!0
-if(typeof window!="undefined"){z=window
-y=init.interceptorsByTag
-x=Object.getOwnPropertyNames(y)
-for(w=0;w<x.length;++w){v=x[w]
-if(typeof z[v]=="function"){u=z[v].prototype
-if(u!=null){t=H.VF(v,y[v],u)
-if(t!=null)Object.defineProperty(u, init.dispatchPropertyName, {value: t, enumerable: false, writable: true, configurable: true})}}}}},f7:function(a){var z=a.gF4()
+H.Z1()},Z1:function(){var z,y,x,w,v,u,t
+$.nw=Object.create(null)
+$.vv=Object.create(null)
+H.kO()
+z=init.interceptorsByTag
+y=Object.getOwnPropertyNames(z)
+if(typeof window!="undefined"){window
+for(x=0;x<y.length;++x){w=y[x]
+v=$.x7.call$1(w)
+if(v!=null){u=H.VF(w,z[w],v)
+if(u!=null)Object.defineProperty(v, init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})}}}for(x=0;x<y.length;++x){w=y[x]
+if(/^[A-Za-z_]/.test(w)){t=z[w]
+z["!"+w]=t
+z["~"+w]=t
+z["-"+w]=t
+z["+"+w]=t
+z["*"+w]=t}}},kO:function(){var z,y,x,w,v,u,t
+z=C.HX()
+z=H.ud(C.Mc,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.Px,H.ud(C.dE,H.ud(C.dK(C.Mo),z))))))
+if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
+if(typeof y=="function")y=[y]
+if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
+if(typeof w=="function")z=w(z)||z}}v=z.getTag
+u=z.getUnknownTag
+t=z.prototypeForTag
+$.NF=new H.dC(v)
+$.TX=new H.wN(u)
+$.x7=new H.VX(t)},ud:function(a,b){return a(b)||b},f7:function(a){var z=a.goX()
 z.lastIndex=0
 return z},ZT:function(a,b){var z,y,x,w,v,u
 z=P.A(null,P.Od)
@@ -9321,11 +9040,12 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},m2:function(a,b,c){var z
+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.rY(b)
 if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
-return b.Ej.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},ys:function(a,b,c){var z,y,x,w
+y=b.SQ
+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
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
@@ -9342,33 +9062,32 @@
 gor:function(a){return!J.xC(this.gB(this),0)},
 "+isNotEmpty":0,
 bu:function(a){return P.vW(this)},
-Ix:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.Ix()},
+q3:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
+u:function(a,b,c){return this.q3()},
 "+[]=:2:0":0,
-to:function(a,b){return this.Ix()},
-Rz:function(a,b){return this.Ix()},
-$isZ0:true},LP:{"":"oH;B>,eZ,tc",
+Rz:function(a,b){return this.q3()},
+$isL8:true},LP:{"":"oH;B>,il,js",
 PF:function(a){var z=this.gUQ(this)
-return z.Vr(z,new H.QS(this,a))},
+return z.Vr(z,new H.c2(this,a))},
 "+containsValue:1:0":0,
 x4:function(a){if(typeof a!=="string")return!1
 if(a==="__proto__")return!1
-return this.eZ.hasOwnProperty(a)},
+return this.il.hasOwnProperty(a)},
 "+containsKey:1:0":0,
 t:function(a,b){if(typeof b!=="string")return
 if(!this.x4(b))return
-return this.eZ[b]},
+return this.il[b]},
 "+[]:1:0":0,
-aN:function(a,b){J.kH(this.tc,new H.WT(this,b))},
+aN:function(a,b){J.kH(this.js,new H.WT(this,b))},
 gvc:function(a){var z=new H.XR(this)
-H.VM(z,[H.ip(this,"LP",0)])
+H.VM(z,[H.W8(this,"LP",0)])
 return z},
 "+keys":0,
-gUQ:function(a){return J.kl(this.tc,new H.p8(this))},
+gUQ:function(a){return J.C0(this.js,new H.p8(this))},
 "+values":0,
 $asoH:null,
-$asZ0:null,
-$isyN:true},QS:{"":"Tp;a,b",
+$asL8:null,
+$isqC:true},c2:{"":"Tp;a,b",
 call$1:function(a){return J.xC(a,this.b)},
 "+call:1:0":0,
 $isEH:true,
@@ -9385,54 +9104,56 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},XR:{"":"mW;Y3",
-gA:function(a){return J.GP(this.Y3.tc)},
+$is_Dv:true},XR:{"":"mW;Nt",
+gA:function(a){return J.GP(this.Nt.js)},
 $asmW:null,
-$ascX:null},LI:{"":"a;lK,cC,xI,rq,FX,Nc",
+$ascX:null},LI:{"":"a;t5,Qp,GF,FQ,md,mG",
 gWa:function(){var z,y,x
-z=this.lK
+z=this.t5
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$iswv)return z
 y=$.bx()
 x=y.t(y,z)
 if(x!=null){y=J.uH(x,":")
 if(0>=y.length)throw H.e(y,0)
-z=y[0]}this.lK=new H.GD(z)
-return this.lK},
-glT:function(){return this.xI===1},
-ghB:function(){return this.xI===2},
+z=y[0]}this.t5=new H.GD(z)
+return this.t5},
+glT:function(){return this.GF===1},
+ghB:function(){return this.GF===2},
 gnd:function(){var z,y,x,w
-if(this.xI===1)return C.xD
-z=this.rq
-y=z.length-this.FX.length
+if(this.GF===1)return C.xD
+z=this.FQ
+y=z.length-this.md.length
 if(y===0)return C.xD
 x=[]
 for(w=0;w<y;++w){if(w>=z.length)throw H.e(z,w)
 x.push(z[w])}return H.m9(x)},
 gVm:function(){var z,y,x,w,v,u,t,s
-if(this.xI!==0)return H.B7([],P.L5(null,null,null,null,null))
-z=this.FX
+if(this.GF!==0){z=H.B7([],P.L5(null,null,null,null,null))
+H.VM(z,[P.wv,null])
+return z}z=this.md
 y=z.length
-x=this.rq
+x=this.FQ
 w=x.length-y
-if(y===0)return H.B7([],P.L5(null,null,null,null,null))
-v=P.L5(null,null,null,P.wv,null)
+if(y===0){z=H.B7([],P.L5(null,null,null,null,null))
+H.VM(z,[P.wv,null])
+return z}v=P.L5(null,null,null,P.wv,null)
 for(u=0;u<y;++u){if(u>=z.length)throw H.e(z,u)
 t=z[u]
 s=w+u
 if(s<0||s>=x.length)throw H.e(x,s)
 v.u(v,new H.GD(t),x[s])}return v},
-ZU:function(a){var z,y,x,w,v,u
+Yd:function(a){var z,y,x,w,v,u
 z=J.x(a)
-y=this.cC
+y=this.Qp
 x=$.Dq.indexOf(y)!==-1
 if(x){w=a===z?null:z
 v=z
 z=w}else{v=a
 z=null}u=v[y]
-if(typeof u==="function"){if(!("$reflectable" in u))H.Hz(J.cs(this.gWa()))
+if(typeof u==="function"){if(!("$reflectable" in u))H.Hz(J.Z0(this.gWa()))
 return new H.A2(u,x,z)}else return new H.F3(z)},
-static:{"":"Em,Le,De",}},A2:{"":"a;mr,eK,Ot",
+static:{"":"W2,Le,De",}},A2:{"":"a;mr,eK,Ot",
 gpf:function(){return!1},
 Bj:function(a,b){var z,y
 if(!this.eK){if(typeof b!=="object"||b===null||b.constructor!==Array)b=P.F(b,!0,null)
@@ -9441,7 +9162,6 @@
 z=this.Ot
 z=z!=null?z:a
 b=y}return this.mr.apply(z,b)}},F3:{"":"a;e0?",
-pG:function(){return this.e0.call$0()},
 gpf:function(){return!0},
 Bj:function(a,b){var z=this.e0
 return J.jf(z==null?a:z,b)}},u8:{"":"Tp;b",
@@ -9462,20 +9182,20 @@
 z.a=z.a+1},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},Zr:{"":"a;bT,rq,Xs,Fa,Ga,EP",
+$is_bh:true},Zr:{"":"a;i9,FQ,Vv,yB,Sp,lv",
 qS:function(a){var z,y,x
-z=new RegExp(this.bT).exec(a)
+z=new RegExp(this.i9).exec(a)
 if(z==null)return
 y={}
-x=this.rq
+x=this.FQ
 if(x!==-1)y.arguments=z[x+1]
-x=this.Xs
+x=this.Vv
 if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Fa
+x=this.yB
 if(x!==-1)y.expr=z[x+1]
-x=this.Ga
+x=this.Sp
 if(x!==-1)y.method=z[x+1]
-x=this.EP
+x=this.lv
 if(x!==-1)y.receiver=z[x+1]
 return y},
 static:{"":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",cM:function(a){var z,y,x,w,v,u
@@ -9526,26 +9246,26 @@
   } catch (e) {
     return e.message;
   }
-}()}}},W0:{"":"Ge;V7,Ga",
-bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.V7)
+}()}}},ZQ:{"":"Ge;Zf,Sp",
+bu:function(a){var z=this.Sp
+if(z==null)return"NullError: "+H.d(this.Zf)
 return"NullError: Cannot call \""+H.d(z)+"\" on null"},
 $ismp:true,
-$isGe:true},az:{"":"Ge;V7,Ga,EP",
+$isGe:true},az:{"":"Ge;Zf,Sp,lv",
 bu:function(a){var z,y
-z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.V7)
-y=this.EP
-if(y==null)return"NoSuchMethodError: Cannot call \""+z+"\" ("+H.d(this.V7)+")"
-return"NoSuchMethodError: Cannot call \""+z+"\" on \""+y+"\" ("+H.d(this.V7)+")"},
+z=this.Sp
+if(z==null)return"NoSuchMethodError: "+H.d(this.Zf)
+y=this.lv
+if(y==null)return"NoSuchMethodError: Cannot call \""+z+"\" ("+H.d(this.Zf)+")"
+return"NoSuchMethodError: Cannot call \""+z+"\" on \""+y+"\" ("+H.d(this.Zf)+")"},
 $ismp:true,
 $isGe:true,
 static:{T3:function(a,b){var z,y
 z=b==null
 y=z?null:b.method
 z=z?null:b.receiver
-return new H.az(a,y,z)}}},vV:{"":"Ge;V7",
-bu:function(a){var z=this.V7
+return new H.az(a,y,z)}}},vV:{"":"Ge;Zf",
+bu:function(a){var z=this.Zf
 return C.xB.gl0(z)?"Error":"Error: "+z}},Hk:{"":"Tp;a",
 call$1:function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
@@ -9553,14 +9273,14 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},XO:{"":"a;lA,ui",
+$is_Dv:true},XO:{"":"a;MP,bQ",
 bu:function(a){var z,y
-z=this.ui
+z=this.bQ
 if(z!=null)return z
-z=this.lA
+z=this.MP
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
-this.ui=z
+this.bQ=z
 return z}},dr:{"":"Tp;a",
 call$0:function(){return this.a.call$0()},
 "+call:0:0":0,
@@ -9584,73 +9304,82 @@
 $is_X0:true},Tp:{"":"a;",
 bu:function(a){return"Closure"},
 $isTp:true,
-$isEH:true},v:{"":"Tp;nw<,jm<,EP,RA>",
+$isEH:true},v:{"":"Tp;wc<,nn<,lv,Pp>",
 n:function(a,b){var z
 if(b==null)return!1
 if(this===b)return!0
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},
-gEo:function(a){var z,y
-z=this.EP
-if(z==null)y=H.eQ(this.nw)
-else y=typeof z!=="object"?J.le(z):H.eQ(z)
-return(y^H.eQ(this.jm))>>>0},
+return this.wc===b.wc&&this.nn===b.nn&&this.lv===b.lv},
+giO:function(a){var z,y
+z=this.lv
+if(z==null)y=H.eQ(this.wc)
+else y=typeof z!=="object"?J.v1(z):H.eQ(z)
+return(y^H.eQ(this.nn))>>>0},
 $isv:true},Z3:{"":"a;Jy"},D2:{"":"a;Jy"},GT:{"":"a;oc>"},Pe:{"":"Ge;G1>",
 bu:function(a){return this.G1},
 $isGe:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+a+" to incompatible type "+H.d(b))}}},Eq:{"":"Ge;G1>",
 bu:function(a){return"RuntimeError: "+this.G1},
-static:{Pa:function(a){return new H.Eq(a)}}},cu:{"":"a;LU<,ke",
+static:{Pa:function(a){return new H.Eq(a)}}},cu:{"":"a;IE<,rE",
 bu:function(a){var z,y,x
-z=this.ke
+z=this.rE
 if(z!=null)return z
-y=this.LU
+y=this.IE
 x=H.Jg(y)
 y=x==null?y:x
-this.ke=y
+this.rE=y
 return y},
-gEo:function(a){return J.le(this.LU)},
+giO:function(a){return J.v1(this.IE)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.xC(this.LU,b.LU)},
+return typeof b==="object"&&b!==null&&!!z.$iscu&&J.xC(this.IE,b.IE)},
 $iscu:true,
-$isuq:true},Lm:{"":"a;XP<,oc>,M7"},Vs:{"":"Tp;a",
+$isuq:true},Lm:{"":"a;h7<,oc>,kU>"},dC:{"":"Tp;a",
 call$1:function(a){return this.a(a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},VR:{"":"a;Ej,Ii,Ua",
-gF4:function(){var z=this.Ii
+$is_Dv:true},wN:{"":"Tp;b",
+call$2:function(a,b){return this.b(a,b)},
+"+call:2:0":0,
+$isEH:true,
+$is_bh:true},VX:{"":"Tp;c",
+call$1:function(a){return this.c(a)},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},VR:{"":"a;SQ,h2,fX",
+goX:function(){var z=this.h2
 if(z!=null)return z
-z=this.Ej
+z=this.SQ
 z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
-this.Ii=z
+this.h2=z
 return z},
-gAT:function(){var z=this.Ua
+gXP:function(){var z=this.fX
 if(z!=null)return z
-z=this.Ej
+z=this.SQ
 z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
-this.Ua=z
+this.fX=z
 return z},
 ej:function(a){var z
 if(typeof a!=="string")H.vh(new P.AT(a))
-z=this.Ej.exec(a)
+z=this.SQ.exec(a)
 if(z==null)return
 return H.yx(this,z)},
 zD:function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},
+return this.SQ.test(a)},
 dd:function(a,b){if(typeof b!=="string")H.vh(new P.AT(b))
 return new H.KW(this,b)},
-yk:function(a,b){var z,y
-z=this.gF4()
+oG:function(a,b){var z,y
+z=this.goX()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
 return H.yx(this,y)},
-Bh:function(a,b){var z,y,x,w
-z=this.gAT()
+Nd:function(a,b){var z,y,x,w
+z=this.gXP()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
@@ -9665,7 +9394,7 @@
 if(typeof z!=="number")throw H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},
+return this.Nd(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 static:{v4:function(a,b,c,d){var z,y,x,w,v
@@ -9675,65 +9404,65 @@
 w=(function() {try {return new RegExp(a, z + y + x);} catch (e) {return e;}})()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},EK:{"":"a;zO,QK",
-t:function(a,b){var z=this.QK
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},EK:{"":"a;zO,oH",
+t:function(a,b){var z=this.oH
 if(b>>>0!==b||b>=z.length)throw H.e(z,b)
 return z[b]},
 "+[]:1:0":0,
-VO:function(a,b){},
+kx:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
-z.VO(a,b)
-return z}}},KW:{"":"mW;Gf,rv",
-gA:function(a){return new H.Pb(this.Gf,this.rv,null)},
+z.kx(a,b)
+return z}}},KW:{"":"mW;td,BZ",
+gA:function(a){return new H.Pb(this.td,this.BZ,null)},
 $asmW:function(){return[P.Od]},
-$ascX:function(){return[P.Od]}},Pb:{"":"a;VV,rv,Wh",
-gl:function(){return this.Wh},
+$ascX:function(){return[P.Od]}},Pb:{"":"a;EW,BZ,Jz",
+gl:function(){return this.Jz},
 "+current":0,
 G:function(){var z,y,x
-if(this.rv==null)return!1
-z=this.Wh
-if(z!=null){z=z.QK
+if(this.BZ==null)return!1
+z=this.Jz
+if(z!=null){z=z.oH
 y=z.index
 if(0>=z.length)throw H.e(z,0)
 z=J.q8(z[0])
 if(typeof z!=="number")throw H.s(z)
 x=y+z
-if(this.Wh.QK.index===x)++x}else x=0
-this.Wh=this.VV.yk(this.rv,x)
-if(this.Wh==null){this.rv=null
+if(this.Jz.oH.index===x)++x}else x=0
+this.Jz=this.EW.oG(this.BZ,x)
+if(this.Jz==null){this.BZ=null
 return!1}return!0}},tQ:{"":"a;M,J9,zO",
-t:function(a,b){if(!J.xC(b,0))H.vh(new P.bJ("value "+H.d(b)))
+t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
 "+[]:1:0":0,
-$isOd:true}}],["app_bootstrap","index.html_bootstrap.dart",,E,{E2:function(){$.x2=["package:observatory/src/observatory_elements/observatory_element.dart","package:observatory/src/observatory_elements/class_view.dart","package:observatory/src/observatory_elements/disassembly_entry.dart","package:observatory/src/observatory_elements/code_view.dart","package:observatory/src/observatory_elements/collapsible_content.dart","package:observatory/src/observatory_elements/error_view.dart","package:observatory/src/observatory_elements/field_view.dart","package:observatory/src/observatory_elements/function_view.dart","package:observatory/src/observatory_elements/isolate_summary.dart","package:observatory/src/observatory_elements/isolate_list.dart","package:observatory/src/observatory_elements/json_view.dart","package:observatory/src/observatory_elements/library_view.dart","package:observatory/src/observatory_elements/stack_trace.dart","package:observatory/src/observatory_elements/message_viewer.dart","package:observatory/src/observatory_elements/navigation_bar.dart","package:observatory/src/observatory_elements/response_viewer.dart","package:observatory/src/observatory_elements/observatory_application.dart","index.html.0.dart"]
+$isOd:true}}],["app_bootstrap","index.html_bootstrap.dart",,E,{E2:function(){$.x2=["package:observatory/src/observatory_elements/observatory_element.dart","package:observatory/src/observatory_elements/error_view.dart","package:observatory/src/observatory_elements/class_view.dart","package:observatory/src/observatory_elements/disassembly_entry.dart","package:observatory/src/observatory_elements/code_view.dart","package:observatory/src/observatory_elements/collapsible_content.dart","package:observatory/src/observatory_elements/field_view.dart","package:observatory/src/observatory_elements/function_view.dart","package:observatory/src/observatory_elements/isolate_summary.dart","package:observatory/src/observatory_elements/isolate_list.dart","package:observatory/src/observatory_elements/json_view.dart","package:observatory/src/observatory_elements/library_view.dart","package:observatory/src/observatory_elements/stack_trace.dart","package:observatory/src/observatory_elements/message_viewer.dart","package:observatory/src/observatory_elements/navigation_bar.dart","package:observatory/src/observatory_elements/response_viewer.dart","package:observatory/src/observatory_elements/observatory_application.dart","index.html.0.dart"]
 $.uP=!1
-A.Ok()}},1],["class_view_element","package:observatory/src/observatory_elements/class_view.dart",,Z,{aC:{"":["Vf;lb%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:function(a){return a.lb
+A.Ok()}},1],["class_view_element","package:observatory/src/observatory_elements/class_view.dart",,Z,{aC:{"":["Vf;FJ%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gRu:function(a){return a.FJ
 "32,33,34"},
 "+cls":1,
-sRu:function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)
+sRu:function(a,b){a.FJ=this.pD(a,C.XA,a.FJ,b)
 "35,28,32,33"},
 "+cls=":1,
 "@":function(){return[C.aQ]},
 static:{zg:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
-C.ka.ZL(a)
-C.ka.XI(a)
+C.kk.ZL(a)
+C.kk.FH(a)
 return a
-"9"},"+new ClassViewElement$created:0:0":1}},"+ClassViewElement": [],Vf:{"":"uL+Pi;",$iswn:true}}],["code_view_element","package:observatory/src/observatory_elements/code_view.dart",,F,{Be:{"":["Vc;Zw%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"9"},"+new ClassViewElement$created:0:0":1}},"+ClassViewElement": [36],Vf:{"":"uL+Pi;",$isd3:true}}],["code_view_element","package:observatory/src/observatory_elements/code_view.dart",,F,{Be:{"":["tu;Zw%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gtT:function(a){return a.Zw
 "32,33,34"},
 "+code":1,
-stT:function(a,b){a.Zw=this.ct(a,C.b1,a.Zw,b)
+stT:function(a,b){a.Zw=this.pD(a,C.b1,a.Zw,b)
 "35,28,32,33"},
 "+code=":1,
 grK:function(a){var z=a.Zw
@@ -9744,79 +9473,77 @@
 "@":function(){return[C.xW]},
 static:{Fe:function(a){var z,y,x,w,v,u
 z=H.B7([],P.L5(null,null,null,null,null))
-z=B.tB(z)
-y=$.R8()
+z=R.Jk(z)
+y=$.Nd()
 x=P.Py(null,null,null,J.O,W.I0)
 w=J.O
 v=W.cv
-u=new B.br(P.Py(null,null,null,w,v),null,null)
+u=new V.br(P.Py(null,null,null,w,v),null,null)
 H.VM(u,[w,v])
 a.Zw=z
 a.Ye=y
 a.mT=x
 a.KM=u
 C.YD.ZL(a)
-C.YD.XI(a)
+C.YD.FH(a)
 return a
-"10"},"+new CodeViewElement$created:0:0":1}},"+CodeViewElement": [],Vc:{"":"uL+Pi;",$iswn:true}}],["collapsible_content_element","package:observatory/src/observatory_elements/collapsible_content.dart",,R,{i6:{"":["WZ;Xf%-,VA%-,El%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"10"},"+new CodeViewElement$created:0:0":1}},"+CodeViewElement": [37],tu:{"":"uL+Pi;",$isd3:true}}],["collapsible_content_element","package:observatory/src/observatory_elements/collapsible_content.dart",,R,{i6:{"":["Vc;Xf%-,VA%-,P2%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gAQ:function(a){return a.Xf
-"8,33,36"},
+"8,33,38"},
 "+iconClass":1,
-sAQ:function(a,b){a.Xf=this.ct(a,C.tx,a.Xf,b)
+sAQ:function(a,b){a.Xf=this.pD(a,C.Di,a.Xf,b)
 "35,28,8,33"},
 "+iconClass=":1,
-gvu:function(a){return a.VA
-"8,33,36"},
+gai:function(a){return a.VA
+"8,33,38"},
 "+displayValue":1,
-svu:function(a,b){a.VA=this.ct(a,C.Jw,a.VA,b)
+sai:function(a,b){a.VA=this.pD(a,C.Jw,a.VA,b)
 "35,28,8,33"},
 "+displayValue=":1,
-gxj:function(a){return a.El
-"37"},
+gxj:function(a){return a.P2
+"39"},
 "+collapsed":1,
-sxj:function(a,b){a.El=b
+sxj:function(a,b){a.P2=b
 this.dR(a)
-"35,38,37"},
+"35,40,39"},
 "+collapsed=":1,
 i4:function(a){Z.uL.prototype.i4.call(this,a)
 this.dR(a)
 "35"},
 "+enteredView:0:0":1,
-rS:function(a,b,c,d){a.El=a.El!==!0
+rS:function(a,b,c,d){a.P2=a.P2!==!0
 this.dR(a)
 this.dR(a)
-"35,39,40,41,35,42,43"},
+"35,41,42,43,35,44,45"},
 "+toggleDisplay:3:0":1,
 dR:function(a){var z,y
-z=a.El
+z=a.P2
 y=a.Xf
-if(z===!0){a.Xf=this.ct(a,C.tx,y,"glyphicon glyphicon-chevron-down")
-a.VA=this.ct(a,C.Jw,a.VA,"none")}else{a.Xf=this.ct(a,C.tx,y,"glyphicon glyphicon-chevron-up")
-a.VA=this.ct(a,C.Jw,a.VA,"block")}"35"},
+if(z===!0){a.Xf=this.pD(a,C.Di,y,"glyphicon glyphicon-chevron-down")
+a.VA=this.pD(a,C.Jw,a.VA,"none")}else{a.Xf=this.pD(a,C.Di,y,"glyphicon glyphicon-chevron-up")
+a.VA=this.pD(a,C.Jw,a.VA,"block")}"35"},
 "+_refresh:0:0":1,
 "@":function(){return[C.Gu]},
-static:{"":"AL<-,DI<-",IT:function(a){var z,y,x,w,v
-z=$.R8()
+static:{"":"Vl<-,DI<-",IT:function(a){var z,y,x,w,v
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Xf="glyphicon glyphicon-chevron-down"
 a.VA="none"
-a.El=!0
+a.P2=!0
 a.Ye=z
 a.mT=y
 a.KM=v
 C.j8.ZL(a)
-C.j8.XI(a)
+C.j8.FH(a)
 return a
-"11"},"+new CollapsibleContentElement$created:0:0":1}},"+CollapsibleContentElement": [],WZ:{"":"uL+Pi;",$iswn:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{G9:function(){var z,y
-if($.LX()==null)return!0
-z=$.LX()
-y=z.t(z,"CustomElements")
-if(y==null)return"register" in document
-return J.xC(J.UQ(y,"ready"),!0)},wJ:{"":"Tp;",
+"11"},"+new CollapsibleContentElement$created:0:0":1}},"+CollapsibleContentElement": [46],Vc:{"":"uL+Pi;",$isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{G9:function(){if($.LX()==null)return!0
+var z=J.UQ($.LX(),"CustomElements")
+if(z==null)return"register" in document
+return J.xC(J.UQ(z,"ready"),!0)},zO:{"":"Tp;",
 call$0:function(){if(B.G9())return P.Ab(null,null)
 var z=new W.RO(new W.Jn(document).WK,"WebComponentsReady",!1)
 H.VM(z,[null])
@@ -9830,20 +9557,18 @@
 if(c>=a.length)return-1
 if(c<0)c=0
 for(z=c;z<d;++z){if(z>>>0!==z||z>=a.length)throw H.e(a,z)
-if(J.xC(a[z],b))return z}return-1},nX:function(a,b,c){var z,y
+if(J.xC(a[z],b))return z}return-1},hH:function(a,b,c){var z,y
 if(typeof c!=="number")throw 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)throw H.e(a,y)
 if(J.xC(a[y],b))return y}return-1},bQ:function(a,b){var z
-for(z=new H.wi(a,a.length,0,null),H.VM(z,[H.ip(a,"Q",0)]);z.G();)b.call$1(z.M4)},Ck:function(a,b){var z
-for(z=new H.wi(a,a.length,0,null),H.VM(z,[H.ip(a,"Q",0)]);z.G();)if(b.call$1(z.M4)===!0)return!0
+for(z=new H.a7(a,a.length,0,null),H.VM(z,[H.W8(a,"Q",0)]);z.G();)b.call$1(z.mD)},Ck:function(a,b){var z
+for(z=new H.a7(a,a.length,0,null),H.VM(z,[H.W8(a,"Q",0)]);z.G();)if(b.call$1(z.mD)===!0)return!0
 return!1},n3:function(a,b,c){var z
-for(z=new H.wi(a,a.length,0,null),H.VM(z,[H.ip(a,"Q",0)]);z.G();)b=c.call$2(b,z.M4)
-return b},nE:function(a,b,c){var z,y
-for(z=new H.wi(a,a.length,0,null),H.VM(z,[H.ip(a,"Q",0)]);z.G();){y=z.M4
-if(b.call$1(y)===!0)return y}return c.call$0()},mx:function(a,b,c){var z,y,x
+for(z=new H.a7(a,a.length,0,null),H.VM(z,[H.W8(a,"Q",0)]);z.G();)b=c.call$2(b,z.mD)
+return b},mx:function(a,b,c){var z,y,x
 for(y=0;y<$.RM().length;++y){x=$.RM()
 if(y>=x.length)throw H.e(x,y)
 if(x[y]===a)return H.d(b)+"..."+H.d(c)}z=P.p9("")
@@ -9852,7 +9577,7 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)throw H.e(x,0)
-x.pop()}return z.gvM()},ED:function(a,b,c){return H.nX(a,b,a.length-1)},S6:function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},Wv:function(a,b,c){return H.hH(a,b,a.length-1)},S6: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))},qG:function(a,b,c,d,e){var z,y
@@ -9863,24 +9588,27 @@
 y=J.Wx(e)
 if(y.C(e,0))throw H.b(new P.AT(e))
 if(J.xZ(y.g(e,z),J.q8(d)))throw H.b(P.w("Not enough elements"))
-H.Zi(d,e,a,b,z)},m5:function(a,b,c){var z,y,x,w,v
+H.Zi(d,e,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=c.length
-C.Nm.sB(a,a.length+y)
-z=z.g(b,y)
-x=a.length
+y=J.U6(c)
+x=y.gB(c)
+w=a.length
+if(typeof x!=="number")throw H.s(x)
+C.Nm.sB(a,w+x)
+z=z.g(b,x)
+w=a.length
 if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,z,x,a,b)
-for(z=new H.wi(c,c.length,0,null),H.VM(z,[H.ip(c,"Q",0)]);z.G();b=v){w=z.M4
-v=J.WB(b,1)
-C.Nm.u(a,b,w)}},LJ:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+H.qG(a,z,w,a,b)
+for(z=y.gA(c);z.G();b=u){v=z.mD
+u=J.WB(b,1)
+C.Nm.u(a,b,v)}},LJ: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)},aL:{"":"mW;",
-gA:function(a){var z=new H.wi(this,this.gB(this),0,null)
-H.VM(z,[H.ip(this,"aL",0)])
+gA:function(a){var z=new H.a7(this,this.gB(this),0,null)
+H.VM(z,[H.W8(this,"aL",0)])
 return z},
 aN:function(a,b){var z,y
 z=this.gB(this)
@@ -9890,8 +9618,6 @@
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.xC(this.gB(this),0)},
 "+isEmpty":0,
-gFV:function(a){if(J.xC(this.gB(this),0))throw H.b(new P.lj("No elements"))
-return this.Zv(this,0)},
 grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(this,J.xH(this.gB(this),1))},
 tg:function(a,b){var z,y
@@ -9906,14 +9632,6 @@
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(this,y))===!0)return!0
 if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
-DX:function(a,b,c){var z,y,x
-z=this.gB(this)
-if(typeof z!=="number")throw H.s(z)
-y=0
-for(;y<z;++y){x=this.Zv(this,y)
-if(b.call$1(x)===!0)return x
-if(z!==this.gB(this))throw H.b(P.a4(this))}return c.call$0()},
-XG:function(a,b){return this.DX(a,b,null)},
 zV:function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -9945,11 +9663,12 @@
 x=0
 for(;x<z;++x){y=c.call$2(y,this.Zv(this,x))
 if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
+eR:function(a,b){return H.j5(this,b,null,null)},
 tt:function(a,b){var z,y,x
-if(b){z=P.A(null,H.ip(this,"aL",0))
-H.VM(z,[H.ip(this,"aL",0)])
-C.Nm.sB(z,this.gB(this))}else{z=P.A(this.gB(this),H.ip(this,"aL",0))
-H.VM(z,[H.ip(this,"aL",0)])}y=0
+if(b){z=P.A(null,H.W8(this,"aL",0))
+H.VM(z,[H.W8(this,"aL",0)])
+C.Nm.sB(z,this.gB(this))}else{z=P.A(this.gB(this),H.W8(this,"aL",0))
+H.VM(z,[H.W8(this,"aL",0)])}y=0
 while(!0){x=this.gB(this)
 if(typeof x!=="number")throw H.s(x)
 if(!(y<x))break
@@ -9959,172 +9678,211 @@
 br:function(a){return this.tt(a,!0)},
 $asmW:null,
 $ascX:null,
-$isyN:true},bX:{"":"aL;V8,aZ,r8",
-gzf:function(){var z,y
-z=J.q8(this.V8)
-y=this.r8
+$isqC:true},nH:{"":"aL;Kw,Bz,n1",
+gX1:function(){var z,y
+z=J.q8(this.Kw)
+y=this.n1
 if(y==null||J.xZ(y,z))return z
 return y},
-gBU:function(){var z,y
-z=J.q8(this.V8)
-y=this.aZ
+gtO:function(){var z,y
+z=J.q8(this.Kw)
+y=this.Bz
 if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
-z=J.q8(this.V8)
-y=this.aZ
+z=J.q8(this.Kw)
+y=this.Bz
 if(J.J5(y,z))return 0
-x=this.r8
+x=this.n1
 if(x==null||J.J5(x,z))return J.xH(z,y)
 return J.xH(x,y)},
 "+length":0,
-Zv:function(a,b){var z=J.WB(this.gBU(),b)
-if(J.u6(b,0)||J.J5(z,this.gzf()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.V8,z)},
+Zv:function(a,b){var z=J.WB(this.gtO(),b)
+if(J.u6(b,0)||J.J5(z,this.gX1()))throw H.b(P.TE(b,0,this.gB(this)))
+return J.i4(this.Kw,z)},
+eR:function(a,b){if(b<0)throw H.b(new P.bJ("value "+b))
+return H.j5(this.Kw,J.WB(this.Bz,b),this.n1,null)},
+qZ:function(a,b){var z,y,x
+if(J.u6(b,0))throw H.b(P.N(b))
+z=this.n1
+y=this.Bz
+if(z==null)return H.j5(this.Kw,y,J.WB(y,b),null)
+else{x=J.WB(y,b)
+if(J.u6(z,x))return this
+return H.j5(this.Kw,y,x,null)}},
 Hd:function(a,b,c,d){var z,y,x
-z=this.aZ
+z=this.Bz
 y=J.Wx(z)
-if(y.C(z,0))throw H.b(new P.bJ("value "+H.d(z)))
-x=this.r8
-if(x!=null){if(J.u6(x,0))throw H.b(new P.bJ("value "+H.d(x)))
+if(y.C(z,0))throw H.b(P.N(z))
+x=this.n1
+if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
 if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
 $asaL:null,
 $ascX:null,
-static:{q9:function(a,b,c,d){var z=new H.bX(a,b,c)
+static:{j5:function(a,b,c,d){var z=new H.nH(a,b,c)
 H.VM(z,[d])
 z.Hd(a,b,c,d)
-return z}}},wi:{"":"a;V8,Vt,q5,M4",
-gl:function(){return this.M4},
+return z}}},a7:{"":"a;Kw,qn,j2,mD",
+gl:function(){return this.mD},
 "+current":0,
 G:function(){var z,y,x,w
-z=this.V8
+z=this.Kw
 y=J.U6(z)
 x=y.gB(z)
-if(!J.xC(this.Vt,x))throw H.b(P.a4(z))
-w=this.q5
+if(!J.xC(this.qn,x))throw H.b(P.a4(z))
+w=this.j2
 if(typeof x!=="number")throw H.s(x)
-if(w>=x){this.M4=null
-return!1}this.M4=y.Zv(z,w)
-this.q5=this.q5+1
-return!0}},i1:{"":"mW;V8,Wz",
-Du:function(a){return this.Wz.call$1(a)},
-gA:function(a){var z=this.V8
+if(w>=x){this.mD=null
+return!1}this.mD=y.Zv(z,w)
+this.j2=this.j2+1
+return!0}},i1:{"":"mW;Kw,ew",
+ei:function(a){return this.ew.call$1(a)},
+gA:function(a){var z=this.Kw
 z=z.gA(z)
-z=new H.MH(null,z,this.Wz)
-H.VM(z,[H.ip(this,"i1",0),H.ip(this,"i1",1)])
+z=new H.MH(null,z,this.ew)
+H.VM(z,[H.W8(this,"i1",0),H.W8(this,"i1",1)])
 return z},
-gB:function(a){var z=this.V8
+gB:function(a){var z=this.Kw
 return z.gB(z)},
 "+length":0,
-gl0:function(a){var z=this.V8
+gl0:function(a){var z=this.Kw
 return z.gl0(z)},
 "+isEmpty":0,
-gFV:function(a){var z=this.V8
-return this.Du(z.gFV(z))},
-grZ:function(a){var z=this.V8
-return this.Du(z.grZ(z))},
-Zv:function(a,b){var z=this.V8
-return this.Du(z.Zv(z,b))},
+grZ:function(a){var z=this.Kw
+return this.ei(z.grZ(z))},
+Zv:function(a,b){var z=this.Kw
+return this.ei(z.Zv(z,b))},
 $asmW:function(a,b){return[b]},
 $ascX:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){var z
-if(!!a.$isyN){z=new H.xy(a,b)
+if(!!a.$isqC){z=new H.xy(a,b)
 H.VM(z,[c,d])
 return z}z=new H.i1(a,b)
 H.VM(z,[c,d])
-return z}}},xy:{"":"i1;V8,Wz",$asi1:null,
+return z}}},xy:{"":"i1;Kw,ew",$asi1:null,
 $ascX:function(a,b){return[b]},
-$isyN:true},MH:{"":"Yl;M4,N4,Wz",
-Du:function(a){return this.Wz.call$1(a)},
-G:function(){var z=this.N4
-if(z.G()){this.M4=this.Du(z.gl())
-return!0}this.M4=null
+$isqC:true},MH:{"":"Fl;mD,RX,ew",
+ei:function(a){return this.ew.call$1(a)},
+G:function(){var z=this.RX
+if(z.G()){this.mD=this.ei(z.gl())
+return!0}this.mD=null
 return!1},
-gl:function(){return this.M4},
+gl:function(){return this.mD},
 "+current":0,
-$asYl:function(a,b){return[b]}},A8:{"":"aL;uk,Wz",
-Du:function(a){return this.Wz.call$1(a)},
-gB:function(a){return J.q8(this.uk)},
+$asFl:function(a,b){return[b]}},A8:{"":"aL;qb,ew",
+ei:function(a){return this.ew.call$1(a)},
+gB:function(a){return J.q8(this.qb)},
 "+length":0,
-Zv:function(a,b){return this.Du(J.i4(this.uk,b))},
+Zv:function(a,b){return this.ei(J.i4(this.qb,b))},
 $asaL:function(a,b){return[b]},
 $ascX:function(a,b){return[b]},
-$isyN:true},U5:{"":"mW;V8,Wz",
-Du:function(a){return this.Wz.call$1(a)},
-gA:function(a){var z=J.GP(this.V8)
-z=new H.SO(z,this.Wz)
-H.VM(z,[H.ip(this,"U5",0)])
+$isqC:true},U5:{"":"mW;Kw,ew",
+gA:function(a){var z=J.GP(this.Kw)
+z=new H.SO(z,this.ew)
+H.VM(z,[H.W8(this,"U5",0)])
 return z},
 $asmW:null,
-$ascX:null},SO:{"":"Yl;N4,Wz",
-Du:function(a){return this.Wz.call$1(a)},
-G:function(){for(var z=this.N4;z.G();)if(this.Du(z.gl())===!0)return!0
+$ascX:null},SO:{"":"Fl;RX,ew",
+ei:function(a){return this.ew.call$1(a)},
+G:function(){for(var z=this.RX;z.G();)if(this.ei(z.gl())===!0)return!0
 return!1},
-gl:function(){return this.N4.gl()},
+gl:function(){return this.RX.gl()},
 "+current":0,
-$asYl:null},zs:{"":"mW;V8,Wz",
-Du:function(a){return this.Wz.call$1(a)},
-gA:function(a){var z=J.GP(this.V8)
-z=new H.rR(z,this.Wz,C.Gw,null)
-H.VM(z,[H.ip(this,"zs",0),H.ip(this,"zs",1)])
+$asFl:null},zs:{"":"mW;Kw,ew",
+gA:function(a){var z=J.GP(this.Kw)
+z=new H.rR(z,this.ew,C.Gw,null)
+H.VM(z,[H.W8(this,"zs",0),H.W8(this,"zs",1)])
 return z},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]}},rR:{"":"a;N4,Wz,Qy,M4",
-Du:function(a){return this.Wz.call$1(a)},
-gl:function(){return this.M4},
+$ascX:function(a,b){return[b]}},rR:{"":"a;RX,ew,IO,mD",
+ei:function(a){return this.ew.call$1(a)},
+gl:function(){return this.mD},
 "+current":0,
-G:function(){if(this.Qy==null)return!1
-for(var z=this.N4;!this.Qy.G();){this.M4=null
-if(z.G()){this.Qy=null
-this.Qy=J.GP(this.Du(z.gl()))}else return!1}this.M4=this.Qy.gl()
-return!0}},Fu:{"":"a;",
+G:function(){if(this.IO==null)return!1
+for(var z=this.RX;!this.IO.G();){this.mD=null
+if(z.G()){this.IO=null
+this.IO=J.GP(this.ei(z.gl()))}else return!1}this.mD=this.IO.gl()
+return!0}},AM:{"":"mW;Kw,xZ",
+eR:function(a,b){if(b<0)throw H.b(new P.bJ("value "+b))
+return H.ke(this.Kw,this.xZ+b,H.W8(this,"AM",0))},
+gA:function(a){var z=this.Kw
+z=z.gA(z)
+z=new H.U1(z,this.xZ)
+H.VM(z,[H.W8(this,"AM",0)])
+return z},
+q1:function(a,b,c){if(this.xZ<0)throw H.b(P.C3(this.xZ))},
+$asmW:null,
+$ascX:null,
+static:{ke:function(a,b,c){var z,y
+if(!!a.$isqC){z=c
+y=new H.d5(a,b)
+H.VM(y,[z])
+y.q1(a,b,z)
+return y}return H.bk(a,b,c)},bk:function(a,b,c){var z=new H.AM(a,b)
+H.VM(z,[c])
+z.q1(a,b,c)
+return z}}},d5:{"":"AM;Kw,xZ",
+gB:function(a){var z,y
+z=this.Kw
+y=J.xH(z.gB(z),this.xZ)
+if(J.J5(y,0))return y
+return 0},
+"+length":0,
+$asAM:null,
+$ascX:null,
+$isqC:true},U1:{"":"Fl;RX,xZ",
+G:function(){var z,y
+for(z=this.RX,y=0;y<this.xZ;++y)z.G()
+this.xZ=0
+return z.G()},
+gl:function(){return this.RX.gl()},
+"+current":0,
+$asFl:null},SJ:{"":"a;",
 G:function(){return!1},
 gl:function(){return},
 "+current":0},SU:{"":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
 "+length=":0,
 h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-ght:function(a){return new J.C7(this,H.SU.prototype.h,a,"h")},
-Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))}},Ja:{"":"a;",
+Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))}},Tv:{"":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 "+[]=:2:0":0,
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
 "+length=":0,
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-ght:function(a){return new J.C7(this,H.Ja.prototype.h,a,"h")},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 $isList:true,
 $asWO:null,
-$isyN:true,
+$isqC:true,
 $iscX:true,
-$ascX:null},XC:{"":"ar+Ja;",$asar:null,$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},iK:{"":"aL;uk",
-gB:function(a){return J.q8(this.uk)},
+$ascX:null},XC:{"":"ar+Tv;",$asar:null,$asWO:null,$ascX:null,$isList:true,$isqC:true,$iscX:true},iK:{"":"aL;qb",
+gB:function(a){return J.q8(this.qb)},
 "+length":0,
 Zv:function(a,b){var z,y
-z=this.uk
+z=this.qb
 y=J.U6(z)
 return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},
 $asaL:null,
-$ascX:null},GD:{"":"a;E3>",
+$ascX:null},GD:{"":"a;hr>",
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.xC(this.E3,b.E3)},
-gEo:function(a){return 536870911&664597*J.le(this.E3)},
-bu:function(a){return"Symbol(\""+H.d(this.E3)+"\")"},
+return typeof b==="object"&&b!==null&&!!z.$isGD&&J.xC(this.hr,b.hr)},
+giO:function(a){return 536870911&664597*J.v1(this.hr)},
+bu:function(a){return"Symbol(\""+H.d(this.hr)+"\")"},
 $isGD:true,
 $iswv:true,
-static:{"":"zP",bK:function(a){var z=J.U6(a)
+static:{"":"zP",le:function(a){var z=J.U6(a)
 if(z.gl0(a)===!0)return a
 if(z.nC(a,"_"))throw H.b(new P.AT("\""+H.d(a)+"\" is a private identifier"))
-z=$.R0().Ej
+z=$.R0().SQ
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(!z.test(a))throw H.b(new P.AT("\""+H.d(a)+"\" is not an identifier or an empty String"))
 return a}}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{YC:function(a){if(a==null)return
-return new H.GD(a)},X7:function(a){return H.YC(H.d(J.cs(a))+"=")},vn:function(a){var z=J.x(a)
+return new H.GD(a)},X7:function(a){return H.YC(H.d(J.Z0(a))+"=")},vn:function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a)
-else return new H.iu(a)},nH:function(a){var z,y
+else return new H.iu(a)},jO:function(a){var z,y
 z=$.Sl()
 y=z.t(z,a)
 return H.tT(H.YC(y==null?a:y),a)},tT:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
@@ -10133,16 +9891,16 @@
 if(z!=null)return z
 y=J.U6(b)
 x=y.u8(b,"<")
-if(x!==-1){w=H.nH(y.JT(b,0,x))
-z=new H.bl(w,y.JT(b,x+1,J.xH(y.gB(b),1)),null,null,null,null,null,w.gIf())
+if(x!==-1){w=H.jO(y.JT(b,0,x))
+z=new H.bl(w,y.JT(b,x+1,J.xH(y.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,w.gIf())
 $.tY[b]=z
 return z}v=H.pL(b)
 if(v==null){u=init.functionAliases[b]
 if(u!=null){z=new H.ng(b,null,a)
 z.CM=new H.Ar(init.metadata[u],null,null,null,z)
 $.tY[b]=z
-return z}throw H.b(P.f("Cannot find class for: "+H.d(a.E3)))}y=J.x(v)
-t=typeof v==="object"&&v!==null&&!!y.$isvB?v.constructor:v
+return z}throw H.b(P.f("Cannot find class for: "+H.d(a.hr)))}y=J.x(v)
+t=typeof v==="object"&&v!==null&&!!y.$isGv?v.constructor:v
 s=t["@"]
 if(s==null){r=null
 q=null}else{r=s[""]
@@ -10160,44 +9918,48 @@
 return z},Vv:function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=J.GP(a);y.G();){x=y.gl()
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(z,x.gIf(),x)}return z},AX:function(a,b){var z,y,x,w
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(z,x.gIf(),x)}return z},Fk:function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
-for(y=J.GP(a),x=J.U6(b);y.G();){w=y.gl()
-if(w.glT()){if(x.t(b,w.gIf())!=null)continue
-z.u(z,w.gIf(),w)}}return z},OL:function(a,b){var z,y,x,w,v,u
+for(y=J.GP(a);y.G();){x=y.gl()
+if(x.gxV())z.u(z,x.gIf(),x)}return z},vE:function(a,b){var z,y,x,w,v,u
 z=P.L5(null,null,null,null,null)
-for(y=J.GP(a),x=J.U6(b);y.G();){w=y.gl()
-if(w.ghB()){v=J.cs(w.gIf())
-u=J.U6(v)
-if(x.t(b,H.YC(u.JT(v,0,J.xH(u.gB(v),1))))!=null)continue
-z.u(z,w.gIf(),w)}}return z},MJ:function(a,b){var z,y,x,w,v,u,t
+z.Ay(z,b)
+for(y=J.GP(a);y.G();){x=y.gl()
+if(x.ghB()){w=J.Z0(x.gIf())
+v=J.U6(w)
+v=z.t(z,H.YC(v.JT(w,0,J.xH(v.gB(w),1))))
+u=J.x(v)
+if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
+z.to(x.gIf(),new H.YX(x))}return z},MJ:function(a,b){var z,y,x,w,v,u,t
 z=[]
-for(y=new H.wi(a,a.length,0,null),H.VM(y,[H.ip(a,"Q",0)]);y.G();){x=y.M4
+for(y=new H.a7(a,a.length,0,null),H.VM(y,[H.W8(a,"Q",0)]);y.G();){x=y.mD
 w=$.Sl()
 v=w.t(w,x)
-z.push(H.tT(H.YC(v==null?x:v),x))}u=new H.wi(z,z.length,0,null)
-H.VM(u,[H.ip(z,"Q",0)])
+z.push(H.tT(H.YC(v==null?x:v),x))}u=new H.a7(z,z.length,0,null)
+H.VM(u,[H.W8(z,"Q",0)])
 u.G()
-t=u.M4
-for(;u.G();)t=new H.BI(t,u.M4,null,H.YC(b))
-return t},Jf:function(a){var z
-if(a==null)return $.Cr()
-z=H.Ko(a)
-if(z==null)return P.re(C.hT)
-return H.nH(new H.cu(z,null).LU)},QO:function(a,b){var z,y,x,w,v,u,t
-if(typeof b!=="number"||Math.floor(b)!==b)return H.Jf(b)
-for(z=a;y=null,z!=null;){x=J.x(z)
-if(typeof z==="object"&&z!==null&&!!x.$isMs){y=z
-break}z=z.gXP()}w=new H.GD(H.bK(J.tE(init.metadata[b])))
-v=y.gNy()
-x=J.U6(v)
-u=0
-while(!0){t=x.gB(v)
-if(typeof t!=="number")throw H.s(t)
-if(!(u<t))break
-if(J.xC(x.t(v,u).gIf(),w))if(y.gHA())return x.t(v,u)
-else return J.UQ(y.gw8(),u);++u}},fb:function(a,b){if(a==null)return b
-return H.YC(H.d(J.cs(a.gvd()))+"."+H.d(J.cs(b)))},pj:function(a){var z,y,x,w
+t=u.mD
+for(;u.G();)t=new H.BI(t,u.mD,null,H.YC(b))
+return t},w2:function(a,b){var z,y,x
+z=J.U6(a)
+y=0
+while(!0){x=z.gB(a)
+if(typeof x!=="number")throw H.s(x)
+if(!(y<x))break
+if(J.xC(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},Jf:function(a,b){var z,y,x,w,v,u
+z={}
+z.a=null
+for(y=a;y!=null;){x=J.x(y)
+if(typeof y==="object"&&y!==null&&!!x.$isMs){z.a=y
+break}y=y.gh7()}if(b==null)return $.Cr()
+else{x=z.a
+if(x==null)w=H.Ko(b,null)
+else if(x.gHA())if(typeof b==="number"&&Math.floor(b)===b){v=init.metadata[b]
+u=x.gNy()
+return J.UQ(u,H.w2(u,J.DA(v)))}else w=H.Ko(b,null)
+else w=H.Ko(b,new H.jB(z))}if(w!=null)return H.jO(new H.cu(w,null).IE)
+return P.re(C.yQ)},fb:function(a,b){if(a==null)return b
+return H.YC(H.d(J.Z0(a.gvd()))+"."+H.d(J.Z0(b)))},pj:function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
 if(typeof a!=="function")return C.xD
@@ -10212,15 +9974,16 @@
 z=J.U6(b)
 if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
-x=null}for(z=new H.wi(y,y.length,0,null),H.VM(z,[H.ip(y,"Q",0)]),w=x!=null,v=0;z.G();){u=z.M4
+x=null}for(z=new H.a7(y,y.length,0,null),H.VM(z,[H.W8(y,"Q",0)]),w=x!=null,v=0;z.G();){u=z.mD
 if(w){t=v+1
 if(v>=x.length)throw H.e(x,v)
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
 if(r!=null)d.push(r)}},Mk:function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return[]
-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
+if(z.gl0(a)===!0){z=[]
+H.VM(z,[J.O])
+return z}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
@@ -10231,16 +9994,16 @@
 z=this.L5
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
-for(z=$.zX(),z=z.gUQ(z),x=z.V8,x=x.gA(x),x=new H.MH(null,x,z.Wz),H.VM(x,[H.ip(z,"i1",0),H.ip(z,"i1",1)]);x.G();)for(z=J.GP(x.M4);z.G();){w=z.gl()
+for(z=$.vK(),z=z.gUQ(z),x=z.Kw,x=x.gA(x),x=new H.MH(null,x,z.ew),H.VM(x,[H.W8(z,"i1",0),H.W8(z,"i1",1)]);x.G();)for(z=J.GP(x.mD);z.G();){w=z.gl()
 y.u(y,w.gFP(),w)}z=new H.Gj(y)
 H.VM(z,[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,l
+static:{"":"QG,RC,Ct",dF:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=P.L5(null,null,null,J.O,[J.Q,P.D4])
 y=init.libraries
 if(y==null)return z
-for(y.toString,x=new H.wi(y,y.length,0,null),H.VM(x,[H.ip(y,"Q",0)]);x.G();){w=x.M4
+for(y.toString,x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]);x.G();){w=x.mD
 v=J.U6(w)
 u=v.t(w,0)
 t=v.t(w,1)
@@ -10253,7 +10016,9 @@
 m=v.t(w,7)
 l=p==null?C.xD:p()
 J.bi(z.to(u,new H.nI()),new H.Uz(s,r,q,l,o,n,m,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z}}},nI:{"":"Tp;",
-call$0:function(){return[]},
+call$0:function(){var z=[]
+H.VM(z,[P.D4])
+return z},
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true},jU:{"":"a;",
@@ -10262,40 +10027,44 @@
 Hy:function(a,b){throw H.b(P.SY(null))},
 $isQF:true},Lj:{"":"jU;MA",
 gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().nb
+gcZ:function(){var z=$.At().gvU().nb
 z=z.gUQ(z)
 return z.XG(z,new H.mb())},
 $isQF:true},mb:{"":"Tp;",
-call$1:function(a){return a.gGD()},
+call$1:function(a){return a.grv()},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},am:{"":"jU;If<",
-gvd:function(){return H.fb(this.gXP(),this.gIf())},
-gkw:function(){return J.co(J.cs(this.gIf()),"_")},
-bu:function(a){return this.gOO()+" on '"+H.d(J.cs(this.gIf()))+"'"},
+gvd:function(){return H.fb(this.gh7(),this.gIf())},
+gkw:function(){return J.co(J.Z0(this.gIf()),"_")},
+bu:function(a){return this.gOO()+" on '"+H.d(J.Z0(this.gIf()))+"'"},
 gEO:function(){throw H.b(H.Pa("Should not call _methods"))},
 qj:function(a,b){throw H.b(H.Pa("Should not call _invoke"))},
 gmW:function(a){return H.vh(P.SY(null))},
-$isQF:true},cw:{"":"EE;XP<,xW,LQ,If",
+$isNL:true,
+$isQF:true},cw:{"":"EE;h7<,xW,LQ,If",
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$iscw)z=J.xC(this.If,b.If)&&J.xC(this.XP,b.XP)
-else z=!1
-return z},
-gEo:function(a){return(1073741823&J.le(C.Gp.LU)^17*J.le(this.If)^19*J.le(this.XP))>>>0},
+return typeof b==="object"&&b!==null&&!!z.$iscw&&J.xC(this.If,b.If)&&J.xC(this.h7,b.h7)},
+giO:function(a){return(1073741823&J.v1(C.Gp.IE)^17*J.v1(this.If)^19*J.v1(this.h7))>>>0},
 gOO:function(){return"TypeVariableMirror"},
 $iscw:true,
+$isFw:true,
+$isX9:true,
+$isNL:true,
 $isQF:true},EE:{"":"am;If",
 gOO:function(){return"TypeMirror"},
-gXP:function(){return},
+gh7:function(){return},
 gc9:function(){return H.vh(P.SY(null))},
-gNy:function(){return H.vh(P.SY(null))},
-gw8:function(){return H.vh(P.SY(null))},
+gNy:function(){return C.dn},
+gw8:function(){return C.hU},
 gHA:function(){return!0},
 gJi:function(){return this},
-$isQF:true},Uz:{"":"Xd;FP<,aP,wP,le,LB,GD<,ae<,SD,tB,P8,mX,T1,fX,M2,uA,Db,Ok,If",
+$isX9:true,
+$isNL:true,
+$isQF:true},Uz:{"":"uh;FP<,aP,wP,le,LB,rv<,ae<,SD,tB,P8,mX,T1,Ly,M2,uA,Db,Ok,If",
 gOO:function(){return"LibraryMirror"},
 gvd:function(){return this.If},
 gEO:function(){return this.gm8()},
@@ -10314,8 +10083,8 @@
 this.P8=z
 return z},
 PU:function(a,b){var z,y,x,w
-z=J.cs(a)
-J.Eg(z,"=")
+z=a.ghr(a)
+if(z.Tc(z,"="))throw H.b(new P.AT(""))
 y=this.gmu()
 x=H.YC(H.d(z)+"=")
 y=y.nb
@@ -10336,13 +10105,13 @@
 y=z.t(z,a)
 if(y==null)throw H.b(P.lr(this,a,b,c,null))
 z=J.x(y)
-if(typeof y==="object"&&y!==null&&!!z.$isZk)if(!("$reflectable" in y.dl))H.Hz(J.cs(a))
+if(typeof y==="object"&&y!==null&&!!z.$isZk)if(!("$reflectable" in y.dl))H.Hz(J.Z0(a))
 return H.vn(y.qj(b,c))},
 "+invoke:3:0":0,
 "*invoke":[35],
 CI:function(a,b){return this.F2(a,b,null)},
 "+invoke:2:0":0,
-T8:function(a){return $[a]},
+Z0:function(a){return $[a]},
 H7:function(a,b){$[a]=b},
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
@@ -10372,6 +10141,7 @@
 z=this.tB
 if(z!=null)return z
 y=[]
+H.VM(y,[P.RY])
 H.jw(this,this.LB,!0,y)
 this.tB=y
 return y},
@@ -10379,28 +10149,28 @@
 z=this.mX
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
-for(z=this.gm8(),z.toString,x=new H.wi(z,z.length,0,null),H.VM(x,[H.ip(z,"Q",0)]);x.G();){w=x.M4
+for(z=this.gm8(),z.toString,x=new H.a7(z,z.length,0,null),H.VM(x,[H.W8(z,"Q",0)]);x.G();){w=x.mD
 if(!w.gxV())y.u(y,w.gIf(),w)}z=new H.Gj(y)
 H.VM(z,[P.wv,P.RS])
 this.mX=z
 return z},
-gE4:function(){var z=this.T1
+gII:function(){var z=this.T1
 if(z!=null)return z
 z=new H.Gj(P.L5(null,null,null,null,null))
 H.VM(z,[P.wv,P.RS])
 this.T1=z
 return z},
-gF8:function(){var z=this.fX
+gF8:function(){var z=this.Ly
 if(z!=null)return z
 z=new H.Gj(P.L5(null,null,null,null,null))
 H.VM(z,[P.wv,P.RS])
-this.fX=z
+this.Ly=z
 return z},
 gZ3:function(){var z,y,x,w
 z=this.M2
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
-for(z=this.gKn(),z.toString,x=new H.wi(z,z.length,0,null),H.VM(x,[H.ip(z,"Q",0)]);x.G();){w=x.M4
+for(z=this.gKn(),z.toString,x=new H.a7(z,z.length,0,null),H.VM(x,[H.W8(z,"Q",0)]);x.G();){w=x.mD
 y.u(y,w.gIf(),w)}z=new H.Gj(y)
 H.VM(z,[P.wv,P.RY])
 this.M2=z
@@ -10414,7 +10184,7 @@
 z=new H.Kv(y)
 x=this.gmu().nb
 x.aN(x,z)
-x=this.gE4().nb
+x=this.gII().nb
 x.aN(x,z)
 x=this.gF8().nb
 x.aN(x,z)
@@ -10425,36 +10195,57 @@
 this.uA=z
 return z},
 "+members":0,
+gYK:function(){var z,y
+z=this.Db
+if(z!=null)return z
+y=P.L5(null,null,null,P.wv,P.NL)
+z=this.glc(this).nb
+z.aN(z,new H.oP(y))
+z=new H.Gj(y)
+H.VM(z,[P.wv,P.NL])
+this.Db=z
+return z},
+"+declarations":0,
 gc9:function(){var z=this.Ok
 if(z!=null)return z
-z=new P.Yp(J.kl(this.le,H.Yf))
-H.VM(z,[P.VL])
+z=new P.Yp(J.C0(this.le,H.Yf))
+H.VM(z,[P.vr])
 this.Ok=z
 return z},
-gXP:function(){return},
+gh7:function(){return},
 $isD4:true,
-$isQF:true},Xd:{"":"am+U2;",$isQF:true},Kv:{"":"Tp;a",
+$isQF:true,
+$isNL:true},uh:{"":"am+M2;",$isQF:true},Kv:{"":"Tp;a",
 call$2:function(a,b){var z=this.a
 z.u(z,a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},BI:{"":"y1;AY<,XW,BB,If",
+$is_bh:true},oP:{"":"Tp;a",
+call$2:function(a,b){var z=this.a
+z.u(z,a,b)},
+"+call:2:0":0,
+$isEH:true,
+$is_bh:true},YX:{"":"Tp;a",
+call$0:function(){return this.a},
+"+call:0:0":0,
+$isEH:true,
+$is_X0:true},BI:{"":"y1;AY<,XW,BB,If",
 gOO:function(){return"ClassMirror"},
 gIf:function(){var z,y
 z=this.BB
 if(z!=null)return z
-y=J.cs(this.AY.gvd())
+y=J.Z0(this.AY.gvd())
 z=this.XW
-z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(J.cs(z.gvd()))):H.YC(H.d(y)+" with "+H.d(J.cs(z.gvd())))
+z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(J.Z0(z.gvd()))):H.YC(H.d(y)+" with "+H.d(J.Z0(z.gvd())))
 this.BB=z
 return z},
 gvd:function(){return this.gIf()},
 glc:function(a){return J.GK(this.XW)},
 "+members":0,
 gtx:function(){return this.XW.gtx()},
-gE4:function(){return this.XW.gE4()},
-gF8:function(){return this.XW.gF8()},
 gZ3:function(){return this.XW.gZ3()},
+gYK:function(){return this.XW.gYK()},
+"+declarations":0,
 F2:function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},
 "+invoke:3:0":0,
 "*invoke":[35],
@@ -10468,12 +10259,14 @@
 gHA:function(){return!0},
 gJi:function(){return this},
 gNy:function(){throw H.b(P.SY(null))},
-gw8:function(){return P.A(null,null)},
+gw8:function(){return C.hU},
 $isMs:true,
-$isQF:true},y1:{"":"EE+U2;",$isQF:true},U2:{"":"a;",$isQF:true},iu:{"":"U2;Ax<",
-gt5:function(a){return H.nH(J.bB(this.Ax).LU)},
+$isQF:true,
+$isX9:true,
+$isNL:true},y1:{"":"EE+M2;",$isQF:true},M2:{"":"a;",$isQF:true},iu:{"":"M2;Ax<",
+gr9:function(a){return H.jO(J.bB(this.Ax).IE)},
 F2:function(a,b,c){var z,y
-z=J.cs(a)
+z=J.Z0(a)
 y=z+":"+b.length+":0"
 return this.tu(a,0,y,b)},
 "+invoke:3:0":0,
@@ -10488,18 +10281,18 @@
 y.constructor[z]=x}w=x[c]
 if(w==null){v=$.I6()
 u=v.t(v,c)
-if(b===0){v=H.q9(J.uH(c,":"),3,null,null)
+if(b===0){v=H.j5(J.uH(c,":"),3,null,null)
 t=v.br(v)}else t=C.xD
 s=new H.LI(a,u,b,d,t,null)
-w=s.ZU(y)
+w=s.Yd(y)
 x[c]=w}else s=null
 if(w.gpf()){if(s==null){v=$.I6()
 s=new H.LI(a,v.t(v,c),b,d,[],null)}return H.vn(w.Bj(y,s))}else return H.vn(w.Bj(y,d))},
-PU:function(a,b){var z=H.d(J.cs(a))+"="
+PU:function(a,b){var z=H.d(J.Z0(a))+"="
 this.tu(H.YC(z),2,z,[b])
 return H.vn(b)},
 "+setField:2:0":0,
-rN:function(a){return this.tu(a,1,J.cs(a),[])},
+rN:function(a){return this.tu(a,1,J.Z0(a),[])},
 "+getField:1:0":0,
 n:function(a,b){var z,y
 if(b==null)return!1
@@ -10509,10 +10302,10 @@
 y=z==null?y==null:z===y
 z=y}else z=!1
 return z},
-gEo:function(a){return(H.CU(this.Ax)^909522486)>>>0},
+giO:function(a){return(H.CU(this.Ax)^909522486)>>>0},
 bu:function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},
 $isiu:true,
-$isVL:true,
+$isvr:true,
 $isQF:true},mg:{"":"Tp;",
 call$1:function(a){return init.metadata[a]},
 "+call:1:0":0,
@@ -10520,35 +10313,31 @@
 $is_HB:true,
 $is_Dv:true},zE:{"":"Tp;a",
 call$2:function(a,b){var z,y
-z=J.cs(a)
+z=J.Z0(a)
 y=this.a
 if(y.x4(z))y.u(y,z,b)
 else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},bl:{"":"am;NK,EZ,M2,T1,fX,FU,jd,If",
+$is_bh:true},bl:{"":"am;NK,EZ,ut,Db,uA,b0,M2,T1,Ly,FU,jd,qN,qm,If",
 gOO:function(){return"ClassMirror"},
+gWL:function(){return H.d(this.NK.gWL())+"<"+this.EZ+">"},
+"+_mangledName":0,
 gNy:function(){return this.NK.gNy()},
-gw8:function(){var z,y,x,w,v,u,t
-z=this.EZ
-if(typeof z!=="string")return z
+gw8:function(){var z,y,x,w,v,u,t,s
+z=this.ut
+if(z!=null)return z
 y=P.A(null,null)
 z=new H.Ef(y)
-if(J.UU(this.EZ,"<")===-1)H.bQ(J.uH(this.EZ,","),new H.Tc(z))
-else{x=0
-w=""
-v=0
-while(!0){u=J.q8(this.EZ)
-if(typeof u!=="number")throw H.s(u)
-if(!(v<u))break
-c$0:{t=J.UQ(this.EZ,v)
-u=J.x(t)
-if(u.n(t," "))break c$0
-else if(u.n(t,"<")){w=C.xB.g(w,t);++x}else if(u.n(t,">")){w=C.xB.g(w,t);--x}else if(u.n(t,","))if(x>0)w=C.xB.g(w,t)
-else{z.call$1(w)
-w=""}else w=C.xB.g(w,t)}++v}z.call$1(w)}z=new P.Yp(y)
+x=this.EZ
+if(C.xB.u8(x,"<")===-1)H.bQ(x.split(","),new H.Tc(z))
+else{for(w=x.length,v=0,u="",t=0;t<w;++t){s=x[t]
+if(s===" ")continue
+else if(s==="<"){u+=s;++v}else if(s===">"){u+=s;--v}else if(s===",")if(v>0)u+=s
+else{z.call$1(u)
+u=""}else u+=s}z.call$1(u)}z=new P.Yp(y)
 H.VM(z,[null])
-this.EZ=z
+this.ut=z
 return z},
 gEO:function(){var z=this.jd
 if(z!=null)return z
@@ -10561,36 +10350,51 @@
 H.VM(z,[P.wv,P.RS])
 this.FU=z
 return z},
-gE4:function(){var z=this.T1
+gDI:function(){var z=this.b0
 if(z!=null)return z
-z=new H.Gj(H.AX(this.gEO(),this.gZ3()))
+z=new H.Gj(H.Fk(this.gEO()))
 H.VM(z,[P.wv,P.RS])
-this.T1=z
-return z},
-gF8:function(){var z=this.fX
-if(z!=null)return z
-z=new H.Gj(H.OL(this.gEO(),this.gZ3()))
-H.VM(z,[P.wv,P.RS])
-this.fX=z
+this.b0=z
 return z},
 gZ3:function(){var z,y,x,w
 z=this.M2
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
-for(z=this.NK.ws(this),x=new H.wi(z,z.length,0,null),H.VM(x,[H.ip(z,"Q",0)]);x.G();){w=x.M4
+for(z=this.NK.ws(this),x=new H.a7(z,z.length,0,null),H.VM(x,[H.W8(z,"Q",0)]);x.G();){w=x.mD
 y.u(y,w.gIf(),w)}z=new H.Gj(y)
 H.VM(z,[P.wv,P.RY])
 this.M2=z
 return z},
-glc:function(a){return J.GK(this.NK)},
+glc:function(a){var z=this.uA
+if(z!=null)return z
+z=new H.Gj(H.vE(this.gEO(),this.gZ3()))
+H.VM(z,[P.wv,P.NL])
+this.uA=z
+return z},
 "+members":0,
+gYK:function(){var z,y
+z=this.Db
+if(z!=null)return z
+y=P.L5(null,null,null,P.wv,P.NL)
+y.Ay(y,this.glc(this))
+y.Ay(y,this.gDI())
+J.kH(this.NK.gNy(),new H.Ax(y))
+z=new H.Gj(y)
+H.VM(z,[P.wv,P.NL])
+this.Db=z
+return z},
+"+declarations":0,
 PU:function(a,b){return this.NK.PU(a,b)},
 "+setField:2:0":0,
 rN:function(a){return this.NK.rN(a)},
 "+getField:1:0":0,
-gXP:function(){return this.NK.gXP()},
+gh7:function(){return this.NK.gh7()},
 gc9:function(){return this.NK.gc9()},
-gAY:function(){return this.NK.gAY()},
+gAY:function(){var z=this.qN
+if(z!=null)return z
+z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gWL()],0)])
+this.qN=z
+return z},
 F2:function(a,b,c){return this.NK.F2(a,b,c)},
 "+invoke:3:0":0,
 "*invoke":[35],
@@ -10598,19 +10402,24 @@
 "+invoke:2:0":0,
 gHA:function(){return!1},
 gJi:function(){return this.NK},
-gkZ:function(){return this.NK.gkZ()},
-gkw:function(){return this.NK.gkw()},
-gmW:function(a){return J.pN(this.NK)},
+gkZ:function(){var z=this.qm
+if(z!=null)return z
+z=this.NK.MR(this)
+this.qm=z
+return z},
+gmW:function(a){return J.UX(this.NK)},
 gvd:function(){return this.NK.gvd()},
 gIf:function(){return this.NK.gIf()},
 $isMs:true,
-$isQF:true},Ef:{"":"Tp;a",
+$isQF:true,
+$isX9:true,
+$isNL:true},Ef:{"":"Tp;a",
 call$1:function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
-if(J.xC(z,-1))y.push(H.nH(J.rr(a)))
+if(J.xC(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,null,H.YC(J.tE(x))))}},
+y.push(new H.cw(P.re(x.gh7()),x,null,H.YC(J.DA(x))))}},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
@@ -10624,70 +10433,87 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Wf:{"":"Rk;WL<-,Tx<-,H8<-,Ht<-,pz<-,le@-,qN@-,jd@-,tB@-,b0@-,FU@-,T1@-,fX@-,M2@-,uA@-,Db@-,Ok@-,qm@-,UF@-,nz@-,If",
+$is_Dv:true},Ax:{"":"Tp;a",
+call$1:function(a){var z=this.a
+z.u(z,a.gIf(),a)
+return a},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},Wf:{"":"Un;WL<-,Tx<-,H8<-,Ht<-,pz<-,le@-,qN@-,jd@-,tB@-,b0@-,FU@-,T1@-,Ly@-,M2@-,uA@-,Db@-,Ok@-,qm@-,UF@-,nz@-,If",
 gOO:function(){return"ClassMirror"
 "8"},
 "+_prettyName":1,
 gaB:function(){var z,y
 z=this.Tx
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isvB)return z.constructor
+if(typeof z==="object"&&z!==null&&!!y.$isGv)return z.constructor
 else return z
 "35"},
 "+_jsConstructor":1,
+gDI:function(){var z=this.b0
+if(z!=null)return z
+z=new H.Gj(H.Fk(this.gEO()))
+H.VM(z,[P.wv,P.RS])
+this.b0=z
+return z
+"47"},
+"+constructors":1,
 ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=this.gaB().prototype
-y=[]
-for(x=J.GP((function(victim, hasOwnProperty) {
+y=(function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
     if (hasOwnProperty.call(victim, key)) result.push(key);
   }
   return result;
-})(z, Object.prototype.hasOwnProperty));x.G();){w=x.gl()
-if(H.Y6(w))continue
-v=$.bx()
-u=v.t(v,w)
-if(u==null)continue
-t=H.Sd(u,z[w],!1,!1)
-y.push(t)
-t.nz=a}s=(function(victim, hasOwnProperty) {
+})(z, Object.prototype.hasOwnProperty)
+x=[]
+H.VM(x,[H.Zk])
+for(w=J.GP(y);w.G();){v=w.gl()
+if(H.Y6(v))continue
+u=$.bx()
+t=u.t(u,v)
+if(t==null)continue
+s=H.Sd(t,z[v],!1,!1)
+x.push(s)
+s.nz=a}y=(function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
     if (hasOwnProperty.call(victim, key)) result.push(key);
   }
   return result;
 })(init.statics[this.WL], Object.prototype.hasOwnProperty)
-x=J.U6(s)
-r=x.gB(s)
+w=J.U6(y)
+r=w.gB(y)
+if(typeof r!=="number")throw H.s(r)
 q=0
-while(!0){if(typeof r!=="number")throw H.s(r)
-if(!(q<r))break
-c$0:{p=x.t(s,q)
-if(H.Y6(p))break c$0
-o=this.gXP().gae()[p]
+for(;q<r;++q){p=w.t(y,q)
+if(H.Y6(p))continue
+o=this.gh7().gae()[p]
 n=q+1
-if(n<r){m=x.t(s,n)
-v=J.rY(m)
-if(v.nC(m,"+")){m=v.yn(m,1)
+if(n<r){m=w.t(y,n)
+u=J.rY(m)
+if(u.nC(m,"+")){m=u.yn(m,1)
 l=C.xB.nC(m,"new ")
-if(l){v=C.xB.yn(m,4)
-m=H.ys(v,"$",".")}q=n}else l=!1
+if(l){u=C.xB.yn(m,4)
+m=H.ys(u,"$",".")}q=n}else l=!1
 k=m}else{k=p
-l=!1}t=H.Sd(k,o,!l,l)
-y.push(t)
-t.nz=a}++q}return y
-"44,45,46"},
+l=!1}s=H.Sd(k,o,!l,l)
+x.push(s)
+s.nz=a}return x
+"48,49,50"},
 "+_getMethodsWithOwner:1:0":1,
 gEO:function(){var z=this.jd
 if(z!=null)return z
 z=this.ly(this)
 this.jd=z
 return z
-"44"},
+"48"},
 "+_methods":1,
 ws:function(a){var z,y,x,w
 z=[]
+H.VM(z,[P.RY])
 y=J.uH(this.H8,";")
 if(1>=y.length)throw H.e(y,1)
 x=y[1]
@@ -10697,14 +10523,14 @@
 w=init.statics[this.WL]
 if(w!=null)H.jw(a,w[""],!0,z)
 return z
-"47,48,46"},
+"51,52,50"},
 "+_getFieldsWithOwner:1:0":1,
 gKn:function(){var z=this.tB
 if(z!=null)return z
 z=this.ws(this)
 this.tB=z
 return z
-"47"},
+"51"},
 "+_fields":1,
 gtx:function(){var z=this.FU
 if(z!=null)return z
@@ -10712,24 +10538,8 @@
 H.VM(z,[P.wv,P.RS])
 this.FU=z
 return z
-"49"},
+"47"},
 "+methods":1,
-gE4:function(){var z=this.T1
-if(z!=null)return z
-z=new H.Gj(H.AX(this.gEO(),this.gZ3()))
-H.VM(z,[P.wv,P.RS])
-this.T1=z
-return z
-"49"},
-"+getters":1,
-gF8:function(){var z=this.fX
-if(z!=null)return z
-z=new H.Gj(H.OL(this.gEO(),this.gZ3()))
-H.VM(z,[P.wv,P.RS])
-this.fX=z
-return z
-"49"},
-"+setters":1,
 gZ3:function(){var z,y,x
 z=this.M2
 if(z!=null)return z
@@ -10739,110 +10549,121 @@
 H.VM(z,[P.wv,P.RY])
 this.M2=z
 return z
-"50"},
+"53"},
 "+variables":1,
-glc:function(a){var z,y,x,w,v,u
-z=this.uA
+glc:function(a){var z=this.uA
 if(z!=null)return z
-z=this.gZ3()
-y=P.L5(null,null,null,null,null)
-y.Ay(y,z)
-for(z=J.GP(this.gEO());z.G();){x=z.gl()
-if(x.ghB()){w=J.cs(x.gIf())
-v=J.U6(w)
-v=y.t(y,H.YC(v.JT(w,0,J.xH(v.gB(w),1))))
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
-y.to(x.gIf(),new H.Gt(x))}z=new H.Gj(y)
+z=new H.Gj(H.vE(this.gEO(),this.gZ3()))
 H.VM(z,[P.wv,P.QF])
 this.uA=z
 return z
-"51"},
+"54"},
 "+members":1,
+gYK:function(){var z,y
+z=this.Db
+if(z!=null)return z
+y=P.L5(null,null,null,P.wv,P.NL)
+z=new H.Ei(y)
+J.kH(this.glc(this),z)
+J.kH(this.gDI(),z)
+J.kH(this.gNy(),new H.U7(y))
+z=new H.Gj(y)
+H.VM(z,[P.wv,P.NL])
+this.Db=z
+return z
+"55"},
+"+declarations":1,
 PU:function(a,b){var z,y
 z=J.UQ(this.gZ3(),a)
-if(z!=null&&z.gFo()&&J.EM(z)!==!0){y=z.gcK()
+if(z!=null&&z.gFo()&&!z.gV5()){y=z.gao()
 if(!(y in $))throw H.b(H.Pa("Cannot find \""+y+"\" in current isolate."))
 $[y]=b
 return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))
-"52,53,54,55,0"},
+"56,57,58,59,0"},
 "+setField:2:0":1,
 rN:function(a){var z,y
 z=J.UQ(this.gZ3(),a)
-if(z!=null&&z.gFo()){y=z.gcK()
+if(z!=null&&z.gFo()){y=z.gao()
 if(!(y in $))throw H.b(H.Pa("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
 else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))
-"52,53,54"},
+"56,57,58"},
 "+getField:1:0":1,
-gXP:function(){var z,y,x,w,v,u,t
+gh7:function(){var z,y,x,w,v,u,t
 if(this.nz==null){z=this.Tx
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isvB){x=C.FQ.LU
+if(typeof z==="object"&&z!==null&&!!y.$isGv){x=C.nY.IE
 z=$.Sl()
 w=z.t(z,x)
-this.nz=H.tT(H.YC(w==null?x:w),x).gXP()}else{z=$.zX()
+this.nz=H.tT(H.YC(w==null?x:w),x).gh7()}else{z=$.vK()
 z=z.gUQ(z)
-y=z.V8
+y=z.Kw
 y=y.gA(y)
 v=H.Y9(z.$asi1,H.oX(z))
 u=v==null?null:v[0]
 v=H.Y9(z.$asi1,H.oX(z))
 t=v==null?null:v[1]
-z=new H.MH(null,y,z.Wz)
+z=new H.MH(null,y,z.ew)
 z.$builtinTypeInfo=[u,t]
-for(;z.G();)for(y=J.GP(z.M4);y.G();)J.pP(y.gl())}if(this.nz==null)throw H.b(new P.lj("Class \""+H.d(J.cs(this.If))+"\" has no owner"))}return this.nz
-"56"},
+for(;z.G();)for(y=J.GP(z.mD);y.G();)J.pP(y.gl())}if(this.nz==null)throw H.b(new P.lj("Class \""+H.d(J.Z0(this.If))+"\" has no owner"))}return this.nz
+"60"},
 "+owner":1,
 gc9:function(){var z=this.Ok
 if(z!=null)return z
 if(this.le==null)this.le=H.pj(this.gaB().prototype)
-z=new P.Yp(J.kl(this.le,H.Yf))
-H.VM(z,[P.VL])
+z=new P.Yp(J.C0(this.le,H.Yf))
+H.VM(z,[P.vr])
 this.Ok=z
 return z
-"57"},
+"61"},
 "+metadata":1,
-gAY:function(){var z,y,x,w,v
-if(this.qN==null){z=this.H8
-y=J.uH(z,";")
-if(0>=y.length)throw H.e(y,0)
-x=y[0]
-y=J.rY(x)
-w=y.Fr(x,"+")
-v=w.length
-if(v>1){if(v!==2)throw H.b(H.Pa("Strange mixin: "+H.d(z)))
-this.qN=H.nH(w[0])}else this.qN=y.n(x,"")?this:H.nH(x)}return J.xC(this.qN,this)?null:this.qN
-"58"},
+gAY:function(){var z,y,x,w,v,u
+if(this.qN==null){z=init.typeInformation[this.WL]
+if(z!=null)this.qN=H.Jf(this,init.metadata[J.UQ(z,0)])
+else{y=this.H8
+x=J.uH(y,";")
+if(0>=x.length)throw H.e(x,0)
+w=x[0]
+x=J.rY(w)
+v=x.Fr(w,"+")
+u=v.length
+if(u>1){if(u!==2)throw H.b(H.Pa("Strange mixin: "+H.d(y)))
+this.qN=H.jO(v[0])}else this.qN=x.n(w,"")?this:H.jO(w)}}return J.xC(this.qN,this)?null:this.qN
+"62"},
 "+superclass":1,
 F2:function(a,b,c){var z
 if(c!=null&&J.FN(c)!==!0)throw H.b(P.f("Named arguments are not implemented."))
 z=J.UQ(this.gtx(),a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
-if(!z.yR())H.Hz(J.cs(a))
+if(!z.yR())H.Hz(J.Z0(a))
 return H.vn(z.qj(b,c))
-"52,59,54,60,61,62,63"},
+"56,63,58,64,65,66,67"},
 "+invoke:3:0":1,
 "*invoke":[35],
 CI:function(a,b){return this.F2(a,b,null)},
 "+invoke:2:0":1,
 gHA:function(){return!0
-"37"},
+"39"},
 "+isOriginalDeclaration":1,
 gJi:function(){return this
-"58"},
+"62"},
 "+originalDeclaration":1,
-gkZ:function(){var z,y,x
-z=this.qm
+MR:function(a){var z,y,x
+z=init.typeInformation[this.WL]
+if(z!=null){y=new H.A8(J.Pr(z,1),new H.t0(a))
+H.VM(y,[null,null])
+x=y.br(y)}else x=C.Me
+y=new P.Yp(x)
+H.VM(y,[P.Ms])
+return y
+"68,69,50"},
+"+_getSuperinterfacesWithOwner:1:0":1,
+gkZ:function(){var z=this.qm
 if(z!=null)return z
-y=init.interfaces[this.WL]
-if(y!=null){z=J.kl(y,new H.J0())
-x=z.br(z)}else x=C.xD
-z=new P.Yp(x)
-H.VM(z,[P.Ms])
+z=this.MR(this)
 this.qm=z
 return z
-"64"},
+"68"},
 "+superinterfaces":1,
 gNy:function(){var z,y,x,w,v
 z=this.UF
@@ -10851,42 +10672,52 @@
 x=this.gaB().prototype["<>"]
 if(x==null)return y
 for(w=0;w<x.length;++w){v=init.metadata[x[w]]
-y.push(new H.cw(this,v,null,H.YC(J.tE(v))))}z=new P.Yp(y)
+y.push(new H.cw(this,v,null,H.YC(J.DA(v))))}z=new P.Yp(y)
 H.VM(z,[null])
 this.UF=z
 return z
-"65"},
+"70"},
 "+typeVariables":1,
-gw8:function(){return P.A(null,null)
-"66"},
+gw8:function(){return C.hU
+"71"},
 "+typeArguments":1,
 $isWf:true,
 $isMs:true,
-$isQF:true},"+JsClassMirror": [58],Rk:{"":"EE+U2;",$isQF:true},Gt:{"":"Tp;a-",
-call$0:function(){return this.a
-"35"},
-"+call:0:0":1,
+$isQF:true,
+$isX9:true,
+$isNL:true},"+JsClassMirror": [72, 62],Un:{"":"EE+M2;",$isQF:true},Ei:{"":"Tp;a-",
+call$2:function(a,b){J.kW(this.a,a,b)
+"35,73,58,28,74"},
+"+call:2:0":1,
 $isEH:true,
-$is_X0:true},"+JsClassMirror_members_closure": [],J0:{"":"Tp;",
-call$1:function(a){return H.Jf(init.metadata[a])
-"58,67,27"},
+$is_bh:true},"+JsClassMirror_declarations_addToResult": [75],U7:{"":"Tp;b-",
+call$1:function(a){J.kW(this.b,a.gIf(),a)
+return a
+"35,76,35"},
 "+call:1:0":1,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},"+JsClassMirror_superinterfaces_lookupType": [],Ld:{"":"am;cK<,V5>,Fo<,n6,nz,le,If",
+$is_Dv:true},"+JsClassMirror_declarations_closure": [75],t0:{"":"Tp;a-",
+call$1:function(a){return H.Jf(this.a,init.metadata[a])
+"62,77,27"},
+"+call:1:0":1,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},"+JsClassMirror__getSuperinterfacesWithOwner_lookupType": [75],Ld:{"":"am;ao<,V5<,Fo<,n6,nz,le,If",
 gOO:function(){return"VariableMirror"},
 "+_prettyName":0,
-gt5:function(a){return $.Cr()},
-gXP:function(){return this.nz},
+gr9:function(a){return $.Cr()},
+gh7:function(){return this.nz},
 "+owner":0,
 gc9:function(){if(this.le==null){var z=this.n6
-this.le=z==null?C.xD:z()}z=J.kl(this.le,H.Yf)
+this.le=z==null?C.xD:z()}z=J.C0(this.le,H.Yf)
 return z.br(z)},
 "+metadata":0,
-IB:function(a){return a.T8(this.cK)},
+IB:function(a){return a.Z0(this.ao)},
 Hy:function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-a.H7(this.cK,b)},
+a.H7(this.ao,b)},
 $isRY:true,
+$isNL:true,
 $isQF:true,
 static:{"":"Z8",pS:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
 z=J.U6(a)
@@ -10912,7 +10743,7 @@
 if(a>=37&&a<=43)return a-27
 return 0}}},Sz:{"":"iu;Ax",
 gMj:function(a){var z,y,x,w,v,u,t,s,r
-z=$.z7
+z=$.te
 y=this.Ax
 x=y.constructor[z]
 if(x!=null)return x
@@ -10928,35 +10759,35 @@
 if(1>=v.length)throw H.e(v,1)
 u=H.BU(v[1],null,null)
 v=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!v.$isv){t=y.gjm()
-y.gnw()
+if(typeof y==="object"&&y!==null&&!!v.$isv){t=y.gnn()
+y.gwc()
 s=$.bx()
-r=s.t(s,v.gRA(y))
+r=s.t(s,v.gPp(y))
 if(r==null)H.Hz(r)
 x=H.Sd(r,t,!1,!1)}else x=new H.Zk(y[w],u,!1,!1,!0,!1,!1,null,null,null,null,H.YC(w))
 y.constructor[z]=x
 return x},
 "+function":0,
 bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
-$isVL:true,
-$isQF:true},Zk:{"":"am;dl,Yq,lT<,hB<,Fo<,xV<,kN,nz,le,A9,Cr,If",
+$isvr:true,
+$isQF:true},Zk:{"":"am;dl,Yq,lT<,hB<,Fo<,xV<,qx,nz,le,G6,Cr,If",
 gOO:function(){return"MethodMirror"},
 "+_prettyName":0,
-gMP:function(){var z=this.Cr
+gJx:function(){var z=this.Cr
 if(z!=null)return z
 this.gc9()
 return this.Cr},
 yR:function(){return"$reflectable" in this.dl},
-gXP:function(){return this.nz},
+gh7:function(){return this.nz},
 "+owner":0,
 gdw:function(){this.gc9()
-return H.QO(this.nz,this.A9)},
+return H.Jf(this.nz,this.G6)},
 gc9:function(){var z,y,x,w,v,u,t,s,r,q,p
 if(this.le==null){z=H.pj(this.dl)
 y=this.Yq
 x=P.A(y,null)
 w=J.U6(z)
-if(w.gl0(z)!==!0){this.A9=w.t(z,0)
+if(w.gl0(z)!==!0){this.G6=w.t(z,0)
 y=J.p0(y,2)
 if(typeof y!=="number")throw H.s(y)
 v=1+y
@@ -10973,7 +10804,7 @@
 x[t]=new H.fu(this,null,p)}}y=new P.Yp(x)
 H.VM(y,[P.Ys])
 this.Cr=y
-y=new P.Yp(J.kl(z,H.Yf))
+y=new P.Yp(J.C0(z,H.Yf))
 H.VM(y,[null])
 this.le=y}return this.le},
 "+metadata":0,
@@ -10988,6 +10819,7 @@
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
+$isNL:true,
 $isQF:true,
 static:{Sd:function(a,b,c,d){var z,y,x,w,v,u,t
 z=J.uH(a,":")
@@ -11003,43 +10835,38 @@
 if(2>=z.length)throw H.e(z,2)
 t=H.BU(z[2],null,null)
 u=!1}w=H.YC(a)
-return new H.Zk(b,J.WB(v,t),u,x,c,d,y,null,null,null,null,w)}}},fu:{"":"am;XP<,Ad,If",
+return new H.Zk(b,J.WB(v,t),u,x,c,d,y,null,null,null,null,w)}}},fu:{"":"am;h7<,Ad,If",
 gOO:function(){return"ParameterMirror"},
 "+_prettyName":0,
-gt5:function(a){return H.QO(this.XP,this.Ad)},
+gr9:function(a){return H.Jf(this.h7,this.Ad)},
 gFo:function(){return!1},
-gV5:function(a){return!1},
+gV5:function(){return!1},
 gQ2:function(){return!1},
 gc9:function(){return H.vh(P.SY(null))},
 "+metadata":0,
 $isYs:true,
 $isRY:true,
-$isQF:true},ng:{"":"am;WL,CM,If",
+$isNL:true,
+$isQF:true},ng:{"":"am;WL<,CM,If",
 gP:function(a){return this.CM},
 "+value":0,
 r6:function(a,b){return this.gP(a).call$1(b)},
 gOO:function(){return"TypedefMirror"},
 "+_prettyName":0,
-$isQF:true},Ar:{"":"a;d9,o3,yA,zs,XP<",
-gdw:function(){var z=this.yA
-if(z!=null)return z
-z=this.d9
-if(!!z.void){z=$.oj()
-this.yA=z
-return z}if(!("ret" in z)){z=$.Cr()
-this.yA=z
-return z}z=H.Jf(z.ret)
-this.yA=z
-return z},
-gMP:function(){var z,y,x,w,v,u,t
-z=this.zs
+$isX9:true,
+$isNL:true,
+$isQF:true},Ar:{"":"a;d9,o3,yA,zM,h7<",
+gHA:function(){return!0},
+"+isOriginalDeclaration":0,
+gJx:function(){var z,y,x,w,v,u,t
+z=this.zM
 if(z!=null)return z
 y=[]
 z=this.d9
-if("args" in z)for(x=z.args,w=new H.wi(x,x.length,0,null),H.VM(w,[H.ip(x,"Q",0)]),v=0;w.G();v=u){u=v+1
-y.push(new H.fu(this,w.M4,H.YC("argument"+v)))}else v=0
-if("opt" in z)for(x=z.opt,w=new H.wi(x,x.length,0,null),H.VM(w,[H.ip(x,"Q",0)]);w.G();v=u){u=v+1
-y.push(new H.fu(this,w.M4,H.YC("argument"+v)))}if("named" in z)for(x=J.GP((function(victim, hasOwnProperty) {
+if("args" in z)for(x=z.args,w=new H.a7(x,x.length,0,null),H.VM(w,[H.W8(x,"Q",0)]),v=0;w.G();v=u){u=v+1
+y.push(new H.fu(this,w.mD,H.YC("argument"+v)))}else v=0
+if("opt" in z)for(x=z.opt,w=new H.a7(x,x.length,0,null),H.VM(w,[H.W8(x,"Q",0)]);w.G();v=u){u=v+1
+y.push(new H.fu(this,w.mD,H.YC("argument"+v)))}if("named" in z)for(x=J.GP((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
     if (hasOwnProperty.call(victim, key)) result.push(key);
@@ -11048,17 +10875,17 @@
 })(z.named, Object.prototype.hasOwnProperty));x.G();){t=x.gl()
 y.push(new H.fu(this,z.named[t],H.YC(t)))}z=new P.Yp(y)
 H.VM(z,[P.Ys])
-this.zs=z
+this.zM=z
 return z},
 bu:function(a){var z,y,x,w,v,u,t
 z=this.o3
 if(z!=null)return z
 z=this.d9
-if("args" in z)for(y=z.args,x=new H.wi(y,y.length,0,null),H.VM(x,[H.ip(y,"Q",0)]),w="FunctionTypeMirror on '(",v="";x.G();v=", "){u=x.M4
-w=C.xB.g(w+v,H.Ko(u))}else{w="FunctionTypeMirror on '("
+if("args" in z)for(y=z.args,x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]),w="FunctionTypeMirror on '(",v="";x.G();v=", "){u=x.mD
+w=C.xB.g(w+v,H.Ko(u,null))}else{w="FunctionTypeMirror on '("
 v=""}if("opt" in z){w+=v+"["
-for(y=z.opt,x=new H.wi(y,y.length,0,null),H.VM(x,[H.ip(y,"Q",0)]),v="";x.G();v=", "){u=x.M4
-w=C.xB.g(w+v,H.Ko(u))}w+="]"}if("named" in z){w+=v+"{"
+for(y=z.opt,x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]),v="";x.G();v=", "){u=x.mD
+w=C.xB.g(w+v,H.Ko(u,null))}w+="]"}if("named" in z){w+=v+"{"
 for(y=J.GP((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -11066,24 +10893,35 @@
   }
   return result;
 })(z.named, Object.prototype.hasOwnProperty)),v="";y.G();v=", "){t=y.gl()
-w=C.xB.g(w+v+(H.d(t)+": "),H.Ko(z.named[t]))}w+="}"}w+=") -> "
+w=C.xB.g(w+v+(H.d(t)+": "),H.Ko(z.named[t],null))}w+="}"}w+=") -> "
 if(!!z.void)w+="void"
-else w="ret" in z?C.xB.g(w,H.Ko(z.ret)):w+"dynamic"
+else w="ret" in z?C.xB.g(w,H.Ko(z.ret,null)):w+"dynamic"
 z=w+"'"
 this.o3=z
 return z},
 $isMs:true,
-$isQF:true},ye:{"":"Tp;",
+$isQF:true,
+$isX9:true,
+$isNL:true},jB:{"":"Tp;a",
+call$1:function(a){var z,y,x
+z=init.metadata[a]
+y=this.a
+x=H.w2(y.a.gNy(),J.DA(z))
+return J.UQ(y.a.gw8(),x).gWL()},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},ye:{"":"Tp;",
 call$1:function(a){return init.metadata[a]},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},Gj:{"":"a;nb",
-gB:function(a){return this.nb.hr},
+gB:function(a){return this.nb.X5},
 "+length":0,
-gl0:function(a){return this.nb.hr===0},
+gl0:function(a){return this.nb.X5===0},
 "+isEmpty":0,
-gor:function(a){return this.nb.hr!==0},
+gor:function(a){return this.nb.X5!==0},
 "+isNotEmpty":0,
 t:function(a,b){var z=this.nb
 return z.t(z,b)},
@@ -11096,8 +10934,8 @@
 return z.aN(z,b)},
 gvc:function(a){var z,y
 z=this.nb
-y=new P.Tz(z)
-H.VM(y,[H.ip(z,"YB",0)])
+y=new P.Cm(z)
+H.VM(y,[H.W8(z,"YB",0)])
 return y},
 "+keys":0,
 gUQ:function(a){var z=this.nb
@@ -11105,14 +10943,13 @@
 "+values":0,
 u:function(a,b,c){return H.kT()},
 "+[]=:2:0":0,
-to:function(a,b){H.kT()},
 Rz:function(a,b){H.kT()},
-$isZ0:true,
+$isL8:true,
 static:{kT:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))}}},Zz:{"":"Ge;hu",
 bu:function(a){return"Unsupported operation: "+this.hu},
 $ismp:true,
 $isGe:true,
-static:{WE:function(a){return new H.Zz(a)}}},"":"Sk<"}],["dart._js_names","dart:_js_names",,H,{hY:function(a,b){var z,y,x,w,v,u,t
+static:{WE:function(a){return new H.Zz(a)}}},"":"uN<"}],["dart._js_names","dart:_js_names",,H,{hY:function(a,b){var z,y,x,w,v,u,t
 z=(function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -11121,34 +10958,30 @@
   return result;
 })(a, Object.prototype.hasOwnProperty)
 y=H.B7([],P.L5(null,null,null,null,null))
+H.VM(y,[J.O,J.O])
 for(x=J.GP(z),w=!b;x.G();){v=x.gl()
 u=a[v]
 y.u(y,v,u)
 if(w){t=J.rY(v)
 if(t.nC(v,"g"))y.u(y,"s"+t.yn(v,1),u+"=")}}return y},YK:function(a){var z=H.B7([],P.L5(null,null,null,null,null))
+H.VM(z,[J.O,J.O])
 a.aN(a,new H.Xh(z))
 return z},Jg:function(a){return init.mangledGlobalNames[a]},Xh:{"":"Tp;a",
 call$2:function(a,b){var z=this.a
 z.u(z,b,a)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true}}],["dart.async","dart:async",,P,{uh:function(a,b){var z
-if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")return
-z=$.ij()
-z.u(z,a,b)},K2:function(a,b,c){var z=J.x(a)
+$is_bh:true}}],["dart.async","dart:async",,P,{K2:function(a,b,c){var z=J.x(a)
 if(!!z.$is_bh)return a.call$2(b,c)
 else return a.call$1(b)},VH:function(a,b){var z=J.x(a)
 if(!!z.$is_bh)return b.O8(a)
-else return b.cR(a)},XS:function(a){var z
-if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")return
-z=$.ij()
-return z.t(z,a)},pH:function(a){var z,y,x,w,v,u,t,s,r
+else return b.cR(a)},pH:function(a){var z,y,x,w,v,u,t,s,r
 z={}
 z.a=null
 z.b=null
 y=new P.j7(z)
 z.c=0
-for(x=new H.wi(a,a.length,0,null),H.VM(x,[H.ip(a,"Q",0)]);x.G();){w=x.M4
+for(x=new H.a7(a,a.length,0,null),H.VM(x,[H.W8(a,"Q",0)]);x.G();){w=x.mD
 v=z.c
 z.c=v+1
 u=w.OA(y)
@@ -11174,8 +11007,8 @@
 return}z=$.X3
 z.wr(z.xi(a,!0))},Ve:function(a,b,c,d,e,f){var z
 if(e){z=new P.ly(b,c,d,a,null,0,null)
-H.VM(z,[f])}else{z=new P.q1(b,c,d,a,null,0,null)
-H.VM(z,[f])}return z},nd:function(a,b,c,d){var z
+H.VM(z,[f])}else{z=new P.Gh(b,c,d,a,null,0,null)
+H.VM(z,[f])}return z},bK:function(a,b,c,d){var z
 if(c){z=new P.dz(b,a,0,null,null,null,null)
 H.VM(z,[d])
 z.SJ=z
@@ -11191,17 +11024,14 @@
 return}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-$.X3.hk(P.qK(y,x),x)}},SN:function(a){},SZ:function(a,b){$.X3.hk(a,b)},ax:function(){},qK:function(a,b){if(b==null)return a
-if(P.XS(a)!=null)return a
-P.uh(a,b)
-return a},FE:function(a,b,c){var z,y,x,w
+$.X3.hk(y,x)}},YE:function(a){},SZ:function(a,b){$.X3.hk(a,b)},ax:function(){},FE:function(a,b,c){var z,y,x,w
 try{b.call$1(a.call$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.call$2(P.qK(z,y),y)}},NX:function(a,b,c,d){var z,y
+c.call$2(z,y)}},NX:function(a,b,c,d){var z,y
 z=a.ed()
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isb8)z.wM(new P.v1(b,c,d))
+if(typeof z==="object"&&z!==null&&!!y.$isb8)z.wM(new P.dR(b,c,d))
 else b.K5(c,d)},TB:function(a,b){return new P.uR(a,b)},Bb:function(a,b,c){var z,y
 z=a.ed()
 y=J.x(z)
@@ -11215,7 +11045,7 @@
 z=$.X3
 try{$.X3=c
 y=d.call$0()
-return y}finally{$.X3=z}},yv:function(a,b,c,d,e){var z,y
+return y}finally{$.X3=z}},V7:function(a,b,c,d,e){var z,y
 if(J.xC($.X3,c))return d.call$1(e)
 z=$.X3
 try{$.X3=c
@@ -11227,9 +11057,9 @@
 y=d.call$2(e,f)
 return y}finally{$.X3=z}},Ee:function(a,b,c,d){return d},cQ:function(a,b,c,d){return d},dL:function(a,b,c,d){return d},Tk:function(a,b,c,d){P.IA(d)},h8:function(a,b,c,d,e){return P.jL(d,e)},Jj:function(a,b,c,d){H.LJ(d)},CI:function(a){J.wl($.X3,a)},qc:function(a,b,c,d,e){var z,y
 $.oK=P.jt
-if(d==null)d=C.z3
+if(d==null)d=C.Qq
 else{z=J.x(d)
-if(typeof d!=="object"||d===null||!z.$isyQ)throw H.b(new P.AT("ZoneSpecifications must be instantiated with the provided constructor."))}y=P.Py(null,null,null,null,null)
+if(typeof d!=="object"||d===null||!z.$iswJ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))}y=P.Py(null,null,null,null,null)
 if(e!=null)J.kH(e,new P.Ue(y))
 return new P.uo(c,d,y)},Ca:{"":"a;kc>,I4<",$isGe:true},Ik:{"":"O9;Y8",$asO9:null,$asqh:null},JI:{"":"yU;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
 gY8:function(){return this.Y8},
@@ -11249,13 +11079,12 @@
 if(typeof z!=="number")throw z.i()
 return(z&4)!==0},
 uO:function(){},
-gp4:function(){return new H.Ip(this,P.JI.prototype.uO,null,"uO")},
+gp4:function(){return new P.Ip(this,P.JI.prototype.uO,null,"uO")},
 LP:function(){},
-gZ9:function(){return new H.Ip(this,P.JI.prototype.LP,null,"LP")},
+gZ9:function(){return new P.Ip(this,P.JI.prototype.LP,null,"LP")},
 $asyU:null,
 $asMO:null,
-static:{"":"vi,HC,fw",}},WV:{"":"a;nL<,QC<,iE@,SJ@",
-tA:function(){return this.QC.call$0()},
+static:{"":"HO,HC,fw",}},WV:{"":"a;nL<,QC<,iE@,SJ@",
 gP4:function(){return(this.Gv&2)!==0},
 SL:function(){var z=this.Ip
 if(z!=null)return z
@@ -11276,7 +11105,7 @@
 a.siE(a)},
 ET:function(a){var z,y,x,w
 if((this.Gv&4)!==0)throw H.b(new P.lj("Subscribing to closed stream"))
-z=H.ip(this,"WV",0)
+z=H.W8(this,"WV",0)
 y=$.X3
 x=a?1:0
 w=new P.JI(null,null,null,this,null,null,null,y,x,null,null)
@@ -11298,11 +11127,10 @@
 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)},
-ght:function(a){return new J.C7(this,P.WV.prototype.h,a,"h")},
+ght:function(a){return new P.C7(this,P.WV.prototype.h,a,"h")},
 zw:function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-if(b!=null)P.uh(a,b)
 this.pb(a,b)},
-gXB:function(){return new P.CQ(this,P.WV.prototype.zw,null,"zw")},
+gGj:function(){return new P.CQ(this,P.WV.prototype.zw,null,"zw")},
 cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -11311,14 +11139,13 @@
 y=this.SL()
 this.SY()
 return y},
-gJK:function(a){return new H.MT(this,P.WV.prototype.cO,a,"cO")},
 Rg:function(a){this.Iv(a)},
-oJ:function(a,b){this.pb(a,b)},
+V8:function(a,b){this.pb(a,b)},
 Qj:function(){var z=this.AN
 this.AN=null
 this.Gv=(this.Gv&4294967287)>>>0
 C.jN.tZ(z)},
-Qz:function(a){var z,y,x,w
+nE:function(a){var z,y,x,w
 z=this.Gv
 if((z&2)!==0)throw H.b(new P.lj("Cannot fire new event. Controller is already firing an event"))
 if(this.iE===this)return
@@ -11341,10 +11168,10 @@
 Of:function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
 P.ot(this.QC)}},dz:{"":"WV;nL,QC,Gv,iE,SJ,AN,Ip",
 Iv:function(a){if(this.iE===this)return
-this.Qz(new P.tK(this,a))},
+this.nE(new P.tK(this,a))},
 pb:function(a,b){if(this.iE===this)return
-this.Qz(new P.OR(this,a,b))},
-SY:function(){if(this.iE!==this)this.Qz(new P.Bg(this))
+this.nE(new P.OR(this,a,b))},
+SY:function(){if(this.iE!==this)this.nE(new P.Bg(this))
 else this.Ip.OH(null)},
 $asWV:null},tK:{"":"Tp;a,b",
 call$1:function(a){a.Rg(this.b)},
@@ -11352,7 +11179,7 @@
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},OR:{"":"Tp;a,b,c",
-call$1:function(a){a.oJ(this.b,this.c)},
+call$1:function(a){a.V8(this.b,this.c)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
@@ -11374,9 +11201,7 @@
 $asWV:null},b8:{"":"a;",$isb8:true},j7:{"":"Tp;a",
 call$1:function(a){var z=this.a
 if(z.b!=null){z.b=null
-z=z.a.MM
-if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
-z.CG(a,null)}return},
+z.a.pm(a)}return},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
@@ -11397,17 +11222,17 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},TP:{"":"a;",
-gv6:function(a){return new P.P0(this,P.TP.prototype.oo,a,"oo")},
-gYJ:function(){return new P.CQ(this,P.TP.prototype.w0,null,"w0")}},Zf:{"":"TP;MM",
+$is_Dv:true},TP:{"":"a;"},Zf:{"":"TP;MM",
 oo:function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
 z.OH(b)},
 tZ:function(a){return this.oo(a,null)},
-gv6:function(a){return new P.P0(this,P.Zf.prototype.oo,a,"oo")},
-w0:function(a,b){var z=this.MM
+w0:function(a,b){var z
+if(a==null)throw H.b(new P.AT("Error must not be null"))
+z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
 z.CG(a,b)},
+pm:function(a){return this.w0(a,null)},
 gYJ:function(){return new P.CQ(this,P.Zf.prototype.w0,null,"w0")},
 $asTP:null},vs:{"":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -11428,7 +11253,7 @@
 this.au(z)
 return z},
 OA:function(a){return this.co(a,null)},
-wM:function(a){var z=P.X4(a,H.ip(this,"vs",0))
+wM:function(a){var z=P.X4(a,H.W8(this,"vs",0))
 this.au(z)
 return z},
 gDL:function(){return this.jk},
@@ -11451,13 +11276,11 @@
 return}y=this.L3()
 this.Am(a)
 P.HZ(this,y)},
-K5:function(a,b){var z
-if(b!=null)P.uh(a,b)
-z=this.Gv===2?null:this.L3()
+K5:function(a,b){var z=this.L3()
 this.E6(a,b)
 P.HZ(this,z)},
 Lp:function(a){return this.K5(a,null)},
-giO:function(){return new P.CQ(this,P.vs.prototype.K5,null,"K5")},
+gbY:function(){return new P.CQ(this,P.vs.prototype.K5,null,"K5")},
 OH:function(a){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.rH(this,a))},
@@ -11467,7 +11290,7 @@
 L7:function(a,b){this.OH(a)},
 $isvs:true,
 $isb8:true,
-static:{"":"ew,Ry,ma,oN,NK",Dt:function(a){var z=new P.vs(0,$.X3,null,null,null,null,null,null)
+static:{"":"Gn,Ry,cp,oN,NK",Dt:function(a){var z=new P.vs(0,$.X3,null,null,null,null,null,null)
 H.VM(z,[a])
 return z},Ab:function(a,b){var z=new P.vs(0,$.X3,null,null,null,null,null,null)
 H.VM(z,[b])
@@ -11488,7 +11311,7 @@
 z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isvs)if(a.Gv>=4)P.HZ(a,b)
 else a.au(b)
-else a.Rx(new P.xw(b),new P.dm(b))},HW:function(a,b){var z
+else a.Rx(new P.xw(b),new P.dm(b))},yE:function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
@@ -11502,7 +11325,7 @@
 if(x&&b==null){w=z.e.gcG()
 z.e.gLj().hk(J.w8(w),w.gI4())
 return}if(b==null)return
-if(b.gBQ()!=null){P.HW(z.e,b)
+if(b.gBQ()!=null){P.yE(z.e,b)
 return}if(x&&!z.e.gLj().fC(b.gLj())){w=z.e.gcG()
 z.e.gLj().hk(J.w8(w),w.gI4())
 return}v=$.X3
@@ -11581,7 +11404,7 @@
 q=z.a
 p=J.x(q)
 if(typeof q==="object"&&q!==null&&!!p.$isb8){r.swG(!0)
-z.a.Rx(new P.wB(this.c,r),new P.Gv(z,r))
+z.a.Rx(new P.wB(this.c,r),new P.Pu(z,r))
 this.b.d=!0}}}catch(o){z=H.Ru(o)
 t=z
 s=new H.XO(o,null)
@@ -11591,7 +11414,7 @@
 z=r}else z=!1
 r=this.b
 if(z)r.c=this.c.e.gcG()
-else r.c=new P.Ca(P.qK(t,s),s)
+else r.c=new P.Ca(t,s)
 this.b.b=!1}},
 "+call:0:0":0,
 $isEH:true,
@@ -11600,7 +11423,7 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Gv:{"":"Tp;a,h",
+$is_Dv:true},Pu:{"":"Tp;a,h",
 call$2:function(a,b){var z,y,x
 z=this.a
 y=z.a
@@ -11616,10 +11439,10 @@
 $is_HB:true,
 $is_Dv:true},qh:{"":"a;",
 ev:function(a,b){var z=new P.nO(b,this)
-H.VM(z,[H.ip(this,"qh",0)])
+H.VM(z,[H.W8(this,"qh",0)])
 return z},
 ez:function(a,b){var z=new P.t3(b,this)
-H.VM(z,[H.ip(this,"qh",0),null])
+H.VM(z,[H.W8(this,"qh",0),null])
 return z},
 zV:function(a,b){var z,y,x
 z={}
@@ -11627,75 +11450,71 @@
 x=P.p9("")
 z.a=null
 z.b=!0
-z.a=this.X5(new P.Lp(z,this,b,y,x),!0,new P.QC(y,x),new P.Rv(y))
+z.a=this.KR(new P.QC(z,this,b,y,x),!0,new P.Rv(y,x),new P.Yl(y))
 return y},
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(J.yE)
+y=P.Dt(J.kn)
 z.a=null
-z.a=this.X5(new P.YJ(z,this,b,y),!0,new P.DO(y),y.giO())
+z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gbY())
 return y},
 aN:function(a,b){var z,y
 z={}
 y=P.Dt(null)
 z.a=null
-z.a=this.X5(new P.lz(z,this,b,y),!0,new P.M4(y),y.giO())
+z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(J.yE)
+y=P.Dt(J.kn)
 z.a=null
-z.a=this.X5(new P.Jp(z,this,b,y),!0,new P.eN(y),y.giO())
+z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
 return y},
 gB:function(a){var z,y
 z={}
-y=P.Dt(J.im)
+y=new P.vs(0,$.X3,null,null,null,null,null,null)
+y.$builtinTypeInfo=[J.im]
 z.a=0
-this.X5(new P.B5(z),!0,new P.PI(z,y),y.giO())
+this.KR(new P.B5(z),!0,new P.PI(z,y),y.gbY())
 return y},
 "+length":0,
 gl0:function(a){var z,y
 z={}
-y=P.Dt(J.yE)
+y=P.Dt(J.kn)
 z.a=null
-z.a=this.X5(new P.j4(z,y),!0,new P.i9(y),y.giO())
+z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gbY())
 return y},
 "+isEmpty":0,
 br:function(a){var z,y
 z=[]
-y=P.Dt([J.Q,H.ip(this,"qh",0)])
-this.X5(new P.VV(this,z),!0,new P.Dy(z,y),y.giO())
+H.VM(z,[H.W8(this,"qh",0)])
+y=P.Dt([J.Q,H.W8(this,"qh",0)])
+this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
 return y},
+eR:function(a,b){return P.eF(this,b,null)},
 gFV:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"qh",0))
+y=P.Dt(H.W8(this,"qh",0))
 z.a=null
-z.a=this.X5(new P.lU(z,this,y),!0,new P.xp(y),y.giO())
+z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gbY())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"qh",0))
+y=P.Dt(H.W8(this,"qh",0))
 z.a=null
 z.b=!1
-this.X5(new P.UH(z,this),!0,new P.Z5(z,y),y.giO())
+this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gbY())
 return y},
-KJ:function(a,b,c){var z,y
-z={}
-y=P.Dt(null)
-z.a=null
-z.a=this.X5(new P.Om(z,this,b,y),!0,new P.Yd(c,y),y.giO())
-return y},
-XG:function(a,b){return this.KJ(a,b,null)},
 Zv:function(a,b){var z,y,x
 z={}
 z.a=b
 y=z.a
 if(typeof y!=="number"||Math.floor(y)!==y||J.u6(y,0))throw H.b(new P.AT(z.a))
-x=P.Dt(H.ip(this,"qh",0))
+x=P.Dt(H.W8(this,"qh",0))
 z.b=null
-z.b=this.X5(new P.qC(z,this,x),!0,new P.j5(z,x),x.giO())
+z.b=this.KR(new P.ii(z,this,x),!0,new P.ib(z,x),x.gbY())
 return x},
-$isqh:true},Lp:{"":"Tp;a,b,c,d,e",
+$isqh:true},QC:{"":"Tp;a,b,c,d,e",
 call$1:function(a){var z,y,x,w,v
 x=this.a
 if(!x.b)this.e.KF(this.c)
@@ -11703,16 +11522,16 @@
 try{this.e.KF(a)}catch(w){v=H.Ru(w)
 z=v
 y=new H.XO(w,null)
-P.NX(x.a,this.d,P.qK(z,y),y)}},
+P.NX(x.a,this.d,z,y)}},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Rv:{"":"Tp;f",
+$is_Dv:true},Yl:{"":"Tp;f",
 call$1:function(a){this.f.Lp(a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},QC:{"":"Tp;g,h",
+$is_Dv:true},Rv:{"":"Tp;g,h",
 call$0:function(){this.g.rX(this.h.vM)},
 "+call:0:0":0,
 $isEH:true,
@@ -11826,42 +11645,18 @@
 return}this.c.Lp(new P.lj("No elements"))},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},Om:{"":"Tp;a,b,c,d",
-call$1:function(a){var z,y
-z=this.a
-y=this.d
-P.FE(new P.Sq(this.c,a),new P.KU(z,y,a),P.TB(z.a,y))},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},Sq:{"":"Tp;e,f",
-call$0:function(){return this.e.call$1(this.f)},
-"+call:0:0":0,
-$isEH:true,
-$is_X0:true},KU:{"":"Tp;a,g,h",
-call$1:function(a){if(a===!0)P.Bb(this.a.a,this.g,this.h)},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},Yd:{"":"Tp;i,j",
-call$0:function(){this.j.Lp(new P.lj("firstMatch ended without match"))},
-"+call:0:0":0,
-$isEH:true,
-$is_X0:true},qC:{"":"Tp;a,b,c",
+$is_X0:true},ii:{"":"Tp;a,b,c",
 call$1:function(a){var z=this.a
 if(J.xC(z.a,0)){P.Bb(z.b,this.c,a)
 return}z.a=J.xH(z.a,1)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},j5:{"":"Tp;a,d",
+$is_Dv:true},ib:{"":"Tp;a,d",
 call$0:function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true},MO:{"":"a;",$isMO:true},ms:{"":"a;",
-uO:function(){return this.gp4().call$0()},
-LP:function(){return this.gZ9().call$0()},
-tA:function(){return this.gQC().call$0()},
 gh6:function(){if((this.Gv&8)===0)return this.iP
 return this.iP.gjy()},
 kW:function(){if((this.Gv&8)===0){if(this.iP==null)this.iP=new P.ny(null,null,0)
@@ -11875,10 +11670,6 @@
 if((this.Gv&2)!==0)this.Ip.rX(null)}return this.Ip},
 h:function(a,b){if(this.Gv>=4)throw H.b(this.BW())
 this.Rg(b)},
-ght:function(a){return new J.C7(this,P.ms.prototype.h,a,"h")},
-zw:function(a,b){if(this.Gv>=4)throw H.b(this.BW())
-this.oJ(a,b)},
-gXB:function(){return new P.CQ(this,P.ms.prototype.zw,null,"zw")},
 cO:function(a){var z=this.Gv
 if((z&4)!==0)return this.Ip
 if(z>=4)throw H.b(this.BW())
@@ -11888,15 +11679,14 @@
 if((z&1)!==0)this.SY()
 else if((z&3)===0){z=this.kW()
 z.h(z,C.Wj)}return this.Ip},
-gJK:function(a){return new H.MT(this,P.ms.prototype.cO,a,"cO")},
 Rg:function(a){var z,y
 z=this.Gv
 if((z&1)!==0)this.Iv(a)
 else if((z&3)===0){z=this.kW()
 y=new P.LV(a,null)
-H.VM(y,[H.ip(this,"ms",0)])
+H.VM(y,[H.W8(this,"ms",0)])
 z.h(z,y)}},
-oJ:function(a,b){var z=this.Gv
+V8:function(a,b){var z=this.Gv
 if((z&1)!==0)this.pb(a,b)
 else if((z&3)===0){z=this.kW()
 z.h(z,new P.DS(a,b,null))}},
@@ -11904,7 +11694,7 @@
 this.iP=z.gjy()
 this.Gv=(this.Gv&4294967287)>>>0
 z.tZ(z)},
-ET:function(a){var z,y,x,w
+ET:function(a){var z,y,x,w,v
 if((this.Gv&3)!==0)throw H.b(new P.lj("Stream has already been listened to."))
 z=$.X3
 y=a?1:0
@@ -11912,8 +11702,9 @@
 H.VM(x,[null])
 w=this.gh6()
 this.Gv=(this.Gv|1)>>>0
-if((this.Gv&8)!==0)this.iP.sjy(x)
-else this.iP=x
+if((this.Gv&8)!==0){v=this.iP
+v.sjy(x)
+v.QE()}else this.iP=x
 x.WN(w)
 x.J7(new P.UO(this))
 return x},
@@ -11941,23 +11732,17 @@
 $isEH:true,
 $is_X0:true},vp:{"":"a;",
 Iv:function(a){this.ghG().Rg(a)},
-pb:function(a,b){this.ghG().oJ(a,b)},
-SY:function(){this.ghG().Qj()}},of:{"":"a;",
+pb:function(a,b){this.ghG().V8(a,b)},
+SY:function(){this.ghG().Qj()}},lk:{"":"a;",
 Iv:function(a){var z,y
 z=this.ghG()
 y=new P.LV(a,null)
 H.VM(y,[null])
 z.w6(y)},
 pb:function(a,b){this.ghG().w6(new P.DS(a,b,null))},
-SY:function(){this.ghG().w6(C.Wj)}},q1:{"":"rK;nL<,p4<,Z9<,QC<,iP,Gv,Ip",
-uO:function(){return this.p4.call$0()},
-LP:function(){return this.Z9.call$0()},
-tA:function(){return this.QC.call$0()}},rK:{"":"ms+of;",$asms:null},ly:{"":"QW;nL<,p4<,Z9<,QC<,iP,Gv,Ip",
-uO:function(){return this.p4.call$0()},
-LP:function(){return this.Z9.call$0()},
-tA:function(){return this.QC.call$0()}},QW:{"":"ms+vp;",$asms:null},O9:{"":"ez;Y8<",
+SY:function(){this.ghG().w6(C.Wj)}},Gh:{"":"XB;nL<,p4<,Z9<,QC<,iP,Gv,Ip"},XB:{"":"ms+lk;",$asms:null},ly:{"":"cK;nL<,p4<,Z9<,QC<,iP,Gv,Ip"},cK:{"":"ms+vp;",$asms:null},O9:{"":"ez;Y8",
 w4:function(a){return this.Y8.ET(a)},
-gEo:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
+giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
 n:function(a,b){var z
 if(b==null)return!1
 if(this===b)return!0
@@ -11968,11 +11753,11 @@
 $asez:null,
 $asqh:null},yU:{"":"KA;Y8<,dB,o7,Bd,Lj,Gv,lz,Ri",
 tA:function(){return this.gY8().j0(this)},
-gQC:function(){return new H.Ip(this,P.yU.prototype.tA,null,"tA")},
+gQC:function(){return new P.Ip(this,P.yU.prototype.tA,null,"tA")},
 uO:function(){this.gY8().mO(this)},
-gp4:function(){return new H.Ip(this,P.yU.prototype.uO,null,"uO")},
+gp4:function(){return new P.Ip(this,P.yU.prototype.uO,null,"uO")},
 LP:function(){this.gY8().m4(this)},
-gZ9:function(){return new H.Ip(this,P.yU.prototype.LP,null,"LP")},
+gZ9:function(){return new P.Ip(this,P.yU.prototype.LP,null,"LP")},
 $asKA:null,
 $asMO:null},nP:{"":"a;"},KA:{"":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
 WN:function(a){if(a==null)return
@@ -11982,14 +11767,14 @@
 fe:function(a){this.dB=$.X3.cR(a)},
 fm:function(a,b){if(b==null)b=P.AY
 this.o7=P.VH(b,$.X3)},
-y5:function(a){if(a==null)a=P.No
+pE:function(a){if(a==null)a=P.No
 this.Bd=$.X3.Al(a)},
-Fv:function(a,b){var z=this.Gv
+nB:function(a,b){var z=this.Gv
 if((z&8)!==0)return
 this.Gv=(z+128|4)>>>0
 if(z<128&&this.Ri!=null)this.Ri.FK()
 if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},
-yy:function(a){return this.Fv(a,null)},
+yy:function(a){return this.nB(a,null)},
 QE:function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){this.Gv=z-128
@@ -12016,7 +11801,7 @@
 else{z=new P.LV(a,null)
 H.VM(z,[null])
 this.w6(z)}},
-oJ:function(a,b){var z=this.Gv
+V8:function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.pb(a,b)
 else this.w6(new P.DS(a,b,null))},
@@ -12026,11 +11811,11 @@
 if(this.Gv<32)this.SY()
 else this.w6(C.Wj)},
 uO:function(){},
-gp4:function(){return new H.Ip(this,P.KA.prototype.uO,null,"uO")},
+gp4:function(){return new P.Ip(this,P.KA.prototype.uO,null,"uO")},
 LP:function(){},
-gZ9:function(){return new H.Ip(this,P.KA.prototype.LP,null,"LP")},
+gZ9:function(){return new P.Ip(this,P.KA.prototype.LP,null,"LP")},
 tA:function(){},
-gQC:function(){return new H.Ip(this,P.KA.prototype.tA,null,"tA")},
+gQC:function(){return new P.Ip(this,P.KA.prototype.tA,null,"tA")},
 w6:function(a){var z,y
 z=this.Ri
 if(z==null){z=new P.ny(null,null,0)
@@ -12080,7 +11865,7 @@
 this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
 if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
-static:{"":"ry,bG,Q9,QU,na,lk,mN,GC,L3",}},Vo:{"":"Tp;a,b,c",
+static:{"":"ry,bG,Q9,QU,yJ,F2,yo,GC,L3",}},Vo:{"":"Tp;a,b,c",
 call$0:function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
@@ -12106,15 +11891,15 @@
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true},ez:{"":"qh;",
-X5:function(a,b,c,d){var z=this.w4(!0===b)
+KR:function(a,b,c,d){var z=this.w4(!0===b)
 z.fe(a)
 z.fm(z,d)
-z.y5(c)
+z.pE(c)
 return z},
-zC:function(a,b,c){return this.X5(a,null,b,c)},
-yI:function(a){return this.X5(a,null,null,null)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 w4:function(a){var z,y,x
-z=H.ip(this,"ez",0)
+z=H.W8(this,"ez",0)
 y=$.X3
 x=a?1:0
 x=new P.KA(null,null,null,y,x,null,null)
@@ -12125,7 +11910,7 @@
 $asqh:null},fI:{"":"a;LD@"},LV:{"":"fI;P>,LD",
 r6:function(a,b){return this.P.call$1(b)},
 pP:function(a){a.Iv(this.P)}},DS:{"":"fI;kc>,I4<,LD",
-pP:function(a){a.pb(this.kc,this.I4)}},yR:{"":"a;",
+pP:function(a){a.pb(this.kc,this.I4)}},dp:{"":"a;",
 pP:function(a){a.SY()},
 gLD:function(){return},
 sLD:function(a){throw H.b(new P.lj("No events after a done."))}},B3:{"":"a;",
@@ -12150,11 +11935,10 @@
 if(z==null){this.N6=b
 this.zR=b}else{z.sLD(b)
 this.N6=b}},
-ght:function(a){return new J.C7(this,P.ny.prototype.h,a,"h")},
 TO:function(a){var z=this.zR
 this.zR=z.gLD()
 if(this.zR==null)this.N6=null
-z.pP(a)}},v1:{"":"Tp;a,b,c",
+z.pP(a)}},dR:{"":"Tp;a,b,c",
 call$0:function(){return this.a.K5(this.b,this.c)},
 "+call:0:0":0,
 $isEH:true,
@@ -12167,43 +11951,37 @@
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true},YR:{"":"qh;",
-X5:function(a,b,c,d){var z=P.zK(this,!0===b,H.ip(this,"YR",0),H.ip(this,"YR",1))
+KR:function(a,b,c,d){var z=P.zK(this,!0===b,H.W8(this,"YR",0),H.W8(this,"YR",1))
 z.fe(a)
 z.fm(z,d)
-z.y5(c)
+z.pE(c)
 return z},
-zC:function(a,b,c){return this.X5(a,null,b,c)},
-yI:function(a){return this.X5(a,null,null,null)},
-w4:function(a){return P.zK(this,a,H.ip(this,"YR",0),H.ip(this,"YR",1))},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 Ml:function(a,b){b.Rg(a)},
-gOa:function(){return new P.eO(this,P.YR.prototype.Ml,null,"Ml")},
-B2:function(a,b,c){c.oJ(a,b)},
-gRE:function(){return new P.Dw(this,P.YR.prototype.B2,null,"B2")},
-Eq:function(a){a.Qj()},
-gH1:function(){return new H.Pm(this,P.YR.prototype.Eq,null,"Eq")},
-$asqh:function(a,b){return[b]}},fB:{"":"KA;UY,hG<,dB,o7,Bd,Lj,Gv,lz,Ri",
+$asqh:function(a,b){return[b]}},fB:{"":"KA;UY,hG,dB,o7,Bd,Lj,Gv,lz,Ri",
 Rg:function(a){if((this.Gv&2)!==0)return
 P.KA.prototype.Rg.call(this,a)},
-oJ:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.oJ.call(this,a,b)},
+V8:function(a,b){if((this.Gv&2)!==0)return
+P.KA.prototype.V8.call(this,a,b)},
 uO:function(){var z=this.hG
 if(z==null)return
 z.yy(z)},
-gp4:function(){return new H.Ip(this,P.fB.prototype.uO,null,"uO")},
+gp4:function(){return new P.Ip(this,P.fB.prototype.uO,null,"uO")},
 LP:function(){var z=this.hG
 if(z==null)return
 z.QE()},
-gZ9:function(){return new H.Ip(this,P.fB.prototype.LP,null,"LP")},
+gZ9:function(){return new P.Ip(this,P.fB.prototype.LP,null,"LP")},
 tA:function(){var z=this.hG
 if(z!=null){this.hG=null
-z.ed()}},
-gQC:function(){return new H.Ip(this,P.fB.prototype.tA,null,"tA")},
+z.ed()}return},
+gQC:function(){return new P.Ip(this,P.fB.prototype.tA,null,"tA")},
 vx:function(a){this.UY.Ml(a,this)},
 gOa:function(){return new H.Pm(this,P.fB.prototype.vx,null,"vx")},
-xL:function(a,b){this.oJ(a,b)},
+xL:function(a,b){this.V8(a,b)},
 gRE:function(){return new P.eO(this,P.fB.prototype.xL,null,"xL")},
 fE:function(){this.Qj()},
-gH1:function(){return new H.Ip(this,P.fB.prototype.fE,null,"fE")},
+gH1:function(){return new P.Ip(this,P.fB.prototype.fE,null,"fE")},
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -12216,16 +11994,15 @@
 y=new P.fB(a,null,null,null,null,z,y,null,null)
 H.VM(y,[c,d])
 y.S8(a,b,c,d)
-return y}}},nO:{"":"YR;me,Sb",
-Dr:function(a){return this.me.call$1(a)},
+return y}}},nO:{"":"YR;qs,Sb",
+Dr:function(a){return this.qs.call$1(a)},
 Ml:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.Dr(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-b.oJ(P.qK(y,x),x)
+b.V8(y,x)
 return}if(z===!0)b.Rg(a)},
-gOa:function(){return new P.eO(this,P.nO.prototype.Ml,null,"Ml")},
 $asYR:function(a){return[a,a]},
 $asqh:null},t3:{"":"YR;TN,Sb",
 kn:function(a){return this.TN.call$1(a)},
@@ -12234,15 +12011,22 @@
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-b.oJ(P.qK(y,x),x)
+b.V8(y,x)
 return}b.Rg(z)},
-gOa:function(){return new P.eO(this,P.t3.prototype.Ml,null,"Ml")},
 $asYR:null,
-$asqh:function(a,b){return[b]}},dX:{"":"a;"},aY:{"":"a;"},yQ:{"":"a;E2<,cP<,vo<,eo<,Ka<,Xp<,fb<,rb<,Vd<,Zq<,rF,JS>,iq<",
+$asqh:function(a,b){return[b]}},dq:{"":"YR;Em,Sb",
+Ml:function(a,b){var z=this.Em
+if(z>0){this.Em=z-1
+return}b.Rg(a)},
+U6:function(a,b,c){if(b<0)throw H.b(new P.AT(b))},
+$asYR:function(a){return[a,a]},
+$asqh:null,
+static:{eF:function(a,b,c){var z=new P.dq(b,a)
+H.VM(z,[c])
+z.U6(a,b,c)
+return z}}},dX:{"":"a;"},aY:{"":"a;"},wJ:{"":"a;E2<,cP<,vo<,eo<,Ka<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
 hk:function(a,b){return this.E2.call$2(a,b)},
 Gr:function(a){return this.cP.call$1(a)},
-FI:function(a,b){return this.vo.call$2(a,b)},
-mg:function(a,b,c){return this.eo.call$3(a,b,c)},
 Al:function(a){return this.Ka.call$1(a)},
 cR:function(a){return this.Xp.call$1(a)},
 O8:function(a){return this.fb.call$1(a)},
@@ -12251,74 +12035,56 @@
 kG:function(a,b){return this.Zq.call$2(a,b)},
 Ch:function(a,b){return this.JS.call$1(b)},
 iT:function(a){return this.iq.call$1$specification(a)},
-$isyQ:true},e4:{"":"a;"},JB:{"":"a;"},Id:{"":"a;nU",
+$iswJ:true},e4:{"":"a;"},JB:{"":"a;"},Id:{"":"a;nU",
 gLj:function(){return this.nU},
 x5:function(a,b,c){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().gE2()==null;)z=y.geT(z)
 return z.gtp().gE2().call$5(z,new P.Id(y.geT(z)),a,b,c)},
-gE2:function(){return new P.Dw(this,P.Id.prototype.x5,null,"x5")},
 Vn:function(a,b){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().gcP()==null;)z=y.geT(z)
 return z.gtp().gcP().call$4(z,new P.Id(y.geT(z)),a,b)},
-gcP:function(){return new P.eO(this,P.Id.prototype.Vn,null,"Vn")},
 qG:function(a,b,c){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().gvo()==null;)z=y.geT(z)
 return z.gtp().gvo().call$5(z,new P.Id(y.geT(z)),a,b,c)},
-gvo:function(){return new P.Dw(this,P.Id.prototype.qG,null,"qG")},
 nA:function(a,b,c,d){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().geo()==null;)z=y.geT(z)
 return z.gtp().geo().call$6(z,new P.Id(y.geT(z)),a,b,c,d)},
-geo:function(){return new P.cP(this,P.Id.prototype.nA,null,"nA")},
 TE:function(a,b){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().gKa()==null;)z=y.geT(z)
 return z.gtp().gKa().call$4(z,new P.Id(y.geT(z)),a,b)},
 "+registerCallback:2:0":0,
-gKa:function(){return new P.eO(this,P.Id.prototype.TE,null,"TE")},
 xO:function(a,b){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().gXp()==null;)z=y.geT(z)
 return z.gtp().gXp().call$4(z,new P.Id(y.geT(z)),a,b)},
-gXp:function(){return new P.eO(this,P.Id.prototype.xO,null,"xO")},
 P6:function(a,b){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().gfb()==null;)z=y.geT(z)
 return z.gtp().gfb().call$4(z,new P.Id(y.geT(z)),a,b)},
-gfb:function(){return new P.eO(this,P.Id.prototype.P6,null,"P6")},
-RK:function(a,b){var z,y,x,w
+RK:function(a,b){var z,y
 z=this.nU
-while(!0){if(z.gtp().grb()==null){z.gtp().gVd()
-y=!0}else y=!1
-x=J.RE(z)
-if(!y)break
-z=x.geT(z)}y=x.geT(z)
-w=z.gtp().grb()
-if(w==null)w=z.gtp().gVd()
-w.call$4(z,new P.Id(y),a,b)},
-grb:function(){return new P.eO(this,P.Id.prototype.RK,null,"RK")},
-Ed:function(a,b){this.RK(a,b.call$0())},
-gVd:function(){return new P.eO(this,P.Id.prototype.Ed,null,"Ed")},
+for(;y=J.RE(z),z.gtp().grb()==null;)z=y.geT(z)
+y=y.geT(z)
+z.gtp().grb().call$4(z,new P.Id(y),a,b)},
 B7:function(a,b,c){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().gZq()==null;)z=y.geT(z)
 return z.gtp().gZq().call$5(z,new P.Id(y.geT(z)),a,b,c)},
-gZq:function(){return new P.Dw(this,P.Id.prototype.B7,null,"B7")},
 RB:function(a,b,c){var z,y,x
 z=this.nU
 for(;y=z.gtp(),x=J.RE(z),y.gJS(y)==null;)z=x.geT(z)
 y=z.gtp()
 y.gJS(y).call$4(z,new P.Id(x.geT(z)),b,c)},
-gJS:function(a){return new P.SV(this,P.Id.prototype.RB,a,"RB")},
 ld:function(a,b,c){var z,y
 z=this.nU
 for(;y=J.RE(z),z.gtp().giq()==null;)z=y.geT(z)
 y=y.geT(z)
-return z.gtp().giq().call$5(z,new P.Id(y),a,b,c)},
-giq:function(){return new P.Dw(this,P.Id.prototype.ld,null,"ld")}},fZ:{"":"a;",
+return z.gtp().giq().call$5(z,new P.Id(y),a,b,c)}},fZ:{"":"a;",
 fC:function(a){return this.gC5()===a.gC5()},
 bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
@@ -12340,14 +12106,14 @@
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},
+else return new P.Xz(this,z)},
 oj:function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
 else return new P.Hs(this,z)}},TF:{"":"Tp;a,b",
 call$0:function(){return this.a.bH(this.b)},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},K5:{"":"Tp;c,d",
+$is_X0:true},Xz:{"":"Tp;c,d",
 call$0:function(){return this.c.Gr(this.d)},
 "+call:0:0":0,
 $isEH:true,
@@ -12372,49 +12138,37 @@
 return},
 "+[]:1:0":0,
 hk:function(a,b){return new P.Id(this).x5(this,a,b)},
-gE2:function(){return new P.eO(this,P.uo.prototype.hk,null,"hk")},
 uI:function(a,b){return new P.Id(this).ld(this,a,b)},
 iT:function(a){return this.uI(a,null)},
-giq:function(){return new P.bq(this,P.uo.prototype.uI,null,"uI")},
 Gr:function(a){return new P.Id(this).Vn(this,a)},
-gcP:function(){return new H.Pm(this,P.uo.prototype.Gr,null,"Gr")},
 FI:function(a,b){return new P.Id(this).qG(this,a,b)},
-gvo:function(){return new P.eO(this,P.uo.prototype.FI,null,"FI")},
 mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
-geo:function(){return new P.Dw(this,P.uo.prototype.mg,null,"mg")},
 Al:function(a){return new P.Id(this).TE(this,a)},
 "+registerCallback:1:0":0,
-gKa:function(){return new H.Pm(this,P.uo.prototype.Al,null,"Al")},
 cR:function(a){return new P.Id(this).xO(this,a)},
-gXp:function(){return new H.Pm(this,P.uo.prototype.cR,null,"cR")},
 O8:function(a){return new P.Id(this).P6(this,a)},
-gfb:function(){return new H.Pm(this,P.uo.prototype.O8,null,"O8")},
 wr:function(a){new P.Id(this).RK(this,a)},
-grb:function(){return new H.Pm(this,P.uo.prototype.wr,null,"wr")},
-EW:function(a){new P.Id(this).RK(this,a)},
-gVd:function(){return new H.Pm(this,P.uo.prototype.EW,null,"EW")},
 kG:function(a,b){return new P.Id(this).B7(this,a,b)},
-gZq:function(){return new P.eO(this,P.uo.prototype.kG,null,"kG")},
 Ch:function(a,b){var z=new P.Id(this)
-z.RB(z,this,b)},
-gJS:function(a){return new J.C7(this,P.uo.prototype.Ch,a,"Ch")}},pK:{"":"Tp;a,b",
+z.RB(z,this,b)}},pK:{"":"Tp;a,b",
 call$0:function(){P.IA(new P.eM(this.a,this.b))},
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true},eM:{"":"Tp;c,d",
-call$0:function(){var z,y
+call$0:function(){var z,y,x
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
-if(y==null)y=P.XS(z)
-P.uh(z,null)
+if(y==null){x=J.x(z)
+x=typeof z==="object"&&z!==null&&!!x.$isGe}else x=!1
+if(x)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true},Ue:{"":"Tp;a",
 call$2:function(a,b){var z
-if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
+if(a==null)throw H.b(P.u("ZoneValue key must not be null"))
 z=this.a
 z.u(z,a,b)},
 "+call:2:0":0,
@@ -12424,10 +12178,8 @@
 hk:function(a,b){return this.gE2().call$2(a,b)},
 gcP:function(){return P.AI},
 Gr:function(a){return this.gcP().call$1(a)},
-gvo:function(){return P.Un},
-FI:function(a,b){return this.gvo().call$2(a,b)},
+gvo:function(){return P.MM},
 geo:function(){return P.C9},
-mg:function(a,b,c){return this.geo().call$3(a,b,c)},
 gKa:function(){return P.Qk},
 "+registerCallback":0,
 Al:function(a){return this.gKa().call$1(a)},
@@ -12438,13 +12190,12 @@
 grb:function(){return P.G2},
 wr:function(a){return this.grb().call$1(a)},
 RK:function(a,b){return this.grb().call$2(a,b)},
-gVd:function(){return},
 gZq:function(){return P.KF},
 kG:function(a,b){return this.gZq().call$2(a,b)},
 gJS:function(a){return P.ZB},
 Ch:function(a,b){return this.gJS(a).call$1(b)},
 giq:function(){return P.LS},
-iT:function(a){return this.giq().call$1$specification(a)}},MA:{"":"fZ;",
+iT:function(a){return this.giq().call$1$specification(a)}},R8:{"":"fZ;",
 geT:function(a){return},
 gtp:function(){return C.v8},
 gC5:function(){return this},
@@ -12452,42 +12203,31 @@
 t:function(a,b){return},
 "+[]:1:0":0,
 hk:function(a,b){return P.L2(this,null,this,a,b)},
-gE2:function(){return new P.eO(this,P.MA.prototype.hk,null,"hk")},
 uI:function(a,b){return P.qc(this,null,this,a,b)},
 iT:function(a){return this.uI(a,null)},
-giq:function(){return new P.bq(this,P.MA.prototype.uI,null,"uI")},
 Gr:function(a){return P.T8(this,null,this,a)},
-gcP:function(){return new H.Pm(this,P.MA.prototype.Gr,null,"Gr")},
-FI:function(a,b){return P.yv(this,null,this,a,b)},
-gvo:function(){return new P.eO(this,P.MA.prototype.FI,null,"FI")},
+FI:function(a,b){return P.V7(this,null,this,a,b)},
 mg:function(a,b,c){return P.Qx(this,null,this,a,b,c)},
-geo:function(){return new P.Dw(this,P.MA.prototype.mg,null,"mg")},
 Al:function(a){return a},
 "+registerCallback:1:0":0,
-gKa:function(){return new H.Pm(this,P.MA.prototype.Al,null,"Al")},
 cR:function(a){return a},
-gXp:function(){return new H.Pm(this,P.MA.prototype.cR,null,"cR")},
 O8:function(a){return a},
-gfb:function(){return new H.Pm(this,P.MA.prototype.O8,null,"O8")},
 wr:function(a){P.IA(a)},
-grb:function(){return new H.Pm(this,P.MA.prototype.wr,null,"wr")},
-EW:function(a){P.IA(a)},
-gVd:function(){return new H.Pm(this,P.MA.prototype.EW,null,"EW")},
 kG:function(a,b){return P.jL(a,b)},
-gZq:function(){return new P.eO(this,P.MA.prototype.kG,null,"kG")},
 Ch:function(a,b){H.LJ(b)
-return},
-gJS:function(a){return new J.C7(this,P.MA.prototype.Ch,a,"Ch")}}}],["dart.collection","dart:collection",,P,{Ou:function(a,b){return J.xC(a,b)},T9:function(a){return J.le(a)},Py:function(a,b,c,d,e){var z
+return}}}],["dart.collection","dart:collection",,P,{Ou:function(a,b){return J.xC(a,b)},T9:function(a){return J.v1(a)},Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 H.VM(z,[d,e])
 return z}b=P.py
-return P.MP(a,b,c,d,e)},FO:function(a){var z,y
-y=$.OA()
+return P.MP(a,b,c,d,e)},yv:function(a){var z=new P.YO(0,null,null,null,null)
+H.VM(z,[a])
+return z},FO:function(a){var z,y
+y=$.xb()
 if(y.tg(y,a))return"(...)"
-y=$.OA()
+y=$.xb()
 y.h(y,a)
 z=[]
-try{P.Vr(a,z)}finally{y=$.OA()
+try{P.Vr(a,z)}finally{y=$.xb()
 y.Rz(y,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
@@ -12526,9 +12266,11 @@
 b.push(v)},L5:function(a,b,c,d,e){var z
 if(b==null){if(a==null){z=new P.YB(0,null,null,null,null,null,0)
 H.VM(z,[d,e])
-return z}b=P.py}else{if((P.J2==null?b==null:P.J2===b)&&(P.N3==null?a==null:P.N3===a)){z=new P.ey(0,null,null,null,null,null,0)
+return z}b=P.py}else{if(P.J2===b&&P.N3===a){z=new P.ey(0,null,null,null,null,null,0)
 H.VM(z,[d,e])
-return z}if(a==null)a=P.iv}return P.Ex(a,b,c,d,e)},vW:function(a){var z,y,x,w
+return z}if(a==null)a=P.iv}return P.Ex(a,b,c,d,e)},Ls:function(a,b,c,d){var z=new P.b6(0,null,null,null,null,null,0)
+H.VM(z,[d])
+return z},vW:function(a){var z,y,x,w
 z={}
 for(x=0;x<$.tw().length;++x){w=$.tw()
 if(x>=w.length)throw H.e(w,x)
@@ -12536,23 +12278,23 @@
 try{$.tw().push(a)
 y.KF("{")
 z.a=!0
-J.kH(a,new P.ZQ(z,y))
+J.kH(a,new P.W0(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)throw H.e(z,0)
-z.pop()}return y.gvM()},k6:{"":"a;hr,vv,OX,OB,aw",
-gB:function(a){return this.hr},
+z.pop()}return y.gvM()},k6:{"":"a;X5,vv,OX,OB,aw",
+gB:function(a){return this.X5},
 "+length":0,
-gl0:function(a){return this.hr===0},
+gl0:function(a){return this.X5===0},
 "+isEmpty":0,
-gor:function(a){return this.hr!==0},
+gor:function(a){return this.X5!==0},
 "+isNotEmpty":0,
 gvc:function(a){var z=new P.fG(this)
-H.VM(z,[H.ip(this,"k6",0)])
+H.VM(z,[H.W8(this,"k6",0)])
 return z},
 "+keys":0,
 gUQ:function(a){var z=new P.fG(this)
-H.VM(z,[H.ip(this,"k6",0)])
-return H.K1(z,new P.oi(this),H.ip(z,"mW",0),null)},
+H.VM(z,[H.W8(this,"k6",0)])
+return H.K1(z,new P.oi(this),H.W8(z,"mW",0),null)},
 "+values":0,
 x4:function(a){var z,y,x
 if(typeof a==="string"&&a!=="__proto__"){z=this.vv
@@ -12578,28 +12320,41 @@
 t=this.aH(u,b)
 return t<0?null:u[t+1]}},
 "+[]:1:0":0,
-u:function(a,b,c){var z,y,x,w,v,u
+u:function(a,b,c){var z,y,x,w,v,u,t,s
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.a0()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.a0()
-this.OX=y}this.dg(y,b,c)}else{x=this.OB
-if(x==null){x=P.a0()
-this.OB=x}w=this.nm(b)
-v=x[w]
-if(v==null){P.cW(x,w,[b,c])
-this.hr=this.hr+1
-this.aw=null}else{u=this.aH(v,b)
-if(u>=0)v[u+1]=c
-else{v.push(b,c)
-this.hr=this.hr+1
+if(z==null){y=Object.create(null)
+if(y==null)y["<non-identifier-key>"]=y
+else y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.vv=y
+z=y}if(z[b]==null){this.X5=this.X5+1
+this.aw=null}if(c==null)z[b]=z
+else z[b]=c}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+if(x==null){y=Object.create(null)
+if(y==null)y["<non-identifier-key>"]=y
+else y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.OX=y
+x=y}if(x[b]==null){this.X5=this.X5+1
+this.aw=null}if(c==null)x[b]=x
+else x[b]=c}else{w=this.OB
+if(w==null){y=Object.create(null)
+if(y==null)y["<non-identifier-key>"]=y
+else y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.OB=y
+w=y}v=this.nm(b)
+u=w[v]
+if(u==null){t=[b,c]
+if(t==null)w[v]=w
+else w[v]=t
+this.X5=this.X5+1
+this.aw=null}else{s=this.aH(u,b)
+if(s>=0)u[s+1]=c
+else{u.push(b,c)
+this.X5=this.X5+1
 this.aw=null}}}},
 "+[]=:2:0":0,
-to:function(a,b){var z
-if(this.x4(a))return this.t(this,a)
-z=b.call$0()
-this.u(this,a,z)
-return z},
 Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -12608,7 +12363,7 @@
 y=z[this.nm(b)]
 x=this.aH(y,b)
 if(x<0)return
-this.hr=this.hr-1
+this.X5=this.X5-1
 this.aw=null
 return y.splice(x,2)[1]}},
 aN:function(a,b){var z,y,x,w
@@ -12619,7 +12374,7 @@
 Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.aw
 if(z!=null)return z
-y=P.A(this.hr,null)
+y=P.A(this.X5,null)
 x=this.vv
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
@@ -12634,27 +12389,21 @@
 p=q.length
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.aw=y
 return y},
-dg:function(a,b,c){if(a[b]==null){this.hr=this.hr+1
-this.aw=null}P.cW(a,b,c)},
 Nv:function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
-this.hr=this.hr-1
+this.X5=this.X5-1
 this.aw=null
 return z}else return},
-nm:function(a){return J.le(a)&0x3ffffff},
+nm:function(a){return J.v1(a)&0x3ffffff},
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
 return-1},
-$isZ0:true,
+$isL8:true,
 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}}},oi:{"":"Tp;a",
+return z===a?null:z}}},oi:{"":"Tp;a",
 call$1:function(a){var z=this.a
 return z.t(z,a)},
 "+call:1:0":0,
@@ -12666,10 +12415,10 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},o2:{"":"k6;m6,Q6,zx,hr,vv,OX,OB,aw",
+$is_Dv:true},o2:{"":"k6;m6,Q6,bR,X5,vv,OX,OB,aw",
 C2:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
-Ef:function(a){return this.zx.call$1(a)},
+Ef:function(a){return this.bR.call$1(a)},
 t:function(a,b){if(this.Ef(b)!==!0)return
 return P.k6.prototype.t.call(this,this,b)},
 "+[]:1:0":0,
@@ -12686,7 +12435,7 @@
 return-1},
 bu:function(a){return P.vW(this)},
 $ask6:null,
-$asZ0:null,
+$asL8:null,
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 z=new P.o2(a,b,z,0,null,null,null,null)
 H.VM(z,[d,e])
@@ -12697,15 +12446,15 @@
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},fG:{"":"mW;Fb",
-gB:function(a){return this.Fb.hr},
+gB:function(a){return this.Fb.X5},
 "+length":0,
-gl0:function(a){return this.Fb.hr===0},
+gl0:function(a){return this.Fb.X5===0},
 "+isEmpty":0,
 gA:function(a){var z,y
 z=this.Fb
 y=z.Ig()
-y=new P.nm(z,y,0,null)
-H.VM(y,[H.ip(this,"fG",0)])
+y=new P.EQ(z,y,0,null)
+H.VM(y,[H.W8(this,"fG",0)])
 return y},
 tg:function(a,b){return this.Fb.x4(b)},
 aN:function(a,b){var z,y,x,w
@@ -12715,7 +12464,7 @@
 if(y!==z.aw)throw H.b(P.a4(z))}},
 $asmW:null,
 $ascX:null,
-$isyN:true},nm:{"":"a;Fb,aw,zi,fD",
+$isqC:true},EQ:{"":"a;Fb,aw,zi,fD",
 gl:function(){return this.fD},
 "+current":0,
 G:function(){var z,y,x
@@ -12726,20 +12475,20 @@
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
-return!0}}},YB:{"":"a;hr,vv,OX,OB,H9,lX,zN",
-gB:function(a){return this.hr},
+return!0}}},YB:{"":"a;X5,vv,OX,OB,H9,lX,zN",
+gB:function(a){return this.X5},
 "+length":0,
-gl0:function(a){return this.hr===0},
+gl0:function(a){return this.X5===0},
 "+isEmpty":0,
-gor:function(a){return this.hr!==0},
+gor:function(a){return this.X5!==0},
 "+isNotEmpty":0,
-gvc:function(a){var z=new P.Tz(this)
-H.VM(z,[H.ip(this,"YB",0)])
+gvc:function(a){var z=new P.Cm(this)
+H.VM(z,[H.W8(this,"YB",0)])
 return z},
 "+keys":0,
-gUQ:function(a){var z=new P.Tz(this)
-H.VM(z,[H.ip(this,"YB",0)])
-return H.K1(z,new P.iX(this),H.ip(z,"mW",0),null)},
+gUQ:function(a){var z=new P.Cm(this)
+H.VM(z,[H.W8(this,"YB",0)])
+return H.K1(z,new P.iX(this),H.W8(z,"mW",0),null)},
 "+values":0,
 x4:function(a){var z,y,x
 if(typeof a==="string"&&a!=="__proto__"){z=this.vv
@@ -12750,8 +12499,8 @@
 if(x==null)return!1
 return this.aH(x[this.nm(a)],a)>=0}},
 "+containsKey:1:0":0,
-PF:function(a){var z=new P.Tz(this)
-H.VM(z,[H.ip(this,"YB",0)])
+PF:function(a){var z=new P.Cm(this)
+H.VM(z,[H.W8(this,"YB",0)])
 return z.Vr(z,new P.ou(this,a))},
 "+containsValue:1:0":0,
 Ay:function(a,b){J.kH(b,new P.S9(this))},
@@ -12759,29 +12508,42 @@
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return
 y=z[b]
-return y==null?null:y.gcA()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+return y==null?null:y.gS4()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
 if(x==null)return
 y=x[b]
-return y==null?null:y.gcA()}else{w=this.OB
+return y==null?null:y.gS4()}else{w=this.OB
 if(w==null)return
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gcA()}},
+return v[u].gS4()}},
 "+[]:1:0":0,
-u:function(a,b,c){var z,y,x,w,v,u
+u:function(a,b,c){var z,y,x,w,v,u,t,s
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.Qs()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.Qs()
-this.OX=y}this.dg(y,b,c)}else{x=this.OB
-if(x==null){x=P.Qs()
-this.OB=x}w=this.nm(b)
-v=x[w]
-if(v==null)x[w]=[this.pE(b,c)]
-else{u=this.aH(v,b)
-if(u>=0)v[u].scA(c)
-else v.push(this.pE(b,c))}}},
+if(z==null){y=Object.create(null)
+y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.vv=y
+z=y}x=z[b]
+if(x==null)z[b]=this.y5(b,c)
+else x.sS4(c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.OX
+if(w==null){y=Object.create(null)
+y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.OX=y
+w=y}x=w[b]
+if(x==null)w[b]=this.y5(b,c)
+else x.sS4(c)}else{v=this.OB
+if(v==null){y=Object.create(null)
+y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.OB=y
+v=y}u=this.nm(b)
+t=v[u]
+if(t==null)v[u]=[this.y5(b,c)]
+else{s=this.aH(t,b)
+if(s>=0)t[s].sS4(c)
+else t.push(this.y5(b,c))}}},
 "+[]=:2:0":0,
 to:function(a,b){var z
 if(this.x4(a))return this.t(this,a)
@@ -12798,37 +12560,34 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gcA()}},
-V1:function(a){if(this.hr>0){this.lX=null
+return w.gS4()}},
+V1:function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.hr=0
+this.X5=0
 this.zN=this.zN+1&67108863}},
 aN:function(a,b){var z,y
 z=this.H9
 y=this.zN
-for(;z!=null;){b.call$2(z.gkh(),z.gcA())
+for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
 z=z.gDG()}},
-dg:function(a,b,c){var z=a[b]
-if(z==null)a[b]=this.pE(b,c)
-else z.scA(c)},
 Nv:function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
 this.Vb(z)
 delete a[b]
-return z.gcA()},
-pE:function(a,b){var z,y
+return z.gS4()},
+y5:function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
 z.zQ=y
 y.sDG(z)
-this.lX=z}this.hr=this.hr+1
+this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
 return z},
 Vb:function(a){var z,y
@@ -12838,9 +12597,9 @@
 else z.sDG(y)
 if(y==null)this.lX=z
 else y.szQ(z)
-this.hr=this.hr-1
+this.X5=this.X5-1
 this.zN=this.zN+1&67108863},
-nm:function(a){return J.le(a)&0x3ffffff},
+nm:function(a){return J.v1(a)&0x3ffffff},
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
@@ -12848,11 +12607,7 @@
 return-1},
 bu:function(a){return P.vW(this)},
 $isFo:true,
-$isZ0:true,
-static:{Qs:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},iX:{"":"Tp;a",
+$isL8:true},iX:{"":"Tp;a",
 call$1:function(a){var z=this.a
 return z.t(z,a)},
 "+call:1:0":0,
@@ -12869,7 +12624,7 @@
 z.u(z,a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},ey:{"":"YB;hr,vv,OX,OB,H9,lX,zN",
+$is_bh:true},ey:{"":"YB;X5,vv,OX,OB,H9,lX,zN",
 nm:function(a){return H.CU(a)&0x3ffffff},
 aH:function(a,b){var z,y,x
 if(a==null)return-1
@@ -12878,10 +12633,10 @@
 if(x==null?b==null:x===b)return y}return-1},
 $asYB:null,
 $asFo:null,
-$asZ0:null},xd:{"":"YB;m6,Q6,zx,hr,vv,OX,OB,H9,lX,zN",
+$asL8:null},xd:{"":"YB;m6,Q6,bR,X5,vv,OX,OB,H9,lX,zN",
 C2:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
-Ef:function(a){return this.zx.call$1(a)},
+Ef:function(a){return this.bR.call$1(a)},
 t:function(a,b){if(this.Ef(b)!==!0)return
 return P.YB.prototype.t.call(this,this,b)},
 "+[]:1:0":0,
@@ -12898,7 +12653,7 @@
 return-1},
 $asYB:null,
 $asFo:null,
-$asZ0:null,
+$asL8:null,
 static:{Ex:function(a,b,c,d,e){var z=new P.v6(d)
 z=new P.xd(a,b,z,0,null,null,null,null,null,0)
 H.VM(z,[d,e])
@@ -12908,16 +12663,16 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},db:{"":"a;kh<,cA@,DG@,zQ@"},Tz:{"":"mW;Fb",
-gB:function(a){return this.Fb.hr},
+$is_Dv:true},db:{"":"a;kh<,S4@,DG@,zQ@"},Cm:{"":"mW;Fb",
+gB:function(a){return this.Fb.X5},
 "+length":0,
-gl0:function(a){return this.Fb.hr===0},
+gl0:function(a){return this.Fb.X5===0},
 "+isEmpty":0,
 gA:function(a){var z,y
 z=this.Fb
 y=z.zN
 y=new P.N6(z,y,null,null)
-H.VM(y,[H.ip(this,"Tz",0)])
+H.VM(y,[H.W8(this,"Cm",0)])
 y.zq=y.Fb.H9
 return y},
 tg:function(a,b){return this.Fb.x4(b)},
@@ -12930,7 +12685,7 @@
 y=y.gDG()}},
 $asmW:null,
 $ascX:null,
-$isyN:true},N6:{"":"a;Fb,zN,zq,fD",
+$isqC:true},N6:{"":"a;Fb,zN,zq,fD",
 gl:function(){return this.fD},
 "+current":0,
 G:function(){var z=this.Fb
@@ -12942,13 +12697,13 @@
 return!0}}}},jg:{"":"u3;",
 gA:function(a){var z=this.Zl()
 z=new P.oz(this,z,0,null)
-H.VM(z,[H.ip(this,"jg",0)])
+H.VM(z,[H.W8(this,"jg",0)])
 return z},
-gB:function(a){return this.hr},
+gB:function(a){return this.X5},
 "+length":0,
-gl0:function(a){return this.hr===0},
+gl0:function(a){return this.X5===0},
 "+isEmpty":0,
-gor:function(a){return this.hr!==0},
+gor:function(a){return this.X5!==0},
 "+isNotEmpty":0,
 tg:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -12972,12 +12727,12 @@
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+z=y}return this.cA(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.OX=y
-x=y}return this.jn(x,b)}else{w=this.OB
+x=y}return this.cA(x,b)}else{w=this.OB
 if(w==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
@@ -12986,10 +12741,9 @@
 u=w[v]
 if(u==null)w[v]=[b]
 else{if(this.aH(u,b)>=0)return!1
-u.push(b)}this.hr=this.hr+1
+u.push(b)}this.X5=this.X5+1
 this.DM=null
 return!0}},
-ght:function(a){return new J.C7(this,P.jg.prototype.h,a,"h")},
 Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -12998,14 +12752,14 @@
 y=z[this.nm(b)]
 x=this.aH(y,b)
 if(x<0)return!1
-this.hr=this.hr-1
+this.X5=this.X5-1
 this.DM=null
 y.splice(x,1)
 return!0}},
 Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.DM
 if(z!=null)return z
-y=P.A(this.hr,null)
+y=P.A(this.X5,null)
 x=this.vv
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
@@ -13020,16 +12774,16 @@
 p=q.length
 for(o=0;o<p;++o){y[u]=q[o];++u}}}this.DM=y
 return y},
-jn:function(a,b){if(a[b]!=null)return!1
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=0
-this.hr=this.hr+1
+this.X5=this.X5+1
 this.DM=null
 return!0},
 Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b]
-this.hr=this.hr-1
+this.X5=this.X5-1
 this.DM=null
 return!0}else return!1},
-nm:function(a){return J.le(a)&0x3ffffff},
+nm:function(a){return J.v1(a)&0x3ffffff},
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
@@ -13037,8 +12791,8 @@
 return-1},
 $asu3:null,
 $ascX:null,
-$isyN:true,
-$iscX:true},YO:{"":"jg;hr,vv,OX,OB,DM",
+$isqC:true,
+$iscX:true},YO:{"":"jg;X5,vv,OX,OB,DM",
 nm:function(a){return H.CU(a)&0x3ffffff},
 aH:function(a,b){var z,y,x
 if(a==null)return-1
@@ -13057,16 +12811,16 @@
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
-return!0}}},b6:{"":"u3;hr,vv,OX,OB,H9,lX,zN",
+return!0}}},b6:{"":"u3;X5,vv,OX,OB,H9,lX,zN",
 gA:function(a){var z=new P.zQ(this,this.zN,null,null)
 H.VM(z,[null])
 z.zq=z.O2.H9
 return z},
-gB:function(a){return this.hr},
+gB:function(a){return this.X5},
 "+length":0,
-gl0:function(a){return this.hr===0},
+gl0:function(a){return this.X5===0},
 "+isEmpty":0,
-gor:function(a){return this.hr!==0},
+gor:function(a){return this.X5!==0},
 "+isNotEmpty":0,
 tg:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -13092,9 +12846,6 @@
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
 z=z.gDG()}},
-gFV:function(a){var z=this.H9
-if(z==null)throw H.b(new P.lj("No elements"))
-return z.gGc()},
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -13104,12 +12855,12 @@
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+z=y}return this.cA(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.OX=y
-x=y}return this.jn(x,b)}else{w=this.OB
+x=y}return this.cA(x,b)}else{w=this.OB
 if(w==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
@@ -13119,9 +12870,8 @@
 if(u==null)w[v]=[this.xf(b)]
 else{if(this.aH(u,b)>=0)return!1
 u.push(this.xf(b))}return!0}},
-ght:function(a){return new J.C7(this,P.b6.prototype.h,a,"h")},
 Ay:function(a,b){var z
-for(z=new P.zQ(b,b.zN,null,null),H.VM(z,[null]),z.zq=z.O2.H9;z.G();)this.h(this,z.gl())},
+for(z=new P.zQ(b,b.zN,null,null),H.VM(z,[null]),z.zq=z.O2.H9;z.G();)this.h(this,z.fD)},
 Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -13132,7 +12882,7 @@
 if(x<0)return!1
 this.Vb(y.splice(x,1)[0])
 return!0}},
-jn:function(a,b){if(a[b]!=null)return!1
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
 return!0},
 Nv:function(a,b){var z
@@ -13148,7 +12898,7 @@
 this.H9=z}else{y=this.lX
 z.zQ=y
 y.sDG(z)
-this.lX=z}this.hr=this.hr+1
+this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
 return z},
 Vb:function(a){var z,y
@@ -13158,9 +12908,9 @@
 else z.sDG(y)
 if(y==null)this.lX=z
 else y.szQ(z)
-this.hr=this.hr-1
+this.X5=this.X5-1
 this.zN=this.zN+1&67108863},
-nm:function(a){return J.le(a)&0x3ffffff},
+nm:function(a){return J.v1(a)&0x3ffffff},
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
@@ -13168,7 +12918,7 @@
 return-1},
 $asu3:null,
 $ascX:null,
-$isyN:true,
+$isqC:true,
 $iscX:true},ef:{"":"a;Gc<,DG@,zQ@"},zQ:{"":"a;O2,zN,zq,fD",
 gl:function(){return this.fD},
 "+current":0,
@@ -13187,10 +12937,10 @@
 $asWO:null,
 $ascX:null},u3:{"":"mW;",
 tt:function(a,b){var z,y,x,w,v
-if(b){z=P.A(null,H.ip(this,"u3",0))
-H.VM(z,[H.ip(this,"u3",0)])
-C.Nm.sB(z,this.gB(this))}else{z=P.A(this.gB(this),H.ip(this,"u3",0))
-H.VM(z,[H.ip(this,"u3",0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+if(b){z=P.A(null,H.W8(this,"u3",0))
+H.VM(z,[H.W8(this,"u3",0)])
+C.Nm.sB(z,this.gB(this))}else{z=P.A(this.gB(this),H.W8(this,"u3",0))
+H.VM(z,[H.W8(this,"u3",0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)throw H.e(z,x)
 z[x]=w}return z},
@@ -13198,13 +12948,11 @@
 bu:function(a){return H.mx(this,"{","}")},
 $asmW:null,
 $ascX:null,
-$isyN:true,
-$iscX:true},mk:{"":"a;",$isyN:true,$iscX:true,$ascX:null,static:{zM:function(a){var z=new P.YO(0,null,null,null,null)
-H.VM(z,[a])
-return z}}},mW:{"":"a;",
-ez:function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},
+$isqC:true,
+$iscX:true},mW:{"":"a;",
+ez:function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},
 ev:function(a,b){var z=new H.U5(this,b)
-H.VM(z,[H.ip(this,"mW",0)])
+H.VM(z,[H.W8(this,"mW",0)])
 return z},
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
@@ -13224,7 +12972,7 @@
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
 return!1},
-tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
+tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
 gB:function(a){var z,y
 z=this.gA(this)
@@ -13235,8 +12983,9 @@
 "+isEmpty":0,
 gor:function(a){return this.gl0(this)!==!0},
 "+isNotEmpty":0,
+eR:function(a,b){return H.ke(this,b,H.W8(this,"mW",0))},
 gFV:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(P.w("No elements"))
+if(!z.G())throw H.b(new P.lj("No elements"))
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
@@ -13244,23 +12993,21 @@
 do y=z.gl()
 while(z.G())
 return y},
-DX:function(a,b,c){var z,y
+l8:function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
 if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},
-XG:function(a,b){return this.DX(a,b,null)},
+XG:function(a,b){return this.l8(a,b,null)},
 Zv:function(a,b){var z,y,x,w
-if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(new P.bJ("value "+H.d(b)))
+if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(new P.bJ("value "+H.d(b)))},
+y=w.W(y,1)}throw H.b(P.N(b))},
 bu:function(a){return P.FO(this)},
 $iscX:true,
-$ascX:null},n0:{"":"a;",$isyN:true,$iscX:true,$ascX:null,static:{Ls:function(a,b,c,d){var z=new P.b6(0,null,null,null,null,null,0)
-H.VM(z,[d])
-return z}}},ar:{"":"a+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},lD:{"":"a;",
-gA:function(a){var z=new H.wi(a,this.gB(a),0,null)
-H.VM(z,[H.ip(a,"lD",0)])
+$ascX:null},ar:{"":"a+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},lD:{"":"a;",
+gA:function(a){var z=new H.a7(a,this.gB(a),0,null)
+H.VM(z,[H.W8(a,"lD",0)])
 return z},
 Zv:function(a,b){return this.t(a,b)},
 aN:function(a,b){var z,y
@@ -13271,10 +13018,8 @@
 if(z!==this.gB(a))throw H.b(P.a4(a))}},
 gl0:function(a){return J.xC(this.gB(a),0)},
 "+isEmpty":0,
-gor:function(a){return!J.xC(this.gB(a),0)},
+gor:function(a){return!this.gl0(a)},
 "+isNotEmpty":0,
-gFV:function(a){if(J.xC(this.gB(a),0))throw H.b(P.w("No elements"))
-return this.t(a,0)},
 grZ:function(a){if(J.xC(this.gB(a),0))throw H.b(new P.lj("No elements"))
 return this.t(a,J.xH(this.gB(a),1))},
 tg:function(a,b){var z,y
@@ -13289,14 +13034,6 @@
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-DX:function(a,b,c){var z,y,x
-z=this.gB(a)
-if(typeof z!=="number")throw H.s(z)
-y=0
-for(;y<z;++y){x=this.t(a,y)
-if(b.call$1(x)===!0)return x
-if(z!==this.gB(a))throw H.b(P.a4(a))}return c.call$0()},
-XG:function(a,b){return this.DX(a,b,null)},
 zV:function(a,b){var z,y,x,w,v,u
 z=this.gB(a)
 if(b.length!==0){y=J.x(z)
@@ -13318,16 +13055,17 @@
 w.vM=w.vM+u
 if(z!==this.gB(a))throw H.b(P.a4(a))}return w.vM}},
 ev:function(a,b){var z=new H.U5(a,b)
-H.VM(z,[H.ip(a,"lD",0)])
+H.VM(z,[H.W8(a,"lD",0)])
 return z},
 ez:function(a,b){var z=new H.A8(a,b)
 H.VM(z,[null,null])
 return z},
+eR:function(a,b){return H.j5(a,b,null,null)},
 tt:function(a,b){var z,y,x
-if(b){z=P.A(null,H.ip(a,"lD",0))
-H.VM(z,[H.ip(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{z=P.A(this.gB(a),H.ip(a,"lD",0))
-H.VM(z,[H.ip(a,"lD",0)])}y=0
+if(b){z=P.A(null,H.W8(a,"lD",0))
+H.VM(z,[H.W8(a,"lD",0)])
+C.Nm.sB(z,this.gB(a))}else{z=P.A(this.gB(a),H.W8(a,"lD",0))
+H.VM(z,[H.W8(a,"lD",0)])}y=0
 while(!0){x=this.gB(a)
 if(typeof x!=="number")throw H.s(x)
 if(!(y<x))break
@@ -13338,7 +13076,6 @@
 h:function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
 this.u(a,z,b)},
-ght:function(a){return new J.C7(this,P.lD.prototype.h,a,"h")},
 Rz:function(a,b){var z,y
 z=0
 while(!0){y=this.gB(a)
@@ -13347,19 +13084,16 @@
 if(J.xC(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
 this.sB(a,J.xH(this.gB(a),1))
 return!0}++z}return!1},
-pZ:function(a,b,c){var z
-if(!(b<0)){z=this.gB(a)
-if(typeof z!=="number")throw H.s(z)
-z=b>z}else z=!0
-if(z)throw H.b(P.TE(b,0,this.gB(a)))
+pZ:function(a,b,c){var z=J.Wx(b)
+if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
 if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
 D6:function(a,b,c){var z,y,x,w
 c=this.gB(a)
 this.pZ(a,b,c)
 z=J.xH(c,b)
-y=P.A(null,H.ip(a,"lD",0))
-H.VM(y,[H.ip(a,"lD",0)])
+y=P.A(null,H.W8(a,"lD",0))
+H.VM(y,[H.W8(a,"lD",0)])
 C.Nm.sB(y,z)
 if(typeof z!=="number")throw H.s(z)
 x=0
@@ -13368,7 +13102,7 @@
 y[x]=w}return y},
 Jk:function(a,b){return this.D6(a,b,null)},
 Mu:function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},
+return H.j5(a,b,c,null)},
 YW:function(a,b,c,d,e){var z,y,x,w
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")throw H.s(z)
@@ -13403,20 +13137,20 @@
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
 bu:function(a){var z,y
-y=$.OA()
+y=$.xb()
 if(y.tg(y,a))return"[...]"
 z=P.p9("")
-try{y=$.OA()
+try{y=$.xb()
 y.h(y,a)
 z.KF("[")
 z.We(a,", ")
-z.KF("]")}finally{y=$.OA()
+z.KF("]")}finally{y=$.xb()
 y.Rz(y,a)}return z.gvM()},
 $isList:true,
 $asWO:null,
-$isyN:true,
+$isqC:true,
 $iscX:true,
-$ascX:null},ZQ:{"":"Tp;a,b",
+$ascX:null},W0:{"":"Tp;a,b",
 call$2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
@@ -13427,7 +13161,7 @@
 "+call:2:0":0,
 $isEH:true,
 $is_bh:true},Sw:{"":"mW;v5,av,HV,qT",
-gA:function(a){return P.MW(this,H.ip(this,"Sw",0))},
+gA:function(a){return P.MW(this,H.W8(this,"Sw",0))},
 aN:function(a,b){var z,y,x
 z=this.qT
 for(y=this.av;y!==this.HV;y=(y+1&this.v5.length-1)>>>0){x=this.v5
@@ -13438,12 +13172,6 @@
 "+isEmpty":0,
 gB:function(a){return(this.HV-this.av&this.v5.length-1)>>>0},
 "+length":0,
-gFV:function(a){var z,y
-z=this.av
-if(z===this.HV)throw H.b(P.w("No elements"))
-y=this.v5
-if(z<0||z>=y.length)throw H.e(y,z)
-return y[z]},
 grZ:function(a){var z,y,x
 z=this.av
 y=this.HV
@@ -13464,14 +13192,13 @@
 if(y<0||y>=x)throw H.e(z,y)
 return z[y]},
 tt:function(a,b){var z
-if(b){z=P.A(null,H.ip(this,"Sw",0))
-H.VM(z,[H.ip(this,"Sw",0)])
-C.Nm.sB(z,this.gB(this))}else{z=P.A(this.gB(this),H.ip(this,"Sw",0))
-H.VM(z,[H.ip(this,"Sw",0)])}this.e4(z)
+if(b){z=P.A(null,H.W8(this,"Sw",0))
+H.VM(z,[H.W8(this,"Sw",0)])
+C.Nm.sB(z,this.gB(this))}else{z=P.A(this.gB(this),H.W8(this,"Sw",0))
+H.VM(z,[H.W8(this,"Sw",0)])}this.e4(z)
 return z},
 br:function(a){return this.tt(a,!0)},
 h:function(a,b){this.NZ(b)},
-ght:function(a){return new J.C7(this,P.Sw.prototype.h,a,"h")},
 Rz:function(a,b){var z,y
 for(z=this.av;z!==this.HV;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)throw H.e(y,z)
@@ -13520,8 +13247,8 @@
 y[z]=null
 return a}},
 VW:function(){var z,y,x,w
-z=P.A(this.v5.length*2,H.ip(this,"Sw",0))
-H.VM(z,[H.ip(this,"Sw",0)])
+z=P.A(this.v5.length*2,H.W8(this,"Sw",0))
+H.VM(z,[H.W8(this,"Sw",0)])
 y=this.v5
 x=this.av
 w=y.length-x
@@ -13544,16 +13271,16 @@
 y=this.v5
 H.qG(a,v,v+z,y,0)
 return this.HV+v}},
-Pt:function(a,b){var z=P.A(8,b)
+Eo:function(a,b){var z=P.A(8,b)
 H.VM(z,[b])
 this.v5=z},
 $asmW:null,
 $ascX:null,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 static:{"":"TN",NZ:function(a,b){var z=new P.Sw(null,0,0,0)
 H.VM(z,[b])
-z.Pt(a,b)
+z.Eo(a,b)
 return z}}},o0:{"":"a;Lz,dP,qT,Dc,fD",
 gl:function(){return this.fD},
 "+current":0,
@@ -13569,41 +13296,41 @@
 return!0},
 static:{MW:function(a,b){var z=new P.o0(a,a.HV,a.qT,a.av,null)
 H.VM(z,[b])
-return z}}},a1:{"":"a;G3>,Bb>,ip>",$isa1:true},jp:{"":"a1;P*,G3,Bb,ip",
+return z}}},a1:{"":"a;G3>,Bb>,T8>",$isa1:true},jp:{"":"a1;P*,G3,Bb,T8",
 r6:function(a,b){return this.P.call$1(b)},
 $asa1:function(a,b){return[a]}},Xt:{"":"a;",
 vh:function(a){var z,y,x,w,v,u,t,s
 z=this.aY
 if(z==null)return-1
 y=this.iW
-for(x=y,w=x,v=null;!0;){v=this.yV(z.G3,a)
+for(x=y,w=x,v=null;!0;){v=this.nw(z.G3,a)
 u=J.Wx(v)
 if(u.D(v,0)){u=z.Bb
 if(u==null)break
-v=this.yV(u.G3,a)
+v=this.nw(u.G3,a)
 if(J.xZ(v,0)){t=z.Bb
-z.Bb=t.ip
-t.ip=z
+z.Bb=t.T8
+t.T8=z
 if(t.Bb==null){z=t
 break}z=t}x.Bb=z
 s=z.Bb
 x=z
-z=s}else{if(u.C(v,0)){u=z.ip
+z=s}else{if(u.C(v,0)){u=z.T8
 if(u==null)break
-v=this.yV(u.G3,a)
-if(J.u6(v,0)){t=z.ip
-z.ip=t.Bb
+v=this.nw(u.G3,a)
+if(J.u6(v,0)){t=z.T8
+z.T8=t.Bb
 t.Bb=z
-if(t.ip==null){z=t
-break}z=t}w.ip=z
-s=z.ip}else break
+if(t.T8==null){z=t
+break}z=t}w.T8=z
+s=z.T8}else break
 w=z
-z=s}}w.ip=z.Bb
-x.Bb=z.ip
-z.Bb=y.ip
-z.ip=y.Bb
+z=s}}w.T8=z.Bb
+x.Bb=z.T8
+z.Bb=y.T8
+z.T8=y.Bb
 this.aY=z
-y.ip=null
+y.T8=null
 y.Bb=null
 this.bb=this.bb+1
 return v},
@@ -13614,11 +13341,11 @@
 this.J0=this.J0-1
 y=this.aY
 x=y.Bb
-y=y.ip
+y=y.T8
 if(x==null)this.aY=y
 else{this.aY=x
 this.vh(a)
-this.aY.ip=y}this.qT=this.qT+1
+this.aY.T8=y}this.qT=this.qT+1
 return z},
 K8:function(a,b){var z,y
 this.J0=this.J0+1
@@ -13627,13 +13354,13 @@
 return}z=J.u6(b,0)
 y=this.aY
 if(z){a.Bb=y
-a.ip=this.aY.ip
-this.aY.ip=null}else{a.ip=y
+a.T8=this.aY.T8
+this.aY.T8=null}else{a.T8=y
 a.Bb=this.aY.Bb
-this.aY.Bb=null}this.aY=a}},Ba:{"":"Xt;Cw,zx,aY,iW,J0,qT,bb",
+this.aY.Bb=null}this.aY=a}},Ba:{"":"Xt;Cw,bR,aY,iW,J0,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
-Ef:function(a){return this.zx.call$1(a)},
-yV:function(a,b){return this.wS(a,b)},
+Ef:function(a){return this.bR.call$1(a)},
+nw:function(a,b){return this.wS(a,b)},
 t:function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
@@ -13649,33 +13376,23 @@
 z=this.vh(b)
 if(J.xC(z,0)){this.aY.P=c
 return}y=new P.jp(c,b,null,null)
-H.VM(y,[null,null])
+y.$builtinTypeInfo=[null,null]
 this.K8(y,z)},
 "+[]=:2:0":0,
-to:function(a,b){var z,y,x,w,v
-z=this.vh(a)
-if(J.xC(z,0))return this.aY.P
-y=this.qT
-x=this.bb
-w=b.call$0()
-if(y!==this.qT)throw H.b(P.a4(this))
-if(x!==this.bb)z=this.vh(a)
-v=new P.jp(w,a,null,null)
-H.VM(v,[null,null])
-this.K8(v,z)
-return w},
 gl0:function(a){return this.aY==null},
 "+isEmpty":0,
 gor:function(a){return this.aY!=null},
 "+isNotEmpty":0,
-aN:function(a,b){var z,y,x
-z=H.ip(this,"Ba",0)
-y=new P.Iy(this,[],this.qT,this.bb,null)
-H.VM(y,[z])
-y.Qf(this,[P.a1,z])
-for(;y.G();){x=y.gl()
-z=J.RE(x)
-b.call$2(z.gG3(x),z.gP(x))}},
+aN:function(a,b){var z,y,x,w
+z=H.W8(this,"Ba",0)
+y=[]
+H.VM(y,[P.a1])
+x=new P.HW(this,y,this.qT,this.bb,null)
+H.VM(x,[z])
+x.Qf(this,[P.a1,z])
+for(;x.G();){w=x.gl()
+z=J.RE(w)
+b.call$2(z.gG3(w),z.gP(w))}},
 gB:function(a){return this.J0},
 "+length":0,
 x4:function(a){return this.Ef(a)===!0&&J.xC(this.vh(a),0)},
@@ -13683,18 +13400,18 @@
 PF:function(a){return new P.LD(this,a,this.bb).call$1(this.aY)},
 "+containsValue:1:0":0,
 gvc:function(a){var z=new P.OG(this)
-H.VM(z,[H.ip(this,"Ba",0)])
+H.VM(z,[H.W8(this,"Ba",0)])
 return z},
 "+keys":0,
 gUQ:function(a){var z=new P.ro(this)
-H.VM(z,[H.ip(this,"Ba",0),H.ip(this,"Ba",1)])
+H.VM(z,[H.W8(this,"Ba",0),H.W8(this,"Ba",1)])
 return z},
 "+values":0,
 bu:function(a){return P.vW(this)},
 $isBa:true,
 $asXt:function(a,b){return[a]},
-$asZ0:null,
-$isZ0:true,
+$asL8:null,
+$isL8:true,
 static:{GV:function(a,b,c,d){var z,y,x
 z=P.n4
 y=new P.An(c)
@@ -13713,25 +13430,25 @@
 for(z=this.c,y=this.a,x=this.b;a!=null;){w=J.RE(a)
 if(J.xC(w.gP(a),x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
-if(w.gip(a)!=null&&this.call$1(w.gip(a))===!0)return!0
+if(w.gT8(a)!=null&&this.call$1(w.gT8(a))===!0)return!0
 a=w.gBb(a)}return!1},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},pi:{"":"a;",
+$is_Dv:true},YI:{"":"a;",
 gl:function(){var z=this.ya
 if(z==null)return
 return this.Wb(z)},
 "+current":0,
-Az:function(a){var z
+WV:function(a){var z
 for(z=this.Ln;a!=null;){z.push(a)
 a=a.Bb}},
 zU:function(a){var z
 C.Nm.sB(this.Ln,0)
 z=this.Dn
-if(a==null)this.Az(z.aY)
+if(a==null)this.WV(z.aY)
 else{z.vh(a.G3)
-this.Az(z.aY.ip)}},
+this.WV(z.aY.T8)}},
 G:function(){var z,y
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -13740,50 +13457,55 @@
 return!1}if(z.bb!==this.bb)this.zU(this.ya)
 if(0>=y.length)throw H.e(y,0)
 this.ya=y.pop()
-this.Az(this.ya.ip)
+this.WV(this.ya.T8)
 return!0},
-Qf:function(a,b){this.Az(a.aY)}},OG:{"":"mW;Dn",
+Qf:function(a,b){this.WV(a.aY)}},OG:{"":"mW;Dn",
 gB:function(a){return this.Dn.J0},
 "+length":0,
 gl0:function(a){return this.Dn.J0===0},
 "+isEmpty":0,
 gA:function(a){var z,y,x
 z=this.Dn
-y=H.ip(this,"OG",0)
-x=new P.DN(z,[],z.qT,z.bb,null)
+y=H.W8(this,"OG",0)
+x=[]
+H.VM(x,[P.a1])
+x=new P.DN(z,x,z.qT,z.bb,null)
 H.VM(x,[y])
 x.Qf(z,y)
 return x},
 $asmW:null,
 $ascX:null,
-$isyN:true},ro:{"":"mW;Fb",
+$isqC:true},ro:{"":"mW;Fb",
 gB:function(a){return this.Fb.J0},
 "+length":0,
 gl0:function(a){return this.Fb.J0===0},
 "+isEmpty":0,
-gA:function(a){var z,y,x
+gA:function(a){var z,y,x,w
 z=this.Fb
-y=H.ip(this,"ro",1)
-x=new P.ZM(z,[],z.qT,z.bb,null)
-H.VM(x,[H.ip(this,"ro",0),y])
-x.Qf(z,y)
-return x},
+y=H.W8(this,"ro",0)
+x=H.W8(this,"ro",1)
+w=[]
+H.VM(w,[P.a1])
+w=new P.ZM(z,w,z.qT,z.bb,null)
+H.VM(w,[y,x])
+w.Qf(z,x)
+return w},
 $asmW:function(a,b){return[b]},
 $ascX:function(a,b){return[b]},
-$isyN:true},DN:{"":"pi;Dn,Ln,qT,bb,ya",
+$isqC:true},DN:{"":"YI;Dn,Ln,qT,bb,ya",
 Wb:function(a){return a.G3},
-$aspi:null},ZM:{"":"pi;Dn,Ln,qT,bb,ya",
+$asYI:null},ZM:{"":"YI;Dn,Ln,qT,bb,ya",
 Wb:function(a){return a.P},
-$aspi:function(a,b){return[b]}},Iy:{"":"pi;Dn,Ln,qT,bb,ya",
+$asYI:function(a,b){return[b]}},HW:{"":"YI;Dn,Ln,qT,bb,ya",
 Wb:function(a){return a},
-$aspi:function(a){return[[P.a1,a]]}}}],["dart.convert","dart:convert",,P,{VQ:function(a,b){var z=new P.CM()
+$asYI:function(a){return[[P.a1,a]]}}}],["dart.convert","dart:convert",,P,{VQ:function(a,b){var z=new P.JC()
 return z.call$2(null,new P.f1(z).call$1(a))},BS:function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(new P.AT(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)},tp:function(a){return a.Lt()},CM:{"":"Tp;",
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},JC:{"":"Tp;",
 call$2:function(a,b){return b},
 "+call:2:0":0,
 $isEH:true,
@@ -13801,126 +13523,15 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Uk:{"":"a;",
-kV:function(a){return this.gHe().WJ(a)}},wI:{"":"a;"},ob:{"":"Uk;",
-$asUk:function(){return[J.O,[J.Q,J.im]]}},Ud:{"":"Ge;Ct,FN",
-bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},
-static:{Gy:function(a,b){return new P.Ud(a,b)}}},K8:{"":"Ud;Ct,FN",
-bu:function(a){return"Cyclic error in JSON stringify"},
-static:{bc:function(a){return new P.K8(a,null)}}},by:{"":"Uk;",
+$is_Dv:true},Uk:{"":"a;"},wI:{"":"a;"},ob:{"":"Uk;",
+$asUk:function(){return[J.O,[J.Q,J.im]]}},by:{"":"Uk;",
 pW:function(a,b){return P.BS(a,C.A3.N5)},
 kV:function(a){return this.pW(a,null)},
-gZE:function(){return C.Ap},
-gHe:function(){return C.A3},
-$asUk:function(){return[P.a,J.O]}},ct:{"":"wI;uD",
-WJ:function(a){return P.TC(a,this.uD)},
-$aswI:function(){return[P.a,J.O]}},Mx:{"":"wI;N5",
-WJ:function(a){return P.BS(a,this.N5)},
-$aswI:function(){return[J.O,P.a]}},Sh:{"":"a;WE,Mw,JN",
-RR:function(a){return this.WE.call$1(a)},
-Dx:function(a){var z=this.JN
-if(z.tg(z,a))throw H.b(P.bc(a))
-z.h(z,a)},
-C7:function(a){var z,y,x,w,v
-if(!this.Jc(a)){x=a
-w=this.JN
-if(w.tg(w,x))H.vh(P.bc(x))
-w.h(w,x)
-try{z=this.RR(a)
-if(!this.Jc(z)){x=P.Gy(a,null)
-throw H.b(x)}w.Rz(w,a)}catch(v){x=H.Ru(v)
-y=x
-throw H.b(P.Gy(a,y))}}},
-Jc:function(a){var z,y,x,w
-z={}
-if(typeof a==="number"){this.Mw.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.Mw.KF("true")
-return!0}else if(a===!1){this.Mw.KF("false")
-return!0}else if(a==null){this.Mw.KF("null")
-return!0}else if(typeof a==="string"){z=this.Mw
-z.KF("\"")
-P.k0(z,a)
-z.KF("\"")
-return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.Dx(a)
-z=this.Mw
-z.KF("[")
-if(J.xZ(y.gB(a),0)){this.C7(y.t(a,0))
-x=1
-while(!0){w=y.gB(a)
-if(typeof w!=="number")throw H.s(w)
-if(!(x<w))break
-z.vM=z.vM+","
-this.C7(y.t(a,x));++x}}z.KF("]")
-z=this.JN
-z.Rz(z,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.Dx(a)
-w=this.Mw
-w.KF("{")
-z.a=!0
-y.aN(a,new P.IH(z,this))
-w.KF("}")
-w=this.JN
-w.Rz(w,a)
-return!0}else return!1}},
-static:{"":"P3,ts,Ta,XM,qS,eZ,BL,KQ,MU,mr,YM,wO,QV",TC:function(a,b){var z
-b=P.BC
-z=P.p9("")
-new P.Sh(b,z,P.zM(null)).C7(a)
-return z.vM},k0:function(a,b){var z,y,x,w,v,u,t
-z=J.U6(b)
-y=z.gB(b)
-x=P.A(null,J.im)
-H.VM(x,[J.im])
-w=!1
-v=0
-while(!0){if(typeof y!=="number")throw H.s(y)
-if(!(v<y))break
-u=z.j(b,v)
-if(u<32){x.push(92)
-switch(u){case 8:x.push(98)
-break
-case 9:x.push(116)
-break
-case 10:x.push(110)
-break
-case 12:x.push(102)
-break
-case 13:x.push(114)
-break
-default:x.push(117)
-t=C.jn.m(u,12)&15
-x.push(t<10?48+t:87+t)
-t=C.jn.m(u,8)&15
-x.push(t<10?48+t:87+t)
-t=C.jn.m(u,4)&15
-x.push(t<10?48+t:87+t)
-t=u&15
-x.push(t<10?48+t:87+t)
-break}w=!0}else if(u===34||u===92){x.push(92)
-x.push(u)
-w=!0}else x.push(u);++v}a.KF(w?P.HM(x):b)}}},IH:{"":"Tp;a,b",
-call$2:function(a,b){var z,y,x
-z=this.a
-y=this.b
-if(!z.a)y.Mw.KF(",\"")
-else y.Mw.KF("\"")
-y=this.b
-x=y.Mw
-P.k0(x,a)
-x.KF("\":")
-y.C7(b)
-z.a=!1},
-"+call:2:0":0,
-$isEH:true,
-$is_bh:true},u5:{"":"ob;lH",
+$asUk:function(){return[P.a,J.O]}},QM:{"":"wI;N5",
+$aswI:function(){return[J.O,P.a]}},z0:{"":"ob;lH",
 goc:function(a){return"utf-8"},
 "+name":0,
-ou:function(a,b){return new P.GY(b).WJ(a)},
-kV:function(a){return this.ou(a,null)},
-gZE:function(){return new P.Vx()},
-gHe:function(){return new P.GY(this.lH)}},Vx:{"":"wI;",
+gZE:function(){return new P.Vx()}},Vx:{"":"wI;",
 WJ:function(a){var z,y,x
 z=a.length
 y=P.A(z*3,J.im)
@@ -14005,70 +13616,8 @@
 this.An=u+1
 if(u<0||u>=y)throw H.e(z,u)
 z[u]=(128|v&63)>>>0}}return w},
-static:{"":"Ij",}},GY:{"":"wI;lH",
-WJ:function(a){var z,y
-z=P.p9("")
-y=new P.jZ(this.lH,z,!0,0,0,0)
-y.ME(a,0,a.length)
-y.fZ()
-return z.vM},
-$aswI:function(){return[[J.Q,J.im],J.O]}},jZ:{"":"a;lH,aS,rU,nt,iU,VN",
-cO:function(a){this.fZ()},
-gJK:function(a){return new H.MT(this,P.jZ.prototype.cO,a,"cO")},
-fZ:function(){if(this.iU>0){if(!this.lH)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
-this.aS.KF(P.fc(65533))
-this.nt=0
-this.iU=0
-this.VN=0}},
-ME:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
-z=this.nt
-y=this.iU
-x=this.VN
-this.nt=0
-this.iU=0
-this.VN=0
-$loop$0:for(w=this.aS,v=!this.lH,u=b;!0;u=p,y=3,x=3){$multibyte$2:{if(y>0){t=a.length
-while(!0){if(u===c)break $loop$0
-if(u<0||u>=t)throw H.e(a,u)
-s=a[u]
-r=J.Wx(s)
-r.i(s,192)
-if(v)throw H.b(P.cD("Bad UTF-8 encoding 0x"+r.WZ(s,16)))
-this.rU=!1
-q=P.O8(1,65533,J.im)
-q.$builtinTypeInfo=[J.im]
-t=H.eT(q)
-w.vM=w.vM+t
-y=0
-break $multibyte$2}}}if(typeof c!=="number")throw H.s(c)
-for(;u<c;u=p){p=u+1
-if(u<0||u>=a.length)throw H.e(a,u)
-s=a[u]
-t=J.Wx(s)
-if(t.C(s,0)){if(v)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+J.em(t.J(s),16)))
-q=P.O8(1,65533,J.im)
-q.$builtinTypeInfo=[J.im]
-t=H.eT(q)
-w.vM=w.vM+t}else if(t.E(s,127)){this.rU=!1
-q=P.O8(1,s,J.im)
-q.$builtinTypeInfo=[J.im]
-t=H.eT(q)
-w.vM=w.vM+t}else{t.i(s,224)
-t.i(s,240)
-t.i(s,248)
-if(v)throw H.b(P.cD("Bad UTF-8 encoding 0x"+t.WZ(s,16)))
-this.rU=!1
-q=P.O8(1,65533,J.im)
-q.$builtinTypeInfo=[J.im]
-t=H.eT(q)
-w.vM=w.vM+t
-z=65533
-y=0
-x=0}}break $loop$0}if(y>0){this.nt=z
-this.iU=y
-this.VN=x}},
-static:{"":"AD",}}}],["dart.core","dart:core",,P,{Te:function(a){return},Wc:function(a,b){return J.oE(a,b)},hl:function(a){var z,y,x,w,v,u
-if(typeof a==="number"&&Math.floor(a)===a||typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
+static:{"":"Ij",}}}],["dart.core","dart:core",,P,{Te:function(a){return},Wc:function(a,b){return J.oE(a,b)},hl:function(a){var z,y,x,w,v,u
+if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
 z.vM="\""
 for(y=a.length,x=0;x<y;++x){w=C.xB.j(a,x)
@@ -14090,15 +13639,14 @@
 z.vM=z.vM+v}}z.vM=z.vM+"\""
 return z.vM}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},xv:function(a){return H.CU(a)},QA:function(a,b,c){return H.BU(a,c,b)},A:function(a,b){var z
 if(a==null)return new Array(0)
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(new P.AT("Length must be a positive integer: "+H.d(a)+"."))
+if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a positive integer: "+H.d(a)+"."))
 z=new Array(a)
 z.fixed$length=!0
 return z},O8:function(a,b,c){var z,y,x
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(new P.AT("Length must be a positive integer: "+H.d(a)+"."))
-z=new Array(a)
-z.fixed$length=!0
-if(!J.xC(a,0)&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},F:function(a,b,c){var z,y,x,w,v,u,t
+if(a<0)throw H.b(P.u("Length must be a positive integer: "+a+"."))
+z=H.rD(a)
+if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
+return z},F:function(a,b,c){var z,y,x,w,v
 z=P.A(null,c)
 H.VM(z,[c])
 for(y=J.GP(a);y.G();)z.push(y.gl())
@@ -14106,40 +13654,38 @@
 x=z.length
 w=P.A(x,c)
 H.VM(w,[c])
-for(y=z.length,v=w.length,u=0;u<x;++u){if(u>=y)throw H.e(z,u)
-t=z[u]
-if(u>=v)throw H.e(w,u)
-w[u]=t}return w},JS:function(a){var z,y
+for(y=z.length,v=0;v<x;++v){if(v>=y)throw H.e(z,v)
+w[v]=z[v]}return w},JS:function(a){var z,y
 z=J.AG(a)
 y=$.oK
 if(y==null)H.LJ(z)
-else y.call$1(z)},HM:function(a){return H.eT(a)},fc:function(a){var z=P.O8(1,a,J.im)
+else y.call$1(z)},fc:function(a){var z=P.O8(1,a,J.im)
 z.$builtinTypeInfo=[J.im]
-return H.eT(z)},ZZ:function(a,b){return 65536+((a&1023)<<10>>>0)+(b&1023)},h0:{"":"Tp;a",
+return H.eT(z)},hz:function(a,b){return 65536+((a&1023)<<10>>>0)+(b&1023)},h0:{"":"Tp;a",
 call$2:function(a,b){var z=this.a
-z.u(z,J.cs(a),b)},
+z.u(z,J.Z0(a),b)},
 "+call:2:0":0,
 $isEH:true,
 $is_bh:true},CL:{"":"Tp;a",
 call$2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
-z.a.KF(J.cs(a))
+z.a.KF(J.Z0(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b))
 z.b=z.b+1},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},uA:{"":"a;OF",
+$is_bh:true},K8:{"":"a;OF",
 bu:function(a){return"Deprecated feature. Will be removed "+this.OF}},a2:{"":"a;",
 bu:function(a){return this?"true":"false"},
-$isbool:true},fR:{"":"a;"},iP:{"":"a;y3<,aL",
+$isbool:true},fR:{"":"a;"},iP:{"":"a;rq<,aL",
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isiP)return!1
-return this.y3===b.y3&&this.aL===b.aL},
-iM:function(a,b){return C.CD.iM(this.y3,b.gy3())},
-gEo:function(a){return this.y3},
+return this.rq===b.rq&&this.aL===b.aL},
+iM:function(a,b){return C.CD.iM(this.rq,b.grq())},
+giO:function(a){return this.rq},
 bu:function(a){var z,y,x,w,v,u,t,s
 z=new P.pl()
 y=new P.Hn().call$1(H.tJ(this))
@@ -14147,19 +13693,18 @@
 w=z.call$1(H.jA(this))
 v=z.call$1(H.KL(this))
 u=z.call$1(H.ch(this))
-t=z.call$1(H.Jd(this))
+t=z.call$1(H.XJ(this))
 s=new P.Zl().call$1(H.o1(this))
 if(this.aL)return H.d(y)+"-"+H.d(x)+"-"+H.d(w)+" "+H.d(v)+":"+H.d(u)+":"+H.d(t)+"."+H.d(s)+"Z"
 else return H.d(y)+"-"+H.d(x)+"-"+H.d(w)+" "+H.d(v)+":"+H.d(u)+":"+H.d(t)+"."+H.d(s)},
-h:function(a,b){return P.Wu(C.CD.g(this.y3,b.gVs()),this.aL)},
-ght:function(a){return new J.C7(this,P.iP.prototype.h,a,"h")},
+h:function(a,b){return P.Wu(this.rq+b.gVs(),this.aL)},
 EK:function(){H.U8(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
-static:{"":"Oj,bI,df,yz,h2,JE,ur,DU,kc,Kc,k3,cR,E0,Ke,lT,Nr,bm,o4,Kz,J7,TO,Fk",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=new H.VR(H.v4("^([+-]?\\d?\\d\\d\\d\\d)-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)? ?([zZ])?)?$",!1,!0,!1),null,null).ej(a)
+static:{"":"Oj,bI,df,yM,h2,JE,nm,DU,H9,EN,k3,cR,E0,Ke,lT,Nr,bm,o4,Kz,J7,TO,I2",Gl:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=new H.VR(H.v4("^([+-]?\\d?\\d\\d\\d\\d)-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?\\+00(?::?00)?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
-x=z.QK
+x=z.oH
 if(1>=x.length)throw H.e(x,1)
 w=H.BU(x[1],null,null)
 if(2>=x.length)throw H.e(x,2)
@@ -14177,8 +13722,7 @@
 if(q===1000){p=!0
 q=999}else p=!1
 if(8>=x.length)throw H.e(x,8)
-y=x[8]
-o=y!=null&&!J.xC(y,"")
+o=x[8]!=null
 n=H.zW(w,v,u,t,s,r,q,o)
 return P.Wu(p?n+1:n,o)}else throw H.b(new P.AT(a))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
@@ -14192,7 +13736,7 @@
 $is_HB:true,
 $is_Dv:true},Rq:{"":"Tp;",
 call$1:function(a){if(a==null)return 0
-return H.mO(a,null)},
+return H.IH(a,null)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
@@ -14237,7 +13781,7 @@
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isa6)return!1
 return this.Fq===b.Fq},
-gEo:function(a){return this.Fq&0x1FFFFFFF},
+giO:function(a){return this.Fq&0x1FFFFFFF},
 iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
 bu:function(a){var z,y,x,w,v
 z=new P.DW()
@@ -14248,7 +13792,7 @@
 v=new P.P7().call$1(C.CD.JV(y,1000000))
 return H.d(C.CD.Z(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"":"Bp,S4,dk,Lo,zj,b2,jS,Ie,Do,ai,By,IJ,V6,Vk,fm,rG",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;",
+static:{"":"Bp,S4,dk,Lo,RD,b2,q9,Ie,Do,f4,vd,IJ,V6,Vk,fm,rG",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;",
 call$1:function(a){var z=J.Wx(a)
 if(z.F(a,100000))return H.d(a)
 if(z.F(a,10000))return"0"+H.d(a)
@@ -14299,7 +13843,7 @@
 $isub:true,
 static:{f:function(a){return new P.ub(a)}}},ds:{"":"Ge;G1>",
 bu:function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+z:"UnimplementedError"},
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},
 $isub:true,
 $isGe:true,
 static:{SY:function(a){return new P.ds(a)}}},lj:{"":"Ge;G1>",
@@ -14320,36 +13864,28 @@
 bu:function(a){return"FormatException: "+H.d(this.G1)},
 static:{cD:function(a){return new P.aE(a)}}},kM:{"":"a;oc>",
 bu:function(a){return"Expando:"+this.oc},
-t:function(a,b){var z=H.VK(b,"expando$values")
-return z==null?null:H.VK(z,this.J4())},
+t:function(a,b){var z=H.of(b,"expando$values")
+return z==null?null:H.of(z,this.Qz())},
 "+[]:1:0":0,
-u:function(a,b,c){var z=H.VK(b,"expando$values")
+u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.J4(),c)},
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},
 "+[]=:2:0":0,
-J4:function(){var z,y
-z=H.VK(this,"expando$key")
+Qz:function(){var z,y
+z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
 $.Ss=y+1
 z="expando$key$"+y
 H.aw(this,"expando$key",z)}return z},
-static:{"":"bZ,rl,Ss",}},EH:{"":"a;",$isEH:true},cX:{"":"a;",$iscX:true,$ascX:null},Yl:{"":"a;"},Z0:{"":"a;",$isZ0:true},c8:{"":"a;",
+static:{"":"bZ,rt,Ss",}},EH:{"":"a;",$isEH:true},cX:{"":"a;",$iscX:true,$ascX:null},Fl:{"":"a;"},L8:{"":"a;",$isL8:true},c8:{"":"a;",
 bu:function(a){return"null"}},a:{"":";",
 n:function(a,b){return this===b},
-gEo:function(a){return H.eQ(this)},
+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))},
+"+noSuchMethod:1:0":0,
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},Od:{"":"a;",$isOd:true},mE:{"":"a;"},WU:{"":"a;Qk,SU,Oq,Wn",
-dt:function(a){J.xZ(a,0)},
-Z0:function(a,b){var z=J.Wx(b)
-z.C(b,0)
-z.D(b,J.q8(this.Qk))
-this.dt(b)
-this.Oq=b
-this.SU=b
-this.Wn=null},
-CH:function(a){return this.Z0(a,0)},
 gl:function(){return this.Wn},
 "+current":0,
 G:function(){var z,y,x,w,v,u
@@ -14364,7 +13900,7 @@
 v=w<v}else v=!1
 if(v){u=y.j(z,w)
 if((u&64512)===56320){this.Oq=w+1
-this.Wn=P.ZZ(x,u)
+this.Wn=P.hz(x,u)
 return!0}}this.Oq=w
 this.Wn=x
 return!0}},Rn:{"":"a;vM<",
@@ -14388,10 +13924,11 @@
 y=typeof y==="string"?y:H.d(y)
 this.vM=this.vM+y}}},
 bu:function(a){return this.vM},
-PD:function(a){this.vM=a},
+PD:function(a){if(typeof a==="string")this.vM=a
+else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
-return z}}},wv:{"":"a;",$iswv:true},uq:{"":"a;",$isuq:true},iD:{"":"a;NN,HC,r0,Fi,ku,tP,BJ,MS,yW",
+return z}}},wv:{"":"a;",$iswv:true},uq:{"":"a;",$isuq:true},iD:{"":"a;NN,HC,r0,Fi,iV,tP,BJ,MS,yW",
 gJf:function(a){var z,y
 z=this.NN
 if(z!=null&&J.co(z,"[")){y=J.U6(z)
@@ -14401,27 +13938,28 @@
 y=J.x(z)
 if(y.n(z,"http"))return 80
 if(y.n(z,"https"))return 443}return this.HC},
-gay:function(a){return this.r0},
+gIi:function(a){return this.r0},
 Ja:function(a,b){return this.tP.call$1(b)},
 x6:function(a,b){var z,y
 z=a==null
 if(z&&!0)return""
 z=!z
-if(z);y=z?P.Xc(a):J.Dn(C.jN.ez(b,new P.Kd()),"/")
-if(!J.xC(this.gJf(this),"")||J.xC(this.Fi,"file")){z=J.U6(y)
+if(z);if(z)y=P.Xc(a)
+else{z=C.jN.ez(b,new P.Kd())
+y=z.zV(z,"/")}if(!J.xC(this.gJf(this),"")||J.xC(this.Fi,"file")){z=J.U6(y)
 z=z.gor(y)&&!z.nC(y,"/")}else z=!1
 if(z)return"/"+H.d(y)
 return y},
 Ky:function(a,b){var z=J.x(a)
 if(z.n(a,""))return"/"+H.d(b)
 return z.JT(a,0,J.WB(z.cn(a,"/"),1))+H.d(b)},
-K2:function(a){var z=J.U6(a)
+uo:function(a){var z=J.U6(a)
 if(J.xZ(z.gB(a),0)&&z.j(a,0)===58)return!0
 return z.u8(a,"/.")!==-1},
 SK:function(a){var z,y,x,w,v
-if(!this.K2(a))return a
+if(!this.uo(a))return a
 z=[]
-for(y=J.uH(a,"/"),x=new H.wi(y,y.length,0,null),H.VM(x,[H.ip(y,"Q",0)]),w=!1;x.G();){v=x.M4
+for(y=J.uH(a,"/"),x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]),w=!1;x.G();){v=x.mD
 if(J.xC(v,"..")){y=z.length
 if(y!==0)if(y===1){if(0>=y)throw H.e(z,0)
 y=!J.xC(z[0],"")}else y=!0
@@ -14431,15 +13969,13 @@
 else{z.push(v)
 w=!1}}if(w)z.push("")
 return C.Nm.zV(z,"/")},
-RT:function(a){return this.mS(P.r6($.cO().ej(a)))},
-gjM:function(){return new H.Pm(this,P.iD.prototype.RT,null,"RT")},
 mS:function(a){var z,y,x,w,v,u,t,s
 z=a.Fi
-if(!J.xC(z,"")){y=a.ku
+if(!J.xC(z,"")){y=a.iV
 x=a.gJf(a)
 w=a.gGL(a)
 v=this.SK(a.r0)
-u=a.tP}else{if(!J.xC(a.gJf(a),"")){y=a.ku
+u=a.tP}else{if(!J.xC(a.gJf(a),"")){y=a.iV
 x=a.gJf(a)
 w=a.gGL(a)
 v=this.SK(a.r0)
@@ -14448,10 +13984,10 @@
 u=!J.xC(u,"")?u:this.tP}else{t=J.co(a.r0,"/")
 s=a.r0
 v=t?this.SK(s):this.SK(this.Ky(this.r0,s))
-u=a.tP}y=this.ku
+u=a.tP}y=this.iV
 x=this.gJf(this)
 w=this.gGL(this)}z=this.Fi}return P.R6(a.BJ,x,v,null,w,u,null,z,y)},
-tb:function(a){var z=this.ku
+tb:function(a){var z=this.iV
 if(""!==z){a.KF(z)
 a.KF("@")}z=this.NN
 a.KF(z==null?"null":z)
@@ -14472,17 +14008,17 @@
 if(b==null)return!1
 z=J.RE(b)
 if(typeof b!=="object"||b===null||!z.$isiD)return!1
-return J.xC(this.Fi,b.Fi)&&J.xC(this.ku,b.ku)&&J.xC(this.gJf(this),z.gJf(b))&&J.xC(this.gGL(this),z.gGL(b))&&J.xC(this.r0,b.r0)&&J.xC(this.tP,b.tP)&&J.xC(this.BJ,b.BJ)},
-gEo:function(a){var z=new P.ud()
-return z.call$2(this.Fi,z.call$2(this.ku,z.call$2(this.gJf(this),z.call$2(this.gGL(this),z.call$2(this.r0,z.call$2(this.tP,z.call$2(this.BJ,1)))))))},
+return J.xC(this.Fi,b.Fi)&&J.xC(this.iV,b.iV)&&J.xC(this.gJf(this),z.gJf(b))&&J.xC(this.gGL(this),z.gGL(b))&&J.xC(this.r0,b.r0)&&J.xC(this.tP,b.tP)&&J.xC(this.BJ,b.BJ)},
+giO:function(a){var z=new P.XZ()
+return z.call$2(this.Fi,z.call$2(this.iV,z.call$2(this.gJf(this),z.call$2(this.gGL(this),z.call$2(this.r0,z.call$2(this.tP,z.call$2(this.BJ,1)))))))},
 n3:function(a,b,c,d,e,f,g,h,i){var z=J.x(h)
 if(z.n(h,"http")&&J.xC(e,80))this.HC=0
 else if(z.n(h,"https")&&J.xC(e,443))this.HC=0
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"":"Um,B4,Bx,tX,LM,ha,nR,jJ,d2,q7,ux,vI,il,Im,IL,Q5,Xr,yt,qD,O5,Fs,qf,dR,rq,Cn,R1,oe,vT,K7,nL,H5,d5,eK,bf,Sp,aJ,uj,SQ,Th",r6:function(a){var z,y,x,w,v,u,t,s
-z=a.QK
+static:{"":"Um,B4,Bx,iR,LM,iI,nR,jJ,d2,q7,ux,vI,il,tC,IL,Q5,vl,yt,fC,O5,eq,qf,Tx,y3,Cn,R1,oe,vT,K7,nL,H5,zst,eK,bf,Sp,nU,uj,SQ,SD",r6:function(a){var z,y,x,w,v,u,t,s
+z=a.oH
 if(1>=z.length)throw H.e(z,1)
 y=z[1]
 y=P.iy(y!=null?y:"")
@@ -14618,12 +14154,12 @@
 w=t}if(t===w){if(u)z.call$1("only one wildcard `::` is allowed")
 J.bi(x,-1)
 u=!0}else J.bi(x,y.call$2(w,t))
-w=t+1}++t}if(J.xC(J.q8(x),0))z.call$1("too few parts")
+w=t+1}++t}if(J.q8(x)===0)z.call$1("too few parts")
 r=J.xC(w,J.q8(a))
 q=J.xC(J.MQ(x),-1)
 if(r&&!q)z.call$1("expected a part after last `:`")
 if(!r)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(p){H.Ru(p)
-try{v=P.q5(J.Z1(a,w))
+try{v=P.q5(J.ZZ(a,w))
 s=J.Eh(J.UQ(v,0),8)
 o=J.UQ(v,1)
 if(typeof o!=="number")throw H.s(o)
@@ -14632,9 +14168,7 @@
 s=J.UQ(v,3)
 if(typeof s!=="number")throw H.s(s)
 J.bi(x,(o|s)>>>0)}catch(p){H.Ru(p)
-z.call$1("invalid end of IPv6 address.")}}if(u){s=J.q8(x)
-if(typeof s!=="number")throw s.D()
-if(s>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(!J.xC(J.q8(x),8))z.call$1("an address without a wildcard must contain exactly 8 parts")
+z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.zs(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
 n=H.Y9(s.$asmW,H.oX(s))
@@ -14661,7 +14195,7 @@
 r.$builtinTypeInfo=[J.im]
 v=H.eT(r)
 v=C.Nm.gA(C.dy.gZE().WJ(v))
-for(;v.G();){t=z.call$1(v.M4)
+for(;v.G();){t=z.call$1(v.mD)
 t=typeof t==="string"?t:H.d(t)
 y.vM=y.vM+t}}++w}return y.vM}}},hb:{"":"Tp;",
 call$1:function(a){var z,y
@@ -14754,8 +14288,8 @@
 else y.KF(J.bh(w,x,v))},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},ud:{"":"Tp;",
-call$2:function(a,b){return J.mQ(J.WB(J.p0(b,31),J.le(a)),1073741823)},
+$is_X0:true},XZ:{"":"Tp;",
+call$2:function(a,b){return J.mQ(J.WB(J.p0(b,31),J.v1(a)),1073741823)},
 "+call:2:0":0,
 $isEH:true,
 $is_bh:true},hQ:{"":"Tp;",
@@ -14806,43 +14340,39 @@
 $isEH:true,
 $is_HB:true,
 $is_Dv:true}}],["dart.dom.html","dart:html",,W,{lq:function(){return window
-"12"},"+window":1,Fz:function(a){if(P.F7()===!0)return"webkitTransitionEnd"
+"12"},"+window":1,UE:function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
 return"transitionend"},r3:function(a,b){return document.createElement(a)},It: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,w
 z=W.fJ
 y=new P.Zf(P.Dt(z))
 H.VM(y,[z])
 x=new XMLHttpRequest()
-C.W3.kP(x,"GET",a,!0)
+C.W3.xI(x,"GET",a,!0)
 z=C.fK.aM(x)
 w=new W.Ov(0,z.uv,z.Ph,W.aF(new W.bU(y,x)),z.Sg)
-H.VM(w,[H.ip(z,"RO",0)])
+H.VM(w,[H.W8(z,"RO",0)])
 w.Zz()
 w=C.MD.aM(x)
 z=y.gYJ()
 z=new W.Ov(0,w.uv,w.Ph,W.aF(z),w.Sg)
-H.VM(z,[H.ip(w,"RO",0)])
+H.VM(z,[H.W8(w,"RO",0)])
 z.Zz()
 x.send()
-return y.MM},en:function(a){var z,y
+return y.MM},ED:function(a){var z,y
 z=document.createElement("input",null)
-if(a!=null)try{J.fl(z,a)}catch(y){H.Ru(y)}return z},H6:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var z=document.createEvent("MouseEvent")
+if(a!=null)try{J.Q3(z,a)}catch(y){H.Ru(y)}return z},H6:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var z=document.createEvent("MouseEvent")
 J.e2(z,a,d,e,o,i,l,m,f,g,h,b,n,j,c,k)
 return z},uC:function(a){var z,y,x
 try{z=a
 y=J.x(z)
 return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},C0:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return(a^C.jn.m(a,6))>>>0},Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
-a=(a^C.jn.m(a,11))>>>0
-return 536870911&a+((16383&a)<<15>>>0)},Pv:function(a){if(a==null)return
-return W.P1(a)},jj:function(a){var z,y
+return!1}},uV:function(a){if(a==null)return
+return W.P1(a)},bt:function(a){var z,y
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},m7:function(a){return a},YT:function(a,b){return new W.vZ(a,b)},GO:function(a){return J.TD(a)},Yb:function(a){return J.W7(a)},Qp:function(a,b,c,d){return J.qd(a,b,c,d)},a7:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+return}else return a},m7:function(a){return a},YT:function(a,b){return new W.vZ(a,b)},GO:function(a){return J.TD(a)},Yb:function(a){return J.W7(a)},Qp:function(a,b,c,d){return J.qd(a,b,c,d)},wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Fb(d)
 if(z==null)throw H.b(new P.AT(d))
 y=z.prototype
@@ -14881,22 +14411,259 @@
 q={prototype: s}
 if(!J.xC(w,"HTMLElement"))if(!v)q.extends=e
 b.register(c,q)},aF:function(a){if(J.xC($.X3,C.NU))return a
-return $.X3.oj(a,!0)},QZ:{"":"a;",
+return $.X3.oj(a,!0)},qE:{"":"cv;","%":"HTMLAppletElement|HTMLBRElement|HTMLBaseFontElement|HTMLBodyElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLFrameSetElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableElement|HTMLTableHeaderCellElement|HTMLTableRowElement|HTMLTableSectionElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Tt|GN|ir|Xf|uL|Vf|aC|tu|Be|Vc|i6|WZ|Fv|pv|I3|Vfx|Gk|Dsd|Ds|u7|tuj|St|Vct|vj|D13|CX|Nh|ih|F1|XP|NQ|WZq|uw"},Yy:{"":"Gv;",$isList:true,
+$asWO:function(){return[W.M5]},
+$isqC:true,
+$iscX:true,
+$ascX:function(){return[W.M5]},
+"%":"EntryArray"},Ps:{"":"qE;cC:hash%,LU:href=,N:target=,r9:type%",
+bu:function(a){return a.toString()},
+"%":"HTMLAnchorElement"},fY:{"":"qE;cC:hash=,LU:href=,N:target=","%":"HTMLAreaElement"},nB:{"":"qE;LU:href=,N:target=","%":"HTMLBaseElement"},Az:{"":"Gv;r9:type=",$isAz:true,"%":";Blob"},QW:{"":"qE;MB:form=,oc:name%,r9:type%,P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+"%":"HTMLButtonElement"},OM:{"":"KV;B:length=",$isGv:true,"%":"Comment;CharacterData"},QQ:{"":"ea;tT:code=","%":"CloseEvent"},oJ:{"":"BV;B:length=",
+T2:function(a,b){var z=a.getPropertyValue(b)
+return z!=null?z:""},
+"%":"CSS2Properties|CSSStyleDeclaration|MSStyleCSSProperties"},DG:{"":"ea;",
+gey:function(a){var z=a._dartDetail
+if(z!=null)return z
+return P.o7(a.detail,!0)},
+$isDG:true,
+"%":"CustomEvent"},YN:{"":"KV;",
+JP:function(a){return a.createDocumentFragment()},
+Kb:function(a,b){return a.getElementById(b)},
+gEr:function(a){return C.mt.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
+gLm:function(a){return C.io.aM(a)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+$isYN:true,
+"%":"Document|HTMLDocument|SVGDocument"},bA:{"":"KV;",
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+$isGv:true,
+"%":";DocumentFragment"},Wq:{"":"KV;",$isGv:true,"%":"DocumentType"},rz:{"":"Gv;G1:message=,oc:name=","%":";DOMError"},BK:{"":"Gv;G1:message=",
+goc:function(a){var z=a.name
+if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
+if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
+return z},
+"+name":0,
+bu:function(a){return a.toString()},
+"%":"DOMException"},cv:{"":"KV;xr:className%,jO:id%",
+gQg:function(a){return new W.E9(a)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+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)},
+i4:function(a){},
+"+enteredView:0:0":0,
+Nz:function(a){},
+"+leftView:0:0":0,
+aC:function(a,b,c,d){},
+gjU:function(a){return a.localName},
+bu:function(a){return a.localName},
+WO:function(a,b){if(!!a.matches)return a.matches(b)
+else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
+else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
+else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
+else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
+else throw H.b(P.f("Not supported on this platform"))},
+bA:function(a,b){var z=a
+do{if(J.RF(z,b))return!0
+z=z.parentElement}while(z!=null)
+return!1},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+gKE:function(a){return a.shadowRoot||a.webkitShadowRoot},
+gI:function(a){return new W.DM(a,a)},
+gEr:function(a){return C.mt.f0(a)},
+gVl:function(a){return C.T1.f0(a)},
+gLm:function(a){return C.io.f0(a)},
+ZL:function(a){},
+$iscv:true,
+$isGv:true,
+"%":";Element"},Fs:{"":"qE;oc:name%,LA:src=,r9:type%","%":"HTMLEmbedElement"},SX:{"":"ea;kc:error=,G1:message=","%":"ErrorEvent"},ea:{"":"Gv;It:_selector},Xt:bubbles=,Ii:path=,r9:type=",
+gN:function(a){return W.bt(a.target)},
+$isea:true,
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MIDIMessageEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MessageEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|SpeechRecognitionEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},D0:{"":"Gv;",
+gI:function(a){return new W.Jn(a)},
+On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
+$isD0:true,
+"%":";EventTarget"},as:{"":"qE;MB:form=,oc:name%,r9:type=","%":"HTMLFieldSetElement"},T5:{"":"Az;oc:name=","%":"File"},Aa:{"":"rz;tT:code=","%":"FileError"},Yu:{"":"qE;B:length=,bP:method=,oc:name%,N:target=","%":"HTMLFormElement"},xn:{"":"ec;",
+gB:function(a){return a.length},
+"+length":0,
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},
+"+[]:1:0":0,
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+"+[]=:2:0":0,
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+"+length=":0,
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(new P.lj("No elements"))},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
+return a[b]},
+$asWO:function(){return[W.KV]},
+$ascX:function(){return[W.KV]},
+$isList:true,
+$isqC:true,
+$iscX:true,
+$isXj:true,
+"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},fJ:{"":"Vi;iC:responseText=,ys:status=,po:statusText=",
+R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+xI:function(a,b,c,d){return a.open(b,c,d)},
+wR:function(a,b){return a.send(b)},
+$isfJ:true,
+"%":"XMLHttpRequest"},Vi:{"":"D0;","%":";XMLHttpRequestEventTarget"},tX:{"":"qE;oc:name%,LA:src=","%":"HTMLIFrameElement"},Sg:{"":"Gv;",$isSg:true,"%":"ImageData"},pA:{"":"qE;LA:src=",
+tZ:function(a){return this.complete.call$0()},
+"%":"HTMLImageElement"},Mi:{"":"qE;Tq:checked%,MB:form=,qC:list=,oc:name%,LA:src=,r9:type%,P:value%",
+RR:function(a,b){return this.accept.call$1(b)},
+r6:function(a,b){return this.value.call$1(b)},
+$isMi:true,
+$iscv:true,
+$isGv:true,
+$isKV:true,
+$isD0:true,
+"%":"HTMLInputElement"},Gt:{"":"Mf;mW:location=","%":"KeyboardEvent"},In:{"":"qE;MB:form=,oc:name%,r9:type=","%":"HTMLKeygenElement"},Gx:{"":"qE;P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+"%":"HTMLLIElement"},eP:{"":"qE;MB:form=","%":"HTMLLabelElement"},AL:{"":"qE;MB:form=","%":"HTMLLegendElement"},Og:{"":"qE;LU:href=,r9:type%",$isOg:true,"%":"HTMLLinkElement"},cS:{"":"Gv;cC:hash%,LU:href=",
+bu:function(a){return a.toString()},
+$iscS:true,
+"%":"Location"},M6:{"":"qE;oc:name%","%":"HTMLMapElement"},El:{"":"qE;kc:error=,LA:src=",
+yy:function(a){return a.pause()},
+"%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},zm:{"":"Gv;tT:code=","%":"MediaError"},SV:{"":"Gv;tT:code=","%":"MediaKeyError"},aB:{"":"ea;G1:message=","%":"MediaKeyEvent"},ku:{"":"ea;G1:message=","%":"MediaKeyMessageEvent"},cW:{"":"D0;jO:id=","%":"MediaStream"},la:{"":"qE;jb:content=,oc:name%","%":"HTMLMetaElement"},Vn:{"":"qE;P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+"%":"HTMLMeterElement"},bn:{"":"Im;",
+LV:function(a,b,c){return a.send(b,c)},
+wR:function(a,b){return a.send(b)},
+"%":"MIDIOutput"},Im:{"":"D0;jO:id=,oc:name=,r9:type=","%":"MIDIInput;MIDIPort"},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.m7(p))
+return},
+$isAj:true,
+"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},oU:{"":"Gv;",$isGv:true,"%":"Navigator"},qT:{"":"Gv;G1:message=,oc:name=","%":"NavigatorUserMediaError"},KV:{"":"D0;q6:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent}",
+gyT:function(a){return new W.e7(a)},
+wg:function(a){var z=a.parentNode
+if(z!=null)z.removeChild(a)},
+bu:function(a){var z=a.nodeValue
+return z==null?J.Gv.prototype.bu.call(this,a):z},
+jx:function(a,b){return a.appendChild(b)},
+Yv:function(a,b){return a.cloneNode(b)},
+tg:function(a,b){return a.contains(b)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
+$isKV:true,
+"%":"Entity|Notation;Node"},BH:{"":"rl;",
+gB:function(a){return a.length},
+"+length":0,
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},
+"+[]:1:0":0,
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+"+[]=:2:0":0,
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+"+length=":0,
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(new P.lj("No elements"))},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
+return a[b]},
+$asWO:function(){return[W.KV]},
+$ascX:function(){return[W.KV]},
+$isList:true,
+$isqC:true,
+$iscX:true,
+$isXj:true,
+"%":"NodeList|RadioNodeList"},mh:{"":"qE;r9:type%","%":"HTMLOListElement"},G7:{"":"qE;MB:form=,oc:name%,r9:type%","%":"HTMLObjectElement"},Ql:{"":"qE;MB:form=,vH:index=,P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+$isQl:true,
+"%":"HTMLOptionElement"},Xp:{"":"qE;MB:form=,oc:name%,r9:type=,P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+"%":"HTMLOutputElement"},HD:{"":"qE;oc:name%,P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+"%":"HTMLParamElement"},p3:{"":"Gv;tT:code=,G1:message=","%":"PositionError"},qW:{"":"OM;N:target=","%":"ProcessingInstruction"},KR:{"":"qE;P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+"%":"HTMLProgressElement"},ew:{"":"ea;",$isew:true,"%":"ProgressEvent|ResourceProgressEvent|XMLHttpRequestProgressEvent"},j2:{"":"qE;LA:src=,r9:type%",$isj2:true,"%":"HTMLScriptElement"},lp:{"":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,r9:type=,P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+$islp:true,
+"%":"HTMLSelectElement"},I0:{"":"bA;pQ:applyAuthorStyles=",
+Yv:function(a,b){return a.cloneNode(b)},
+Kb:function(a,b){return a.getElementById(b)},
+$isI0:true,
+"%":"ShadowRoot"},QR:{"":"qE;LA:src=,r9:type%","%":"HTMLSourceElement"},zD:{"":"ea;kc:error=,G1:message=","%":"SpeechRecognitionError"},G0:{"":"ea;oc:name=","%":"SpeechSynthesisEvent"},wb:{"":"ea;G3:key=,zZ:newValue=,jL:oldValue=","%":"StorageEvent"},fq:{"":"qE;r9:type%","%":"HTMLStyleElement"},yY:{"":"qE;jb:content=",$isyY:true,"%":"HTMLTemplateElement"},kJ:{"":"OM;",$iskJ:true,"%":"CDATASection|Text"},AE:{"":"qE;MB:form=,oc:name%,r9:type=,P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+$isAE:true,
+"%":"HTMLTextAreaElement"},RH:{"":"qE;fY:kind=,LA:src=","%":"HTMLTrackElement"},Lq:{"":"ea;",$isLq:true,"%":"TransitionEvent|WebKitTransitionEvent"},Mf:{"":"ea;","%":"CompositionEvent|FocusEvent|SVGZoomEvent|TextEvent|TouchEvent;UIEvent"},K5:{"":"D0;oc:name%,ys:status=",
+gmW:function(a){var z=a.location
+if(W.uC(z)===!0)return z
+if(null==a._location_wrapper)a._location_wrapper=new W.H2(z)
+return a._location_wrapper},
+oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+pl:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
+  (function($this) {
+   var vendors = ['ms', 'moz', 'webkit', 'o'];
+   for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+     $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+     $this.cancelAnimationFrame =
+         $this[vendors[i]+'CancelAnimationFrame'] ||
+         $this[vendors[i]+'CancelRequestAnimationFrame'];
+   }
+   if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
+   $this.requestAnimationFrame = function(callback) {
+      return window.setTimeout(function() {
+        callback(Date.now());
+      }, 16 /* 16ms ~= 60fps */);
+   };
+   $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
+  })(a)},
+geT:function(a){return W.uV(a.parent)},
+cO:function(a){return a.close()},
+bu:function(a){return a.toString()},
+gEr:function(a){return C.mt.aM(a)},
+gVl:function(a){return C.T1.aM(a)},
+gLm:function(a){return C.io.aM(a)},
+$isK5:true,
+$isGv:true,
+$isD0:true,
+"%":"DOMWindow|Window"},UM:{"":"KV;oc:name=,P:value%",
+r6:function(a,b){return this.value.call$1(b)},
+"%":"Attr"},rh:{"":"Gb;",
+gB:function(a){return a.length},
+"+length":0,
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},
+"+[]:1:0":0,
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+"+[]=:2:0":0,
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+"+length=":0,
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(new P.lj("No elements"))},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
+return a[b]},
+$asWO:function(){return[W.KV]},
+$ascX:function(){return[W.KV]},
+$isList:true,
+$isqC:true,
+$iscX:true,
+$isXj:true,
+"%":"MozNamedAttrMap|NamedNodeMap"},QZ:{"":"a;",
 Wt:function(a,b){return typeof console!="undefined"?console.error(b):null},
 "+error:1:0":0,
-gkc:function(a){return new J.C7(this,W.QZ.prototype.Wt,a,"Wt")},
+gkc:function(a){return new P.C7(this,W.QZ.prototype.Wt,a,"Wt")},
 To:function(a){return typeof console!="undefined"?console.info(a):null},
 ZF:function(a,b){return typeof console!="undefined"?console.trace(b):null},
 "+trace:1:0":0,
-gtN:function(a){return new J.C7(this,W.QZ.prototype.ZF,a,"ZF")},
-static:{"":"wk",}},BV:{"":"vB+id;"},id:{"":"a;",
+gtN:function(a){return new P.C7(this,W.QZ.prototype.ZF,a,"ZF")},
+static:{"":"wk",}},BV:{"":"Gv+E1;"},E1:{"":"a;",
 gjb:function(a){return this.T2(a,"content")},
-gfg:function(a){return this.T2(a,"height")},
 gBb:function(a){return this.T2(a,"left")},
-gip:function(a){return this.T2(a,"right")},
-gLA:function(a){return this.T2(a,"src")},
-gG6:function(a){return this.T2(a,"top")},
-gR:function(a){return this.T2(a,"width")}},yo:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},ec:{"":"yo+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},wz:{"":"ar;Sn,Sc",
+gT8:function(a){return this.T2(a,"right")},
+gLA:function(a){return this.T2(a,"src")}},wz:{"":"ar;Sn,Sc",
 gB:function(a){return this.Sn.length},
 "+length":0,
 t:function(a,b){var z=this.Sn
@@ -14907,50 +14674,56 @@
 "+[]=:2:0":0,
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 "+length=":0,
-gFV:function(a){return C.t5.gFV(this.Sn)},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
-gi9:function(a){return C.mt.Uh(this)},
+gEr:function(a){return C.mt.Uh(this)},
 gVl:function(a){return C.T1.Uh(this)},
 gLm:function(a){return C.io.Uh(this)},
-nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.Lc())
-this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
+nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
+this.Sc=P.F(z,!0,H.W8(z,"mW",0))},
 $asar:null,
 $asWO:null,
 $ascX:null,
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 static:{vD:function(a,b){var z=new W.wz(a,null)
 H.VM(z,[b])
 z.nJ(a,b)
-return z}}},Lc:{"":"Tp;",
+return z}}},B1:{"":"Tp;",
 call$1:function(a){var z=J.x(a)
 return typeof a==="object"&&a!==null&&!!z.$iscv},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},M5:{"":"vB;"},Jn:{"":"a;WK<",
+$is_Dv:true},M5:{"":"Gv;"},Jn:{"":"a;WK<",
 t:function(a,b){var z=new W.RO(this.gWK(),b,!1)
-H.VM(z,[null])
+z.$builtinTypeInfo=[null]
 return z},
 "+[]:1:0":0},DM:{"":"Jn;WK<,vW",
 t:function(a,b){var z,y
 z=$.Vp()
 y=J.rY(b)
-if(z.gvc(z).Fb.x4(y.hc(b)))if(P.F7()===!0){z=$.Vp()
+if(z.gvc(z).Fb.x4(y.hc(b))){if($.PN==null){if($.L4==null){z=window.navigator.userAgent
+z.toString
+z.length
+$.L4=H.m2(z,"Opera",0)}if($.L4!==!0){z=window.navigator.userAgent
+z.toString
+z.length
+z=H.m2(z,"WebKit",0)}else z=!1
+$.PN=z}if($.PN===!0){z=$.Vp()
 y=new W.eu(this.WK,z.t(z,y.hc(b)),!1)
-H.VM(y,[null])
-return y}z=new W.eu(this.WK,b,!1)
-H.VM(z,[null])
+y.$builtinTypeInfo=[null]
+return y}}z=new W.eu(this.WK,b,!1)
+z.$builtinTypeInfo=[null]
 return z},
 "+[]:1:0":0,
-static:{"":"fD",}},zL:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},Gb:{"":"zL+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},xt:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},ecX:{"":"xt+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},Kx:{"":"Tp;",
+static:{"":"fD",}},zL:{"":"Gv+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},ec:{"":"zL+Gm;",$asWO:null,$ascX:null,$isList:true,$isqC:true,$iscX:true},Kx:{"":"Tp;",
 call$1:function(a){return J.EC(a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},hH:{"":"Tp;a",
+$is_Dv:true},iO:{"":"Tp;a",
 call$2:function(a,b){this.a.setRequestHeader(a,b)},
 "+call:2:0":0,
 $isEH:true,
@@ -14963,21 +14736,15 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else{z=x.MM
-if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
-z.CG(a,null)}},
+y.OH(z)}else x.pm(a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},nj:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},w1p:{"":"nj+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},e7:{"":"ar;NL",
-gFV:function(a){var z=this.NL.firstChild
-if(z==null)throw H.b(new P.lj("No elements"))
-return z},
+$is_Dv:true},e7:{"":"ar;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
 h:function(a,b){this.NL.appendChild(b)},
-ght:function(a){return new J.C7(this,W.e7.prototype.h,a,"h")},
 Rz:function(a,b){var z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isKV)return!1
 z=this.NL
@@ -15002,14 +14769,14 @@
 "+[]:1:0":0,
 $asar:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
-$ascX:function(){return[W.KV]}},RAp:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},kEI:{"":"RAp+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},nNL:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},x5e:{"":"nNL+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},KS:{"":"D0+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},bD:{"":"KS+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},yoo:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},HRa:{"":"yoo+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},zLC:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},t7i:{"":"zLC+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},t8:{"":"D0+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},an:{"":"t8+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},dxW:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},rrb:{"":"dxW+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},hmZ:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},rla:{"":"hmZ+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},xth:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},Gba:{"":"xth+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},hw:{"":"ba+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},ST:{"":"hw+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},Ocb:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},maa:{"":"Ocb+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},nja:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e0:{"":"nja+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},qba:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e5:{"":"qba+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},R2:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e6:{"":"R2+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},R3:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e8:{"":"R3+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},cf:{"":"a;",
+$ascX:function(){return[W.KV]}},nj:{"":"Gv+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},rl:{"":"nj+Gm;",$asWO:null,$ascX:null,$isList:true,$isqC:true,$iscX:true},RAp:{"":"Gv+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},Gb:{"":"RAp+Gm;",$asWO:null,$ascX:null,$isList:true,$isqC:true,$iscX:true},cf:{"":"a;",
 PF:function(a){var z,y
-for(z=this.gUQ(this),y=new H.wi(z,z.length,0,null),H.VM(y,[H.ip(z,"Q",0)]);y.G(););return!1},
+for(z=this.gUQ(this),y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G(););return!1},
 "+containsValue:1:0":0,
 to:function(a,b){if(this.x4(a)!==!0)this.u(this,a,b.call$0())
 return this.t(this,a)},
 aN:function(a,b){var z,y,x
-for(z=this.gvc(this),y=new H.wi(z,z.length,0,null),H.VM(y,[H.ip(z,"Q",0)]);y.G();){x=y.M4
+for(z=this.gvc(this),y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G();){x=y.mD
 b.call$2(x,this.t(this,x))}},
 gvc:function(a){var z,y,x,w
 z=this.MW.attributes
@@ -15017,7 +14784,7 @@
 H.VM(y,[J.O])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)throw H.e(z,w)
 if(this.mb(z[w])){if(w>=z.length)throw H.e(z,w)
-y.push(J.tE(z[w]))}}return y},
+y.push(J.DA(z[w]))}}return y},
 "+keys":0,
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
@@ -15031,8 +14798,8 @@
 "+isEmpty":0,
 gor:function(a){return this.gB(this)!==0},
 "+isNotEmpty":0,
-$isZ0:true,
-$asZ0:function(){return[J.O,J.O]}},E9:{"":"cf;MW",
+$isL8:true,
+$asL8:function(){return[J.O,J.O]}},E9:{"":"cf;MW",
 x4:function(a){return this.MW.hasAttribute(a)},
 "+containsKey:1:0":0,
 t:function(a,b){return this.MW.getAttribute(b)},
@@ -15054,7 +14821,7 @@
 return z},
 p5:function(a){var z,y,x
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.QX,x=new H.wi(y,y.length,0,null),H.VM(x,[H.ip(y,"Q",0)]);x.G();)J.Pw(x.M4,z)},
+for(y=this.QX,x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]);x.G();)J.Pw(x.mD,z)},
 OS:function(a){var z=this.Kd
 z.aN(z,new W.vf(a))},
 Rz:function(a,b){return this.xz(new W.Fc(b))},
@@ -15093,22 +14860,34 @@
 $is_bh:true},I4:{"":"As;MW",
 lF:function(){var z,y,x,w
 z=P.Ls(null,null,null,J.O)
-for(y=J.uf(this.MW).split(" "),x=new H.wi(y,y.length,0,null),H.VM(x,[H.ip(y,"Q",0)]);x.G();){w=J.rr(x.M4)
+for(y=J.uf(this.MW).split(" "),x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]);x.G();){w=J.rr(x.mD)
 if(w.length!==0)z.h(z,w)}return z},
 p5:function(a){P.F(a,!0,null)
-J.Pw(this.MW,a.zV(a," "))}},RO:{"":"qh;uv,Ph,Sg",
-X5:function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
-H.VM(z,[H.ip(this,"RO",0)])
+J.Pw(this.MW,a.zV(a," "))}},e0:{"":"a;Ph",
+zc:function(a,b){var z=new W.RO(a,this.Ph,b)
+H.VM(z,[null])
+return z},
+aM:function(a){return this.zc(a,!1)},
+Qm:function(a,b){var z=new W.eu(a,this.Ph,b)
+H.VM(z,[null])
+return z},
+f0:function(a){return this.Qm(a,!1)},
+nq:function(a,b){var z=new W.pu(a,b,this.Ph)
+H.VM(z,[null])
+return z},
+Uh:function(a){return this.nq(a,!1)}},RO:{"":"qh;uv,Ph,Sg",
+KR:function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
+H.VM(z,[H.W8(this,"RO",0)])
 z.Zz()
 return z},
-zC:function(a,b,c){return this.X5(a,null,b,c)},
-yI:function(a){return this.X5(a,null,null,null)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 $asqh:null},eu:{"":"RO;uv,Ph,Sg",
 WO:function(a,b){var z,y
 z=new P.nO(new W.ie(b),this)
-H.VM(z,[H.ip(this,"qh",0)])
+H.VM(z,[H.W8(this,"qh",0)])
 y=new P.t3(new W.Ea(b),z)
-H.VM(y,[H.ip(z,"qh",0),null])
+H.VM(y,[H.W8(z,"qh",0),null])
 return y},
 $asRO:null,
 $asqh:null,
@@ -15123,54 +14902,69 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},pu:{"":"qh;DI,Sg,Ph",
+$is_Dv:true},pu:{"":"qh;AF,Sg,Ph",
 WO:function(a,b){var z,y
-z=new P.nO(new W.iN(b),this)
-H.VM(z,[H.ip(this,"qh",0)])
-y=new P.t3(new W.TX(b),z)
-H.VM(y,[H.ip(z,"qh",0),null])
+z=new P.nO(new W.i2(b),this)
+H.VM(z,[H.W8(this,"qh",0)])
+y=new P.t3(new W.b0(b),z)
+H.VM(y,[H.W8(z,"qh",0),null])
 return y},
-X5:function(a,b,c,d){var z,y,x,w,v
+KR:function(a,b,c,d){var z,y,x,w,v
 z=W.Lu(null)
-for(y=this.DI,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.M4,x,w)
+for(y=this.AF,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.mD,x,w)
 v.$builtinTypeInfo=[null]
 z.h(z,v)}y=z.aV
 y.toString
 x=new P.Ik(y)
-H.VM(x,[H.ip(y,"WV",0)])
-return x.X5(a,b,c,d)},
-zC:function(a,b,c){return this.X5(a,null,b,c)},
-yI:function(a){return this.X5(a,null,null,null)},
+H.VM(x,[H.W8(y,"WV",0)])
+return x.KR(a,b,c,d)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 $asqh:null,
-$isqh:true},iN:{"":"Tp;a",
+$isqh:true},i2:{"":"Tp;a",
 call$1:function(a){return J.eI(J.l2(a),this.a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},TX:{"":"Tp;b",
+$is_Dv:true},b0:{"":"Tp;b",
 call$1:function(a){J.og(a,this.b)
 return a},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},qO:{"":"a;aV,eM",
+$is_Dv:true},Ov:{"":"MO;VP,uv,Ph,u7,Sg",
+ed:function(){if(this.uv==null)return
+this.Ns()
+this.uv=null
+this.u7=null},
+nB:function(a,b){if(this.uv==null)return
+this.VP=this.VP+1
+this.Ns()},
+yy:function(a){return this.nB(a,null)},
+QE:function(){if(this.uv==null||this.VP<=0)return
+this.VP=this.VP-1
+this.Zz()},
+Zz:function(){var z=this.u7
+if(z!=null&&this.VP<=0)J.qV(this.uv,this.Ph,z,this.Sg)},
+Ns:function(){var z=this.u7
+if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)},
+$asMO:null},qO:{"":"a;aV,eM",
 h:function(a,b){var z,y
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(z,b,b.zC(y.ght(y),new W.RX(this,b),y.gXB()))},
-ght:function(a){return new J.C7(this,W.qO.prototype.h,a,"h")},
+z.u(z,b,b.zC(y.ght(y),new W.RX(this,b),y.gGj()))},
 Rz:function(a,b){var z,y
 z=this.eM
 y=z.Rz(z,b)
 if(y!=null)y.ed()},
 cO:function(a){var z,y,x
-for(z=this.eM,y=z.gUQ(z),x=y.V8,x=x.gA(x),x=new H.MH(null,x,y.Wz),H.VM(x,[H.ip(y,"i1",0),H.ip(y,"i1",1)]);x.G();)x.M4.ed()
+for(z=this.eM,y=z.gUQ(z),x=y.Kw,x=x.gA(x),x=new H.MH(null,x,y.ew),H.VM(x,[H.W8(y,"i1",0),H.W8(y,"i1",1)]);x.G();)x.mD.ed()
 z.V1(z)
 z=this.aV
 z.cO(z)},
-gJK:function(a){return new H.MT(this,W.qO.prototype.cO,a,"cO")},
-KS:function(a){this.aV=P.nd(this.gJK(this),null,!0,a)},
+gJK:function(a){return new H.YP(this,W.qO.prototype.cO,a,"cO")},
+KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)},
 static:{Lu:function(a){var z=new W.qO(null,P.L5(null,null,null,[P.qh,a],[P.MO,a]))
 H.VM(z,[a])
 z.KS(a)
@@ -15179,35 +14973,7 @@
 return z.Rz(z,this.b)},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},Ov:{"":"MO;VP,uv,Ph,u7,Sg",
-ed:function(){if(this.uv==null)return
-this.Ns()
-this.uv=null
-this.u7=null},
-Fv:function(a,b){if(this.uv==null)return
-this.VP=this.VP+1
-this.Ns()},
-yy:function(a){return this.Fv(a,null)},
-QE:function(){if(this.uv==null||this.VP<=0)return
-this.VP=this.VP-1
-this.Zz()},
-Zz:function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.qV(this.uv,this.Ph,z,this.Sg)},
-Ns:function(){var z=this.u7
-if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)},
-$asMO:null},I2:{"":"a;Ph",
-zc:function(a,b){var z=new W.RO(a,this.Ph,b)
-H.VM(z,[null])
-return z},
-aM:function(a){return this.zc(a,!1)},
-Qm:function(a,b){var z=new W.eu(a,this.Ph,b)
-H.VM(z,[null])
-return z},
-f0:function(a){return this.Qm(a,!1)},
-nq:function(a,b){var z=new W.pu(a,b,this.Ph)
-H.VM(z,[null])
-return z},
-Uh:function(a){return this.nq(a,!1)}},bO:{"":"a;bG",
+$is_X0:true},kG:{"":"a;bG",
 cN:function(a){return this.bG.call$1(a)},
 zc:function(a,b){var z=new W.RO(a,this.cN(a),b)
 H.VM(z,[null])
@@ -15221,26 +14987,22 @@
 H.VM(z,[null])
 return z},
 Uh:function(a){return this.nq(a,!1)}},Gm:{"":"a;",
-gA:function(a){return W.yB(a,H.ip(a,"Gm",0))},
+gA:function(a){return W.yB(a,H.W8(a,"Gm",0))},
 h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
-ght:function(a){return new J.C7(this,W.Gm.prototype.h,a,"h")},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
 $isList:true,
 $asWO:null,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $ascX:null},W9:{"":"a;nj,vN,Nq,QZ",
 G:function(){var z,y
-z=this.Nq
-if(typeof z!=="number")throw z.g()
-y=z+1
-z=this.vN
-if(typeof z!=="number")throw H.s(z)
-if(y<z){this.QZ=J.UQ(this.nj,y)
-this.Nq=y
-return!0}this.QZ=null
+z=this.Nq+1
+y=this.vN
+if(z<y){this.QZ=J.UQ(this.nj,z)
 this.Nq=z
+return!0}this.QZ=null
+this.Nq=y
 return!1},
 gl:function(){return this.QZ},
 "+current":0,
@@ -15254,892 +15016,45 @@
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},dW:{"":"a;Ui",
-gmW:function(a){return W.tF(this.Ui.location)},
+gmW:function(a){return W.zX(this.Ui.location)},
 geT:function(a){return W.P1(this.Ui.parent)},
-gG6:function(a){return W.P1(this.Ui.top)},
 cO:function(a){return this.Ui.close()},
-gJK:function(a){return new H.MT(this,W.dW.prototype.cO,a,"cO")},
 $isD0:true,
-$isvB:true,
+$isGv:true,
 static:{P1:function(a){if(a===window)return a
-else return new W.dW(a)}}},PA:{"":"a;wf",static:{tF:function(a){if(a===C.ol.gmW(window))return a
-else return new W.PA(a)}}},H2:{"":"a;WK<",
-grk:function(a){return this.WK.hash},
+else return new W.dW(a)}}},PA:{"":"a;mf",static:{zX:function(a){if(a===C.ol.gmW(window))return a
+else return new W.PA(a)}}},H2:{"":"a;WK",
+gcC:function(a){return this.WK.hash},
 "+hash":0,
-srk:function(a,b){this.WK.hash=b},
+scC:function(a,b){this.WK.hash=b},
 "+hash=":0,
-gJf:function(a){return this.WK.host},
-gmH:function(a){return this.WK.href},
-gGL:function(a){return this.WK.port},
+gLU:function(a){return this.WK.href},
 bu:function(a){return this.WK.toString()},
 $iscS:true,
-$isvB:true},qE:{"":"cv;","%":"HTMLAppletElement|HTMLBRElement|HTMLBaseFontElement|HTMLBodyElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLFrameSetElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableElement|HTMLTableHeaderCellElement|HTMLTableRowElement|HTMLTableSectionElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|Xf|uL|Vf|aC|Vc|Be|WZ|i6|pv|Fv|wa|Ir|Vfx|Gk|Dsd|Ds|u7|tuj|St|Vct|vj|D13|CX|Nh|ih|F1|XP|M9|WZq|uw"},vH:{"":"vB;",$isList:true,
-$asWO:function(){return[W.M5]},
-$isyN:true,
-$iscX:true,
-$ascX:function(){return[W.M5]},
-"%":"EntryArray"},Ps:{"":"qE;rk:hash%,Jf:host=,mH:href=,GL:port=,N:target=,t5:type%",
-bu:function(a){return a.toString()},
-"%":"HTMLAnchorElement"},fY:{"":"qE;rk:hash=,Jf:host=,mH:href=,GL:port=,N:target=","%":"HTMLAreaElement"},nB:{"":"qE;mH:href=,N:target=","%":"HTMLBaseElement"},Az:{"":"vB;t5:type=",$isAz:true,"%":";Blob"},uQ:{"":"qE;MB:form=,oc:name%,t5:type%,P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"HTMLButtonElement"},mT:{"":"qE;fg:height=,R:width=","%":"HTMLCanvasElement"},OM:{"":"KV;B:length=",$isvB:true,"%":"Comment;CharacterData"},Mb:{"":"ea;tT:code=","%":"CloseEvent"},U1:{"":"lw;mH:href=","%":"CSSImportRule"},wN:{"":"lw;oc:name%","%":"CSSKeyframesRule|MozCSSKeyframesRule|WebKitCSSKeyframesRule"},lw:{"":"vB;t5:type=","%":"CSSCharsetRule|CSSFontFaceRule|CSSHostRule|CSSKeyframeRule|CSSMediaRule|CSSPageRule|CSSStyleRule|CSSSupportsRule|CSSUnknownRule|CSSViewportRule|MozCSSKeyframeRule|WebKitCSSFilterRule|WebKitCSSKeyframeRule|WebKitCSSRegionRule;CSSRule"},oJ:{"":"BV;B:length=",
-T2:function(a,b){var z=a.getPropertyValue(b)
-return z!=null?z:""},
-"%":"CSS2Properties|CSSStyleDeclaration|MSStyleCSSProperties"},DG:{"":"ea;",
-gey:function(a){var z=a._dartDetail
-if(z!=null)return z
-return P.o7(a.detail,!0)},
-$isDG:true,
-"%":"CustomEvent"},xm:{"":"qE;",
-kP:function(a,b,c,d){return this.open.call$3$async(b,c,d)},
-"%":"HTMLDetailsElement"},rV:{"":"qE;",
-kP:function(a,b,c,d){return this.open.call$3$async(b,c,d)},
-kJ:function(a,b){return a.close(b)},
-gJK:function(a){return new J.C7(this,W.rV.prototype.kJ,a,"kJ")},
-"%":"HTMLDialogElement"},YN:{"":"KV;",
-JP:function(a){return a.createDocumentFragment()},
+$isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{hF:{"":"Gv;",$ishF:true,"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{Y0:{"":"tp;N:target=,LU:href=",$isGv:true,"%":"SVGAElement"},ZJ:{"":"Eo;LU:href=",$isGv:true,"%":"SVGAltGlyphElement"},ui:{"":"MB;",$isGv:true,"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},D6:{"":"tp;",$isGv:true,"%":"SVGCircleElement"},DQ:{"":"tp;",$isGv:true,"%":"SVGClipPathElement"},Sm:{"":"tp;",$isGv:true,"%":"SVGDefsElement"},es:{"":"tp;",$isGv:true,"%":"SVGEllipseElement"},eG:{"":"MB;",$isGv:true,"%":"SVGFEBlendElement"},lv:{"":"MB;r9:type=,UQ:values=",$isGv:true,"%":"SVGFEColorMatrixElement"},pf:{"":"MB;",$isGv:true,"%":"SVGFEComponentTransferElement"},NV:{"":"MB;kp:operator=",$isGv:true,"%":"SVGFECompositeElement"},W1:{"":"MB;",$isGv:true,"%":"SVGFEConvolveMatrixElement"},zo:{"":"MB;",$isGv:true,"%":"SVGFEDiffuseLightingElement"},wf:{"":"MB;",$isGv:true,"%":"SVGFEDisplacementMapElement"},bb:{"":"MB;",$isGv:true,"%":"SVGFEFloodElement"},tk:{"":"MB;",$isGv:true,"%":"SVGFEGaussianBlurElement"},me:{"":"MB;LU:href=",$isGv:true,"%":"SVGFEImageElement"},qN:{"":"MB;",$isGv:true,"%":"SVGFEMergeElement"},d4:{"":"MB;kp:operator=",$isGv:true,"%":"SVGFEMorphologyElement"},MI:{"":"MB;",$isGv:true,"%":"SVGFEOffsetElement"},kK:{"":"MB;",$isGv:true,"%":"SVGFESpecularLightingElement"},um:{"":"MB;",$isGv:true,"%":"SVGFETileElement"},Fu:{"":"MB;r9:type=",$isGv:true,"%":"SVGFETurbulenceElement"},OE:{"":"MB;LU:href=",$isGv:true,"%":"SVGFilterElement"},l6:{"":"tp;",$isGv:true,"%":"SVGForeignObjectElement"},BA:{"":"tp;",$isGv:true,"%":"SVGGElement"},tp:{"":"MB;",$isGv:true,"%":";SVGGraphicsElement"},rE:{"":"tp;LU:href=",$isGv:true,"%":"SVGImageElement"},CC:{"":"tp;",$isGv:true,"%":"SVGLineElement"},uz:{"":"MB;",$isGv:true,"%":"SVGMarkerElement"},Yd:{"":"MB;",$isGv:true,"%":"SVGMaskElement"},AD:{"":"tp;",$isGv:true,"%":"SVGPathElement"},Gr:{"":"MB;LU:href=",$isGv:true,"%":"SVGPatternElement"},tc:{"":"tp;",$isGv:true,"%":"SVGPolygonElement"},GH:{"":"tp;",$isGv:true,"%":"SVGPolylineElement"},NJ:{"":"tp;",$isGv:true,"%":"SVGRectElement"},nd:{"":"MB;r9:type%,LU:href=",$isGv:true,"%":"SVGScriptElement"},EU:{"":"MB;r9:type%","%":"SVGStyleElement"},MB:{"":"cv;",
+gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
+return a._cssClassSet},
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},hy:{"":"tp;",
 Kb:function(a,b){return a.getElementById(b)},
-gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.T1.aM(a)},
-gLm:function(a){return C.io.aM(a)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isYN:true,
-"%":"Document|HTMLDocument|SVGDocument"},bA:{"":"KV;",
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isvB:true,
-"%":";DocumentFragment"},Wq:{"":"KV;",$isvB:true,"%":"DocumentType"},rz:{"":"vB;G1:message=,oc:name=","%":";DOMError"},cA:{"":"vB;G1:message=",
-goc:function(a){var z=a.name
-if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
-if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
-return z},
-"+name":0,
-bu:function(a){return a.toString()},
-"%":"DOMException"},u1:{"":"ec;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-tg:function(a,b){return a.contains(b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[J.O]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"DOMStringList"},cv:{"":"KV;xr:className%,jO:id%",
-gQg:function(a){return new W.E9(a)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-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)},
-i4:function(a){},
-"+enteredView:0:0":0,
-Nz:function(a){},
-"+leftView:0:0":0,
-aC:function(a,b,c,d){},
-gqn:function(a){return a.localName},
-bu:function(a){return a.localName},
-WO:function(a,b){if(!!a.matches)return a.matches(b)
-else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
-else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
-else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
-else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},
-bA:function(a,b){var z=a
-do{if(J.UK(z,b))return!0
-z=z.parentElement}while(z!=null)
-return!1},
-er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
-gKE:function(a){return a.shadowRoot||a.webkitShadowRoot},
-gI:function(a){return new W.DM(a,a)},
-gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.T1.f0(a)},
-gLm:function(a){return C.io.f0(a)},
-ZL:function(a){},
-$iscv:true,
-$isvB:true,
-"%":";Element"},Al:{"":"qE;fg:height=,oc:name%,LA:src=,t5:type%,R:width=","%":"HTMLEmbedElement"},SX:{"":"ea;kc:error=,G1:message=","%":"ErrorEvent"},ea:{"":"vB;It:_selector},oM:bubbles=,ay:path=,t5:type=",
-gN:function(a){return W.jj(a.target)},
-$isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIMessageEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MessageEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|SpeechRecognitionEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},D0:{"":"vB;",
-gI:function(a){return new W.Jn(a)},
-On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isD0:true,
-"%":";EventTarget;KS|bD|t8|an"},as:{"":"qE;MB:form=,oc:name%,t5:type=","%":"HTMLFieldSetElement"},T5:{"":"Az;oc:name=","%":"File"},Aa:{"":"rz;tT:code=","%":"FileError"},XV:{"":"Gb;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.T5]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"FileList"},Yu:{"":"qE;B:length=,bP:method=,oc:name%,N:target=",
-CH:function(a){return a.reset()},
-"%":"HTMLFormElement"},Io:{"":"vB;jO:id=,vH:index=","%":"Gamepad"},xn:{"":"ecX;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.KV]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},fJ:{"":"Nn;iC:responseText=,ys:status=,po:statusText=",
-R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
-kP:function(a,b,c,d){return a.open(b,c,d)},
-wR:function(a,b){return a.send(b)},
-$isfJ:true,
-"%":"XMLHttpRequest"},EA:{"":"qE;fg:height=,oc:name%,LA:src=,R:width=","%":"HTMLIFrameElement"},Sg:{"":"vB;fg:height=,R:width=",$isSg:true,"%":"ImageData"},pA:{"":"qE;v6:complete=,fg:height=,LA:src=,R:width=",
-tZ:function(a){return this.complete.call$0()},
-"%":"HTMLImageElement"},Mi:{"":"qE;d4:checked%,MB:form=,fg:height=,qC:list=,oc:name%,LA:src=,t5:type%,P:value%,Pu:webkitEntries=,R:width=",
-Yx:function(a,b){return this.accept.call$1(b)},
-r6:function(a,b){return this.value.call$1(b)},
-$isMi:true,
-$iscv:true,
-$isvB:true,
-$isKV:true,
-$isD0:true,
-"%":"HTMLInputElement"},HN:{"":"Mf;mW:location=","%":"KeyboardEvent"},Xb:{"":"qE;MB:form=,oc:name%,t5:type=","%":"HTMLKeygenElement"},Gx:{"":"qE;P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"HTMLLIElement"},eP:{"":"qE;MB:form=","%":"HTMLLabelElement"},JP:{"":"qE;MB:form=","%":"HTMLLegendElement"},Og:{"":"qE;mH:href=,t5:type%",$isOg:true,"%":"HTMLLinkElement"},cS:{"":"vB;rk:hash%,Jf:host=,mH:href=,GL:port=",
-bu:function(a){return a.toString()},
-$iscS:true,
-"%":"Location"},M6O:{"":"qE;oc:name%","%":"HTMLMapElement"},El:{"":"qE;kc:error=,LA:src=",
-yy:function(a){return a.pause()},
-"%":"HTMLAudioElement;HTMLMediaElement"},zm:{"":"vB;tT:code=","%":"MediaError"},Y7:{"":"vB;tT:code=","%":"MediaKeyError"},o9:{"":"ea;G1:message=","%":"MediaKeyEvent"},ku:{"":"ea;G1:message=","%":"MediaKeyMessageEvent"},lx:{"":"D0;jO:id=","%":"MediaStream"},la:{"":"qE;jb:content=,oc:name%","%":"HTMLMetaElement"},Vn:{"":"qE;P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"HTMLMeterElement"},PG:{"":"ea;GL:port=","%":"MIDIConnectionEvent"},QT:{"":"tH;",
-LV:function(a,b,c){return a.send(b,c)},
-wR:function(a,b){return a.send(b)},
-"%":"MIDIOutput"},tH:{"":"D0;jO:id=,oc:name=,t5:type=","%":"MIDIInput;MIDIPort"},AW:{"":"vB;t5:type=","%":"MimeType"},ql:{"":"w1p;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.AW]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"MimeTypeArray"},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.m7(p))
-return},
-$isAj:true,
-"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},oU:{"":"vB;",$isvB:true,"%":"Navigator"},qT:{"":"vB;G1:message=,oc:name=","%":"NavigatorUserMediaError"},KV:{"":"D0;q6:firstChild=,zW:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent}",
-wg:function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},
-bu:function(a){var z=a.nodeValue
-return z==null?J.vB.prototype.bu.call(this,a):z},
-jx:function(a,b){return a.appendChild(b)},
-Yv:function(a,b){return a.cloneNode(b)},
-tg:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
-$isKV:true,
-"%":"Entity|Notation;Node"},BH:{"":"kEI;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.KV]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"NodeList|RadioNodeList"},mh:{"":"qE;t5:type%","%":"HTMLOListElement"},G7:{"":"qE;MB:form=,fg:height=,oc:name%,t5:type%,R:width=","%":"HTMLObjectElement"},Ql:{"":"qE;MB:form=,vH:index=,P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-$isQl:true,
-"%":"HTMLOptionElement"},Xp:{"":"qE;MB:form=,oc:name%,t5:type=,P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"HTMLOutputElement"},me:{"":"qE;oc:name%,P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"HTMLParamElement"},qp:{"":"vB;B:length=,oc:name=","%":"Plugin"},Ev:{"":"x5e;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.qp]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"PluginArray"},p3:{"":"vB;tT:code=,G1:message=","%":"PositionError"},qW:{"":"OM;N:target=","%":"ProcessingInstruction"},KR:{"":"qE;P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"HTMLProgressElement"},kQ:{"":"ea;",$iskQ:true,"%":"ProgressEvent|ResourceProgressEvent|XMLHttpRequestProgressEvent"},j2:{"":"qE;LA:src=,t5:type%",$isj2:true,"%":"HTMLScriptElement"},lp:{"":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,t5:type=,P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-$islp:true,
-"%":"HTMLSelectElement"},I0:{"":"bA;pQ:applyAuthorStyles=",
-Yv:function(a,b){return a.cloneNode(b)},
-Kb:function(a,b){return a.getElementById(b)},
-$isI0:true,
-"%":"ShadowRoot"},x8:{"":"D0;","%":"SourceBuffer"},Mkk:{"":"bD;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.x8]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"SourceBufferList"},QR:{"":"qE;LA:src=,t5:type%","%":"HTMLSourceElement"},KI:{"":"vB;LA:src=","%":"SpeechGrammar"},AM:{"":"HRa;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.KI]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"SpeechGrammarList"},dZ:{"":"vB;","%":"SpeechInputResult"},mG:{"":"ea;kc:error=,G1:message=","%":"SpeechRecognitionError"},l8:{"":"vB;V5:isFinal=,B:length=","%":"SpeechRecognitionResult"},G0:{"":"ea;oc:name=","%":"SpeechSynthesisEvent"},ii:{"":"ea;G3:key=,zZ:newValue=,jL:oldValue=","%":"StorageEvent"},fq:{"":"qE;t5:type%","%":"HTMLStyleElement"},xr:{"":"vB;mH:href=,t5:type=","%":"CSSStyleSheet|StyleSheet"},yY:{"":"qE;jb:content=",$isyY:true,"%":"HTMLTemplateElement"},kJ:{"":"OM;",$iskJ:true,"%":"CDATASection|Text"},AE:{"":"qE;MB:form=,oc:name%,t5:type=,P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-$isAE:true,
-"%":"HTMLTextAreaElement"},A1:{"":"D0;fY:kind=","%":"TextTrack"},MN:{"":"D0;jO:id%,a4:text}","%":"TextTrackCue"},X0:{"":"t7i;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.MN]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"TextTrackCueList"},u4:{"":"an;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.A1]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"TextTrackList"},a3:{"":"vB;",
-gN:function(a){return W.jj(a.target)},
-"%":"Touch"},bj:{"":"rrb;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.a3]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"TouchList"},RH:{"":"qE;fY:kind=,LA:src=","%":"HTMLTrackElement"},Lq:{"":"ea;",$isLq:true,"%":"TransitionEvent|WebKitTransitionEvent"},Mf:{"":"ea;ey:detail=","%":"CompositionEvent|FocusEvent|SVGZoomEvent|TextEvent|TouchEvent;UIEvent"},aG:{"":"El;fg:height=,R:width=","%":"HTMLVideoElement"},Oi:{"":"D0;oc:name%,ys:status=",
-gmW:function(a){var z=a.location
-if(W.uC(z)===!0)return z
-if(null==a._location_wrapper)a._location_wrapper=new W.H2(z)
-return a._location_wrapper},
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-pl:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
-  (function($this) {
-   var vendors = ['ms', 'moz', 'webkit', 'o'];
-   for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
-     $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
-     $this.cancelAnimationFrame =
-         $this[vendors[i]+'CancelAnimationFrame'] ||
-         $this[vendors[i]+'CancelRequestAnimationFrame'];
-   }
-   if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
-   $this.requestAnimationFrame = function(callback) {
-      return window.setTimeout(function() {
-        callback(Date.now());
-      }, 16 /* 16ms ~= 60fps */);
-   };
-   $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
-  })(a)},
-geT:function(a){return W.Pv(a.parent)},
-gG6:function(a){return W.Pv(a.top)},
-cO:function(a){return a.close()},
-gJK:function(a){return new H.MT(this,W.Oi.prototype.cO,a,"cO")},
-Df:function(a){return a.print()},
-gJS:function(a){return new H.MT(this,W.Oi.prototype.Df,a,"Df")},
-bu:function(a){return a.toString()},
-gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.T1.aM(a)},
-gLm:function(a){return C.io.aM(a)},
-$isvB:true,
-$isD0:true,
-"%":"DOMWindow|Window"},Nn:{"":"D0;","%":";XMLHttpRequestEventTarget"},UM:{"":"KV;oc:name=,P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"Attr"},ba:{"":"vB;","%":"CSSPrimitiveValue;CSSValue;hw|ST"},FR:{"":"vB;fg:height=,Bb:left=,ip:right=,G6:top=,R:width=",
-bu:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},
-n:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$istn)return!1
-y=a.left
-x=z.gBb(b)
-if(y==null?x==null:y===x){y=a.top
-x=z.gG6(b)
-if(y==null?x==null:y===x){y=a.width
-x=z.gR(b)
-if(y==null?x==null:y===x){y=a.height
-z=z.gfg(b)
-z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
-return z},
-gEo:function(a){var z,y,x,w
-z=J.le(a.left)
-y=J.le(a.top)
-x=J.le(a.width)
-w=J.le(a.height)
-return W.Up(W.C0(W.C0(W.C0(W.C0(0,z),y),x),w))},
-$istn:true,
-$astn:function(){return[null]},
-"%":"ClientRect|DOMRect"},S3:{"":"rla;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[P.tn]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"ClientRectList"},PR:{"":"Gba;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.lw]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"CSSRuleList"},VE:{"":"ST;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.ba]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"CSSValueList|WebKitCSSFilterValue|WebKitCSSMixFunctionValue|WebKitCSSTransformValue"},F2:{"":"maa;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.Io]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"GamepadList"},rh:{"":"e0;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.KV]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"MozNamedAttrMap|NamedNodeMap"},c5:{"":"e5;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.dZ]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"SpeechInputResultList"},LO:{"":"e6;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.l8]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"SpeechRecognitionResultList"},pz:{"":"e8;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)throw H.e(a,b)
-return a[b]},
-$asWO:function(){return[null]},
-$ascX:function(){return[W.xr]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-$isXj:true,
-"%":"StyleSheetList"}}],["dart.dom.indexed_db","dart:indexed_db",,P,{hF:{"":"vB;",$ishF:true,"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{R7:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e9:{"":"R7+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},R9:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e10:{"":"R9+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},R10:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e11:{"":"R10+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},R11:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e12:{"":"R11+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},O7:{"":"As;CE",
+$ishy:true,
+$isGv:true,
+"%":"SVGSVGElement"},r8:{"":"tp;",$isGv:true,"%":"SVGSwitchElement"},aS:{"":"MB;",$isGv:true,"%":"SVGSymbolElement"},qF:{"":"tp;",$isGv:true,"%":";SVGTextContentElement"},Rk:{"":"qF;bP:method=,LU:href=",$isGv:true,"%":"SVGTextPathElement"},Eo:{"":"qF;","%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},ox:{"":"tp;LU:href=",$isGv:true,"%":"SVGUseElement"},ZD:{"":"MB;",$isGv:true,"%":"SVGViewElement"},wD:{"":"MB;LU:href=",$isGv:true,"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},mj:{"":"MB;",$isGv:true,"%":"SVGCursorElement"},cB:{"":"MB;",$isGv:true,"%":"SVGFEDropShadowElement"},nb:{"":"MB;",$isGv:true,"%":"SVGGlyphRefElement"},xt:{"":"MB;",$isGv:true,"%":"SVGMPathElement"},O7:{"":"As;CE",
 lF:function(){var z,y,x,w,v
 z=new W.E9(this.CE).MW.getAttribute("class")
 y=P.Ls(null,null,null,J.O)
 if(z==null)return y
-for(x=z.split(" "),w=new H.wi(x,x.length,0,null),H.VM(w,[H.ip(x,"Q",0)]);w.G();){v=J.rr(w.M4)
+for(x=z.split(" "),w=new H.a7(x,x.length,0,null),H.VM(w,[H.W8(x,"Q",0)]);w.G();){v=J.rr(w.mD)
 if(v.length!==0)y.h(y,v)}return y},
-p5:function(a){new W.E9(this.CE).MW.setAttribute("class",a.zV(a," "))}},R12:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e13:{"":"R12+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},R13:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e14:{"":"R13+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},Y0:{"":"zp;N:target=,mH:href=",$isvB:true,"%":"SVGAElement"},hf:{"":"Eo;mH:href=",$isvB:true,"%":"SVGAltGlyphElement"},ui:{"":"MB;",$isvB:true,"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},D6:{"":"zp;",$isvB:true,"%":"SVGCircleElement"},DQ:{"":"zp;",$isvB:true,"%":"SVGClipPathElement"},Sm:{"":"zp;",$isvB:true,"%":"SVGDefsElement"},D5:{"":"D0;q6:firstChild=,KV:parentNode=",
-gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.T1.aM(a)},
-gLm:function(a){return C.io.aM(a)},
-"%":"SVGElementInstance"},bL:{"":"zp;",$isvB:true,"%":"SVGEllipseElement"},eG:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEBlendElement"},lv:{"":"MB;t5:type=,UQ:values=,fg:height=,R:width=",$isvB:true,"%":"SVGFEColorMatrixElement"},pf:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEComponentTransferElement"},NV:{"":"MB;kp:operator=,fg:height=,R:width=",$isvB:true,"%":"SVGFECompositeElement"},Kq:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEConvolveMatrixElement"},zo:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEDiffuseLightingElement"},kK:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEDisplacementMapElement"},bb:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEFloodElement"},tk:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEGaussianBlurElement"},Cf:{"":"MB;fg:height=,R:width=,mH:href=",$isvB:true,"%":"SVGFEImageElement"},qN:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEMergeElement"},d4:{"":"MB;kp:operator=,fg:height=,R:width=",$isvB:true,"%":"SVGFEMorphologyElement"},MI:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFEOffsetElement"},xX:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFESpecularLightingElement"},um:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGFETileElement"},tM:{"":"MB;t5:type=,fg:height=,R:width=",$isvB:true,"%":"SVGFETurbulenceElement"},OE:{"":"MB;fg:height=,R:width=,mH:href=",$isvB:true,"%":"SVGFilterElement"},l6:{"":"zp;fg:height=,R:width=",$isvB:true,"%":"SVGForeignObjectElement"},BA:{"":"zp;",$isvB:true,"%":"SVGGElement"},zp:{"":"MB;",$isvB:true,"%":";SVGGraphicsElement"},rE:{"":"zp;fg:height=,R:width=,mH:href=",$isvB:true,"%":"SVGImageElement"},Xk:{"":"vB;P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"SVGLength"},NR:{"":"e9;",
-t:function(a,b){var z=a.numberOfItems
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a.getItem(b)},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-gB:function(a){return a.numberOfItems},
-"+length":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){return this.t(a,b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[P.Xk]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-"%":"SVGLengthList"},zw:{"":"zp;",$isvB:true,"%":"SVGLineElement"},uz:{"":"MB;",$isvB:true,"%":"SVGMarkerElement"},NBZ:{"":"MB;fg:height=,R:width=",$isvB:true,"%":"SVGMaskElement"},c7:{"":"vB;P:value%",
-r6:function(a,b){return this.value.call$1(b)},
-"%":"SVGNumber"},LZ:{"":"e10;",
-t:function(a,b){var z=a.numberOfItems
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a.getItem(b)},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-gB:function(a){return a.numberOfItems},
-"+length":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){return this.t(a,b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[P.c7]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-"%":"SVGNumberList"},lZ:{"":"zp;",$isvB:true,"%":"SVGPathElement"},Dd:{"":"vB;","%":"SVGPathSeg|SVGPathSegArcAbs|SVGPathSegArcRel|SVGPathSegClosePath|SVGPathSegCurvetoCubicAbs|SVGPathSegCurvetoCubicRel|SVGPathSegCurvetoCubicSmoothAbs|SVGPathSegCurvetoCubicSmoothRel|SVGPathSegCurvetoQuadraticAbs|SVGPathSegCurvetoQuadraticRel|SVGPathSegCurvetoQuadraticSmoothAbs|SVGPathSegCurvetoQuadraticSmoothRel|SVGPathSegLinetoAbs|SVGPathSegLinetoHorizontalAbs|SVGPathSegLinetoHorizontalRel|SVGPathSegLinetoRel|SVGPathSegLinetoVerticalAbs|SVGPathSegLinetoVerticalRel|SVGPathSegMovetoAbs|SVGPathSegMovetoRel"},Sv:{"":"e11;",
-t:function(a,b){var z=a.numberOfItems
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a.getItem(b)},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-gB:function(a){return a.numberOfItems},
-"+length":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){return this.t(a,b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[P.Dd]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-"%":"SVGPathSegList"},Ac:{"":"MB;fg:height=,R:width=,mH:href=",$isvB:true,"%":"SVGPatternElement"},tc:{"":"zp;",$isvB:true,"%":"SVGPolygonElement"},GH:{"":"zp;",$isvB:true,"%":"SVGPolylineElement"},NJ:{"":"zp;fg:height=,R:width=",$isvB:true,"%":"SVGRectElement"},j24:{"":"MB;t5:type%,mH:href=",$isvB:true,"%":"SVGScriptElement"},Mc:{"":"e12;",
-t:function(a,b){var z=a.numberOfItems
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a.getItem(b)},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-gB:function(a){return a.numberOfItems},
-"+length":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){return this.t(a,b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[J.O]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-"%":"SVGStringList"},EU:{"":"MB;t5:type%","%":"SVGStyleElement"},MB:{"":"cv;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
-return a._cssClassSet},
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},hy:{"":"zp;fg:height=,R:width=",
-Kb:function(a,b){return a.getElementById(b)},
-$ishy:true,
-$isvB:true,
-"%":"SVGSVGElement"},r8:{"":"zp;",$isvB:true,"%":"SVGSwitchElement"},aS:{"":"MB;",$isvB:true,"%":"SVGSymbolElement"},qF:{"":"zp;",$isvB:true,"%":";SVGTextContentElement"},xN:{"":"qF;bP:method=,mH:href=",$isvB:true,"%":"SVGTextPathElement"},Eo:{"":"qF;","%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},zY:{"":"vB;t5:type=","%":"SVGTransform"},NC:{"":"e13;",
-t:function(a,b){var z=a.numberOfItems
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a.getItem(b)},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-gB:function(a){return a.numberOfItems},
-"+length":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.numberOfItems
-if(typeof z!=="number")throw z.D()
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){return this.t(a,b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[P.zY]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-"%":"SVGTransformList"},ox:{"":"zp;fg:height=,R:width=,mH:href=",$isvB:true,"%":"SVGUseElement"},ZD:{"":"MB;",$isvB:true,"%":"SVGViewElement"},YY:{"":"e14;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.TE(b,0,a.length))
-return a.item(b)},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){return this.t(a,b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[P.D5]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-"%":"SVGElementInstanceList"},wD:{"":"MB;mH:href=",$isvB:true,"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},We:{"":"MB;",$isvB:true,"%":"SVGCursorElement"},hW:{"":"MB;",$isvB:true,"%":"SVGFEDropShadowElement"},jI:{"":"MB;",$isvB:true,"%":"SVGGlyphRefElement"},zu:{"":"MB;",$isvB:true,"%":"SVGMPathElement"}}],["dart.dom.web_sql","dart:web_sql",,P,{R14:{"":"vB+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},e15:{"":"R14+Gm;",$asWO:null,$ascX:null,$isList:true,$isyN:true,$iscX:true},Hj:{"":"vB;tT:code=,G1:message=","%":"SQLError"},Pk:{"":"e15;",
-gB:function(a){return a.length},
-"+length":0,
-t:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.TE(b,0,a.length))
-return P.mR(a.item(b))},
-"+[]:1:0":0,
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-"+[]=:2:0":0,
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-"+length=":0,
-gFV:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(new P.lj("No elements"))},
-Zv:function(a,b){return this.t(a,b)},
-$asWO:function(){return[null]},
-$ascX:function(){return[P.Z0]},
-$isList:true,
-$isyN:true,
-$iscX:true,
-"%":"SQLResultSetRowList"}}],["dart.isolate","dart:isolate",,P,{HI:{"":"a;",$isHI:true,$isqh:true,
-$asqh:function(){return[null]}}}],["dart.js","dart:js",,P,{z8:function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.uu.call$4, a, b)},R4:function(a,b,c,d){var z,y
+p5:function(a){new W.E9(this.CE).MW.setAttribute("class",a.zV(a," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{Cf:{"":"Gv;tT:code=,G1:message=","%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{HI:{"":"a;",$isHI:true,$isqh:true,
+$asqh:function(){return[null]}}}],["dart.js","dart:js",,P,{z8:function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.uu.call$4, a, b)},R4:function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.Ay(z,d)
-d=z}y=J.kl(d,P.Xl)
-return P.wY(H.Ek(a,y.br(y),P.Te(null)))},Dm:function(a,b,c){var z
+d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl),!0,null),P.Te(null)))},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},wY:function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isAS}else z=!0
+z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isAS||typeof a==="object"&&a!==null&&!!z.$isK5}else z=!0
 else z=!0
 else z=!0
 if(z)return a
@@ -16151,12 +15066,14 @@
 if(z==null){z=c.call$1(a)
 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{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isAS)return a
+else{if(a instanceof Object){z=J.x(a)
+z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isAS||typeof a==="object"&&a!==null&&!!z.$isK5}else z=!1
+if(z)return a
 else if(a instanceof Date)return P.Wu(a.getMilliseconds(),!1)
-else if(typeof a=="function")return P.iQ(a,"_$dart_dartClosure",new P.U7())
 else if(a.constructor===DartObject)return a.o
-else return P.iQ(a,"_$dart_dartObject",new P.vr())}},iQ:function(a,b,c){var z=a[b]
+else return P.ND(a)}},ND:function(a){if(typeof a=="function")return P.iQ(a,"_$dart_dartClosure",new P.Nz())
+else if(a instanceof Array)return P.iQ(a,"_$dart_dartObject",new P.Jd())
+else return P.iQ(a,"_$dart_dartObject",new P.QS())},iQ:function(a,b,c){var z=a[b]
 if(z==null){z=c.call$1(a)
 P.Dm(a,b,z)}return z},E4:{"":"a;eh",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
@@ -16165,7 +15082,7 @@
 u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
 this.eh[b]=P.wY(c)},
 "+[]=:2:0":0,
-gEo:function(a){return 0},
+giO:function(a){return 0},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -16175,23 +15092,57 @@
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
 return P.a.prototype.bu.call(this,this)}},
-K9:function(a,b){var z,y
+V7:function(a,b){var z,y
 z=this.eh
+if(b==null)y=null
+else{b.toString
 y=new H.A8(b,P.En)
 H.VM(y,[null,null])
-y=y.br(y)
-return P.dU(z[a].apply(z,y))},
-w2:function(a){P.iQ(this.eh,"_$dart_dartObject",new P.ZG(this))},
+y=P.F(y,!0,null)}return P.dU(z[a].apply(z,y))},
 $isE4:true,
-static:{EQ:function(a){var z=new P.E4(a)
-z.w2(a)
-return z},Oe:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(new P.AT("object cannot be a num, string, bool, or null"))
-return P.EQ(P.wY(a))}}},ZG:{"":"Tp;a",
-call$1:function(a){return this.a},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},r7:{"":"E4;eh"},DV:{"":"Tp;",
+static:{Oe:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(new P.AT("object cannot be a num, string, bool, or null"))
+return P.ND(P.wY(a))}}},r7:{"":"E4;eh"},Tz:{"":"Wk;eh",
+t:function(a,b){var z
+if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+if(typeof z!=="number")throw H.s(z)
+z=b>=z}else z=!0
+else z=!1
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},
+"+[]:1:0":0,
+u:function(a,b,c){var z
+if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+if(typeof z!=="number")throw H.s(z)
+z=b>=z}else z=!0
+else z=!1
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},
+"+[]=:2:0":0,
+gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
+"+length":0,
+sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
+"+length=":0,
+h:function(a,b){this.V7("push",[b])},
+YW:function(a,b,c,d,e){var z,y,x,w,v,u
+if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
+if(typeof z!=="number")throw H.s(z)
+z=b>z}else z=!0
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
+z=J.Wx(c)
+if(z.C(c,b)||z.D(c,P.E4.prototype.t.call(this,this,"length")))H.vh(P.TE(c,b,P.E4.prototype.t.call(this,this,"length")))
+y=z.W(c,b)
+if(J.xC(y,0))return
+if(e<0)throw H.b(new P.AT(e))
+x=[b,y]
+z=new H.nH(d,e,null)
+z.$builtinTypeInfo=[null]
+w=z.Bz
+v=J.Wx(w)
+if(v.C(w,0))H.vh(P.N(w))
+u=z.n1
+if(u!=null){if(J.u6(u,0))H.vh(P.N(u))
+if(v.D(w,u))H.vh(P.TE(w,0,u))}C.Nm.Ay(x,z.qZ(z,y))
+this.V7("splice",x)},
+$asWO:null,
+$ascX:null},Wk:{"":"E4+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},DV:{"":"Tp;",
 call$1:function(a){var z=P.z8(a,!1)
 P.Dm(z,"_$dart_dartClosure",a)
 return z},
@@ -16203,70 +15154,52 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},U7:{"":"Tp;",
-call$1:function(a){var z=new P.r7(a)
-z.w2(a)
+$is_Dv:true},Nz:{"":"Tp;",
+call$1:function(a){return new P.r7(a)},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},Jd:{"":"Tp;",
+call$1:function(a){var z=new P.Tz(a)
+H.VM(z,[null])
 return z},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},vr:{"":"Tp;",
-call$1:function(a){return P.EQ(a)},
+$is_Dv:true},QS:{"":"Tp;",
+call$1:function(a){return new P.E4(a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true}}],["dart.math","dart:math",,P,{VC:function(a,b){a=536870911&C.jn.g(a,b)
-a=536870911&a+((524287&a)<<10>>>0)
-return(a^C.jn.m(a,6))>>>0},xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
-a=(a^C.jn.m(a,11))>>>0
-return 536870911&a+((16383&a)<<15>>>0)},J:function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
+$is_Dv:true}}],["dart.math","dart:math",,P,{J:function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(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.YI.gzP(b)||C.YI.gG0(b))return b
-return a}return a},HD:{"":"a;",
-gip:function(a){return J.WB(this.gBb(this),this.gR(this))},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.gG6(this))+") "+H.d(this.gR(this))+" x "+H.d(this.gfg(this))},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$istn)return!1
-this.gBb(this)
-z.gBb(b)
-return!1},
-gEo:function(a){var z,y,x,w
-z=J.le(this.gBb(this))
-y=J.le(this.gG6(this))
-x=J.le(this.gR(this))
-w=J.le(this.gfg(this))
-return P.xk(P.VC(P.VC(P.VC(P.VC(0,z),y),x),w))}},tn:{"":"HD;Bb>,G6>,R>,fg>",$istn:true,$astn:null,$asHD:null}}],["dart.mirrors","dart:mirrors",,P,{re:function(a){var z,y
+if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
+return a}return a},y:function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
+if(typeof b!=="number")throw H.b(new P.AT(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.CD.gG0(b))return b
+return a}if(b===0&&C.CD.gzP(a))return b
+return a}}],["dart.mirrors","dart:mirrors",,P,{re:function(a){var z,y
 z=J.x(a)
 if(typeof a!=="object"||a===null||!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-y=H.nH(a.gLU())
+y=P.yq(a)
 z=J.x(y)
 if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},QF:{"":"a;",$isQF:true},VL:{"":"a;",$isVL:true,$isQF:true},D4:{"":"a;",$isD4:true,$isQF:true},Ms:{"":"a;",$isMs:true,$isQF:true},RS:{"":"a;",$isRS:true,$isQF:true},RY:{"":"a;",$isRY:true,$isQF:true},Ys:{"":"a;",$isYs:true,$isRY:true,$isQF:true},WS:{"":"a;o9,m2,nV,V3"}}],["dart.typed_data","dart:typed_data",,P,{xG:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},Vj:{"":"xG+SU;",$asWO:null,$ascX:null},VW:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},RK:{"":"VW+SU;",$asWO:null,$ascX:null},DH:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},ZK:{"":"DH+SU;",$asWO:null,$ascX:null},KB:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},nb:{"":"KB+SU;",$asWO:null,$ascX:null},Rb:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},Vju:{"":"Rb+SU;",$asWO:null,$ascX:null},xGn:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},RKu:{"":"xGn+SU;",$asWO:null,$ascX:null},VWk:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},TkQ:{"":"VWk+SU;",$asWO:null,$ascX:null},DHb:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},ZKG:{"":"DHb+SU;",$asWO:null,$ascX:null},Hna:{"":"AS+lD;",$isList:true,$asWO:null,$isyN:true,$iscX:true,$ascX:null},w6W:{"":"Hna+SU;",$asWO:null,$ascX:null},G8:{"":"AS;",$isList:true,
-$asWO:function(){return[J.im]},
-$isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
-$isXj:true,
-static:{"":"x7",}},UZ:{"":"AS;",$isList:true,
-$asWO:function(){return[J.im]},
-$isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
-$isXj:true,
-static:{"":"U9",}},AS:{"":"vB;",
+return y.gJi()},yq:function(a){if(J.xC(a,C.HH)){$.At().toString
+return $.Cr()}return H.jO(a.gIE())},QF:{"":"a;",$isQF:true},NL:{"":"a;",$isNL:true,$isQF:true},vr:{"":"a;",$isvr:true,$isQF:true},D4:{"":"a;",$isD4:true,$isQF:true,$isNL:true},X9:{"":"a;",$isX9:true,$isNL:true,$isQF:true},Ms:{"":"a;",$isMs:true,$isQF:true,$isX9:true,$isNL:true},Fw:{"":"X9;",$isFw:true},RS:{"":"a;",$isRS:true,$isNL:true,$isQF:true},RY:{"":"a;",$isRY:true,$isNL:true,$isQF:true},Ys:{"":"a;",$isYs:true,$isRY:true,$isNL:true,$isQF:true},vg:{"":"a;c1,m2,nV,V3"}}],["dart.typed_data","dart:typed_data",,P,{AS:{"":"Gv;",
 aq:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},
+else throw H.b(P.u("Invalid list index "+H.d(b)))},
 iA:function(a,b,c){if(b>>>0!=b||J.J5(b,c))this.aq(a,b,c)},
 Im:function(a,b,c,d){this.iA(a,b,d+1)
 return d},
 $isAS:true,
-"%":"DataView;ArrayBufferView;xG|Vj|VW|RK|DH|ZK|KB|nb|Rb|Vju|xGn|RKu|VWk|TkQ|DHb|ZKG|Hna|w6W|G8|UZ"},oI:{"":"Vj;",
+"%":"DataView;ArrayBufferView;xG|Vj|VW|RK|DH|ZK|Th|Vju|KB|RKu|na|TkQ|xGn|ZKG|VWk|w6W|DHb|z9g|G8|UZ"},oI:{"":"Vj;",
 gB:function(a){return C.i7(a)},
 "+length":0,
 t:function(a,b){var z=C.i7(a)
@@ -16287,7 +15220,7 @@
 $asWO:function(){return[J.Pp]},
 $ascX:function(){return[J.Pp]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
 "%":"Float32Array"},mJ:{"":"RK;",
@@ -16311,7 +15244,7 @@
 $asWO:function(){return[J.Pp]},
 $ascX:function(){return[J.Pp]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
 "%":"Float64Array"},rF:{"":"ZK;",
@@ -16335,10 +15268,10 @@
 $asWO:function(){return[J.im]},
 $ascX:function(){return[J.im]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
-"%":"Int16Array"},Sb:{"":"nb;",
+"%":"Int16Array"},vi:{"":"Vju;",
 gB:function(a){return C.i7(a)},
 "+length":0,
 t:function(a,b){var z=C.i7(a)
@@ -16359,10 +15292,10 @@
 $asWO:function(){return[J.im]},
 $ascX:function(){return[J.im]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
-"%":"Int32Array"},ZX:{"":"Vju;",
+"%":"Int32Array"},ZX:{"":"RKu;",
 gB:function(a){return C.i7(a)},
 "+length":0,
 t:function(a,b){var z=C.i7(a)
@@ -16383,10 +15316,10 @@
 $asWO:function(){return[J.im]},
 $ascX:function(){return[J.im]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
-"%":"Int8Array"},HS:{"":"RKu;",
+"%":"Int8Array"},hn:{"":"TkQ;",
 gB:function(a){return C.i7(a)},
 "+length":0,
 t:function(a,b){var z=C.i7(a)
@@ -16407,10 +15340,10 @@
 $asWO:function(){return[J.im]},
 $ascX:function(){return[J.im]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
-"%":"Uint16Array"},Aw:{"":"TkQ;",
+"%":"Uint16Array"},nE:{"":"ZKG;",
 gB:function(a){return C.i7(a)},
 "+length":0,
 t:function(a,b){var z=C.i7(a)
@@ -16431,10 +15364,10 @@
 $asWO:function(){return[J.im]},
 $ascX:function(){return[J.im]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
-"%":"Uint32Array"},zt:{"":"ZKG;",
+"%":"Uint32Array"},zt:{"":"w6W;",
 gB:function(a){return C.i7(a)},
 "+length":0,
 t:function(a,b){var z=C.i7(a)
@@ -16455,10 +15388,10 @@
 $asWO:function(){return[J.im]},
 $ascX:function(){return[J.im]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
-"%":"CanvasPixelArray|Uint8ClampedArray"},F0:{"":"w6W;",
+"%":"CanvasPixelArray|Uint8ClampedArray"},F0:{"":"z9g;",
 gB:function(a){return C.i7(a)},
 "+length":0,
 t:function(a,b){var z=C.i7(a)
@@ -16479,103 +15412,116 @@
 $asWO:function(){return[J.im]},
 $ascX:function(){return[J.im]},
 $isList:true,
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $isXj:true,
-"%":";Uint8Array"}}],["disassembly_entry_element","package:observatory/src/observatory_elements/disassembly_entry.dart",,E,{Fv:{"":["pv;FT%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"%":";Uint8Array"},xG:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},Vj:{"":"xG+SU;",$asWO:null,$ascX:null},VW:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},RK:{"":"VW+SU;",$asWO:null,$ascX:null},DH:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},ZK:{"":"DH+SU;",$asWO:null,$ascX:null},Th:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},Vju:{"":"Th+SU;",$asWO:null,$ascX:null},KB:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},RKu:{"":"KB+SU;",$asWO:null,$ascX:null},na:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},TkQ:{"":"na+SU;",$asWO:null,$ascX:null},xGn:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},ZKG:{"":"xGn+SU;",$asWO:null,$ascX:null},VWk:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},w6W:{"":"VWk+SU;",$asWO:null,$ascX:null},DHb:{"":"AS+lD;",$isList:true,$asWO:null,$isqC:true,$iscX:true,$ascX:null},z9g:{"":"DHb+SU;",$asWO:null,$ascX:null},G8:{"":"AS;",$isList:true,
+$asWO:function(){return[J.im]},
+$isqC:true,
+$iscX:true,
+$ascX:function(){return[J.im]},
+$isXj:true,
+static:{"":"tn",}},UZ:{"":"AS;",$isList:true,
+$asWO:function(){return[J.im]},
+$isqC:true,
+$iscX:true,
+$ascX:function(){return[J.im]},
+$isXj:true,
+static:{"":"U9",}}}],["disassembly_entry_element","package:observatory/src/observatory_elements/disassembly_entry.dart",,E,{Fv:{"":["WZ;FT%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gNI:function(a){return a.FT
 "32,33,34"},
 "+instruction":1,
-sNI:function(a,b){a.FT=this.ct(a,C.eJ,a.FT,b)
+sNI:function(a,b){a.FT=this.pD(a,C.eJ,a.FT,b)
 "35,28,32,33"},
 "+instruction=":1,
-"@":function(){return[C.QQ]},
+"@":function(){return[C.Vy]},
 static:{AH:function(a){var z,y,x,w,v,u
 z=H.B7([],P.L5(null,null,null,null,null))
-z=B.tB(z)
-y=$.R8()
+z=R.Jk(z)
+y=$.Nd()
 x=P.Py(null,null,null,J.O,W.I0)
 w=J.O
 v=W.cv
-u=new B.br(P.Py(null,null,null,w,v),null,null)
+u=new V.br(P.Py(null,null,null,w,v),null,null)
 H.VM(u,[w,v])
 a.FT=z
 a.Ye=y
 a.mT=x
 a.KM=u
 C.Tl.ZL(a)
-C.Tl.XI(a)
+C.Tl.FH(a)
 return a
-"13"},"+new DisassemblyEntryElement$created:0:0":1}},"+DisassemblyEntryElement": [],pv:{"":"uL+Pi;",$iswn:true}}],["error_view_element","package:observatory/src/observatory_elements/error_view.dart",,F,{Ir:{"":["wa;Py%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"13"},"+new DisassemblyEntryElement$created:0:0":1}},"+DisassemblyEntryElement": [78],WZ:{"":"uL+Pi;",$isd3:true}}],["error_view_element","package:observatory/src/observatory_elements/error_view.dart",,F,{I3:{"":["pv;Py%-,hO%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gkc:function(a){return a.Py
 "8,33,34"},
 "+error":1,
-skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)
+skc:function(a,b){a.Py=this.pD(a,C.yh,a.Py,b)
 "35,28,8,33"},
 "+error=":1,
+gVB:function(a){return a.hO
+"35,33,34"},
+"+error_obj":1,
+sVB:function(a,b){a.hO=this.pD(a,C.Yn,a.hO,b)
+"35,28,35,33"},
+"+error_obj=":1,
 "@":function(){return[C.uW]},
 static:{TW:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Py=""
 a.Ye=z
 a.mT=y
 a.KM=v
 C.OD.ZL(a)
-C.OD.XI(a)
+C.OD.FH(a)
 return a
-"14"},"+new ErrorViewElement$created:0:0":1}},"+ErrorViewElement": [],wa:{"":"uL+Pi;",$iswn:true}}],["field_view_element","package:observatory/src/observatory_elements/field_view.dart",,A,{Gk:{"":["Vfx;OL%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gt0:function(a){return a.OL
+"14"},"+new ErrorViewElement$created:0:0":1}},"+ErrorViewElement": [79],pv:{"":"uL+Pi;",$isd3:true}}],["field_view_element","package:observatory/src/observatory_elements/field_view.dart",,A,{Gk:{"":["Vfx;vt%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gt0:function(a){return a.vt
 "32,33,34"},
 "+field":1,
-st0:function(a,b){a.OL=this.ct(a,C.WQ,a.OL,b)
+st0:function(a,b){a.vt=this.pD(a,C.WQ,a.vt,b)
 "35,28,32,33"},
 "+field=":1,
-"@":function(){return[C.My]},
+"@":function(){return[C.mv]},
 static:{cY:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
 C.lS.ZL(a)
-C.lS.XI(a)
+C.lS.FH(a)
 return a
-"15"},"+new FieldViewElement$created:0:0":1}},"+FieldViewElement": [],Vfx:{"":"uL+Pi;",$iswn:true}}],["function_view_element","package:observatory/src/observatory_elements/function_view.dart",,N,{Ds:{"":["Dsd;jr%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gMj:function(a){return a.jr
+"15"},"+new FieldViewElement$created:0:0":1}},"+FieldViewElement": [80],Vfx:{"":"uL+Pi;",$isd3:true}}],["function_view_element","package:observatory/src/observatory_elements/function_view.dart",,N,{Ds:{"":["Dsd;ql%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gMj:function(a){return a.ql
 "32,33,34"},
 "+function":1,
-sMj:function(a,b){a.jr=this.ct(a,C.nf,a.jr,b)
+sMj:function(a,b){a.ql=this.pD(a,C.nf,a.ql,b)
 "35,28,32,33"},
 "+function=":1,
 "@":function(){return[C.nu]},
 static:{p7:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
 C.PJ.ZL(a)
-C.PJ.XI(a)
+C.PJ.FH(a)
 return a
-"16"},"+new FunctionViewElement$created:0:0":1}},"+FunctionViewElement": [],Dsd:{"":"uL+Pi;",$iswn:true}}],["html_common","dart:html_common",,P,{mR:function(a){var z,y,x,w
-if(a==null)return
-z=H.B7([],P.L5(null,null,null,null,null))
-y=Object.getOwnPropertyNames(a)
-for(x=new H.wi(y,y.length,0,null),H.VM(x,[H.ip(y,"Q",0)]);x.G();){w=x.M4
-z.u(z,w,a[w])}return z},jD:function(a){return P.Wu(a.getTime(),!0)},o7:function(a,b){var z=[]
+"16"},"+new FunctionViewElement$created:0:0":1}},"+FunctionViewElement": [81],Dsd:{"":"uL+Pi;",$isd3:true}}],["html_common","dart:html_common",,P,{jD:function(a){return P.Wu(a.getTime(),!0)},o7:function(a,b){var z=[]
 return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},dg:function(){if($.L4==null)$.L4=J.Vw(window.navigator.userAgent,"Opera",0)
 return $.L4},F7:function(){if($.PN==null)$.PN=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 return $.PN},CA:{"":"Tp;a,b",
@@ -16615,7 +15561,7 @@
 if(y!=null)return y
 y=H.B7([],P.L5(null,null,null,null,null))
 this.h.call$2(z,y)
-for(x=Object.keys(a),w=new H.wi(x,x.length,0,null),H.VM(w,[H.ip(x,"Q",0)]);w.G();){v=w.M4
+for(x=Object.keys(a),w=new H.a7(x,x.length,0,null),H.VM(w,[H.W8(x,"Q",0)]);w.G();){v=w.mD
 y.u(y,v,this.call$1(a[v]))}return y}if(a instanceof Array){z=this.f.call$1(a)
 y=this.g.call$1(z)
 if(y!=null)return y
@@ -16644,42 +15590,39 @@
 zV:function(a,b){var z=this.lF()
 return z.zV(z,b)},
 ez:function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},
+return H.K1(z,b,H.W8(z,"mW",0),null)},
 ev:function(a,b){var z,y
 z=this.lF()
 y=new H.U5(z,b)
-H.VM(y,[H.ip(z,"mW",0)])
+H.VM(y,[H.W8(z,"mW",0)])
 return y},
 Vr:function(a,b){var z=this.lF()
 return z.Vr(z,b)},
-gl0:function(a){return this.lF().hr===0},
+gl0:function(a){return this.lF().X5===0},
 "+isEmpty":0,
-gor:function(a){return this.lF().hr!==0},
+gor:function(a){return this.lF().X5!==0},
 "+isNotEmpty":0,
-gB:function(a){return this.lF().hr},
+gB:function(a){return this.lF().X5},
 "+length":0,
 tg:function(a,b){var z=this.lF()
 return z.tg(z,b)},
 Zt:function(a){var z=this.lF()
 return z.tg(z,a)?a:null},
 h:function(a,b){return this.OS(new P.GE(b))},
-ght:function(a){return new J.C7(this,P.As.prototype.h,a,"h")},
 Rz:function(a,b){var z,y
 if(typeof b!=="string")return!1
 z=this.lF()
 y=z.Rz(z,b)
 this.p5(z)
 return y},
-gFV:function(a){var z=this.lF()
-return z.gFV(z)},
-grZ:function(a){var z=this.lF()
-return z.grZ(z)},
+grZ:function(a){var z=this.lF().lX
+if(z==null)H.vh(new P.lj("No elements"))
+return z.gGc()},
 tt:function(a,b){var z=this.lF()
 return z.tt(z,b)},
 br:function(a){return this.tt(a,!0)},
-DX:function(a,b,c){var z=this.lF()
-return z.DX(z,b,c)},
-XG:function(a,b){return this.DX(a,b,null)},
+eR:function(a,b){var z=this.lF()
+return H.ke(z,b,H.W8(z,"mW",0))},
 Zv:function(a,b){var z=this.lF()
 return z.Zv(z,b)},
 OS:function(a){var z,y
@@ -16687,69 +15630,69 @@
 y=a.call$1(z)
 this.p5(z)
 return y},
-$isyN:true,
+$isqC:true,
 $iscX:true,
 $ascX:function(){return[J.O]}},GE:{"":"Tp;a",
 call$1:function(a){return J.bi(a,this.a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true}}],["isolate_list_element","package:observatory/src/observatory_elements/isolate_list.dart",,L,{u7:{"":["uL;tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+$is_Dv:true}}],["isolate_list_element","package:observatory/src/observatory_elements/isolate_list.dart",,L,{u7:{"":["uL;tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.jF]},
-static:{Tt:function(a){var z,y,x,w,v
-z=$.R8()
+static:{ip:function(a){var z,y,x,w,v
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
 C.Dh.ZL(a)
-C.Dh.XI(a)
+C.Dh.FH(a)
 return a
-"17"},"+new IsolateListElement$created:0:0":1}},"+IsolateListElement": []}],["isolate_summary_element","package:observatory/src/observatory_elements/isolate_summary.dart",,D,{St:{"":["tuj;Pw%-,i0%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"17"},"+new IsolateListElement$created:0:0":1}},"+IsolateListElement": [24]}],["isolate_summary_element","package:observatory/src/observatory_elements/isolate_summary.dart",,D,{St:{"":["tuj;Pw%-,i0%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gF1:function(a){return a.Pw
 "27,33,34"},
 "+isolate":1,
-sF1:function(a,b){a.Pw=this.ct(a,C.Y2,a.Pw,b)
+sF1:function(a,b){a.Pw=this.pD(a,C.Y2,a.Pw,b)
 "35,28,27,33"},
 "+isolate=":1,
 goc:function(a){return a.i0
 "8,33,34"},
 "+name":1,
-soc:function(a,b){a.i0=this.ct(a,C.YS,a.i0,b)
+soc:function(a,b){a.i0=this.pD(a,C.YS,a.i0,b)
 "35,28,8,33"},
 "+name=":1,
-"@":function(){return[C.es]},
+"@":function(){return[C.aM]},
 static:{N5:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.i0=""
 a.Ye=z
 a.mT=y
 a.KM=v
 C.nM.ZL(a)
-C.nM.XI(a)
+C.nM.FH(a)
 return a
-"18"},"+new IsolateSummaryElement$created:0:0":1}},"+IsolateSummaryElement": [],tuj:{"":"uL+Pi;",$iswn:true}}],["json_view_element","package:observatory/src/observatory_elements/json_view.dart",,Z,{vj:{"":["Vct;eb%-,kf%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"18"},"+new IsolateSummaryElement$created:0:0":1}},"+IsolateSummaryElement": [82],tuj:{"":"uL+Pi;",$isd3:true}}],["json_view_element","package:observatory/src/observatory_elements/json_view.dart",,Z,{vj:{"":["Vct;eb%-,kf%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gTn:function(a){return a.eb
 "35,33,34"},
 "+json":1,
-sTn:function(a,b){a.eb=this.ct(a,C.B1,a.eb,b)
+sTn:function(a,b){a.eb=this.pD(a,C.Gd,a.eb,b)
 "35,28,35,33"},
 "+json=":1,
 i4:function(a){Z.uL.prototype.i4.call(this,a)
 a.kf=0
 "35"},
 "+enteredView:0:0":1,
-yC:function(a,b){this.ct(a,C.eR,"a","b")
-"35,68,35"},
+yC:function(a,b){this.pD(a,C.eR,"a","b")
+"35,83,35"},
 "+jsonChanged:1:0":1,
 gE8:function(a){return J.AG(a.eb)
 "8"},
@@ -16757,7 +15700,7 @@
 gmm:function(a){var z,y
 z=a.eb
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
+if(typeof z==="object"&&z!==null&&!!y.$isL8)return"Map"
 else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
 return"Primitive"
 "8"},
@@ -16772,63 +15715,63 @@
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
 return[]
-"61"},
+"65"},
 "+list":1,
 gvc:function(a){var z,y
 z=a.eb
 y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.Nd(y.gvc(z))
+if(typeof z==="object"&&z!==null&&!!y.$isL8)return J.qA(y.gvc(z))
 return[]
-"61"},
+"65"},
 "+keys":1,
 r6:function(a,b){return J.UQ(a.eb,b)
-"35,69,8"},
+"35,73,8"},
 "+value:1:0":1,
-gP:function(a){return new J.C7(this,Z.vj.prototype.r6,a,"r6")},
-"@":function(){return[C.zD]},
+gP:function(a){return new P.C7(this,Z.vj.prototype.r6,a,"r6")},
+"@":function(){return[C.HN]},
 static:{un:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.eb=null
 a.kf=0
 a.Ye=z
 a.mT=y
 a.KM=v
-C.GB.ZL(a)
-C.GB.XI(a)
+C.jZ.ZL(a)
+C.jZ.FH(a)
 return a
-"19"},"+new JsonViewElement$created:0:0":1}},"+JsonViewElement": [],Vct:{"":"uL+Pi;",$iswn:true}}],["library_view_element","package:observatory/src/observatory_elements/library_view.dart",,M,{CX:{"":["D13;iI%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"19"},"+new JsonViewElement$created:0:0":1}},"+JsonViewElement": [84],Vct:{"":"uL+Pi;",$isd3:true}}],["library_view_element","package:observatory/src/observatory_elements/library_view.dart",,M,{CX:{"":["D13;iI%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gtD:function(a){return a.iI
 "32,33,34"},
 "+library":1,
-stD:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)
+stD:function(a,b){a.iI=this.pD(a,C.EV,a.iI,b)
 "35,28,32,33"},
 "+library=":1,
 "@":function(){return[C.Oy]},
 static:{SP:function(a){var z,y,x,w,v,u
 z=H.B7([],P.L5(null,null,null,null,null))
-z=B.tB(z)
-y=$.R8()
+z=R.Jk(z)
+y=$.Nd()
 x=P.Py(null,null,null,J.O,W.I0)
 w=J.O
 v=W.cv
-u=new B.br(P.Py(null,null,null,w,v),null,null)
+u=new V.br(P.Py(null,null,null,w,v),null,null)
 H.VM(u,[w,v])
 a.iI=z
 a.Ye=y
 a.mT=x
 a.KM=u
-C.Bn.ZL(a)
-C.Bn.XI(a)
+C.MG.ZL(a)
+C.MG.FH(a)
 return a
-"20"},"+new LibraryViewElement$created:0:0":1}},"+LibraryViewElement": [],D13:{"":"uL+Pi;",$iswn:true}}],["logging","package:logging/logging.dart",,N,{TJ:{"":"a;oc>,eT>,yz,Cj>,wd,Gs",
+"20"},"+new LibraryViewElement$created:0:0":1}},"+LibraryViewElement": [85],D13:{"":"uL+Pi;",$isd3:true}}],["logging","package:logging/logging.dart",,N,{TJ:{"":"a;oc>,eT>,yz,Cj>,wd,Gs",
 gB8:function(){var z,y,x
 z=this.eT
-y=z==null||J.xC(J.tE(z),"")
+y=z==null||J.xC(J.DA(z),"")
 x=this.oc
 return y?x:z.gB8()+"."+x},
 gOR:function(){if($.RL){var z=this.eT
@@ -16843,18 +15786,20 @@
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
 v=z.geT(v)}else J.EY(N.Jx(""),w)}},
+X2:function(a,b,c){return this.Y6(C.VZ,a,b,c)},
+x9:function(a){return this.X2(a,null,null)},
 yl:function(a,b,c){return this.Y6(C.R5,a,b,c)},
-II:function(a){return this.yl(a,null,null)},
+J4:function(a){return this.yl(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)},
 cI:function(a,b,c){return this.Y6(C.UP,a,b,c)},
-j2:function(a){return this.cI(a,null,null)},
+A3:function(a){return this.cI(a,null,null)},
 od:function(a,b){},
 QL:function(a,b,c){var z=this.eT
 if(z!=null){z=J.Tr(z)
 z.u(z,this.oc,this)}},
 $isTJ:true,
-static:{"":"Uj",Jx:function(a){return $.Iu().to(a,new N.aO(a))},hS:function(a){var z,y,x
+static:{"":"Uj",Jx:function(a){return $.Iu().to(a,new N.dG(a))},hS:function(a){var z,y,x
 if(C.xB.nC(a,"."))throw H.b(new P.AT("name shouldn't start with a '.'"))
 z=C.xB.cn(a,".")
 if(z===-1){y=a!==""?N.Jx(""):null
@@ -16863,7 +15808,7 @@
 H.VM(z,[null,null])
 z=new N.TJ(a,b,null,c,z,null)
 z.QL(a,b,c)
-return z}}},aO:{"":"Tp;a",
+return z}}},dG:{"":"Tp;a",
 call$0:function(){return N.hS(this.a)},
 "+call:0:0":0,
 $isEH:true,
@@ -16888,60 +15833,60 @@
 iM:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")throw H.s(z)
 return this.P-z},
-gEo:function(a){return this.P},
+giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isNg:true,
-static:{"":"V7,tm,pR,X8,IQ,Fn,Eb,AN,JY,bn",}},HV:{"":"a;OR<,G1>,iJ,Fl,O0,kc>,I4<",
+static:{"":"bR,tm,pR,X8,IQ,Fn,Eb,BC,JY,bo",}},HV:{"":"a;OR<,G1>,iJ,Fl,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
-static:{"":"xO",}}}],["message_viewer_element","package:observatory/src/observatory_elements/message_viewer.dart",,L,{Nh:{"":["uL;Gj%-,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gG1:function(a){return a.Gj
+static:{"":"xO",}}}],["message_viewer_element","package:observatory/src/observatory_elements/message_viewer.dart",,L,{Nh:{"":["uL;XB%-,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+gG1:function(a){return a.XB
 "32,34"},
 "+message":1,
-sG1:function(a,b){a.Gj=b
-this.ct(a,C.KY,"",this.gQW(a))
-this.ct(a,C.wt,[],this.glc(a))
-"35,70,32,34"},
+sG1:function(a,b){a.XB=b
+this.pD(a,C.KY,"",this.gQW(a))
+this.pD(a,C.wt,[],this.glc(a))
+"35,86,32,34"},
 "+message=":1,
-gQW:function(a){var z=a.Gj
+gQW:function(a){var z=a.XB
 if(z==null||J.UQ(z,"type")==null)return"Error"
-return J.UQ(a.Gj,"type")
+return J.UQ(a.XB,"type")
 "8"},
 "+messageType":1,
-glc:function(a){var z=a.Gj
+glc:function(a){var z=a.XB
 if(z==null||J.UQ(z,"members")==null)return[]
-return J.UQ(a.Gj,"members")
-"71"},
+return J.UQ(a.XB,"members")
+"87"},
 "+members":1,
-"@":function(){return[C.aB]},
+"@":function(){return[C.c0]},
 static:{rJ:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
 C.Wp.ZL(a)
-C.Wp.XI(a)
+C.Wp.FH(a)
 return a
-"21"},"+new MessageViewerElement$created:0:0":1}},"+MessageViewerElement": []}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{fA:{"":"a;T9,Jt",static:{"":"ZJ,Et,yS,PZ,xa",}},tz:{"":"a;"},bW:{"":"a;oc>"},PO:{"":"a;"},oB:{"":"a;"}}],["navigation_bar_element","package:observatory/src/observatory_elements/navigation_bar.dart",,Q,{ih:{"":["uL;tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"21"},"+new MessageViewerElement$created:0:0":1}},"+MessageViewerElement": [24]}],["metadata","/Users/iposva/Downloads/dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{fA:{"":"a;T9,Jt",static:{"":"Xd,en,yS,PZ,xa",}},tz:{"":"a;"},jR:{"":"a;oc>"},PO:{"":"a;"},c5:{"":"a;"}}],["navigation_bar_element","package:observatory/src/observatory_elements/navigation_bar.dart",,Q,{ih:{"":["uL;tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.KG]},
 static:{BW:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
-C.vE.ZL(a)
-C.vE.XI(a)
+C.Xg.ZL(a)
+C.Xg.FH(a)
 return a
-"22"},"+new NavigationBarElement$created:0:0":1}},"+NavigationBarElement": []}],["observatory","package:observatory/observatory.dart",,L,{mL:{"":["Pi;Z6<-,lw<-,nI<-,jH,Wd",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+"22"},"+new NavigationBarElement$created:0:0":1}},"+NavigationBarElement": [24]}],["observatory","package:observatory/observatory.dart",,L,{mL:{"":["Pi;Z6<-,lw<-,nI<-,VJ,Ai",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
 US:function(){var z,y,x
 z=this.Z6
 z.sJR(this)
@@ -16951,21 +15896,21 @@
 x.sJR(this)
 y.se0(x.gVY())
 z.kI()},
-static:{Gh:function(){var z,y
-z=B.tB([])
+static:{AK:function(){var z,y
+z=R.Jk([])
 y=P.L5(null,null,null,J.im,L.bv)
-y=B.tB(y)
-y=new L.mL(new L.yV(null,"",null,null),new L.tb(null,null,"http://127.0.0.1:8181",z,null,null),new L.pt(null,y,null,null),null,null)
+y=R.Jk(y)
+y=new L.mL(new L.dZ(null,"",null,null),new L.jI(null,null,"http://127.0.0.1:8181",z,null,null),new L.pt(null,y,null,null),null,null)
 y.US()
-return y}}},bv:{"":["Pi;jO>-,oc>-,jH,Wd",function(){return[C.mI]},function(){return[C.mI]},null,null],
+return y}}},bv:{"":["Pi;jO>-,oc>-,VJ,Ai",function(){return[C.mI]},function(){return[C.mI]},null,null],
 bu:function(a){return H.d(this.jO)+" "+H.d(this.oc)},
-$isbv:true},pt:{"":["Pi;JR?,i2<-,jH,Wd",null,function(){return[C.mI]},null,null],
+$isbv:true},pt:{"":["Pi;JR?,i2<-,VJ,Ai",null,function(){return[C.mI]},null,null],
 yi:function(){J.kH(this.JR.lw.gn2(),new L.dY(this))},
-gVY:function(){return new H.Ip(this,L.pt.prototype.yi,null,"yi")},
+gVY:function(){return new P.Ip(this,L.pt.prototype.yi,null,"yi")},
 LZ:function(a){var z=[]
 J.kH(this.i2,new L.vY(a,z))
-H.bQ(z,new L.zZ(this))
-J.kH(a,new L.dS(this))},
+H.bQ(z,new L.dS(this))
+J.kH(a,new L.ZW(this))},
 static:{AC:function(a,b){return J.ja(b,new L.Zd(a))}}},Zd:{"":"Tp;a",
 call$1:function(a){return J.xC(J.UQ(a,"id"),this.a)},
 "+call:1:0":0,
@@ -16981,12 +15926,12 @@
 call$2:function(a,b){if(L.AC(a,this.a)!==!0)this.b.push(a)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},zZ:{"":"Tp;c",
+$is_bh:true},dS:{"":"Tp;c",
 call$1:function(a){J.V1(this.c.i2,a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},dS:{"":"Tp;d",
+$is_Dv:true},ZW:{"":"Tp;d",
 call$1:function(a){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"id")
@@ -16997,24 +15942,24 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},yV:{"":"Pi;JR?,IT,jH,Wd",
+$is_Dv:true},dZ:{"":"Pi;JR?,IT,VJ,Ai",
 gzd:function(){return this.IT
-"8,33,36"},
+"8,33,38"},
 "+currentHash":1,
-szd:function(a){this.IT=B.iY(this,C.h1,this.IT,a)
+szd:function(a){this.IT=F.Wi(this,C.h1,this.IT,a)
 "35,28,8,33"},
 "+currentHash=":1,
 kI:function(){var z,y
 z=C.PP.aM(window)
-y=new W.Ov(0,z.uv,z.Ph,W.aF(new L.OH(this)),z.Sg)
-H.VM(y,[H.ip(z,"RO",0)])
+y=new W.Ov(0,z.uv,z.Ph,W.aF(new L.Qe(this)),z.Sg)
+H.VM(y,[H.W8(z,"RO",0)])
 y.Zz()
 if(!this.S7())this.df()},
 vI:function(){var z,y,x,w,v
 z=$.oy()
 y=z.R4(z,this.IT)
 if(y==null)return
-z=y.QK
+z=y.oH
 x=z.input
 w=z.index
 v=z.index
@@ -17028,40 +15973,40 @@
 y=z.split("/")
 if(2>=y.length)throw H.e(y,2)
 return H.BU(y[2],null,null)},
-S7:function(){var z=J.M6(C.ol.gmW(window))
-this.IT=B.iY(this,C.h1,this.IT,z)
-if(J.xC(this.IT,"")||J.xC(this.IT,"#")){J.N7(C.ol.gmW(window),"#/isolates/")
+S7:function(){var z=J.Co(C.ol.gmW(window))
+this.IT=F.Wi(this,C.h1,this.IT,z)
+if(J.xC(this.IT,"")||J.xC(this.IT,"#")){J.We(C.ol.gmW(window),"#/isolates/")
 return!0}return!1},
 df:function(){var z,y
-z=J.M6(C.ol.gmW(window))
-this.IT=B.iY(this,C.h1,this.IT,z)
-y=J.Z1(this.IT,1)
+z=J.Co(C.ol.gmW(window))
+this.IT=F.Wi(this,C.h1,this.IT,z)
+y=J.ZZ(this.IT,1)
 this.JR.lw.ox(y)},
-b7:function(a){var z=this.R6()
+PI:function(a){var z=this.R6()
 if(J.xC(z,0))return"#/isolates/"
 return"#/isolates/"+H.d(z)+"/"+H.d(a)
-"8,72,8,36"},
+"8,88,8,38"},
 "+currentIsolateRelativeLink:1:0":1,
 Ao:function(a){var z=this.R6()
 if(J.xC(z,0))return"#/isolates/"
 return"#/isolates/"+H.d(z)+"/objects/"+H.d(a)
-"8,73,27,36"},
+"8,89,27,38"},
 "+currentIsolateObjectLink:1:0":1,
 dL:function(a){var z=this.R6()
 if(J.xC(z,0))return"#/isolates/"
 return"#/isolates/"+H.d(z)+"/classes/"+H.d(a)
-"8,74,27,36"},
+"8,90,27,38"},
 "+currentIsolateClassLink:1:0":1,
 r4:function(a,b){return"#/isolates/"+H.d(a)+"/"+H.d(b)
-"8,75,27,72,8,36"},
+"8,91,27,88,8,38"},
 "+relativeLink:2:0":1,
-Zy:function(a,b){return"#/isolates/"+H.d(a)+"/objects/"+H.d(b)
-"8,75,27,73,27,36"},
+Dd:function(a,b){return"#/isolates/"+H.d(a)+"/objects/"+H.d(b)
+"8,91,27,89,27,38"},
 "+objectLink:2:0":1,
 bD:function(a,b){return"#/isolates/"+H.d(a)+"/classes/"+H.d(b)
-"8,75,27,74,27,36"},
+"8,91,27,90,27,38"},
 "+classLink:2:0":1,
-static:{"":"kx,Qq,qY",}},OH:{"":"Tp;a",
+static:{"":"kx,K3D,qY",}},Qe:{"":"Tp;a",
 call$1:function(a){var z=this.a
 if(z.S7())return
 z.df()},
@@ -17070,25 +16015,25 @@
 $is_HB:true,
 $is_Dv:true},Nu:{"":"Pi;JR?,e0?",
 pG:function(){return this.e0.call$0()},
-gEI:function(){return this.j6
-"8,33,36"},
+gEI:function(){return this.oJ
+"8,33,38"},
 "+prefix":1,
-sEI:function(a){this.j6=B.iY(this,C.NA,this.j6,a)
+sEI:function(a){this.oJ=F.Wi(this,C.qb,this.oJ,a)
 "35,28,8,33"},
 "+prefix=":1,
 gn2:function(){return this.vm
-"71,33,36"},
+"87,33,38"},
 "+responses":1,
-sn2:function(a){this.vm=B.iY(this,C.wH,this.vm,a)
-"35,28,71,33"},
+sn2:function(a){this.vm=F.Wi(this,C.wH,this.vm,a)
+"35,28,87,33"},
 "+responses=":1,
 Qn:function(a){var z,y
 z=C.lM.kV(a)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)this.dq([z])
+if(typeof z==="object"&&z!==null&&!!y.$isL8)this.dq([z])
 else this.dq(z)},
-dq:function(a){var z=B.tB(a)
-this.vm=B.iY(this,C.wH,this.vm,z)
+dq:function(a){var z=R.Jk(a)
+this.vm=F.Wi(this,C.wH,this.vm,z)
 if(this.e0!=null)this.pG()},
 AI:function(a){var z,y
 z=J.RE(a)
@@ -17105,624 +16050,143 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},tb:{"":"Nu;JR,e0,j6,vm,jH,Wd",
-ym:function(a,b){return W.It(J.WB(this.j6,b),null,null)}}}],["observatory_application_element","package:observatory/src/observatory_elements/observatory_application.dart",,V,{F1:{"":["uL;tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-Qh:function(a){var z=L.Gh()
-a.tH=this.ct(a,C.b0,a.tH,z)
+$is_Dv:true},jI:{"":"Nu;JR,e0,oJ,vm,VJ,Ai",
+ym:function(a,b){return W.It(J.WB(this.oJ,b),null,null)}}}],["observatory_application_element","package:observatory/src/observatory_elements/observatory_application.dart",,V,{F1:{"":["uL;tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+ZB:function(a){var z=L.AK()
+a.tH=this.pD(a,C.wh,a.tH,z)
 "35"},
 "@":function(){return[C.bd]},
 static:{fv:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
-C.HB.ZL(a)
-C.HB.XI(a)
-C.HB.Qh(a)
+C.k0.ZL(a)
+C.k0.FH(a)
+C.k0.ZB(a)
 return a
-"23"},"+new ObservatoryApplicationElement$created:0:0":1}},"+ObservatoryApplicationElement": []}],["observatory_element","package:observatory/src/observatory_elements/observatory_element.dart",,Z,{uL:{"":["Xf;tH%-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"23"},"+new ObservatoryApplicationElement$created:0:0":1}},"+ObservatoryApplicationElement": [24]}],["observatory_element","package:observatory/src/observatory_elements/observatory_element.dart",,Z,{uL:{"":["Xf;tH%-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 i4:function(a){A.dM.prototype.i4.call(this,a)
 "35"},
 "+enteredView:0:0":1,
 Nz:function(a){A.dM.prototype.Nz.call(this,a)
 "35"},
 "+leftView:0:0":1,
-gMR:function(a){return a.tH
-"76,33,34"},
+gQG:function(a){return a.tH
+"92,33,34"},
 "+app":1,
-sMR:function(a,b){a.tH=this.ct(a,C.b0,a.tH,b)
-"35,28,76,33"},
+sQG:function(a,b){a.tH=this.pD(a,C.wh,a.tH,b)
+"35,28,92,33"},
 "+app=":1,
 gpQ:function(a){return!0
-"37"},
+"39"},
 "+applyAuthorStyles":1,
-"@":function(){return[C.lu]},
+"@":function(){return[C.J0]},
 static:{Hx:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
 C.Pf.ZL(a)
-C.Pf.XI(a)
+C.Pf.FH(a)
 return a
-"24"},"+new ObservatoryElement$created:0:0":1}},"+ObservatoryElement": [],Xf:{"":"ir+Pi;",$iswn:true}}],["observe","package:observe/observe.dart",,B,{iY:function(a,b,c,d){var z,y
-z=J.RE(a)
-if(z.gUV(a)&&!J.xC(c,d)){y=new B.qI(a,b,c,d)
-H.VM(y,[null])
-z.SZ(a,y)}return d},Wa:function(a,b){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isW4)return typeof b==="number"&&Math.floor(b)===b&&a.ck(b)
-if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.xC(a.oc,b)
-if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gE3(b)
-return J.xC(a.G3,b)}return!1},yf:function(a,b){var z,y,x,w
-if(a==null)return
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList)&&typeof b==="number"&&Math.floor(b)===b){if(typeof b!=="number")throw b.F()
-if(b>=0){y=z.gB(a)
-if(typeof y!=="number")throw H.s(y)
-y=b<y}else y=!1
-if(y)return z.t(a,b)
-else return}y=J.RE(b)
-x=typeof b==="object"&&b!==null&&!!y.$iswv
-if(x){w=B.Yy(H.vn(a),b)
-if(w!=null)return w.Ax}if(typeof a==="object"&&a!==null&&!!z.$isZ0)return z.t(a,x?y.gE3(b):b)
-return},h6:function(a,b,c){var z,y,x
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList)&&typeof b==="number"&&Math.floor(b)===b){if(typeof b!=="number")throw b.F()
-if(b>=0){y=z.gB(a)
-if(typeof y!=="number")throw H.s(y)
-y=b<y}else y=!1
-if(y){z.u(a,b,c)
-return!0}else return!1}y=J.RE(b)
-x=typeof b==="object"&&b!==null&&!!y.$iswv
-if(x)if(B.N4(H.vn(a),b,c)===!0)return!0
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){z.u(a,x?y.gE3(b):b,c)
-return!0}return!1},Yy:function(a,b){var z,y,x
-try{z=a.rN(b)
-return z}catch(y){z=H.Ru(y)
-x=J.x(z)
-if(typeof z==="object"&&z!==null&&!!x.$ismp){if(B.CK(a,b,new B.Kt()))throw y
-return}else throw y}},N4:function(a,b,c){var z,y,x
-try{a.PU(b,c)
-return!0}catch(z){y=H.Ru(z)
-x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$ismp){if(B.CK(a,b,new B.hh())||B.CK(a,new H.GD(H.bK(H.d(J.cs(b))+"=")),null))throw z
-return!1}else throw z}},CK:function(a,b,c){var z,y,x,w,v
-z=H.nH(J.bB(a.Ax).LU)
-for(y=c!=null;z!=null;){x=J.UQ(J.GK(z),b)
-if(x!=null)w=c==null||c.call$1(x)===!0
-else w=!1
-if(w)return!0
-try{z=z.gAY()}catch(v){y=H.Ru(v)
-w=J.x(y)
-if(typeof y==="object"&&y!==null&&!!w.$isub)return!1
-else throw v}}return!1},rd:function(a){a=J.JA(a,$.c3(),"")
-if(a==="")return!0
-if(0>=a.length)throw H.e(a,0)
-if(a[0]===".")return!1
-return $.tN().zD(a)},tB:function(a){var z,y,x
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iswn)return a
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=B.jR(a,null,null)
-z.aN(a,new B.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)){z=z.ez(a,B.Ft)
-x=B.uX(null,null)
-x.Ay(x,z)
-return x}return a},Pi:{"":"a;",
+"24"},"+new ObservatoryElement$created:0:0":1}},"+ObservatoryElement": [93],Xf:{"":"ir+Pi;",$isd3:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{Pi:{"":"a;",
 gqh:function(a){var z,y
-if(a.jH==null){z=this.glR(a)
-a.jH=P.nd(this.gwa(a),z,!0,null)}z=a.jH
+if(a.VJ==null){z=this.gqw(a)
+a.VJ=P.bK(this.gl1(a),z,!0,null)}z=a.VJ
 z.toString
 y=new P.Ik(z)
-H.VM(y,[H.ip(z,"WV",0)])
+H.VM(y,[H.W8(z,"WV",0)])
 return y},
-hv:function(a){},
-glR:function(a){return new H.MT(this,B.Pi.prototype.hv,a,"hv")},
-a0:function(a){},
-gwa:function(a){return new H.MT(this,B.Pi.prototype.a0,a,"a0")},
+w3:function(a){},
+gqw:function(a){return new H.YP(this,O.Pi.prototype.w3,a,"w3")},
+ni:function(a){a.VJ=null},
+gl1:function(a){return new H.YP(this,O.Pi.prototype.ni,a,"ni")},
 BN:function(a){var z,y,x
-z=a.Wd
-a.Wd=null
-y=a.jH
+z=a.Ai
+a.Ai=null
+y=a.VJ
 if(y!=null){x=y.iE
 x=x==null?y!=null:x!==y}else x=!1
 if(x&&z!=null){x=new P.Yp(z)
-H.VM(x,[B.yj])
+H.VM(x,[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
 return!0}return!1},
-guo:function(a){return new H.MT(this,B.Pi.prototype.BN,a,"BN")},
+gDx:function(a){return new H.YP(this,O.Pi.prototype.BN,a,"BN")},
 gUV:function(a){var z,y
-z=a.jH
+z=a.VJ
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:function(a,b,c,d){return B.iY(a,b,c,d)},
+pD:function(a,b,c,d){return F.Wi(a,b,c,d)},
 SZ:function(a,b){var z,y
-z=a.jH
+z=a.VJ
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(a.Wd==null){a.Wd=[]
-P.rb(this.guo(a))}a.Wd.push(b)},
-$iswn:true},yj:{"":"a;",$isyj:true},qI:{"":"yj;WA,oc>,jL>,zZ>",
-gt0:function(a){return this.oc},
-"+field":0,
-VD:function(a,b){return J.xC(this.oc,b)},
-gqh:function(a){return new J.C7(this,B.qI.prototype.VD,a,"VD")},
+if(a.Ai==null){a.Ai=[]
+P.rb(this.gDx(a))}a.Ai.push(b)},
+$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{yj:{"":"a;",$isyj:true},qI:{"":"yj;WA<,oc>,jL>,zZ>",
 bu:function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isqI:true},W4:{"":"yj;vH>,os<,Ng<",
-VD:function(a,b){return this.ck(b)},
-gqh:function(a){return new J.C7(this,B.W4.prototype.VD,a,"VD")},
-ck:function(a){var z
-if(typeof a==="number"&&Math.floor(a)===a){z=this.vH
-if(typeof z!=="number")throw H.s(z)
-z=a<z}else z=!0
-if(z)return!1
-z=this.Ng
-if(!J.xC(z,this.os))return!0
-return J.u6(a,J.WB(this.vH,z))},
-bu:function(a){return"#<ListChangeRecord index: "+H.d(this.vH)+", removed: "+H.d(this.os)+", addedCount: "+H.d(this.Ng)+">"},
-$isW4:true},zF:{"":"Pi;yZ,j9,MU,X7,vY,jH,Wd",
-Xt:function(a){return this.yZ.call$1(a)},
-gB:function(a){return this.j9.hr},
+$isqI:true}}],["observe.src.compound_path_observer","package:observe/src/compound_path_observer.dart",,Y,{J3:{"":"Pi;b9,kK,Sv,rk,YX,B6,VJ,Ai",
+kb:function(a){return this.rk.call$1(a)},
+gB:function(a){return this.b9.length},
 "+length":0,
-gP:function(a){return this.X7
+gP:function(a){return this.Sv
 "35,33"},
 "+value":1,
 r6:function(a,b){return this.gP(a).call$1(b)},
-sP:function(a,b){this.X7=B.iY(this,C.ls,this.X7,b)
-"35,77,35,33"},
-"+value=":1,
-Zf:function(a,b,c,d){var z
-this.Ih(this,b)
-z=this.j9
-z.u(z,b,B.ao(c,d).yw(new B.Xa(this,b)))},
-U2:function(a,b,c){var z,y
-z=this.j9
-y=z.Rz(z,b)
-if(y==null)return
-y.ed()
-z=this.MU
-z.Rz(z,b)
-if(!c)this.fu()},
-Ih:function(a,b){return this.U2(a,b,!1)},
-fu:function(){if(this.vY)return
-this.vY=!0
-P.rb(this.gjM())},
-WS:function(){if(this.j9.hr===0)return
-this.vY=!1
-if(this.yZ==null)throw H.b(new P.lj("CompoundBinding attempted to resolve without a combinator"))
-var z=this.Xt(this.MU)
-this.X7=B.iY(this,C.ls,this.X7,z)},
-gjM:function(){return new H.Ip(this,B.zF.prototype.WS,null,"WS")},
+wE:function(a){var z,y,x,w
+if(this.YX)return
+this.YX=!0
+z=this.geu()
+for(y=this.b9,x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]),y=this.kK;x.G();){w=J.Ib(x.mD).w4(!1)
+w.dB=$.X3.cR(z)
+w.o7=P.VH(P.AY,$.X3)
+w.Bd=$.X3.Al(P.No)
+y.push(w)}this.CV()},
+TF:function(a){if(this.B6)return
+this.B6=!0
+P.rb(this.gMc())},
+geu:function(){return new H.Pm(this,Y.J3.prototype.TF,null,"TF")},
+CV:function(){var z,y
+this.B6=!1
+z=this.b9
+if(z.length===0)return
+z=new H.A8(z,new Y.E5())
+H.VM(z,[null,null])
+y=z.br(z)
+if(this.rk!=null)y=this.kb(y)
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},
+gMc:function(){return new P.Ip(this,Y.J3.prototype.CV,null,"CV")},
 cO:function(a){var z,y,x
-for(z=this.j9,y=z.gUQ(z),x=y.V8,x=x.gA(x),x=new H.MH(null,x,y.Wz),H.VM(x,[H.ip(y,"i1",0),H.ip(y,"i1",1)]);x.G();)x.M4.ed()
-z.V1(z)
-z=this.MU
-z.V1(z)
-this.X7=B.iY(this,C.ls,this.X7,null)},
-gJK:function(a){return new H.MT(this,B.zF.prototype.cO,a,"cO")},
-a0:function(a){return this.cO(this)},
-gwa:function(a){return new H.MT(this,B.zF.prototype.a0,a,"a0")},
-$iszF:true},Xa:{"":"Tp;a,b",
-call$1:function(a){var z,y
-z=this.a
-y=z.MU
-y.u(y,this.b,a)
-z.fu()},
+z=this.b9
+if(z.length===0)return
+if(this.YX)for(y=this.kK,x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]);x.G();)x.mD.ed()
+C.Nm.sB(z,0)
+C.Nm.sB(this.kK,0)
+this.Sv=null},
+w3:function(a){return this.wE(this)},
+gqw:function(a){return new H.YP(this,Y.J3.prototype.w3,a,"w3")},
+ni:function(a){return this.cO(this)},
+gl1:function(a){return new H.YP(this,Y.J3.prototype.ni,a,"ni")},
+$isJ3:true},E5:{"":"Tp;",
+call$1:function(a){return J.Vm(a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Mu:{"":"a;",$isMu:true},vl:{"":"a;"},X6:{"":"Tp;a,b",
-call$2:function(a,b){var z,y,x,w
-z=this.b
-y=z.Qu.rN(a).Ax
-if(!J.xC(b,y)){x=this.a
-if(x.a==null)x.a=[]
-x=x.a
-w=new B.qI(z,a,b,y)
-H.VM(w,[null])
-x.push(w)
-z=z.MU
-z.u(z,a,y)}},
-"+call:2:0":0,
-$isEH:true,
-$is_bh:true},xh:{"":"Pi;",
-gP:function(a){return this.X7
-"78,33"},
-"+value":1,
-r6:function(a,b){return this.gP(a).call$1(b)},
-sP:function(a,b){this.X7=B.iY(this,C.ls,this.X7,b)
-"35,77,78,33"},
-"+value=":1,
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.X7)+">"}},Pc:{"":"uF;lx,mf,jH,Wd",
-gB:function(a){return this.mf.length
-"27,33"},
-"+length":1,
-sB:function(a,b){var z,y,x
-z=this.mf
-y=z.length
-if(y===b)return
-if(this.gUV(this)){x=J.Wx(b)
-if(x.C(b,y)){if(typeof b!=="number")throw H.s(b)
-x=new B.W4(b,y-b,0)
-if(J.xC(x.Ng,0)&&J.xC(x.os,0))H.vh(new P.AT("added and removed counts should not both be zero. Use 1 if this was a single item update."))
-if(this.lx==null){this.lx=[]
-P.rb(this.guo(this))}this.lx.push(x)}else{x=new B.W4(y,0,x.W(b,y))
-if(J.xC(x.Ng,0)&&J.xC(x.os,0))H.vh(new P.AT("added and removed counts should not both be zero. Use 1 if this was a single item update."))
-if(this.lx==null){this.lx=[]
-P.rb(this.guo(this))}this.lx.push(x)}}C.Nm.sB(z,b)
-"35,28,27,33"},
-"+length=":1,
-t:function(a,b){var z=this.mf
-if(b>>>0!==b||b>=z.length)throw H.e(z,b)
-return z[b]
-"79,26,27,33"},
-"+[]:1:0":1,
-u:function(a,b,c){var z,y
-z=this.mf
-if(b>>>0!==b||b>=z.length)throw H.e(z,b)
-if(this.gUV(this)){y=new B.W4(b,1,1)
-if(J.xC(y.Ng,0)&&J.xC(y.os,0))H.vh(new P.AT("added and removed counts should not both be zero. Use 1 if this was a single item update."))
-if(this.lx==null){this.lx=[]
-P.rb(this.guo(this))}this.lx.push(y)}if(b>=z.length)throw H.e(z,b)
-z[b]=c
-"35,26,27,28,79,33"},
-"+[]=:2:0":1,
-h:function(a,b){var z,y,x
-z=this.mf
-y=z.length
-if(this.gUV(this)){x=new B.W4(y,0,1)
-if(J.xC(x.Ng,0)&&J.xC(x.os,0))H.vh(new P.AT("added and removed counts should not both be zero. Use 1 if this was a single item update."))
-this.Qo(x)}C.Nm.h(z,b)},
-ght:function(a){return new J.C7(this,B.Pc.prototype.h,a,"h")},
-Ay:function(a,b){var z,y,x
-z=this.mf
-y=z.length
-C.Nm.Ay(z,b)
-x=z.length-y
-if(this.gUV(this)&&x>0){z=new B.W4(y,0,x)
-if(J.xC(z.Ng,0)&&J.xC(z.os,0))H.vh(new P.AT("added and removed counts should not both be zero. Use 1 if this was a single item update."))
-this.Qo(z)}},
-Rz:function(a,b){var z,y
-for(z=this.mf,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(this,y,y+1)
-return!0}return!1},
-UZ:function(a,b,c){var z,y,x
-if(b<0||b>this.mf.length)H.vh(P.TE(b,0,this.mf.length))
-if(c<b||c>this.mf.length)H.vh(P.TE(c,b,this.mf.length))
-z=c-b
-y=this.mf
-x=y.length
-H.qG(y,b,x-z,this,c)
-C.Nm.sB(y,y.length-z)
-if(this.gUV(this)&&z>0){y=new B.W4(b,z,0)
-if(J.xC(y.Ng,0)&&J.xC(y.os,0))H.vh(new P.AT("added and removed counts should not both be zero. Use 1 if this was a single item update."))
-if(this.lx==null){this.lx=[]
-P.rb(this.guo(this))}this.lx.push(y)}},
-Qo:function(a){if(this.lx==null){this.lx=[]
-P.rb(this.guo(this))}this.lx.push(a)},
-BN:function(a){if(this.lx==null)return!1
-this.WY()
-return B.Pi.prototype.BN.call(this,this)},
-guo:function(a){return new H.MT(this,B.Pc.prototype.BN,a,"BN")},
-WY:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.mf
-y=z.length
-for(x=this.lx,x.toString,w=new H.wi(x,x.length,0,null),H.VM(w,[H.ip(x,"Q",0)]);w.G();){v=w.M4
-x=J.xH(v.gos(),v.gNg())
-if(typeof x!=="number")throw H.s(x)
-y+=x}z=z.length
-if(z!==y)this.ct(this,C.Wn,y,z)
-z=this.lx
-x=z.length
-if(x===1){if(0>=x)throw H.e(z,0)
-this.SZ(this,z[0])
-this.lx=null
-return}u=[]
-for(t=0;t<y;++t)u.push(t)
-for(z=this.lx,z.toString,x=new H.wi(z,z.length,0,null),H.VM(x,[H.ip(z,"Q",0)]);x.G();){v=x.M4
-z=J.RE(v)
-w=z.gvH(v)
-C.Nm.UZ(u,w,J.WB(w,v.gos()))
-z=z.gvH(v)
-w=P.O8(v.gNg(),-1,null)
-H.m5(u,z,w)}this.lx=null
-for(s=0,r=0;s<u.length;s=q){while(!0){z=u.length
-if(s<z){if(s<0)throw H.e(u,s)
-z=J.xC(u[s],s+r)}else z=!1
-if(!z)break;++s}q=s
-while(!0){z=u.length
-if(q<z){if(q<0)throw H.e(u,q)
-z=J.xC(u[q],-1)}else z=!1
-if(!z)break;++q}p=q-s
-z=u.length
-if(q<z){if(q<0)throw H.e(u,q)
-o=u[q]}else o=y
-n=J.xH(o,s+r)
-if(p>0||J.xZ(n,0)){z=new B.W4(s,n,p)
-if(J.xC(z.Ng,0)&&J.xC(z.os,0))H.vh(new P.AT("added and removed counts should not both be zero. Use 1 if this was a single item update."))
-this.SZ(this,z)}z=J.xH(n,p)
-if(typeof z!=="number")throw H.s(z)
-r+=z}},
-$isPc:true,
-$asWO:null,
-$ascX:null,
-static:{uX:function(a,b){var z=[]
-z=new B.Pc(null,z,null,null)
-H.VM(z,[b])
-return z}}},uF:{"":"ar+Pi;",$asar:null,$asWO:null,$ascX:null,$iswn:true},HA:{"":"yj;G3>,jL>,zZ>,Lv,w5",
-VD:function(a,b){return J.xC(this.G3,b)},
-gqh:function(a){return new J.C7(this,B.HA.prototype.VD,a,"VD")},
-bu:function(a){var z
-if(this.Lv)z="insert"
-else z=this.w5?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isHA:true},br:{"":"Pi;oD,jH,Wd",
-gvc:function(a){var z=this.oD
-return z.gvc(z)
-"80,33"},
-"+keys":1,
-gUQ:function(a){var z=this.oD
-return z.gUQ(z)
-"81,33"},
-"+values":1,
-gB:function(a){var z=this.oD
-return z.gB(z)
-"27,33"},
-"+length":1,
-gl0:function(a){var z=this.oD
-return z.gB(z)===0
-"37,33"},
-"+isEmpty":1,
-gor:function(a){var z=this.oD
-return z.gB(z)!==0
-"37,33"},
-"+isNotEmpty":1,
-PF:function(a){return this.oD.PF(a)
-"37,28,0,33"},
-"+containsValue:1:0":1,
-x4:function(a){return this.oD.x4(a)
-"37,69,0,33"},
-"+containsKey:1:0":1,
-t:function(a,b){var z=this.oD
-return z.t(z,b)
-"82,69,0,33"},
-"+[]:1:0":1,
-u:function(a,b,c){var z,y,x,w,v
-z=this.oD
-y=z.gB(z)
-x=z.t(z,b)
-z.u(z,b,c)
-w=this.jH
-if(w!=null){v=w.iE
-w=v==null?w!=null:v!==w}else w=!1
-if(w)if(y!==z.gB(z)){B.iY(this,C.Wn,y,z.gB(z))
-z=new B.HA(b,null,c,!0,!1)
-H.VM(z,[null,null])
-this.SZ(this,z)}else if(!J.xC(x,c)){z=new B.HA(b,x,c,!1,!1)
-H.VM(z,[null,null])
-this.SZ(this,z)}"35,69,83,28,82,33"},
-"+[]=:2:0":1,
-Ay:function(a,b){b.aN(b,new B.zT(this))},
-to:function(a,b){var z,y,x,w,v
-z=this.oD
-y=z.gB(z)
-x=z.to(a,b)
-w=this.jH
-if(w!=null){v=w.iE
-w=v==null?w!=null:v!==w}else w=!1
-if(w&&y!==z.gB(z)){B.iY(this,C.Wn,y,z.gB(z))
-z=new B.HA(a,null,x,!0,!1)
-H.VM(z,[null,null])
-this.SZ(this,z)}return x},
-Rz:function(a,b){var z,y,x,w,v
-z=this.oD
-y=z.gB(z)
-x=z.Rz(z,b)
-w=this.jH
-if(w!=null){v=w.iE
-w=v==null?w!=null:v!==w}else w=!1
-if(w&&y!==z.gB(z)){w=new B.HA(b,x,null,!1,!0)
-H.VM(w,[null,null])
-this.SZ(this,w)
-B.iY(this,C.Wn,y,z.gB(z))}return x},
-aN:function(a,b){var z=this.oD
-return z.aN(z,b)},
-bu:function(a){return P.vW(this)},
-$asZ0:null,
-$isZ0:true,
-static:{WF:function(a,b,c){var z=B.jR(a,b,c)
-z.Ay(z,a)
-return z},jR:function(a,b,c){var z,y,x
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isBa){z=b
-y=c
-x=new B.br(P.GV(null,null,z,y),null,null)
-H.VM(x,[z,y])}else if(typeof a==="object"&&a!==null&&!!z.$isFo){z=b
-y=c
-x=new B.br(P.L5(null,null,null,z,y),null,null)
-H.VM(x,[z,y])}else{z=b
-y=c
-x=new B.br(P.Py(null,null,null,z,y),null,null)
-H.VM(x,[z,y])}return x}}},zT:{"":"Tp;a",
-call$2:function(a,b){var z=this.a
-z.u(z,a,b)},
-"+call:2:0":0,
-$isEH:true,
-$is_bh:true},WR:{"":"Pi;ay>,TX,oL,MU,Hq,jH,Wd",
-gP:function(a){var z,y
-if(!this.TX)return
-z=this.jH
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)this.VX()
-return C.Nm.grZ(this.MU)
-"35,33"},
-"+value":1,
-r6:function(a,b){return this.gP(a).call$1(b)},
-sP:function(a,b){var z,y,x,w
-z=this.oL
-y=z.length
-if(y===0)return
-x=this.jH
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(!x)this.VX()
-x=this.MU
-w=y-1
-if(w<0||w>=x.length)throw H.e(x,w)
-x=x[w]
-if(w>=z.length)throw H.e(z,w)
-if(B.h6(x,z[w],b)){z=this.MU
-if(y>=z.length)throw H.e(z,y)
-z[y]=b}"35,28,0,33"},
-"+value=":1,
-yw:function(a){var z=this.gqh(this).yI(new B.NG(this,a))
-a.call$1(this.gP(this))
-return z},
-hv:function(a){B.Pi.prototype.hv.call(this,this)
-this.VX()
-this.wY()},
-glR:function(a){return new H.MT(this,B.WR.prototype.hv,a,"hv")},
-a0:function(a){var z,y
-for(z=0;y=this.Hq,z<y.length;++z){y=y[z]
-if(y!=null){y.ed()
-y=this.Hq
-if(z>=y.length)throw H.e(y,z)
-y[z]=null}}},
-gwa:function(a){return new H.MT(this,B.WR.prototype.a0,a,"a0")},
-VX:function(){var z,y,x,w,v,u
-for(z=this.oL,y=0;y<z.length;y=w){x=this.MU
-w=y+1
-v=x.length
-if(y>=v)throw H.e(x,y)
-u=B.yf(x[y],z[y])
-if(w>=v)throw H.e(x,w)
-x[w]=u}},
-IW:function(a){var z,y,x,w,v,u,t
-for(z=this.oL,y=a,x=null,w=null;y<z.length;y=u){v=this.MU
-u=y+1
-t=v.length
-if(u<0||u>=t)throw H.e(v,u)
-x=v[u]
-if(y<0||y>=t)throw H.e(v,y)
-w=B.yf(v[y],z[y])
-if(x==null?w==null:x===w){this.hE(a,y)
-return}v=this.MU
-if(u>=v.length)throw H.e(v,u)
-v[u]=w}this.Kk(a)
-if(this.gUV(this)&&!J.xC(x,w)){z=new B.qI(this,C.ls,x,w)
-z.$builtinTypeInfo=[null]
-this.SZ(this,z)}},
-hE:function(a,b){var z,y
-if(b==null)b=this.oL.length
-if(typeof b!=="number")throw H.s(b)
-z=a
-for(;z<b;++z){y=this.Hq
-if(z<0||z>=y.length)throw H.e(y,z)
-y=y[z]
-if(y!=null)y.ed()
-this.Dg(z)}},
-wY:function(){return this.hE(0,null)},
-Kk:function(a){return this.hE(a,null)},
-Dg:function(a){var z,y,x,w,v,u
-z=this.MU
-if(a<0||a>=z.length)throw H.e(z,a)
-y=z[a]
-z=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!z.$iswn){x=this.Hq
-w=z.gqh(y).w4(!1)
-w.dB=$.X3.cR(new B.C4(this,a,y))
-v=P.AY
-w.o7=P.VH(v,$.X3)
-u=P.No
-w.Bd=$.X3.Al(u)
-if(a>=x.length)throw H.e(x,a)
-x[a]=w}},
-Wr:function(a,b){var z,y,x,w
-if(this.TX)for(z=J.rr(b).split("."),y=new H.wi(z,z.length,0,null),H.VM(y,[H.ip(z,"Q",0)]),z=this.oL;y.G();){x=y.M4
-if(J.xC(x,""))continue
-w=H.BU(x,10,new B.qL())
-z.push(w!=null?w:new H.GD(H.bK(x)))}z=this.oL
-y=P.A(z.length+1,P.a)
-H.VM(y,[P.a])
-this.MU=y
-y=this.MU
-if(0>=y.length)throw H.e(y,0)
-y[0]=a
-z=P.A(z.length,P.MO)
-H.VM(z,[P.MO])
-this.Hq=z},
-$isWR:true,
-static:{ao:function(a,b){var z=new B.WR(b,B.rd(b),[],null,null,null,null)
-z.Wr(a,b)
-return z}}},qL:{"":"Tp;",
-call$1:function(a){return},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},NG:{"":"Tp;a,b",
-call$1:function(a){var z=this.a
-this.b.call$1(z.gP(z))},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},C4:{"":"Tp;a,b,c",
-call$1:function(a){var z,y,x,w,v
-z=this.a
-y=z.MU
-x=this.b
-if(x<0||x>=y.length)throw H.e(y,x)
-if(y[x]!==this.c)return
-for(y=J.GP(a),w=z.oL;y.G();){v=y.gl()
-if(x>=w.length)throw H.e(w,x)
-if(B.Wa(v,w[x])){z.IW(x)
-return}}},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},Kt:{"":"Tp;",
-call$1:function(a){var z,y
-z=a
-y=J.x(z)
-if(typeof z!=="object"||z===null||!y.$isRY){z=a
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isRS&&a.glT()}else z=!0
-return z},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},hh:{"":"Tp;",
-call$1:function(a){var z,y
-z=a
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isRY},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},Md:{"":"Tp;",
-call$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)},
-"+call:0:0":0,
-$isEH:true,
-$is_X0:true},km:{"":"Tp;a",
-call$2:function(a,b){var z=this.a
-z.u(z,B.tB(a),B.tB(b))},
-"+call:2:0":0,
-$isEH:true,
-$is_bh:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{kw:function(a){if($.tW==null)$.tW=[]
-$.tW.push(a)
-$.el=$.el+1},Y3:function(){var z,y,x,w,v,u,t,s,r
+$is_Dv:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{Y3:function(){var z,y,x,w,v,u,t,s,r
 if($.Td)return
 if($.tW==null)return
 $.Td=!0
@@ -17731,27 +16195,29 @@
 do{++z
 if(z===1000)y=[]
 x=$.tW
-$.tW=[]
+w=[]
+w.$builtinTypeInfo=[F.d3]
+$.tW=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
-s=t.jH
+s=t.R9
 s=s.iE!==s
 if(s){if(t.BN(t)){if(w)y.push([u,t])
 v=!0}$.tW.push(t)}}}while(z<1000&&v)
-if(w&&v){$.aT().j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(y.toString,w=new H.wi(y,y.length,0,null),H.VM(w,[H.ip(y,"Q",0)]);w.G();){r=w.M4
+if(w&&v){$.iU().A3("Possible loop in Observable.dirtyCheck, stopped checking.")
+for(y.toString,w=new H.a7(y,y.length,0,null),H.VM(w,[H.W8(y,"Q",0)]);w.G();){r=w.mD
 s=J.U6(r)
-$.aT().j2("In last iteration Observable changed at index "+H.d(s.t(r,0))+", object: "+H.d(s.t(r,1))+".")}}$.el=$.tW.length
+$.iU().A3("In last iteration Observable changed at index "+H.d(s.t(r,0))+", object: "+H.d(s.t(r,1))+".")}}$.el=$.tW.length
 $.Td=!1},Ht:function(){var z={}
 z.a=!1
 z=new O.o5(z)
-return new P.yQ(null,null,null,null,new O.zI(z),new O.bF(z),null,null,null,null,null,null,null)},o5:{"":"Tp;a",
+return new P.wJ(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},o5:{"":"Tp;a",
 call$2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.jB(z))},
+a.RK(b,new O.b5(z))},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},jB:{"":"Tp;a",
+$is_bh:true},b5:{"":"Tp;a",
 call$0:function(){this.a.a=!1
 O.Y3()},
 "+call:0:0":0,
@@ -17765,7 +16231,7 @@
 return this.f.call$0()},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},bF:{"":"Tp;g",
+$is_X0:true},id:{"":"Tp;g",
 call$4:function(a,b,c,d){if(d==null)return d
 return new O.iV(this.g,b,c,d)},
 "+call:4:0":0,
@@ -17775,33 +16241,727 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true}}],["path","package:path/path.dart",,B,{ab:function(){var z,y
-z=$.Cm().gvU()
+$is_Dv: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
+z=J.WB(J.xH(f,e),1)
+y=J.WB(J.xH(c,b),1)
+x=P.A(z,null)
+if(typeof z!=="number")throw H.s(z)
+w=x.length
+v=0
+for(;v<z;++v){u=P.A(y,null)
+if(v>=w)throw H.e(x,v)
+x[v]=u
+u=x[v]
+if(0>=u.length)throw H.e(u,0)
+u[0]=v}if(typeof y!=="number")throw H.s(y)
+t=0
+for(;t<y;++t){if(0>=w)throw H.e(x,0)
+u=x[0]
+if(t>=u.length)throw H.e(u,t)
+u[t]=t}for(u=J.U6(d),s=J.Qc(b),r=J.U6(a),v=1;v<z;++v)for(q=v-1,p=e+v-1,t=1;t<y;++t){o=J.xC(u.t(d,p),r.t(a,J.xH(s.g(b,t),1)))
+n=x[q]
+m=t-1
+if(o){if(v>=w)throw H.e(x,v)
+o=x[v]
+if(q>=w)throw H.e(x,q)
+if(m>=n.length)throw H.e(n,m)
+m=n[m]
+if(t>=o.length)throw H.e(o,t)
+o[t]=m}else{if(q>=w)throw H.e(x,q)
+if(t>=n.length)throw H.e(n,t)
+l=J.WB(n[t],1)
+if(v>=w)throw H.e(x,v)
+o=x[v]
+if(m>=o.length)throw H.e(o,m)
+k=J.WB(o[m],1)
+m=x[v]
+o=P.J(l,k)
+if(t>=m.length)throw H.e(m,t)
+m[t]=o}}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)throw H.e(a,0)
+x=a[0].length-1
+if(y<0)throw H.e(a,y)
+w=a[y]
+if(x<0||x>=w.length)throw H.e(w,x)
+v=w[x]
+u=[]
+while(!0){if(!(y>0||x>0))break
+c$0:{if(y===0){u.push(2);--x
+break c$0}if(x===0){u.push(3);--y
+break c$0}w=y-1
+if(w<0)throw H.e(a,w)
+t=a[w]
+s=x-1
+r=t.length
+if(s<0||s>=r)throw H.e(t,s)
+q=t[s]
+if(x<0||x>=r)throw H.e(t,x)
+p=t[x]
+if(y<0)throw H.e(a,y)
+t=a[y]
+if(s>=t.length)throw H.e(t,s)
+o=t[s]
+n=P.J(P.J(p,o),q)
+if(n===q){if(J.xC(q,v))u.push(0)
+else{u.push(1)
+v=q}x=s
+y=w}else if(n===p){u.push(3)
+v=p
+y=w}else{u.push(2)
+v=o
+x=s}}}z=new H.iK(u)
+H.VM(z,[null])
+return z.br(z)},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.xC(z.t(a,x),y.t(b,x)))return x
+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)
+w=x.gB(b)
+v=0
+while(!0){if(v<c){y=J.xH(y,1)
+u=z.t(a,y)
+w=J.xH(w,1)
+u=J.xC(u,x.t(b,w))}else u=!1
+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))
+w=J.x(b)
+v=w.n(b,0)&&e===0?G.rB(a,d,x):0
+u=z.n(c,J.q8(a))&&y.n(f,J.q8(d))?G.xU(a,d,x-v):0
+b=w.g(b,v)
+e+=v
+c=z.W(c,u)
+f=y.W(f,u)
+z=J.Wx(c)
+if(J.xC(z.W(c,b),0)&&J.xC(J.xH(f,e),0))return C.xD
+if(J.xC(b,c)){t=[]
+z=new P.Yp(t)
+z.$builtinTypeInfo=[null]
+s=new G.W4(a,z,t,b,0)
+if(typeof f!=="number")throw H.s(f)
+z=J.U6(d)
+for(;e<f;e=r){r=e+1
+s.Il.push(z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
+t=[]
+y=new P.Yp(t)
+y.$builtinTypeInfo=[null]
+return[new G.W4(a,y,t,b,z)]}q=G.Mw(G.f6(a,b,c,d,e,f))
+p=[]
+p.$builtinTypeInfo=[G.W4]
+for(z=J.U6(d),o=e,n=b,s=null,m=0;m<q.length;++m)switch(q[m]){case 0:if(s!=null){p.push(s)
+s=null}n=J.WB(n,1);++o
+break
+case 1:if(s==null){t=[]
+y=new P.Yp(t)
+y.$builtinTypeInfo=[null]
+s=new G.W4(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
+n=J.WB(n,1)
+s.Il.push(z.t(d,o));++o
+break
+case 2:if(s==null){t=[]
+y=new P.Yp(t)
+y.$builtinTypeInfo=[null]
+s=new G.W4(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
+n=J.WB(n,1)
+break
+case 3:if(s==null){t=[]
+y=new P.Yp(t)
+y.$builtinTypeInfo=[null]
+s=new G.W4(a,y,t,n,0)}s.Il.push(z.t(d,o));++o
+break
+default:}if(s!=null)p.push(s)
+return p},m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+z=b.gWA()
+y=J.zj(b)
+x=b.gIl()
+x.toString
+w=H.Y9(x.$asQ,H.oX(x))
+v=w==null?null:w[0]
+v=P.F(x,!0,v)
+u=b.gNg()
+if(u==null)u=0
+x=new P.Yp(v)
+x.$builtinTypeInfo=[null]
+t=new G.W4(z,x,v,y,u)
+for(s=!1,r=0,q=0;z=a.length,q<z;++q){if(q<0)throw H.e(a,q)
+p=a[q]
+p.jr=J.WB(p.jr,r)
+if(s)continue
+z=t.jr
+y=J.WB(z,J.q8(t.Uj.G4))
+x=p.jr
+o=P.J(y,J.WB(x,p.dM))-P.y(z,x)
+if(o>=0){C.Nm.W4(a,q);--q
+z=J.xH(p.dM,J.q8(p.Uj.G4))
+if(typeof z!=="number")throw H.s(z)
+r-=z
+t.dM=J.WB(t.dM,J.xH(p.dM,o))
+n=J.xH(J.WB(J.q8(t.Uj.G4),J.q8(p.Uj.G4)),o)
+if(J.xC(t.dM,0)&&J.xC(n,0))s=!0
+else{m=p.Il
+if(J.u6(t.jr,p.jr)){z=t.Uj
+z=z.Mu(z,0,J.xH(p.jr,t.jr))
+m.toString
+if(typeof m!=="object"||m===null||!!m.fixed$length)H.vh(P.f("insertAll"))
+H.IC(m,0,z)}if(J.xZ(J.WB(t.jr,J.q8(t.Uj.G4)),J.WB(p.jr,p.dM))){z=t.Uj
+J.DB(m,z.Mu(z,J.xH(J.WB(p.jr,p.dM),t.jr),J.q8(t.Uj.G4)))}t.Il=m
+t.Uj=p.Uj
+if(J.u6(p.jr,t.jr))t.jr=p.jr
+s=!1}}else if(J.u6(t.jr,p.jr)){C.Nm.xe(a,q,t);++q
+l=J.xH(t.dM,J.q8(t.Uj.G4))
+p.jr=J.WB(p.jr,l)
+if(typeof l!=="number")throw H.s(l)
+r+=l
+s=!0}else s=!1}if(!s)a.push(t)},xl:function(a,b){var z,y
+z=[]
+H.VM(z,[G.W4])
+for(y=new H.a7(b,b.length,0,null),H.VM(y,[H.W8(b,"Q",0)]);y.G();)G.m1(z,y.mD)
+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),x=new H.a7(y,y.length,0,null),H.VM(x,[H.W8(y,"Q",0)]),y=a.h3;x.G();){w=x.mD
+if(J.xC(w.gNg(),1)&&J.xC(J.q8(w.gRt().G4),1)){v=J.i4(w.gRt().G4,0)
+u=J.zj(w)
+if(u>>>0!==u||u>=y.length)throw H.e(y,u)
+if(!J.xC(v,y[u]))z.push(w)
+continue}v=J.RE(w)
+C.Nm.Ay(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},W4:{"":"a;WA<,Uj,Il<,jr,dM",
+gvH:function(a){return this.jr},
+"+index":0,
+gRt:function(){return this.Uj},
+gNg:function(){return this.dM},
+ck:function(a){var z=this.jr
+if(typeof z!=="number")throw H.s(z)
+z=a<z
+if(z)return!1
+if(!J.xC(this.dM,J.q8(this.Uj.G4)))return!0
+z=J.WB(this.jr,this.dM)
+if(typeof z!=="number")throw H.s(z)
+return a<z},
+bu:function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.Uj)+", addedCount: "+H.d(this.dM)+">"},
+$isW4:true,
+static:{XM:function(a,b,c,d){var z
+if(d==null)d=[]
+if(c==null)c=0
+z=new P.Yp(d)
+z.$builtinTypeInfo=[null]
+return new G.W4(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{Fa:{"":"a;"},ma:{"":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{Wi:function(a,b,c,d){var z,y
+z=J.RE(a)
+if(z.gUV(a)&&!J.xC(c,d)){y=new T.qI(a,b,c,d)
+H.VM(y,[null])
+z.SZ(a,y)}return d},d3:{"":"a;",$isd3:true},X6:{"":"Tp;a,b",
+call$2:function(a,b){var z,y,x,w
+z=this.b
+y=z.p6.rN(a).Ax
+if(!J.xC(b,y)){x=this.a
+if(x.a==null)x.a=[]
+x=x.a
+w=new T.qI(z,a,b,y)
+H.VM(w,[null])
+x.push(w)
+z=z.V2
+z.u(z,a,y)}},
+"+call:2:0":0,
+$isEH:true,
+$is_bh:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{xh:{"":"Pi;",
+gP:function(a){return this.L1
+"94,33"},
+"+value":1,
+r6:function(a,b){return this.gP(a).call$1(b)},
+sP:function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)
+"35,95,94,33"},
+"+value=":1,
+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,{wn:{"":"uF;b3,xg,h3,VJ,Ai",
+gRT:function(){var z,y
+if(this.xg==null)this.xg=P.bK(new Q.cj(this),null,!0,null)
+z=this.xg
+z.toString
+y=new P.Ik(z)
+H.VM(y,[H.W8(z,"WV",0)])
+return y},
+gB:function(a){return this.h3.length
+"27,33"},
+"+length":1,
+sB:function(a,b){var z,y,x,w,v,u,t
+z=this.h3
+y=z.length
+if(y===b)return
+this.pD(this,C.Wn,y,b)
+x=this.xg
+if(x!=null){w=x.iE
+x=w==null?x!=null:w!==x}else x=!1
+if(x){x=J.Wx(b)
+if(x.C(b,y)){if(x.C(b,0)||x.D(b,z.length))H.vh(P.TE(b,0,z.length))
+if(typeof b!=="number")throw H.s(b)
+if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
+x=new H.nH(z,b,y)
+x.$builtinTypeInfo=[null]
+w=x.Bz
+v=J.Wx(w)
+if(v.C(w,0))H.vh(new P.bJ("value "+H.d(w)))
+u=x.n1
+if(u!=null){if(J.u6(u,0))H.vh(new P.bJ("value "+H.d(u)))
+if(v.D(w,u))H.vh(P.TE(w,0,u))}x=x.br(x)
+w=new P.Yp(x)
+w.$builtinTypeInfo=[null]
+this.iH(new G.W4(this,w,x,b,0))}else{x=x.W(b,y)
+t=[]
+w=new P.Yp(t)
+w.$builtinTypeInfo=[null]
+this.iH(new G.W4(this,w,t,y,x))}}C.Nm.sB(z,b)
+"35,28,27,33"},
+"+length=":1,
+t:function(a,b){var z=this.h3
+if(b>>>0!==b||b>=z.length)throw H.e(z,b)
+return z[b]
+"96,26,27,33"},
+"+[]:1:0":1,
+u:function(a,b,c){var z,y,x,w
+z=this.h3
+if(b>>>0!==b||b>=z.length)throw H.e(z,b)
+y=z[b]
+x=this.xg
+if(x!=null){w=x.iE
+x=w==null?x!=null:w!==x}else x=!1
+if(x){x=[y]
+w=new P.Yp(x)
+w.$builtinTypeInfo=[null]
+this.iH(new G.W4(this,w,x,b,1))}if(b>=z.length)throw H.e(z,b)
+z[b]=c
+"35,26,27,28,96,33"},
+"+[]=:2:0":1,
+h:function(a,b){var z,y,x,w
+z=this.h3
+y=z.length
+this.pD(this,C.Wn,y,y+1)
+x=this.xg
+if(x!=null){w=x.iE
+x=w==null?x!=null:w!==x}else x=!1
+if(x)this.iH(G.XM(this,y,1,null))
+C.Nm.h(z,b)},
+Ay:function(a,b){var z,y,x,w
+z=this.h3
+y=z.length
+C.Nm.Ay(z,b)
+this.pD(this,C.Wn,y,z.length)
+x=z.length-y
+z=this.xg
+if(z!=null){w=z.iE
+z=w==null?z!=null:w!==z}else z=!1
+if(z&&x>0)this.iH(G.XM(this,y,x,null))},
+Rz:function(a,b){var z,y
+for(z=this.h3,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(this,y,y+1)
+return!0}return!1},
+UZ:function(a,b,c){var z,y,x,w,v,u,t
+z=b>=0
+if(b<0||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
+y=c>=b
+if(c<b||c>this.h3.length)H.vh(P.TE(c,b,this.h3.length))
+x=c-b
+w=this.h3
+v=w.length
+this.pD(this,C.Wn,v,v-x)
+u=this.xg
+if(u!=null){t=u.iE
+u=t==null?u!=null:t!==u}else u=!1
+if(u&&x>0){if(b<0||b>w.length)H.vh(P.TE(b,0,w.length))
+if(c<b||c>w.length)H.vh(P.TE(c,b,w.length))
+z=new H.nH(w,b,c)
+z.$builtinTypeInfo=[null]
+y=z.Bz
+u=J.Wx(y)
+if(u.C(y,0))H.vh(new P.bJ("value "+H.d(y)))
+t=z.n1
+if(t!=null){if(J.u6(t,0))H.vh(new P.bJ("value "+H.d(t)))
+if(u.D(y,t))H.vh(P.TE(y,0,t))}z=z.br(z)
+y=new P.Yp(z)
+y.$builtinTypeInfo=[null]
+this.iH(new G.W4(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+iH:function(a){var z,y
+z=this.xg
+if(z!=null){y=z.iE
+z=y==null?z!=null:y!==z}else z=!1
+if(!z)return
+if(this.b3==null){this.b3=[]
+P.rb(this.gL6())}this.b3.push(a)},
+oC:function(){var z,y,x
+z=this.b3
+if(z==null)return!1
+y=G.u2(this,z)
+this.b3=null
+z=this.xg
+if(z!=null){x=z.iE
+x=x==null?z!=null:x!==z}else x=!1
+if(x){x=new P.Yp(y)
+H.VM(x,[G.W4])
+if(z.Gv>=4)H.vh(z.q7())
+z.Iv(x)
+return!0}return!1},
+gL6:function(){return new P.Ip(this,Q.wn.prototype.oC,null,"oC")},
+$iswn:true,
+$asWO:null,
+$ascX:null,
+static:{uX:function(a,b){var z=[]
+H.VM(z,[b])
+z=new Q.wn(null,null,z,null,null)
+H.VM(z,[b])
+return z}}},uF:{"":"ar+Pi;",$asar:null,$asWO:null,$ascX:null,$isd3:true},cj:{"":"Tp;a",
+call$0:function(){this.a.xg=null},
+"+call:0:0":0,
+$isEH:true,
+$is_X0:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{HA:{"":"yj;G3>,jL>,zZ>,JD,dr",
+bu:function(a){var z
+if(this.JD)z="insert"
+else z=this.dr?"remove":"set"
+return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
+$isHA:true},br:{"":"Pi;Zp,VJ,Ai",
+gvc:function(a){var z=this.Zp
+return z.gvc(z)
+"97,33"},
+"+keys":1,
+gUQ:function(a){var z=this.Zp
+return z.gUQ(z)
+"98,33"},
+"+values":1,
+gB:function(a){var z=this.Zp
+return z.gB(z)
+"27,33"},
+"+length":1,
+gl0:function(a){var z=this.Zp
+return z.gB(z)===0
+"39,33"},
+"+isEmpty":1,
+gor:function(a){var z=this.Zp
+return z.gB(z)!==0
+"39,33"},
+"+isNotEmpty":1,
+PF:function(a){return this.Zp.PF(a)
+"39,28,0,33"},
+"+containsValue:1:0":1,
+x4:function(a){return this.Zp.x4(a)
+"39,73,0,33"},
+"+containsKey:1:0":1,
+t:function(a,b){var z=this.Zp
+return z.t(z,b)
+"99,73,0,33"},
+"+[]:1:0":1,
+u:function(a,b,c){var z,y,x,w,v
+z=this.Zp
+y=z.gB(z)
+x=z.t(z,b)
+z.u(z,b,c)
+w=this.VJ
+if(w!=null){v=w.iE
+w=v==null?w!=null:v!==w}else w=!1
+if(w)if(y!==z.gB(z)){z=z.gB(z)
+if(this.gUV(this)&&y!==z){z=new T.qI(this,C.Wn,y,z)
+z.$builtinTypeInfo=[null]
+this.SZ(this,z)}z=new V.HA(b,null,c,!0,!1)
+z.$builtinTypeInfo=[null,null]
+this.SZ(this,z)}else if(!J.xC(x,c)){z=new V.HA(b,x,c,!1,!1)
+z.$builtinTypeInfo=[null,null]
+this.SZ(this,z)}"35,73,100,28,99,33"},
+"+[]=:2:0":1,
+Ay:function(a,b){b.aN(b,new V.zT(this))},
+Rz:function(a,b){var z,y,x,w,v
+z=this.Zp
+y=z.gB(z)
+x=z.Rz(z,b)
+w=this.VJ
+if(w!=null){v=w.iE
+w=v==null?w!=null:v!==w}else w=!1
+if(w&&y!==z.gB(z)){w=new V.HA(b,x,null,!1,!0)
+H.VM(w,[null,null])
+this.SZ(this,w)
+F.Wi(this,C.Wn,y,z.gB(z))}return x},
+aN:function(a,b){var z=this.Zp
+return z.aN(z,b)},
+bu:function(a){return P.vW(this)},
+$asL8:null,
+$isL8:true,
+static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
+z.Ay(z,a)
+return z},Bq:function(a,b,c){var z,y,x
+z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isBa){z=b
+y=c
+x=new V.br(P.GV(null,null,z,y),null,null)
+H.VM(x,[z,y])}else if(typeof a==="object"&&a!==null&&!!z.$isFo){z=b
+y=c
+x=new V.br(P.L5(null,null,null,z,y),null,null)
+H.VM(x,[z,y])}else{z=b
+y=c
+x=new V.br(P.Py(null,null,null,z,y),null,null)
+H.VM(x,[z,y])}return x}}},zT:{"":"Tp;a",
+call$2:function(a,b){var z=this.a
+z.u(z,a,b)},
+"+call:2:0":0,
+$isEH:true,
+$is_bh:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{Wa:function(a,b){var z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.xC(a.oc,b)
+if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
+if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.ghr(b)
+return J.xC(a.G3,b)}return!1},yf:function(a,b){var z,y,x,w,v,u,t
+if(a==null)return
+x=b
+if(typeof x==="number"&&Math.floor(x)===x){x=a
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{x=b
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+v=J.bB(z.gAx()).IE
+x=$.Sl()
+u=x.t(x,v)
+y=H.tT(H.YC(u==null?v:u),v)
+try{if(L.My(y,b)){x=b
+x=z.tu(x,1,J.Z0(x),[])
+return x.Ax}if(L.iN(y,C.fz)){x=J.UQ(a,J.Z0(b))
+return x}}catch(t){x=H.Ru(t)
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.iN(y,C.OV))throw t}else throw t}}}if($.aT().mL(C.VZ))$.aT().x9("can't get "+H.d(b)+" in "+H.d(a))
+return},h6:function(a,b,c){var z,y,x,w,v
+if(a==null)return!1
+x=b
+if(typeof x==="number"&&Math.floor(x)===x){x=a
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+return!0}}else{x=b
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+y=H.jO(J.bB(z.gAx()).IE)
+try{if(L.hg(y,b)){z.PU(b,c)
+return!0}if(L.iN(y,C.eC)){J.kW(a,J.Z0(b),c)
+return!0}}catch(v){x=H.Ru(v)
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.iN(y,C.OV))throw v}else throw v}}}if($.aT().mL(C.VZ))$.aT().x9("can't set "+H.d(b)+" in "+H.d(a))
+return!1},My:function(a,b){var z
+for(;!J.xC(a,$.aA());){z=a.gYK()
+if(z.x4(b)===!0)return!0
+if(z.x4(C.OV)===!0)return!0
+a=L.pY(a)}return!1},hg:function(a,b){var z,y,x,w
+z=new H.GD(H.le(H.d(b.ghr(b))+"="))
+for(;!J.xC(a,$.aA());){y=a.gYK()
+x=J.UQ(y,b)
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&!!w.$isRY)return!0
+if(y.x4(z)===!0)return!0
+if(y.x4(C.OV)===!0)return!0
+a=L.pY(a)}return!1},iN:function(a,b){var z,y
+for(;!J.xC(a,$.aA());){z=J.UQ(a.gYK(),b)
+y=J.x(z)
+if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
+a=L.pY(a)}return!1},pY:function(a){var z,y,x
+try{z=a.gAY()
+return z}catch(y){z=H.Ru(y)
+x=J.x(z)
+if(typeof z==="object"&&z!==null&&!!x.$isub)return $.aA()
+else throw y}},rd:function(a){a=J.JA(a,$.c3(),"")
+if(a==="")return!0
+if(0>=a.length)throw H.e(a,0)
+if(a[0]===".")return!1
+return $.tN().zD(a)},D7:{"":"Pi;Ii>,YB,BK,kN,cs,cT,VJ,Ai",
+E4:function(a){return this.cT.call$1(a)},
+gWA:function(){var z=this.kN
+if(0>=z.length)throw H.e(z,0)
+return z[0]},
+gP:function(a){var z,y
+if(!this.YB)return
+z=this.VJ
+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)
+"35,33"},
+"+value":1,
+r6:function(a,b){return this.gP(a).call$1(b)},
+sP:function(a,b){var z,y,x,w
+z=this.BK
+y=z.length
+if(y===0)return
+x=this.VJ
+if(x!=null){w=x.iE
+x=w==null?x!=null:w!==x}else x=!1
+if(!x)this.Zy(y-1)
+x=this.kN
+w=y-1
+if(w<0||w>=x.length)throw H.e(x,w)
+x=x[w]
+if(w>=z.length)throw H.e(z,w)
+if(L.h6(x,z[w],b)){z=this.kN
+if(y>=z.length)throw H.e(z,y)
+z[y]=b}"35,95,0,33"},
+"+value=":1,
+w3:function(a){O.Pi.prototype.w3.call(this,this)
+this.ov()
+this.XI()},
+gqw:function(a){return new H.YP(this,L.D7.prototype.w3,a,"w3")},
+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)throw H.e(y,z)
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},
+gl1:function(a){return new H.YP(this,L.D7.prototype.ni,a,"ni")},
+Zy:function(a){var z,y,x,w,v,u
+if(a==null)a=this.BK.length
+z=this.BK
+y=z.length-1
+if(typeof a!=="number")throw H.s(a)
+x=this.cT!=null
+w=0
+for(;w<a;){v=this.kN
+if(w>=v.length)throw H.e(v,w)
+v=v[w]
+if(w>=z.length)throw H.e(z,w)
+u=L.yf(v,z[w])
+if(w===y&&x)u=this.E4(u)
+v=this.kN;++w
+if(w>=v.length)throw H.e(v,w)
+v[w]=u}},
+ov:function(){return this.Zy(null)},
+hd:function(a){var z,y,x,w,v,u,t,s,r
+for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
+s=w+1
+r=t.length
+if(s<0||s>=r)throw H.e(t,s)
+v=t[s]
+if(w<0||w>=r)throw H.e(t,w)
+t=t[w]
+if(w>=z.length)throw H.e(z,w)
+u=L.yf(t,z[w])
+if(w===y&&x)u=this.E4(u)
+if(v==null?u==null:v===u){this.Rl(a,w)
+return}t=this.kN
+if(s>=t.length)throw H.e(t,s)
+t[s]=u}this.ij(a)
+if(this.gUV(this)&&!J.xC(v,u)){z=new T.qI(this,C.ls,v,u)
+z.$builtinTypeInfo=[null]
+this.SZ(this,z)}},
+Rl:function(a,b){var z,y
+if(b==null)b=this.BK.length
+if(typeof b!=="number")throw H.s(b)
+z=a
+for(;z<b;++z){y=this.cs
+if(z<0||z>=y.length)throw H.e(y,z)
+y=y[z]
+if(y!=null)y.ed()
+this.Kh(z)}},
+XI:function(){return this.Rl(0,null)},
+ij:function(a){return this.Rl(a,null)},
+Kh:function(a){var z,y,x,w,v,u,t
+z=this.kN
+if(a<0||a>=z.length)throw H.e(z,a)
+y=z[a]
+z=this.BK
+if(a>=z.length)throw H.e(z,a)
+x=z[a]
+if(typeof x==="number"&&Math.floor(x)===x){z=J.x(y)
+if(typeof y==="object"&&y!==null&&!!z.$iswn){z=this.cs
+w=y.gRT().w4(!1)
+w.dB=$.X3.cR(new L.C4(this,a,x))
+v=P.AY
+w.o7=P.VH(v,$.X3)
+u=P.No
+w.Bd=$.X3.Al(u)
+if(a>=z.length)throw H.e(z,a)
+z[a]=w}}else{z=J.RE(y)
+if(typeof y==="object"&&y!==null&&!!z.$isd3){t=this.cs
+w=z.gqh(y).w4(!1)
+w.dB=$.X3.cR(new L.l9(this,a,x))
+v=P.AY
+w.o7=P.VH(v,$.X3)
+u=P.No
+w.Bd=$.X3.Al(u)
+if(a>=t.length)throw H.e(t,a)
+t[a]=w}}},
+d4:function(a,b,c){var z,y,x,w
+if(this.YB)for(z=J.rr(b).split("."),y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]),z=this.BK;y.G();){x=y.mD
+if(J.xC(x,""))continue
+w=H.BU(x,10,new L.qL())
+z.push(w!=null?w:new H.GD(H.le(x)))}z=this.BK
+y=P.A(z.length+1,P.a)
+H.VM(y,[P.a])
+this.kN=y
+if(z.length===0&&c!=null)a=c.call$1(a)
+y=this.kN
+if(0>=y.length)throw H.e(y,0)
+y[0]=a
+z=P.A(z.length,P.MO)
+H.VM(z,[P.MO])
+this.cs=z},
+$isD7:true,
+static:{ao:function(a,b,c){var z,y
+z=L.rd(b)
+y=[]
+H.VM(y,[P.a])
+y=new L.D7(b,z,y,null,null,c,null,null)
+y.d4(a,b,c)
+return y}}},qL:{"":"Tp;",
+call$1:function(a){return},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},C4:{"":"Tp;a,b,c",
+call$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}},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},l9:{"":"Tp;d,e,f",
+call$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}},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},lP:{"":"Tp;",
+call$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)},
+"+call:0:0":0,
+$isEH:true,
+$is_X0:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{Jk:function(a){var z,y,x
+z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
+if(typeof a==="object"&&a!==null&&!!z.$isL8){y=V.Bq(a,null,null)
+z.aN(a,new R.km(y))
+return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)){z=z.ez(a,R.np)
+x=Q.uX(null,null)
+x.Ay(x,z)
+return x}return a},km:{"":"Tp;a",
+call$2:function(a,b){var z=this.a
+z.u(z,R.Jk(a),R.Jk(b))},
+"+call:2:0":0,
+$isEH:true,
+$is_bh:true}}],["path","package:path/path.dart",,B,{ab:function(){var z,y
+z=$.At().gvU()
 y=P.r6($.cO().ej("dart:io"))
 z=z.nb
-if(z.t(z,y)!=null){z=$.Cm().gvU()
+if(z.t(z,y)!=null){z=$.At().gvU()
 y=P.r6($.cO().ej("dart:io"))
 z=z.nb
-y=J.pP(z.t(z,y))
-return J.mX(y.t(y,C.A5).rN(C.Je).Ax)}else{z=$.Cm().gvU()
+return J.AF(H.Go(J.UQ(z.t(z,y).gYK(),C.A5),"$isMs").rN(C.Je).Ax)}else{z=$.At().gvU()
 y=P.r6($.cO().ej("dart:html"))
 z=z.nb
-if(z.t(z,y)!=null){z=$.Cm().gvU()
+if(z.t(z,y)!=null){z=$.At().gvU()
 y=P.r6($.cO().ej("dart:html"))
 z=z.nb
-return J.CC(J.pN(z.t(z,y).rN(C.QK).Ax))}else return"."}},"+current":0,YF:function(a,b){var z,y,x,w,v,u,t,s
+return J.UW(J.UX(z.t(z,y).rN(C.QK).Ax))}else return"."}},"+current":0,YF:function(a,b){var z,y,x,w,v,u,t,s
 for(z=1;z<8;++z){if(b[z]==null||b[z-1]!=null)continue
 for(y=8;y>=1;y=x){x=y-1
 if(b[x]!=null)break}w=new P.Rn("")
 w.vM=""
 v=a+"("
 w.vM=w.vM+v
-v=new H.bX(b,0,y)
+v=new H.nH(b,0,y)
 v.$builtinTypeInfo=[null]
-u=v.aZ
+u=v.Bz
 t=J.Wx(u)
 if(t.C(u,0))H.vh(new P.bJ("value "+H.d(u)))
-s=v.r8
+s=v.n1
 if(s!=null){if(J.u6(s,0))H.vh(new P.bJ("value "+H.d(s)))
 if(t.D(u,s))H.vh(P.TE(u,0,s))}v=new H.A8(v,new B.Qt())
 v.$builtinTypeInfo=[null,null]
@@ -17810,29 +16970,27 @@
 v="): part "+(z-1)+" was null, but part "+z+" was not."
 w.vM=w.vM+v
 throw H.b(new P.AT(w.vM))}},Rh:function(){var z,y
-z=$.Cm().gvU()
+z=$.At().gvU()
 y=P.r6($.cO().ej("dart:io"))
 z=z.nb
 if(z.t(z,y)==null)return $.LT()
-z=$.Cm().gvU()
+z=$.At().gvU()
 y=P.r6($.cO().ej("dart:io"))
 z=z.nb
-y=J.pP(z.t(z,y))
-if(J.xC(y.t(y,C.pk).rN(C.Ws).Ax,"windows"))return $.CE()
+if(J.xC(H.Go(J.UQ(z.t(z,y).gYK(),C.pk),"$isMs").rN(C.Ws).Ax,"windows"))return $.CE()
 return $.IX()},Qt:{"":"Tp;",
 call$1:function(a){return a==null?"null":"\""+H.d(a)+"\""},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Dk:{"":"a;S,YK",
-gmI:function(){return this.S.gmI()},
+$is_Dv:true},Dk:{"":"a;S,SF",
 tM:function(a){var z,y,x
 z=this.G7(a)
 z.IV()
-y=z.yO
+y=z.dY
 x=y.length
-if(x===0){y=z.YK
-return y==null?".":y}if(x===1){y=z.YK
+if(x===0){y=z.SF
+return y==null?".":y}if(x===1){y=z.SF
 return y==null?".":y}C.Nm.mv(y)
 y=z.Yj
 if(0>=y.length)throw H.e(y,0)
@@ -17842,20 +17000,20 @@
 C8:function(a,b,c,d,e,f,g,h,i){var z,y
 z=[b,c,d,e,f,g,h,i]
 B.YF("join",z)
-y=new H.U5(z,new B.E5())
+y=new H.U5(z,new B.A0())
 H.VM(y,[null])
 return this.IP(y)},
 zV:function(a,b){return this.C8(a,b,null,null,null,null,null,null,null)},
 IP:function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=P.p9("")
-for(y=new H.U5(a,new B.rm()),H.VM(y,[H.ip(a,"mW",0)]),x=J.GP(y.V8),x=new H.SO(x,y.Wz),H.VM(x,[H.ip(y,"U5",0)]),y=this.S,w=x.N4,v=!1,u=!1;x.G();){t=w.gl()
-if(this.G7(t).aA&&u){s=this.G7(z.vM).YK
+for(y=new H.U5(a,new B.rm()),H.VM(y,[H.W8(a,"mW",0)]),x=J.GP(y.Kw),x=new H.SO(x,y.ew),H.VM(x,[H.W8(y,"U5",0)]),y=this.S,w=x.RX,v=!1,u=!1;x.G();){t=w.gl()
+if(this.G7(t).aA&&u){s=this.G7(z.vM).SF
 r=s==null?"":s
 z.vM=""
 q=typeof r==="string"?r:H.d(r)
 z.vM=z.vM+q
 q=typeof t==="string"?t:H.d(t)
-z.vM=z.vM+q}else if(this.G7(t).YK!=null){u=!this.G7(t).aA
+z.vM=z.vM+q}else if(this.G7(t).SF!=null){u=!this.G7(t).aA
 z.vM=""
 q=typeof t==="string"?t:H.d(t)
 z.vM=z.vM+q}else{p=J.U6(t)
@@ -17864,35 +17022,33 @@
 z.vM=z.vM+q}v=J.kE(t,y.gnK())}return z.vM},
 Fr:function(a,b){var z,y
 z=this.G7(b)
-y=new H.U5(z.yO,new B.eY())
+y=new H.U5(z.dY,new B.eY())
 H.VM(y,[null])
-z.yO=P.F(y,!0,H.ip(y,"mW",0))
-y=z.YK
-if(y!=null)C.Nm.kF(z.yO,0,y)
-return z.yO},
-J6:function(a,b,c,d,e,f,g){return this.C8(this,this.YK,a,b,c,d,e,f,g)},
-gjM:function(){return new B.jY(this,B.Dk.prototype.J6,null,"J6")},
+z.dY=P.F(y,!0,H.W8(y,"mW",0))
+y=z.SF
+if(y!=null)C.Nm.xe(z.dY,0,y)
+return z.dY},
 G7:function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=this.S
-y=z.xZ(a)
+y=z.dz(a)
 x=z.uP(a)
-if(y!=null)a=J.Z1(a,J.q8(y))
+if(y!=null)a=J.ZZ(a,J.q8(y))
 w=[]
 v=[]
 u=z.gDF()
 t=u.R4(u,a)
-if(t!=null){u=t.QK
+if(t!=null){u=t.oH
 if(0>=u.length)throw H.e(u,0)
 v.push(u[0])
 if(0>=u.length)throw H.e(u,0)
-a=J.Z1(a,J.q8(u[0]))}else v.push("")
+a=J.ZZ(a,J.q8(u[0]))}else v.push("")
 u=z.gDF()
 if(typeof a!=="string")H.vh(new P.AT(a))
 u=new H.KW(u,a)
-u=new H.Pb(u.Gf,u.rv,null)
+u=new H.Pb(u.td,u.BZ,null)
 s=J.U6(a)
 r=0
-for(;u.G();){q=u.Wh.QK
+for(;u.G();){q=u.Jz.oH
 w.push(s.JT(a,r,q.index))
 if(0>=q.length)throw H.e(q,0)
 v.push(q[0])
@@ -17903,10 +17059,10 @@
 r=p+q}u=s.gB(a)
 if(typeof u!=="number")throw H.s(u)
 if(r<u){w.push(s.yn(a,r))
-v.push("")}return new B.ib(z,y,x!=null,w,v)},
+v.push("")}return new B.q1(z,y,x!=null,w,v)},
 static:{mq:function(a,b){a=B.ab()
 b=$.vP()
-return new B.Dk(b,a)}}},E5:{"":"Tp;",
+return new B.Dk(b,a)}}},A0:{"":"Tp;",
 call$1:function(a){return a!=null},
 "+call:1:0":0,
 $isEH:true,
@@ -17921,9 +17077,9 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},MM:{"":"a;TL<",
-xZ:function(a){var z,y
-z=this.gAV()
+$is_Dv:true},OO:{"":"a;TL<",
+dz:function(a){var z,y
+z=this.gEw()
 if(typeof a!=="string")H.vh(new P.AT(a))
 y=new H.KW(z,a)
 if(!y.gl0(y))return J.UQ(y.gFV(y),0)
@@ -17936,24 +17092,24 @@
 y=new H.KW(z,a)
 if(!y.gA(y).G())return
 return J.UQ(y.gFV(y),0)},
-bu:function(a){return this.goc(this)}},BE:{"":"MM;oc>,mI<,DF<,nK<,AV<,TL"},Qb:{"":"MM;oc>,mI<,DF<,nK<,AV<,TL"},xI:{"":"MM;oc>,mI<,DF<,nK<,AV<,TL<,I9"},ib:{"":"a;S,YK,aA,yO,Yj",
+bu:function(a){return this.goc(this)}},BE:{"":"OO;oc>,mI<,DF<,nK<,Ew<,TL"},Qb:{"":"OO;oc>,mI<,DF<,nK<,Ew<,TL"},xI:{"":"OO;oc>,mI<,DF<,nK<,Ew<,TL<,qW"},q1:{"":"a;S,SF,aA,dY,Yj",
 IV:function(){var z,y
 z=this.Yj
-while(!0){y=this.yO
+while(!0){y=this.dY
 if(!(y.length!==0&&J.xC(C.Nm.grZ(y),"")))break
-C.Nm.mv(this.yO)
+C.Nm.mv(this.dY)
 if(0>=z.length)throw H.e(z,0)
 z.pop()}y=z.length
 if(y>0)z[y-1]=""},
 bu:function(a){var z,y,x,w,v
 z=P.p9("")
-y=this.YK
+y=this.SF
 if(y!=null)z.KF(y)
-for(y=this.Yj,x=0;x<this.yO.length;++x){if(x>=y.length)throw H.e(y,x)
+for(y=this.Yj,x=0;x<this.dY.length;++x){if(x>=y.length)throw H.e(y,x)
 w=y[x]
 w=typeof w==="string"?w:H.d(w)
 z.vM=z.vM+w
-v=this.yO
+v=this.dY
 if(x>=v.length)throw H.e(v,x)
 w=v[x]
 w=typeof w==="string"?w:H.d(w)
@@ -17965,63 +17121,62 @@
 y.insertBefore(z,y.firstChild)
 A.B2()
 $.mC().MM.ml(new A.Zj())},B2:function(){var z,y,x,w
-for(z=$.IN(),y=new H.wi(z,1,0,null),H.VM(y,[H.ip(z,"Q",0)]);y.G();){x=y.M4
-for(z=W.vD(document.querySelectorAll(x),null),z=z.gA(z);z.G();){w=J.pP(z.M4)
-w.h(w,"polymer-veiled")}}},nw:function(a){var z,y
+for(z=$.IN(),y=new H.a7(z,1,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G();){x=y.mD
+for(z=W.vD(document.querySelectorAll(x),null),z=z.gA(z);z.G();){w=J.pP(z.mD)
+w.h(w,"polymer-veiled")}}},yV:function(a){var z,y
 z=$.xY()
 y=z.Rz(z,a)
-if(y!=null)for(z=J.GP(y);z.G();)J.Or(z.gl())},dx:function(a,b,c){var z,y,x,w
-for(z=J.GP(J.hI(a.gZ3()));z.G();){y=z.gl()
-if(J.EM(y)===!0||y.gFo()||y.gkw())continue
-for(x=J.GP(y.gc9());x.G();)if(c.call$1(x.gl().gAx())===!0){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
+if(y!=null)for(z=J.GP(y);z.G();)J.Or(z.gl())},oF:function(a,b){var z,y,x,w,v,u
+if(J.xC(a,$.Tf()))return b
+b=A.oF(a.gAY(),b)
+for(z=J.GP(J.hI(a.gYK()));z.G();){y=z.gl()
+x=J.x(y)
+if(typeof y!=="object"||y===null||!x.$isRY||y.gV5()||y.gFo()||y.gkw())continue
+for(x=J.GP(y.gc9());x.G();){w=x.gl().gAx()
+v=J.x(w)
+if(typeof w==="object"&&w!==null&&!!v.$isyL){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
 b.u(b,y.gIf(),y)
-break}}for(z=J.GP(J.hI(a.gE4()));z.G();){w=z.gl()
-if(w.gFo()||w.gkw())continue
-for(x=J.GP(w.gc9());x.G();)if(c.call$1(x.gl().gAx())===!0){x=H.bK(H.d(J.cs(w.gIf()))+"=")
-if(a.gF8().x4(new H.GD(x))===!0){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(b,w.gIf(),w)}break}}return b},hO:function(a,b,c){var z,y,x
+break}}}for(z=J.GP(J.hI(a.gYK()));z.G();){u=z.gl()
+x=J.x(u)
+if(typeof u!=="object"||u===null||!x.$isRS||!u.glT()||u.Fo||u.gkw())continue
+for(x=J.GP(u.gc9());x.G();){w=x.gl().gAx()
+v=J.x(w)
+if(typeof w==="object"&&w!==null&&!!v.$isyL){if(A.bc(a,u)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
+b.u(b,u.gIf(),u)}break}}}return b},bc:function(a,b){var z,y
+z=H.le(H.d(J.Z0(b.gIf()))+"=")
+y=J.UQ(a.gYK(),new H.GD(z))
+z=J.x(y)
+return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},hO:function(a,b,c){var z,y
 if($.LX()==null||a==null)return
 if($.LX().Bm("ShadowDOMPolyfill"))return
-z=$.LX()
-y=z.t(z,"Platform")
+z=J.UQ($.LX(),"Platform")
+if(z==null)return
+y=J.UQ(z,"ShadowCSS")
 if(y==null)return
-x=J.UQ(y,"ShadowCSS")
-if(x==null)return
-x.K9("shimStyling",[a,b,c])},Hl:function(a){var z,y
+y.V7("shimStyling",[a,b,c])},Hl:function(a){var z
 if(a==null||$.LX()==null)return""
-z=P.Oe(a)
-y=P.dU(z.eh.__resource)
-return y!=null?y:""},ZP:function(a){var z=J.UQ($.pT(),a)
+z=J.UQ(P.Oe(a),"__resource")
+return z!=null?z:""},oY:function(a){var z=J.UQ($.pT(),a)
 return z!=null?z:a},Ad:function(a,b){var z,y
 if(b==null)b=C.hG
 z=$.Ej()
 z.u(z,a,b)
 z=$.p2()
 y=z.Rz(z,a)
-if(y!=null)J.Or(y)},dG:function(a){A.om(a,new A.Mq())},om:function(a,b){var z
+if(y!=null)J.Or(y)},zM:function(a){A.om(a,new A.Mq())},om:function(a,b){var z
 if(a==null)return
 b.call$1(a)
 for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},p1:function(a,b,c,d){var z
-if($.ZH().mL(C.R5))$.ZH().II("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+J.oP(a)+"].["+H.d(b)+"]")
-z=B.ao(c,d)
+if($.ZH().mL(C.R5))$.ZH().J4("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+J.Ro(a)+"].["+H.d(b)+"]")
+z=L.ao(c,d,null)
 if(z.gP(z)==null)z.sP(z,H.vn(a).rN(b).Ax)
-return A.vu(a,b,c,d)},j3:function(a,b,c,d,e){var z,y,x,w
-if(typeof c!=="string"||!C.xB.nC(c,"on-"))return e.call$4(a,b,c,d)
-if($.SS().mL(C.R5))$.SS().II("event: ["+J.oP(d)+"]."+H.d(c)+" => ["+J.oP(a)+"]."+H.d(b)+"())")
-z=J.Z1(c,3)
-y=C.FS.t(C.FS,z)
-if(y!=null)z=y
-x=J.Ei(d)
-x=x.t(x,z)
-w=new W.Ov(0,x.uv,x.Ph,W.aF(new A.bo(a,b,c,d,e)),x.Sg)
-H.VM(w,[H.ip(x,"RO",0)])
-w.Zz()
-return w},Hr:function(a){var z,y
+return A.vu(a,b,c,d)},lJ:function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
+return new A.L6(a,b)},z9:function(a){var z,y
 for(;z=J.TZ(a),z!=null;a=z);y=$.od()
 return y.t(y,a)},HR:function(a,b,c){var z,y,x
 z=H.vn(a)
-y=J.UQ(H.nH(J.bB(z.Ax).LU).gtx(),b)
-if(y!=null){x=y.gMP()
+y=J.UQ(H.jO(J.bB(z.Ax).IE).gtx(),b)
+if(y!=null){x=y.gJx()
 x=x.ev(x,new A.uJ())
 C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},ZI:function(a,b){var z,y
 if(a==null)return
@@ -18032,11 +17187,11 @@
 new W.E9(z).MW.setAttribute("element",y)}b.appendChild(z)},pX:function(){var z=window
 C.ol.pl(z)
 C.ol.oB(z,W.aF(new A.hm()))},l3:function(a){var z=J.RE(a)
-return typeof a==="object"&&a!==null&&!!z.$isRY?z.gt5(a):H.Go(a,"$isRS").gdw()},al:function(a,b){var z,y
+return typeof a==="object"&&a!==null&&!!z.$isRY?z.gr9(a):H.Go(a,"$isRS").gdw()},al:function(a,b){var z,y
 z=A.l3(b)
 if(J.xC(z.gvd(),C.PU)||J.xC(z.gvd(),C.nN))if(a!=null){y=A.ER(a)
 if(y!=null)return P.re(y)
-return H.nH(J.bB(H.vn(a).Ax).LU)}return z},ER:function(a){var z
+return H.jO(J.bB(H.vn(a).Ax).IE)}return z},ER:function(a){var z
 if(a==null)return C.GX
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
@@ -18048,13 +17203,15 @@
 else a=new A.S0(null,null)
 a.Ow=b
 a.VC=P.rT(c,a.gv6(a))
-return a},Ok:function(){if($.uP)$.X3.iT(O.Ht()).Gr(A.PB)
-else A.ei()},ei:function(){var z=document
-W.a7(window,z,"polymer-element",C.Bm,null)
+return a},Ok:function(){if($.uP){var z=$.X3.iT(O.Ht())
+z.Gr(A.PB)
+return z}A.ei()
+return $.X3},ei:function(){var z=document
+W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
 $.i5().ml(new A.Bl())},Jv:function(){var z,y,x,w,v,u,t
-for(w=$.nT(),w.toString,v=new H.wi(w,w.length,0,null),H.VM(v,[H.ip(w,"Q",0)]);v.G();){z=v.M4
+for(w=$.nT(),w.toString,v=new H.a7(w,w.length,0,null),H.VM(v,[H.W8(w,"Q",0)]);v.G();){z=v.mD
 try{A.pw(z)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
@@ -18063,18 +17220,20 @@
 t.$builtinTypeInfo=[w]
 t=new P.Zf(t)
 t.$builtinTypeInfo=[w]
-w=t.MM
-if(w.Gv!==0)H.vh(new P.lj("Future already completed"))
-w.CG(y,x)}}},GA:function(a,b,c,d){var z,y,x,w,v,u
+w=y
+if(w==null)H.vh(new P.AT("Error must not be null"))
+t=t.MM
+if(t.Gv!==0)H.vh(new P.lj("Future already completed"))
+t.CG(w,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=[]
-if(a==null){z="warning: "+H.d(b)+" not found."
+if(d==null){d=[]
+d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
 y=$.oK
 if(y==null)H.LJ(z)
 else y.call$1(z)
 return d}if(c.tg(c,a))return d
 c.h(c,a)
-for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.M4
+for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.mD
 v=J.RE(w)
 if(typeof w==="object"&&w!==null&&!!v.$isOg)A.GA(w.import,w.href,c,d)
 else if(typeof w==="object"&&w!==null&&!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
@@ -18082,59 +17241,56 @@
 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.LJ(z)
-else v.call$1(z)}}return d},pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+else v.call$1(z)}}return d},pw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=$.RQ()
 z.toString
 y=z.mS(P.r6($.cO().ej(a)))
 z=$.UG().nb
 x=z.t(z,y)
-if(J.co(y.r0,$.rw())&&J.Eg(y.r0,".dart")){z="package:"+J.Z1(y.r0,$.rw().length)
+if(J.co(y.r0,$.rw())&&J.Eg(y.r0,".dart")){z="package:"+J.ZZ(y.r0,$.rw().length)
 w=P.r6($.cO().ej(z))
 z=$.UG().nb
 v=z.t(z,w)
-if(v!=null)x=v}if(x==null){u="warning: "+H.d(y)+" library not found"
-z=$.oK
-if(z==null)H.LJ(u)
-else z.call$1(u)
+if(v!=null)x=v}if(x==null){$.M7().To(H.d(y)+" library not found")
 return}z=x.gmu().nb
 z=z.gUQ(z)
-t=z.V8
-t=t.gA(t)
-s=H.Y9(z.$asi1,H.oX(z))
-r=s==null?null:s[0]
-s=H.Y9(z.$asi1,H.oX(z))
-q=s==null?null:s[1]
-z=new H.MH(null,t,z.Wz)
-z.$builtinTypeInfo=[r,q]
-for(;z.G();)A.h5(x,z.M4)
+u=z.Kw
+u=u.gA(u)
+t=H.Y9(z.$asi1,H.oX(z))
+s=t==null?null:t[0]
+t=H.Y9(z.$asi1,H.oX(z))
+r=t==null?null:t[1]
+z=new H.MH(null,u,z.ew)
+z.$builtinTypeInfo=[s,r]
+for(;z.G();)A.h5(x,z.mD)
 z=J.pP(x)
 z=z.gUQ(z)
-t=z.V8
-t=t.gA(t)
-s=H.Y9(z.$asi1,H.oX(z))
-r=s==null?null:s[0]
-s=H.Y9(z.$asi1,H.oX(z))
-q=s==null?null:s[1]
-z=new H.MH(null,t,z.Wz)
-z.$builtinTypeInfo=[r,q]
-for(;z.G();){p=z.M4
-for(t=J.GP(p.gc9());t.G();){o=t.gl().gAx()
-r=J.x(o)
-if(typeof o==="object"&&o!==null&&!!r.$isV3){r=o.ns
-n=M.Lh(p)
-if(n==null)n=C.hG
-q=$.Ej()
-q.u(q,r,n)
-q=$.p2()
-m=q.Rz(q,r)
-if(m!=null)J.Or(m)}}}},h5:function(a,b){var z,y,x
+u=z.Kw
+u=u.gA(u)
+t=H.Y9(z.$asi1,H.oX(z))
+s=t==null?null:t[0]
+t=H.Y9(z.$asi1,H.oX(z))
+r=t==null?null:t[1]
+z=new H.MH(null,u,z.ew)
+z.$builtinTypeInfo=[s,r]
+for(;z.G();){q=z.mD
+for(u=J.GP(q.gc9());u.G();){p=u.gl().gAx()
+s=J.x(p)
+if(typeof p==="object"&&p!==null&&!!s.$isV3){s=p.ns
+o=M.Lh(q)
+if(o==null)o=C.hG
+r=$.Ej()
+r.u(r,s,o)
+r=$.p2()
+n=r.Rz(r,s)
+if(n!=null)J.Or(n)}}}},h5:function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.gl().gAx()===C.za){y=!0
 break}if(!y)return
 if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+H.d(b.gIf())+" is not."
 z=$.oK
 if(z==null)H.LJ(x)
 else z.call$1(x)
-return}z=b.gMP()
+return}z=b.gJx()
 z=z.ev(z,new A.pM())
 if(z.gA(z).G()){x="warning: methods marked with @initMethod should take no arguments, "+H.d(b.gIf())+" expects some."
 z=$.oK
@@ -18145,15 +17301,15 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},XP:{"":"qE;di,P0,ZD,S6,F7=,Q0=,Bg=,n4=,pc,SV,EX=,mn",
-gt5:function(a){return a.di},
+$is_Dv:true},XP:{"":"qE;di,P0,ZD,S6,Dg=,Q0=,Hs=,n4=,pc,SV,EX=,mn",
+gr9:function(a){return a.di},
 gP1:function(a){return a.ZD},
 goc:function(a){return a.S6},
 "+name":0,
 gr3:function(a){var z,y,x
 z=a.querySelector("template")
 if(z!=null){y=J.x(z)
-x=J.NQ(typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z))
+x=J.nX(typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z))
 y=x}else y=null
 return y},
 yx:function(a){var z
@@ -18161,7 +17317,7 @@
 z=new W.E9(a).MW.getAttribute("extends")
 if(this.PM(a,z))return
 this.jT(a,a.S6,z)
-A.nw(a.S6)},
+A.yV(a.S6)},
 y0:function(a,b){var z=$.Ej()
 if(z.t(z,b)!=null)return!1
 z=$.p2()
@@ -18184,11 +17340,11 @@
 if(a.P0!=null){z=$.cd()
 a.ZD=z.t(z,c)}y=P.re(a.di)
 this.YU(a,y,a.ZD)
-z=a.F7
+z=a.Dg
 if(z!=null)a.Q0=this.Pv(a,z)
-this.q1(a,y)},
+this.oq(a,y)},
 fj:function(a,b,c){var z,y
-this.LO(a)
+this.uG(a)
 this.W3(a,a.EX)
 this.Mi(a)
 this.f6(a)
@@ -18203,76 +17359,75 @@
 y=x.gQg(z).MW.getAttribute("extends")
 z=x.gP1(z)}x=document
 w=a.di
-W.a7(window,x,b,w,y)},
+W.wi(window,x,b,w,y)},
 YU:function(a,b,c){var z,y,x,w,v,u,t
-if(c!=null&&J.PF(c)!=null){z=J.PF(c)
+if(c!=null&&J.fP(c)!=null){z=J.fP(c)
 y=P.L5(null,null,null,null,null)
 y.Ay(y,z)
-a.F7=y}a.F7=A.dx(b,a.F7,new A.jd())
+a.Dg=y}a.Dg=A.oF(b,a.Dg)
 x=new W.E9(a).MW.getAttribute("attributes")
 if(x!=null){z=x.split(J.kE(x,",")?",":" ")
-y=new H.wi(z,z.length,0,null)
-H.VM(y,[H.ip(z,"Q",0)])
-for(;y.G();){w=J.rr(y.M4)
-if(w!==""){z=a.F7
+y=new H.a7(z,z.length,0,null)
+H.VM(y,[H.W8(z,"Q",0)])
+for(;y.G();){w=J.rr(y.mD)
+if(w!==""){z=a.Dg
 z=z!=null&&z.x4(w)}else z=!1
 if(z)continue
-v=new H.GD(H.bK(w))
-u=J.UQ(b.gZ3(),v)
-if(u==null){u=J.UQ(b.gE4(),v)
-if(u!=null){z=H.bK(H.d(J.cs(u.gIf()))+"=")
-z=b.gF8().x4(new H.GD(z))!==!0}else z=!1
-if(z)u=null}if(u==null){window
+v=new H.GD(H.le(w))
+u=J.UQ(b.gYK(),v)
+z=J.x(u)
+if(typeof u==="object"&&u!==null&&!!z.$isRS){if(!u.glT()||!A.bc(b,u))u=null}else if(typeof u!=="object"||u===null||!z.$isRY)u=null
+if(u==null){window
 z=$.UT()
 t="property for attribute "+w+" of polymer-element name="+a.S6+" not found."
 z.toString
 if(typeof console!="undefined")console.warn(t)
-continue}if(a.F7==null)a.F7=H.B7([],P.L5(null,null,null,null,null))
-z=a.F7
+continue}if(a.Dg==null)a.Dg=H.B7([],P.L5(null,null,null,null,null))
+z=a.Dg
 z.u(z,v,u)}}},
-LO:function(a){var z,y
+uG:function(a){var z,y
 a.n4=P.L5(null,null,null,J.O,P.a)
 z=a.ZD
 if(z!=null){y=a.n4
 y.Ay(y,J.GW(z))}z=new W.E9(a)
-z.aN(z,new A.HO(a))},
+z.aN(z,new A.CK(a))},
 W3:function(a,b){var z=new W.E9(a)
 z.aN(z,new A.BO(b))},
 Mi:function(a){var z,y
-a.pc=this.Hs(a,"[rel=stylesheet]")
-for(z=a.pc,z.toString,y=new H.wi(z,z.length,0,null),H.VM(y,[H.ip(z,"Q",0)]);y.G();)J.vX(y.M4)},
+a.pc=this.nP(a,"[rel=stylesheet]")
+for(z=a.pc,z.toString,y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G();)J.vX(y.mD)},
 f6:function(a){var z,y
-a.SV=this.Hs(a,"style[polymer-scope]")
-for(z=a.SV,z.toString,y=new H.wi(z,z.length,0,null),H.VM(y,[H.ip(z,"Q",0)]);y.G();)J.vX(y.M4)},
+a.SV=this.nP(a,"style[polymer-scope]")
+for(z=a.SV,z.toString,y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G();)J.vX(y.mD)},
 yq:function(a){var z,y,x,w,v,u
 z=a.pc
 z.toString
-y=new H.U5(z,new A.oF())
+y=new H.U5(z,new A.ZG())
 H.VM(y,[null])
 x=this.gr3(a)
 if(x!=null){w=P.p9("")
-for(z=J.GP(y.V8),z=new H.SO(z,y.Wz),H.VM(z,[H.ip(y,"U5",0)]),v=z.N4;z.G();){u=A.Hl(v.gl())
+for(z=J.GP(y.Kw),z=new H.SO(z,y.ew),H.VM(z,[H.W8(y,"U5",0)]),v=z.RX;z.G();){u=A.Hl(v.gl())
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
 w.vM=w.vM+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
 z.textContent=H.d(w)
 v=J.RE(x)
 v.mK(x,z,v.gq6(x))}}},
-oP:function(a,b,c){var z,y,x
+Wz:function(a,b,c){var z,y,x
 z=W.vD(a.querySelectorAll(b),null)
 y=z.br(z)
 x=this.gr3(a)
 if(x!=null)C.Nm.Ay(y,J.US(x,b))
 return y},
-Hs:function(a,b){return this.oP(a,b,null)},
+nP:function(a,b){return this.Wz(a,b,null)},
 u5:function(a){A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)},
 kO:function(a,b){var z,y,x,w,v
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
-for(x=a.pc,x.toString,x=new H.U5(x,y),H.VM(x,[null]),w=J.GP(x.V8),w=new H.SO(w,x.Wz),H.VM(w,[H.ip(x,"U5",0)]),x=w.N4;w.G();){v=A.Hl(x.gl())
+for(x=a.pc,x.toString,x=new H.U5(x,y),H.VM(x,[null]),w=J.GP(x.Kw),w=new H.SO(w,x.ew),H.VM(w,[H.W8(x,"U5",0)]),x=w.RX;w.G();){v=A.Hl(x.gl())
 v=typeof v==="string"?v:H.d(v)
 z.vM=z.vM+v
-z.vM=z.vM+"\n\n"}for(x=a.SV,x.toString,y=new H.U5(x,y),H.VM(y,[null]),x=J.GP(y.V8),x=new H.SO(x,y.Wz),H.VM(x,[H.ip(y,"U5",0)]),y=x.N4;x.G();){w=y.gl().ghg()
+z.vM=z.vM+"\n\n"}for(x=a.SV,x.toString,y=new H.U5(x,y),H.VM(y,[null]),x=J.GP(y.Kw),x=new H.SO(x,y.ew),H.VM(x,[H.W8(y,"U5",0)]),y=x.RX;x.G();){w=y.gl().ghg()
 z.vM=z.vM+w
 z.vM=z.vM+"\n\n"}return z.vM},
 J3:function(a,b,c){var z
@@ -18282,37 +17437,32 @@
 z.toString
 new W.E9(z).MW.setAttribute("element",a.S6+"-"+c)
 return z},
-q1:function(a,b){var z,y,x,w
-for(z=J.GP(J.hI(b.gtx()));z.G();){y=z.gl()
-if(y.gFo()||!y.guU())continue
-x=J.cs(y.gIf())
-w=J.rY(x)
-if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.Bg==null)a.Bg=P.L5(null,null,null,null,null)
-x=w.JT(x,0,J.xH(w.gB(x),7))
-w=a.Bg
-w.u(w,new H.GD(H.bK(x)),y.gIf())}}},
+oq:function(a,b){var z,y,x,w
+for(z=J.GP(J.hI(b.gYK()));z.G();){y=z.gl()
+x=J.x(y)
+if(typeof y!=="object"||y===null||!x.$isRS||y.gFo()||!y.guU())continue
+w=J.Z0(y.gIf())
+x=J.rY(w)
+if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.Hs==null)a.Hs=P.L5(null,null,null,null,null)
+w=x.JT(w,0,J.xH(x.gB(w),7))
+x=a.Hs
+x.u(x,new H.GD(H.le(w)),y.gIf())}}},
 Pv:function(a,b){var z=P.L5(null,null,null,J.O,null)
-b.aN(b,new A.fh(z))
+b.aN(b,new A.MX(z))
 return z},
 du:function(a){a.S6=new W.E9(a).MW.getAttribute("name")
 this.yx(a)},
 $isXP:true,
 static:{"":"wp",XL:function(a){a.EX=H.B7([],P.L5(null,null,null,null,null))
-C.zb.ZL(a)
-C.zb.du(a)
-return a},"+new PolymerDeclaration$created:0:0":0,d7:function(a){return!C.kr.x4(a)&&!J.co(a,"on-")}}},q6:{"":"Tp;",
+C.xk.ZL(a)
+C.xk.du(a)
+return a},"+new PolymerDeclaration$created:0:0":0,wP:function(a){return!C.kr.x4(a)&&!J.co(a,"on-")}}},q6:{"":"Tp;",
 call$0:function(){return[]},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},jd:{"":"Tp;",
-call$1:function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isyL},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},HO:{"":"Tp;a",
+$is_X0:true},CK:{"":"Tp;a",
 call$2:function(a,b){var z
-if(A.d7(a)){z=this.a.n4
+if(A.wP(a)){z=this.a.n4
 z.u(z,a,b)}},
 "+call:2:0":0,
 $isEH:true,
@@ -18326,22 +17476,22 @@
 v.u(v,z.yn(a,3),C.xB.bS(y.JT(b,x+2,w)))}}},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},oF:{"":"Tp;",
-call$1:function(a){return J.MX(a).MW.hasAttribute("polymer-scope")!==!0},
+$is_bh:true},ZG:{"":"Tp;",
+call$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},Oc:{"":"Tp;a",
-call$1:function(a){return J.UK(a,this.a)},
+call$1:function(a){return J.RF(a,this.a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},fh:{"":"Tp;a",
+$is_Dv:true},MX:{"":"Tp;a",
 call$2:function(a,b){var z=this.a
-z.u(z,J.Mz(J.cs(a)),b)},
+z.u(z,J.Mz(J.Z0(a)),b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},w9:{"":"Tp;",
+$is_bh:true},w12:{"":"Tp;",
 call$0:function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(C.FS,new A.fTP(z))
 return z},
@@ -18352,12 +17502,12 @@
 z.u(z,b,a)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},yL:{"":"Mu;",$isyL:true},dM:{"":["a;KM=-",function(){return[C.nJ]}],
+$is_bh:true},yL:{"":"Fa;",$isyL:true},dM:{"":["a;KM=-",function(){return[C.nJ]}],
 gpQ:function(a){return!1},
 "+applyAuthorStyles":0,
-Pa:function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.M0>0)this.Ec(a)},
+Pa:function(a){if(W.uV(this.gM0(a).defaultView)!=null||$.M0>0)this.Ec(a)},
 gTM:function(a){var z=this.gQg(a).MW.getAttribute("is")
-return z==null||z===""?this.gqn(a):z},
+return z==null||z===""?this.gjU(a):z},
 Ec:function(a){var z,y
 z=this.gTM(a)
 y=$.cd()
@@ -18379,7 +17529,7 @@
 d0:function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=z.Ja(b,"template")
-if(y!=null)if(J.MX(a.ZI).MW.hasAttribute("lightdom")===!0){this.vs(a,y)
+if(y!=null)if(J.Vs(a.ZI).MW.hasAttribute("lightdom")===!0){this.vs(a,y)
 x=null}else x=this.TH(a,y)
 else x=null
 w=J.x(x)
@@ -18410,7 +17560,7 @@
 this.lj(a,z)
 return z},
 lj:function(a,b){var z,y,x,w
-for(z=J.US(b,"[id]"),z=z.gA(z),y=a.KM,x=J.w1(y);z.G();){w=z.M4
+for(z=J.US(b,"[id]"),z=z.gA(z),y=a.KM,x=J.w1(y);z.G();){w=z.mD
 x.u(y,J.F8(w),w)}},
 aC:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
@@ -18423,12 +17573,12 @@
 D3:function(a,b,c){var z,y,x,w
 z=this.Nj(a,b)
 if(z==null)return
-if(c==null||J.kE(c,$.iB())===!0)return
+if(c==null||J.kE(c,$.VC())===!0)return
 y=H.vn(a)
 x=y.rN(z.gIf()).Ax
 w=Z.Zh(c,x,A.al(x,z))
 if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},
-ghW:function(a){return new P.SV(this,A.dM.prototype.D3,a,"D3")},
+ghW:function(a){return new A.Y7(this,A.dM.prototype.D3,a,"D3")},
 Nj:function(a,b){var z=J.B8(a.ZI)
 if(z==null)return
 return z.t(z,b)},
@@ -18439,35 +17589,34 @@
 Id:function(a,b){var z,y,x
 z=H.vn(a).rN(b).Ax
 y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(J.cs(b),y)
+if(y!=null)this.gQg(a).MW.setAttribute(J.Z0(b),y)
 else if(typeof z==="boolean"){x=this.gQg(a)
-x.Rz(x,J.cs(b))}},
-Zf:function(a,b,c,d){var z,y,x
+x.Rz(x,J.Z0(b))}},
+Z1:function(a,b,c,d){var z,y
 if(a.ZI==null)this.Ec(a)
 z=this.Nj(a,b)
-if(z==null)return J.kk(M.Ky(a),b,c,d)
+if(z==null)return J.tb(M.Ky(a),b,c,d)
 else{J.MV(M.Ky(a),b)
 y=A.p1(a,z.gIf(),c,d)
 this.Id(a,z.gIf())
-x=J.QE(M.Ky(a))
-x.u(x,b,y)
+J.kW(J.QE(M.Ky(a)),b,y)
 return y}},
 gCd:function(a){return J.QE(M.Ky(a))},
 Ih:function(a,b){return J.MV(M.Ky(a),b)},
 x3:function(a){if(a.z3===!0)return
-$.P5().II("["+this.gqn(a)+"] asyncUnbindAll")
+$.P5().J4("["+this.gjU(a)+"] asyncUnbindAll")
 a.TQ=A.lN(a.TQ,this.gJg(a),C.RT)},
 GB:function(a){var z
 if(a.z3===!0)return
 this.Td(a)
 J.AA(M.Ky(a))
 z=this.gKE(a)
-for(;z!=null;){A.dG(z)
+for(;z!=null;){A.zM(z)
 z=z.olderShadowRoot}a.z3=!0},
-gJg:function(a){return new H.MT(this,A.dM.prototype.GB,a,"GB")},
+gJg:function(a){return new H.YP(this,A.dM.prototype.GB,a,"GB")},
 BT:function(a,b){var z
-if(a.z3===!0){$.P5().j2("["+this.gqn(a)+"] already unbound, cannot cancel unbindAll")
-return}$.P5().II("["+this.gqn(a)+"] cancelUnbindAll")
+if(a.z3===!0){$.P5().A3("["+this.gjU(a)+"] already unbound, cannot cancel unbindAll")
+return}$.P5().J4("["+this.gjU(a)+"] cancelUnbindAll")
 z=a.TQ
 if(z!=null){z.TP(z)
 a.TQ=null}if(b===!0)return
@@ -18476,38 +17625,38 @@
 Xl:function(a){var z,y,x,w,v,u,t
 z=a.ZI
 y=J.RE(z)
-x=y.gBg(z)
-w=y.gF7(z)
+x=y.gHs(z)
+w=y.gDg(z)
 z=x==null
-if(!z)for(x.toString,y=new P.Tz(x),H.VM(y,[H.ip(x,"YB",0)]),v=y.Fb,u=v.zN,u=new P.N6(v,u,null,null),H.VM(u,[H.ip(y,"Tz",0)]),u.zq=u.Fb.H9;u.G();){t=u.fD
-this.rJ(a,t,H.vn(a).tu(t,1,J.cs(t),[]),null)}if(!z||w!=null)a.Vk=this.gqh(a).yI(this.gnu(a))},
+if(!z)for(x.toString,y=new P.Cm(x),H.VM(y,[H.W8(x,"YB",0)]),v=y.Fb,u=v.zN,u=new P.N6(v,u,null,null),H.VM(u,[H.W8(y,"Cm",0)]),u.zq=u.Fb.H9;u.G();){t=u.fD
+this.rJ(a,t,H.vn(a).tu(t,1,J.Z0(t),[]),null)}if(!z||w!=null)a.Vk=this.gqh(a).yI(this.gnu(a))},
 fd:function(a,b){var z,y,x,w,v,u
 z=a.ZI
 y=J.RE(z)
-x=y.gBg(z)
-w=y.gF7(z)
+x=y.gHs(z)
+w=y.gDg(z)
 v=P.L5(null,null,null,P.wv,A.k8)
 for(z=J.GP(b);z.G();){u=z.gl()
 y=J.x(u)
 if(typeof u!=="object"||u===null||!y.$isqI)continue
 J.Pz(v.to(u.oc,new A.Oa(u)),u.zZ)}v.aN(v,new A.n1(a,b,x,w))},
-gnu:function(a){return new J.C7(this,A.dM.prototype.fd,a,"fd")},
+gnu:function(a){return new P.C7(this,A.dM.prototype.fd,a,"fd")},
 rJ:function(a,b,c,d){var z,y,x,w,v,u,t
-z=J.nU(a.ZI)
+z=J.Ir(a.ZI)
 if(z==null)return
 y=z.t(z,b)
 if(y==null)return
 x=J.x(d)
-if(typeof d==="object"&&d!==null&&!!x.$isPc){if($.yk().mL(C.R5))$.yk().II("["+this.gqn(a)+"] observeArrayValue: unregister observer "+H.d(b))
-this.l5(a,H.d(J.cs(b))+"__array")}x=J.RE(c)
-if(typeof c==="object"&&c!==null&&!!x.$isPc){if($.yk().mL(C.R5))$.yk().II("["+this.gqn(a)+"] observeArrayValue: register observer "+H.d(b))
-w=x.gqh(c).w4(!1)
+if(typeof d==="object"&&d!==null&&!!x.$iswn){if($.yk().mL(C.R5))$.yk().J4("["+this.gjU(a)+"] observeArrayValue: unregister observer "+H.d(b))
+this.l5(a,H.d(J.Z0(b))+"__array")}x=J.x(c)
+if(typeof c==="object"&&c!==null&&!!x.$iswn){if($.yk().mL(C.R5))$.yk().J4("["+this.gjU(a)+"] observeArrayValue: register observer "+H.d(b))
+w=c.gRT().w4(!1)
 w.dB=$.X3.cR(new A.xf(a,d,y))
 v=P.AY
 w.o7=P.VH(v,$.X3)
 u=P.No
 w.Bd=$.X3.Al(u)
-x=H.d(J.cs(b))+"__array"
+x=H.d(J.Z0(b))+"__array"
 if(a.uN==null)a.uN=P.L5(null,null,null,J.O,P.MO)
 t=a.uN
 t.u(t,x,w)}},
@@ -18523,16 +17672,16 @@
 C0:function(a){var z,y
 z=a.uN
 if(z==null)return
-for(z=z.gUQ(z),y=z.V8,y=y.gA(y),y=new H.MH(null,y,z.Wz),H.VM(y,[H.ip(z,"i1",0),H.ip(z,"i1",1)]);y.G();)y.M4.ed()
+for(z=z.gUQ(z),y=z.Kw,y=y.gA(y),y=new H.MH(null,y,z.ew),H.VM(y,[H.W8(z,"i1",0),H.W8(z,"i1",1)]);y.G();)y.mD.ed()
 z=a.uN
 z.V1(z)
 a.uN=null},
 Uc:function(a){var z=J.fU(a.ZI)
 if(z.gl0(z))return
-if($.SS().mL(C.R5))$.SS().II("["+this.gqn(a)+"] addHostListeners: "+H.d(z))
-this.UH(a,a,z.gvc(z),this.gD4(a))},
+if($.SS().mL(C.R5))$.SS().J4("["+this.gjU(a)+"] addHostListeners: "+H.d(z))
+this.UH(a,a,z.gvc(z),this.gay(a))},
 UH:function(a,b,c,d){var z,y,x,w,v,u
-for(z=c.Fb,y=z.zN,y=new P.N6(z,y,null,null),H.VM(y,[H.ip(c,"Tz",0)]),y.zq=y.Fb.H9,z=J.RE(b);y.G();){x=y.fD
+for(z=c.Fb,y=z.zN,y=new P.N6(z,y,null,null),H.VM(y,[H.W8(c,"Cm",0)]),y.zq=y.Fb.H9,z=J.RE(b);y.G();){x=y.fD
 w=z.gI(b)
 w=w.t(w,x)
 v=H.Y9(w.$asRO,H.oX(w))
@@ -18543,30 +17692,30 @@
 if(u!=null&&w.VP<=0)J.qV(w.uv,w.Ph,u,w.Sg)}},
 iw:function(a,b){var z,y,x,w
 z=J.RE(b)
-if(z.goM(b)!==!0)return
+if(z.gXt(b)!==!0)return
 y=$.SS().mL(C.R5)
-if(y)$.SS().II(">>> ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")
+if(y)$.SS().J4(">>> ["+this.gjU(a)+"]: hostEventListener("+H.d(z.gr9(b))+")")
 x=J.fU(a.ZI)
-w=x.t(x,A.ZP(z.gt5(b)))
-if(w!=null){if(y)$.SS().II("["+this.gqn(a)+"] found host handler name ["+H.d(w)+"]")
-this.ea(a,a,w,[b,typeof b==="object"&&b!==null&&!!z.$isDG?z.gey(b):null,a])}if(y)$.SS().II("<<< ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")},
-gD4:function(a){return new J.C7(this,A.dM.prototype.iw,a,"iw")},
+w=x.t(x,A.oY(z.gr9(b)))
+if(w!=null){if(y)$.SS().J4("["+this.gjU(a)+"] found host handler name ["+H.d(w)+"]")
+this.ea(a,a,w,[b,typeof b==="object"&&b!==null&&!!z.$isDG?z.gey(b):null,a])}if(y)$.SS().J4("<<< ["+this.gjU(a)+"]: hostEventListener("+H.d(z.gr9(b))+")")},
+gay:function(a){return new P.C7(this,A.dM.prototype.iw,a,"iw")},
 ea:function(a,b,c,d){var z,y
 z=$.SS().mL(C.R5)
-if(z)$.SS().II(">>> ["+this.gqn(a)+"]: dispatch "+H.d(c))
+if(z)$.SS().J4(">>> ["+this.gjU(a)+"]: dispatch "+H.d(c))
 y=J.x(c)
 if(typeof c==="object"&&c!==null&&!!y.$isEH)H.Ek(c,d,P.Te(null))
-else if(typeof c==="string")A.HR(b,new H.GD(H.bK(c)),d)
-else $.SS().j2("invalid callback")
-if(z)$.SS().To("<<< ["+this.gqn(a)+"]: dispatch "+H.d(c))},
+else if(typeof c==="string")A.HR(b,new H.GD(H.le(c)),d)
+else $.SS().A3("invalid callback")
+if(z)$.SS().To("<<< ["+this.gjU(a)+"]: dispatch "+H.d(c))},
 $isdM:true,
 $ishs:true,
-$iswn:true,
+$isd3:true,
 $iscv:true,
-$isvB:true,
+$isGv:true,
 $isKV:true,
 $isD0:true},WC:{"":"Tp;a",
-call$2:function(a,b){J.MX(this.a).to(a,new A.Xi(b))},
+call$2:function(a,b){J.Vs(this.a).to(a,new A.Xi(b))},
 "+call:2:0":0,
 $isEH:true,
 $is_bh:true},Xi:{"":"Tp;b",
@@ -18607,18 +17756,33 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},bo:{"":"Tp;a,b,c,d,e",
+$is_Dv:true},L6:{"":"Tp;a,b",
+call$2:function(a,b){var z,y,x,w
+if($.SS().mL(C.R5))$.SS().J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
+z=J.ZZ(this.b,3)
+y=C.FS.t(C.FS,z)
+if(y!=null)z=y
+x=J.f5(b)
+x=x.t(x,z)
+w=new W.Ov(0,x.uv,x.Ph,W.aF(new A.Rs(this.a,a,b)),x.Sg)
+H.VM(w,[H.W8(x,"RO",0)])
+w.Zz()
+return w},
+"+call:2:0":0,
+$isEH:true,
+$is_bh:true},Rs:{"":"Tp;c,d,e",
 call$1:function(a){var z,y,x,w,v,u
-z=this.d
-y=A.Hr(z)
+z=this.e
+y=A.z9(z)
 x=J.RE(y)
 if(typeof y!=="object"||y===null||!x.$isdM)return
-w=this.b
-v=J.U6(w)
-if(J.xC(v.t(w,0),"@")){u=this.a
-w=J.Vm(this.e.call$4(u,v.yn(w,1),this.c,z))}else u=y
-v=J.RE(a)
-x.ea(y,u,w,[a,typeof a==="object"&&a!==null&&!!v.$isDG?v.gey(a):null,z])},
+w=this.c
+if(0>=w.length)throw H.e(w,0)
+if(w[0]==="@"){v=this.d
+u=L.ao(v,C.xB.yn(w,1),null)
+w=u.gP(u)}else v=y
+u=J.RE(a)
+x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isDG?u.gey(a):null,z])},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
@@ -18630,7 +17794,7 @@
 $is_Dv:true},hm:{"":"Tp;",
 call$1:function(a){var z,y,x
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
-for(y=z.gA(z);y.G();){x=J.pP(y.M4)
+for(y=z.gA(z);y.G();){x=J.pP(y.mD)
 x.h(x,"polymer-unveil")
 x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
 y.gFV(y).ml(new A.Ji(z))}},
@@ -18639,57 +17803,55 @@
 $is_HB:true,
 $is_Dv:true},Ji:{"":"Tp;a",
 call$1:function(a){var z,y
-for(z=this.a,z=z.gA(z);z.G();){y=J.pP(z.M4)
+for(z=this.a,z=z.gA(z);z.G();){y=J.pP(z.mD)
 y.Rz(y,"polymer-unveil")}},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Bf:{"":"TR;K3,Zu,Po,Ha,N1,lr,ND,B5,eS,ay",
-cO:function(a){if(this.N1==null)return
+$is_Dv:true},Bf:{"":"TR;K3,Zu,Po,Ha,LO,ZY,xS,PB,eS,Ii",
+cO:function(a){if(this.LO==null)return
 this.Po.ed()
-M.TR.prototype.cO.call(this,this)},
-gJK:function(a){return new H.MT(this,A.Bf.prototype.cO,a,"cO")},
+X.TR.prototype.cO.call(this,this)},
 EC:function(a){this.Ha=a
 this.K3.PU(this.Zu,a)},
-gH0:function(){return new H.Pm(this,A.Bf.prototype.EC,null,"EC")},
 zL:function(a){var z,y,x,w,v
 for(z=J.GP(a),y=this.Zu;z.G();){x=z.gl()
 w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.xC(x.oc,y)){v=this.K3.tu(y,1,J.cs(y),[]).Ax
+if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.xC(x.oc,y)){v=this.K3.tu(y,1,J.Z0(y),[]).Ax
 z=this.Ha
-if(z==null?v!=null:z!==v)J.ta(this.ND,v)
+if(z==null?v!=null:z!==v)J.ta(this.xS,v)
 return}}},
 gxH:function(){return new H.Pm(this,A.Bf.prototype.zL,null,"zL")},
 uY:function(a,b,c,d){this.Po=J.Ib(a).yI(this.gxH())},
 static:{vu:function(a,b,c,d){var z,y,x
 z=H.vn(a)
-y=J.cs(b)
+y=J.Z0(b)
 x=d!=null?d:""
 x=new A.Bf(z,b,null,null,a,c,null,null,y,x)
-x.CX()
+x.Og(a,y,c,d)
 x.uY(a,b,c,d)
-return x}}},ir:{"":["GN;jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-XI:function(a){this.Pa(a)},
+return x}}},ir:{"":["GN;VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+FH:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
-C.Iv.ZL(a)
-C.Iv.XI(a)
-return a},"+new PolymerElement$created:0:0":0}},Sa:{"":["qE+dM;KM=-",function(){return[C.nJ]}],$isdM:true,$ishs:true,$iswn:true,$iscv:true,$isvB:true,$isKV:true,$isD0:true},GN:{"":"Sa+Pi;",$iswn:true},k8:{"":"a;jL>,zZ*",$isk8:true},HJ:{"":"G3;nF"},S0:{"":"a;Ow,VC",
+C.GB.ZL(a)
+C.GB.FH(a)
+return a},"+new PolymerElement$created:0:0":0}},Tt:{"":["qE+dM;KM=-",function(){return[C.nJ]}],$isdM:true,$ishs:true,$isd3:true,$iscv:true,$isGv:true,$isKV:true,$isD0:true},GN:{"":"Tt+Pi;",$isd3:true},k8:{"":"a;jL>,zZ*",$isk8:true},HJ:{"":"e9;nF"},S0:{"":"a;Ow,VC",
 E5:function(){return this.Ow.call$0()},
 TP:function(a){var z=this.VC
 if(z!=null){z.ed()
 this.VC=null}},
 tZ:function(a){if(this.VC!=null){this.TP(this)
 this.E5()}},
-gv6:function(a){return new H.MT(this,A.S0.prototype.tZ,a,"tZ")}},V3:{"":"a;ns",$isV3:true},Bl:{"":"Tp;",
+gv6:function(a){return new H.YP(this,A.S0.prototype.tZ,a,"tZ")}},V3:{"":"a;ns",$isV3:true},Bl:{"":"Tp;",
 call$1:function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
 z.OH(null)
@@ -18702,12 +17864,12 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},i2:{"":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{Zh:function(a,b,c){var z,y,x
+$is_Dv:true},Mh:{"":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{Zh:function(a,b,c){var z,y,x
 z=J.UQ($.WJ(),c.gvd())
 if(z!=null)return z.call$2(a,b)
 try{y=C.lM.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},W6:{"":"Tp;",
+return a}},Md:{"":"Tp;",
 call$0:function(){var z=P.L5(null,null,null,null,null)
 z.u(z,C.AZ,new Z.Lf())
 z.u(z,C.ok,new Z.fT())
@@ -18747,7 +17909,7 @@
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},ej:{"":"Tp;",
-call$2:function(a,b){return H.mO(a,new Z.HK(b))},
+call$2:function(a,b){return H.IH(a,new Z.HK(b))},
 "+call:2:0":0,
 $isEH:true,
 $is_bh:true},HK:{"":"Tp;b",
@@ -18758,18 +17920,18 @@
 $is_Dv:true}}],["polymer.src.reflected_type","package:polymer/src/reflected_type.dart",,M,{Lh:function(a){var z,y
 z=H.vn(a)
 y=$.av()
-y=z.tu(y,1,J.cs(y),[])
-return $.Yr().CI(C.to,[y.Ax]).gAx()},w10:{"":"Tp;",
+y=z.tu(y,1,J.Z0(y),[])
+return $.Yr().CI(C.to,[y.Ax]).gAx()},w13:{"":"Tp;",
 call$0:function(){var z,y
-for(z=J.GP(J.Ow(H.nH(J.bB(H.vn(P.re(C.dA)).Ax).LU).gZ3()));z.G();){y=z.gl()
-if(J.xC(J.cs(y),"_mangledName"))return y}},
+for(z=J.GP(J.iY(H.jO(J.bB(H.vn(P.re(C.dA)).Ax).IE).gZ3()));z.G();){y=z.gl()
+if(J.xC(J.Z0(y),"_mangledName"))return y}},
 "+call:0:0":0,
 $isEH:true,
 $is_X0:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{ul:function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){z=J.vo(z.gvc(a),new T.o8(a))
+if(typeof a==="object"&&a!==null&&!!z.$isL8){z=J.vo(z.gvc(a),new T.o8(a))
 z=z.zV(z," ")}else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)?z.zV(a," "):a
 return z},PX:function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){z=J.kl(z.gvc(a),new T.GL(a))
+if(typeof a==="object"&&a!==null&&!!z.$isL8){z=J.C0(z.gvc(a),new T.GL(a))
 z=z.zV(z,";")}else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)?z.zV(a,";"):a
 return z},o8:{"":"Tp;a",
 call$1:function(a){var z=this.a
@@ -18783,28 +17945,40 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},G3:{"":"T4;",
-hZ:function(a,b,c,d){var z,y
-if(b==null)return
-z=T.ww(b,null).oK()
-y=J.x(a)
-if(typeof a!=="object"||a===null||!y.$isz6)a=new K.z6(null,a,B.WF(this.nF,null,null),null)
-y=J.x(d)
-y=typeof d==="object"&&d!==null&&!!y.$iscv
-if(y&&J.xC(c,"class"))return T.FL(z,a,T.qP)
-if(y&&J.xC(c,"style"))return T.FL(z,a,T.Fx)
-return T.FL(z,a,null)},
-ghA:function(){return new P.cP(this,T.G3.prototype.hZ,null,"hZ")},
-tf:function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isz6)return new K.z6(null,b,B.WF(this.nF,null,null),null)
-return b}},mY:{"":"Pi;qc,jf,Qi,uK,jH,Wd",
+$is_Dv:true},e9:{"":"T4;",
+yt:function(a,b,c){var z,y
+if(a==null)return
+z=T.ww(a,null).oK()
+if(M.wR(c)){y=J.x(b)
+if(y.n(b,"bind")||y.n(b,"repeat")){y=J.x(z)
+y=typeof z==="object"&&z!==null&&!!y.$isEZ}else y=!1}else y=!1
+if(y)return
+return new T.Xy(this,b,z)},
+gca:function(){return new T.Dw(this,T.e9.prototype.yt,null,"yt")},
+A5:function(a){return new T.uK(this)}},Xy:{"":"Tp;a,b,c",
+call$2:function(a,b){var z=J.x(a)
+if(typeof a!=="object"||a===null||!z.$isz6)a=new K.z6(null,a,V.WF(this.a.nF,null,null),null)
+z=J.x(b)
+z=typeof b==="object"&&b!==null&&!!z.$iscv
+if(z&&J.xC(this.b,"class"))return T.FL(this.c,a,T.qP)
+if(z&&J.xC(this.b,"style"))return T.FL(this.c,a,T.Fx)
+return T.FL(this.c,a,null)},
+"+call:2:0":0,
+$isEH:true,
+$is_bh:true},uK:{"":"Tp;a",
+call$1:function(a){var z=J.x(a)
+return typeof a==="object"&&a!==null&&!!z.$isz6?a:new K.z6(null,a,V.WF(this.a.nF,null,null),null)},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},mY:{"":"Pi;qc,jf,Qi,uK,VJ,Ai",
 Qv:function(a){return this.Qi.call$1(a)},
 vr:function(a){var z,y
 z=this.uK
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.kl(a.bm,new T.mB(this,a))
+if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a))
 this.uK=y.tt(y,!1)}else this.uK=this.Qi==null?a:this.Qv(a)
-B.iY(this,C.ls,z,this.uK)},
+F.Wi(this,C.ls,z,this.uK)},
 gnc:function(){return new H.Pm(this,T.mY.prototype.vr,null,"vr")},
 gP:function(a){return this.uK
 "35,33"},
@@ -18814,33 +17988,33 @@
 try{K.jX(this.jf,b,this.qc)}catch(y){x=H.Ru(y)
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.IS().j2("Error evaluating expression '"+H.d(this.jf)+"': "+H.d(J.z2(z)))}else throw y}"35,84,35,33"},
+$.IS().A3("Error evaluating expression '"+H.d(this.jf)+"': "+J.z2(z))}else throw y}"35,101,35,33"},
 "+value=":1,
-xS:function(a,b,c){var z,y,x,w,v
+Va:function(a,b,c){var z,y,x,w,v
 y=this.jf
 x=y.gju().yI(this.gnc())
 x.fm(x,new T.fE(this))
-try{J.qg(y,new K.Ed(this.qc))
+try{J.UK(y,new K.Ed(this.qc))
 y.gLl()
 this.vr(y.gLl())}catch(w){x=H.Ru(w)
 v=J.x(x)
 if(typeof x==="object"&&x!==null&&!!v.$isB0){z=x
-$.IS().j2("Error evaluating expression '"+H.d(y)+"': "+H.d(J.z2(z)))}else throw w}},
-static:{FL:function(a,b,c){var z=new T.mY(b,a.Yx(a,new K.G1(b,P.NZ(null,null))),c,null,null,null)
-z.xS(a,b,c)
+$.IS().A3("Error evaluating expression '"+H.d(y)+"': "+J.z2(z))}else throw w}},
+static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(a,new K.G1(b,P.NZ(null,null))),c,null,null,null)
+z.Va(a,b,c)
 return z}}},fE:{"":"Tp;a",
-call$1:function(a){$.IS().j2("Error evaluating expression '"+H.d(this.a.jf)+"': "+H.d(J.z2(a)))},
+call$1:function(a){$.IS().A3("Error evaluating expression '"+H.d(this.a.jf)+"': "+H.d(J.z2(a)))},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},mB:{"":"Tp;a,b",
 call$1:function(a){var z=P.L5(null,null,null,null,null)
-z.u(z,this.b.F5,a)
-return new K.z6(this.a.qc,null,B.WF(z,null,null),null)},
+z.u(z,this.b.kF,a)
+return new K.z6(this.a.qc,null,V.WF(z,null,null),null)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{XF:{"":"xh;vq,X7,jH,Wd",
+$is_Dv:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{XF:{"":"xh;vq,L1,VJ,Ai",
 vb:function(a,b){this.vq.yI(new B.iH(b,this))},
 $asxh:function(a){return[null]},
 static:{z4:function(a,b){var z=new B.XF(a,null,null,null)
@@ -18848,23 +18022,24 @@
 z.vb(a,b)
 return z}}},iH:{"":"Tp;a,b",
 call$1:function(a){var z=this.b
-z.X7=B.iY(z,C.ls,z.X7,a)},
+z.L1=F.Wi(z,C.ls,z.L1,a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{Z2:function(a,b){var z=J.qg(a,new K.G1(b,P.NZ(null,null)))
-J.qg(z,new K.Ed(b))
-return z.gDo()},jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+$is_Dv:true}}],["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)))
+J.UK(z,new K.Ed(b))
+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)
 x=[]
+H.VM(x,[U.hw])
 for(;w=z.a,v=J.RE(w),typeof w==="object"&&w!==null&&!!v.$isuk;){if(!J.xC(v.gkp(w),"|"))break
-x.push(v.gip(w))
+x.push(v.gT8(w))
 z.a=v.gBb(w)}z=z.a
 w=J.x(z)
 if(typeof z==="object"&&z!==null&&!!w.$isw6){u=w.gP(z)
-t=C.fx
+t=C.OL
 s=!1}else if(typeof z==="object"&&z!==null&&!!w.$isRW){t=z.ghP()
 if(J.xC(w.gbP(z),"[]")){w=z.gre()
 if(0>=w.length)throw H.e(w,0)
@@ -18879,321 +18054,333 @@
 u=null}s=!1}}else{y.call$0()
 t=null
 u=null
-s=!1}for(z=new H.wi(x,x.length,0,null),H.VM(z,[H.ip(x,"Q",0)]);z.G();){r=z.M4
-q=J.qg(r,new K.G1(c,P.NZ(null,null)))
-J.qg(q,new K.Ed(c))
-q.gDo()
-throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.Z2(t,c)
-if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
+s=!1}for(z=new H.a7(x,x.length,0,null),H.VM(z,[H.W8(x,"Q",0)]);z.G();){r=z.mD
+q=J.UK(r,new K.G1(c,P.NZ(null,null)))
+J.UK(q,new K.Ed(c))
+q.gLv()
+throw H.b(K.yN("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
+if(p==null)throw H.b(K.yN("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.bK(u)),b)},ci:function(a){var z=J.x(a)
+else H.vn(p).PU(new H.GD(H.le(u)),b)},ci:function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},eC:function(a,b){var z=J.x(a)
-return K.ci(typeof a==="object"&&a!==null&&!!z.$iswL?a.UR.F2(a.ex,b,null).Ax:H.Ek(a,b,P.Te(null)))},"+call:2:0":0,Uf:{"":"Tp;",
+return a},Ku:function(a,b){var z=J.x(a)
+return K.ci(typeof a==="object"&&a!==null&&!!z.$iswL?a.lR.F2(a.ex,b,null).Ax:H.Ek(a,b,P.Te(null)))},"+call:2:0":0,wJY:{"":"Tp;",
 call$2:function(a,b){return J.WB(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},Ra:{"":"Tp;",
+$is_bh:true},zOQ:{"":"Tp;",
 call$2:function(a,b){return J.xH(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},wJY:{"":"Tp;",
+$is_bh:true},W6o:{"":"Tp;",
 call$2:function(a,b){return J.p0(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},zOQ:{"":"Tp;",
+$is_bh:true},MdQ:{"":"Tp;",
 call$2:function(a,b){return J.FW(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},W6o:{"":"Tp;",
+$is_bh:true},YJG:{"":"Tp;",
 call$2:function(a,b){return J.xC(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},MdQ:{"":"Tp;",
+$is_bh:true},DOe:{"":"Tp;",
 call$2:function(a,b){return!J.xC(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},YJG:{"":"Tp;",
+$is_bh:true},lPa:{"":"Tp;",
 call$2:function(a,b){return J.xZ(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},DOe:{"":"Tp;",
+$is_bh:true},Ufa:{"":"Tp;",
 call$2:function(a,b){return J.J5(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},lPa:{"":"Tp;",
+$is_bh:true},Raa:{"":"Tp;",
 call$2:function(a,b){return J.u6(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},Ufa:{"":"Tp;",
+$is_bh:true},w0:{"":"Tp;",
 call$2:function(a,b){return J.Hb(a,b)},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},Raa:{"":"Tp;",
+$is_bh:true},w4:{"":"Tp;",
 call$2:function(a,b){return a===!0||b===!0},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},w0:{"":"Tp;",
+$is_bh:true},w5:{"":"Tp;",
 call$2:function(a,b){return a===!0&&b===!0},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},w2:{"":"Tp;",
+$is_bh:true},w7:{"":"Tp;",
 call$2:function(a,b){var z=H.zN(b,"HB",null,null,null)
 if(z)return b.call$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},
+throw H.b(K.yN("Filters must be a one-argument function."))},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},w3:{"":"Tp;",
+$is_bh:true},w9:{"":"Tp;",
 call$1:function(a){return a},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},w4:{"":"Tp;",
+$is_Dv:true},w10:{"":"Tp;",
 call$1:function(a){return J.Z7(a)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},w5:{"":"Tp;",
+$is_Dv:true},w11:{"":"Tp;",
 call$1:function(a){return a!==!0},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},c4:{"":"Tp;a",
-call$0:function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},
+call$0:function(){return H.vh(K.yN("Expression is not assignable: "+H.d(this.a.a)))},
 "+call:0:0":0,
 $isEH:true,
-$is_X0:true},z6:{"":"a;eT>,k8,pC,AS",
-gBV:function(){var z=this.AS
+$is_X0:true},z6:{"":"a;eT>,k8,bq,G9",
+gCH:function(){var z=this.G9
 if(z!=null)return z
-this.AS=H.vn(this.k8)
-return this.AS},
-t:function(a,b){var z,y,x,w
+this.G9=H.vn(this.k8)
+return this.G9},
+t:function(a,b){var z,y,x,w,v,u
 if(J.xC(b,"this"))return this.k8
-else{z=this.pC.oD
+else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(z,b))
-else if(this.k8!=null){y=new H.GD(H.bK(b))
-x=Z.xq(H.nH(J.bB(this.gBV().Ax).LU),y)
-z=J.x(x)
-if(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
-else w=!0
-if(w)return K.ci(this.gBV().rN(y).Ax)
-else if(typeof x==="object"&&x!==null&&!!z.$isRS)return new K.wL(this.gBV(),y)}}z=this.eT
+else if(this.k8!=null){y=new H.GD(H.le(b))
+x=J.bB(this.gCH().Ax).IE
+z=$.Sl()
+w=z.t(z,x)
+v=Z.xq(H.tT(H.YC(w==null?x:w),x),y)
+z=J.x(v)
+if(typeof v!=="object"||v===null||!z.$isRY)u=typeof v==="object"&&v!==null&&!!z.$isRS&&v.glT()
+else u=!0
+if(u)return K.ci(this.gCH().tu(y,1,y.hr,[]).Ax)
+else if(typeof v==="object"&&v!==null&&!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(z,b))
-else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
+else throw H.b(K.yN("variable '"+H.d(b)+"' not found"))},
 "+[]:1:0":0,
 tI:function(a){var z
 if(J.xC(a,"this"))return
-else{z=this.pC
-if(z.oD.x4(a))return z
-else{z=H.bK(a)
-if(Z.xq(H.nH(J.bB(this.gBV().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
+else{z=this.bq
+if(z.Zp.x4(a))return z
+else{z=H.le(a)
+if(Z.xq(H.jO(J.bB(this.gCH().Ax).IE),new H.GD(z))!=null)return this.k8}}z=this.eT
 if(z!=null)return z.tI(a)},
 tg:function(a,b){var z
-if(this.pC.oD.x4(b))return!0
-else{z=H.bK(b)
-if(Z.xq(H.nH(J.bB(this.gBV().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
+if(this.bq.Zp.x4(b))return!0
+else{z=H.le(b)
+if(Z.xq(H.jO(J.bB(this.gCH().Ax).IE),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(z,b)
 return!1},
-$isz6:true},Ay:{"":"a;qF?,Do<",
+$isz6:true},Ay:{"":"a;bO?,Lv<",
 gju:function(){var z,y
-z=this.ax
+z=this.k6
 y=new P.Ik(z)
-H.VM(y,[H.ip(z,"WV",0)])
+H.VM(y,[H.W8(z,"WV",0)])
 return y},
-gLl:function(){return this.Do},
-IJ:function(a){},
-PI:function(a){var z
-this.BC(this,a)
-z=this.qF
-if(z!=null)z.PI(a)},
-BC:function(a,b){var z,y,x
-z=this.Ni
+gLl:function(){return this.Lv},
+Qh:function(a){},
+DX:function(a){var z
+this.yc(this,a)
+z=this.bO
+if(z!=null)z.DX(a)},
+yc:function(a,b){var z,y,x
+z=this.tj
 if(z!=null){z.ed()
-this.Ni=null}y=this.Do
-this.IJ(b)
-z=this.Do
-if(z==null?y!=null:z!==y){x=this.ax
+this.tj=null}y=this.Lv
+this.Qh(b)
+z=this.Lv
+if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(z)}},
-bu:function(a){var z=this.t8
-return z.bu(z)}},Ed:{"":"cfS;Jd",
-xn:function(a){a.BC(a,this.Jd)},
-ky:function(a){J.qg(a.gip(a),this)
-a.BC(a,this.Jd)}},G1:{"":"fr;Jd,Le",
-W9:function(a){return new K.DK(a,null,null,null,P.nd(null,null,!1,null))},
+bu:function(a){var z=this.KL
+return z.bu(z)},
+$ishw:true},Ed:{"":"a0;Jd",
+xn:function(a){a.yc(a,this.Jd)},
+ky:function(a){J.UK(a.gT8(a),this)
+a.yc(a,this.Jd)}},G1:{"":"fr;Jd,Le",
+W9:function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},
 LT:function(a){var z=a.wz
-return z.Yx(z,this)},
+return z.RR(z,this)},
 Y7:function(a){var z,y,x,w,v
-z=J.qg(a.ghP(),this)
+z=J.UK(a.ghP(),this)
 y=a.gre()
 if(y==null)x=null
 else{w=this.gnG()
 y.toString
 w=new H.A8(y,w)
 H.VM(w,[null,null])
-x=w.tt(w,!1)}v=new K.fa(z,x,a,null,null,null,P.nd(null,null,!1,null))
-z.sqF(v)
+x=w.tt(w,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
+z.sbO(v)
 if(x!=null){x.toString
 H.bQ(x,new K.Os(v))}return v},
-I6:function(a){return new K.x5(a,null,null,null,P.nd(null,null,!1,null))},
+I6:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 o0:function(a){var z,y,x
 z=new H.A8(a.gPu(a),this.gnG())
 H.VM(z,[null,null])
 y=z.tt(z,!1)
-x=new K.ev(y,a,null,null,null,P.nd(null,null,!1,null))
+x=new K.ev(y,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(y,new K.Dl(x))
 return x},
 YV:function(a){var z,y,x
-z=J.qg(a.gG3(a),this)
-y=J.qg(a.gv4(),this)
-x=new K.jV(z,y,a,null,null,null,P.nd(null,null,!1,null))
-z.sqF(x)
-y.sqF(x)
+z=J.UK(a.gG3(a),this)
+y=J.UK(a.gv4(),this)
+x=new K.jV(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sbO(x)
+y.sbO(x)
 return x},
-qv:function(a){return new K.ek(a,null,null,null,P.nd(null,null,!1,null))},
+qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 im:function(a){var z,y,x
-z=J.qg(a.gBb(a),this)
-y=J.qg(a.gip(a),this)
-x=new K.ky(z,y,a,null,null,null,P.nd(null,null,!1,null))
-z.sqF(x)
-y.sqF(x)
+z=J.UK(a.gBb(a),this)
+y=J.UK(a.gT8(a),this)
+x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sbO(x)
+y.sbO(x)
 return x},
 Hx:function(a){var z,y
-z=J.qg(a.gwz(),this)
-y=new K.Jy(z,a,null,null,null,P.nd(null,null,!1,null))
-z.sqF(y)
+z=J.UK(a.gwz(),this)
+y=new K.Jy(z,a,null,null,null,P.bK(null,null,!1,null))
+z.sbO(y)
 return y},
 ky:function(a){var z,y,x
-z=J.qg(a.gBb(a),this)
-y=J.qg(a.gip(a),this)
-x=new K.VA(z,y,a,null,null,null,P.nd(null,null,!1,null))
-y.sqF(x)
+z=J.UK(a.gBb(a),this)
+y=J.UK(a.gT8(a),this)
+x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
+y.sbO(x)
 return x}},Os:{"":"Tp;a",
 call$1:function(a){var z=this.a
-a.sqF(z)
+a.sbO(z)
 return z},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},Dl:{"":"Tp;a",
 call$1:function(a){var z=this.a
-a.sqF(z)
+a.sbO(z)
 return z},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},DK:{"":"Ay;t8,qF,Ni,Do,ax",
-IJ:function(a){this.Do=a.k8},
-Yx:function(a,b){return b.W9(this)},
+$is_Dv:true},Wh:{"":"Ay;KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=a.k8},
+RR:function(a,b){return b.W9(this)},
 $asAy:function(){return[U.EZ]},
-$isEZ:true},x5:{"":"Ay;t8,qF,Ni,Do,ax",
-gP:function(a){var z=this.t8
+$isEZ:true,
+$ishw:true},x5:{"":"Ay;KL,bO,tj,Lv,k6",
+gP:function(a){var z=this.KL
 return z.gP(z)},
 "+value":0,
 r6:function(a,b){return this.gP(a).call$1(b)},
-IJ:function(a){var z=this.t8
-this.Do=z.gP(z)},
-Yx:function(a,b){return b.I6(this)},
+Qh:function(a){var z=this.KL
+this.Lv=z.gP(z)},
+RR:function(a,b){return b.I6(this)},
 $asAy:function(){return[U.no]},
 $asno:function(){return[null]},
-$isno:true},ev:{"":"Ay;Pu>,t8,qF,Ni,Do,ax",
-IJ:function(a){this.Do=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},
-Yx:function(a,b){return b.o0(this)},
+$isno:true,
+$ishw:true},ev:{"":"Ay;Pu>,KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},
+RR:function(a,b){return b.o0(this)},
 $asAy:function(){return[U.kB]},
-$iskB:true},ID:{"":"Tp;",
-call$2:function(a,b){J.kW(a,J.WI(b).gDo(),b.gv4().gDo())
+$iskB:true,
+$ishw:true},ID:{"":"Tp;",
+call$2:function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
 return a},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},jV:{"":"Ay;G3>,v4<,t8,qF,Ni,Do,ax",
-Yx:function(a,b){return b.YV(this)},
-$asAy:function(){return[U.dC]},
-$isdC:true},ek:{"":"Ay;t8,qF,Ni,Do,ax",
-gP:function(a){var z=this.t8
+$is_bh:true},jV:{"":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
+RR:function(a,b){return b.YV(this)},
+$asAy:function(){return[U.ae]},
+$isae:true,
+$ishw:true},ek:{"":"Ay;KL,bO,tj,Lv,k6",
+gP:function(a){var z=this.KL
 return z.gP(z)},
 "+value":0,
 r6:function(a,b){return this.gP(a).call$1(b)},
-IJ:function(a){var z,y,x
-z=this.t8
-this.Do=a.t(a,z.gP(z))
+Qh:function(a){var z,y,x
+z=this.KL
+this.Lv=a.t(a,z.gP(z))
 y=a.tI(z.gP(z))
 x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$iswn){z=H.bK(z.gP(z))
-this.Ni=x.gqh(y).yI(new K.OC(this,a,new H.GD(z)))}},
-Yx:function(a,b){return b.qv(this)},
+if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.le(z.gP(z))
+this.tj=x.gqh(y).yI(new K.OC(this,a,new H.GD(z)))}},
+RR:function(a,b){return b.qv(this)},
 $asAy:function(){return[U.w6]},
-$isw6:true},OC:{"":"Tp;a,b,c",
-call$1:function(a){if(J.ja(a,new K.IC(this.c))===!0)this.a.PI(this.b)},
+$isw6:true,
+$ishw:true},OC:{"":"Tp;a,b,c",
+call$1:function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},IC:{"":"Tp;d",
+$is_Dv:true},Xm:{"":"Tp;d",
 call$1:function(a){var z=J.x(a)
 return typeof a==="object"&&a!==null&&!!z.$isqI&&J.xC(a.oc,this.d)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},Jy:{"":"Ay;wz<,t8,qF,Ni,Do,ax",
-gkp:function(a){var z=this.t8
+$is_Dv:true},Jy:{"":"Ay;wz<,KL,bO,tj,Lv,k6",
+gkp:function(a){var z=this.KL
 return z.gkp(z)},
-IJ:function(a){var z,y,x
+Qh:function(a){var z,y,x
 z=$.YG()
-y=this.t8
+y=this.KL
 x=z.t(z,y.gkp(y))
-if(J.xC(y.gkp(y),"!")){z=this.wz.gDo()
-this.Do=x.call$1(z==null?!1:z)}else{z=this.wz.gDo()
-this.Do=z==null?null:x.call$1(z)}},
-Yx:function(a,b){return b.Hx(this)},
+if(J.xC(y.gkp(y),"!")){z=this.wz.gLv()
+this.Lv=x.call$1(z==null?!1:z)}else{z=this.wz.gLv()
+this.Lv=z==null?null:x.call$1(z)}},
+RR:function(a,b){return b.Hx(this)},
 $asAy:function(){return[U.jK]},
-$isjK:true},ky:{"":"Ay;Bb>,ip>,t8,qF,Ni,Do,ax",
-gkp:function(a){var z=this.t8
+$isjK:true,
+$ishw:true},ky:{"":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
+gkp:function(a){var z=this.KL
 return z.gkp(z)},
-IJ:function(a){var z,y,x
-z=$.Gn()
-y=this.t8
+Qh:function(a){var z,y,x
+z=$.bF()
+y=this.KL
 x=z.t(z,y.gkp(y))
-if(J.xC(y.gkp(y),"&&")||J.xC(y.gkp(y),"||")){z=this.Bb.gDo()
+if(J.xC(y.gkp(y),"&&")||J.xC(y.gkp(y),"||")){z=this.Bb.gLv()
 if(z==null)z=!1
-y=this.ip.gDo()
-this.Do=x.call$2(z,y==null?!1:y)}else if(J.xC(y.gkp(y),"==")||J.xC(y.gkp(y),"!="))this.Do=x.call$2(this.Bb.gDo(),this.ip.gDo())
-else{z=this.Bb.gDo()
-if(z==null||this.ip.gDo()==null)this.Do=null
-else this.Do=x.call$2(z,this.ip.gDo())}},
-Yx:function(a,b){return b.im(this)},
+y=this.T8.gLv()
+this.Lv=x.call$2(z,y==null?!1:y)}else if(J.xC(y.gkp(y),"==")||J.xC(y.gkp(y),"!="))this.Lv=x.call$2(this.Bb.gLv(),this.T8.gLv())
+else{z=this.Bb.gLv()
+if(z==null||this.T8.gLv()==null)this.Lv=null
+else this.Lv=x.call$2(z,this.T8.gLv())}},
+RR:function(a,b){return b.im(this)},
 $asAy:function(){return[U.uk]},
-$isuk:true},fa:{"":"Ay;hP<,re<,t8,qF,Ni,Do,ax",
-glT:function(){return this.t8.glT()},
-gbP:function(a){var z=this.t8
+$isuk:true,
+$ishw:true},fa:{"":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
+glT:function(){return this.KL.glT()},
+gbP:function(a){var z=this.KL
 return z.gbP(z)},
-IJ:function(a){var z,y,x,w,v,u
+Qh:function(a){var z,y,x,w,v,u
 z=this.re
 if(z==null)y=[]
 else{z.toString
 z=new H.A8(z,new K.WW())
 H.VM(z,[null,null])
-y=z.tt(z,!1)}x=this.hP.gDo()
-if(x==null)this.Do=null
-else{z=this.t8
-if(z.gbP(z)==null)if(z.glT())this.Do=x
-else this.Do=K.eC(x,y)
+y=z.tt(z,!1)}x=this.hP.gLv()
+if(x==null)this.Lv=null
+else{z=this.KL
+if(z.gbP(z)==null)if(z.glT())this.Lv=x
+else this.Lv=K.Ku(x,y)
 else if(J.xC(z.gbP(z),"[]")){if(0>=y.length)throw H.e(y,0)
 w=y[0]
 z=J.U6(x)
-this.Do=z.t(x,w)
-if(typeof x==="object"&&x!==null&&!!z.$iswn)this.Ni=z.gqh(x).yI(new K.vQ(this,a,w))}else{v=H.vn(x)
-u=new H.GD(H.bK(z.gbP(z)))
-this.Do=z.glT()?v.rN(u).Ax:v.F2(u,y,null).Ax
+this.Lv=z.t(x,w)
+if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gqh(x).yI(new K.vQ(this,a,w))}else{v=H.vn(x)
+u=new H.GD(H.le(z.gbP(z)))
+this.Lv=z.glT()?v.rN(u).Ax:v.F2(u,y,null).Ax
 z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$iswn)this.Ni=z.gqh(x).yI(new K.jh(this,a,u))}}},
-Yx:function(a,b){return b.Y7(this)},
+if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gqh(x).yI(new K.jh(this,a,u))}}},
+RR:function(a,b){return b.Y7(this)},
 $asAy:function(){return[U.RW]},
-$isRW:true},WW:{"":"Tp;",
-call$1:function(a){return a.gDo()},
+$isRW:true,
+$ishw:true},WW:{"":"Tp;",
+call$1:function(a){return a.gLv()},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},vQ:{"":"Tp;a,b,c",
-call$1:function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.PI(this.b)},
+call$1:function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
@@ -19204,7 +18391,7 @@
 $isEH:true,
 $is_HB:true,
 $is_Dv:true},jh:{"":"Tp;e,f,g",
-call$1:function(a){if(J.ja(a,new K.e3(this.g))===!0)this.e.PI(this.f)},
+call$1:function(a){if(J.ja(a,new K.e3(this.g))===!0)this.e.DX(this.f)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
@@ -19214,31 +18401,26 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},VA:{"":"Ay;Bb>,ip>,t8,qF,Ni,Do,ax",
-IJ:function(a){var z,y,x,w
+$is_Dv:true},VA:{"":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
+Qh:function(a){var z,y,x,w
 z=this.Bb
-y=this.ip.gDo()
-x=J.RE(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$iscX)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(typeof y==="object"&&y!==null&&!!x.$isPc)this.Ni=x.gqh(y).yI(new K.J1(this,a))
+y=this.T8.gLv()
+x=J.x(y)
+if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$iscX)&&y!=null)throw H.b(K.yN("right side of 'in' is not an iterator"))
+if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gRT().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Do=new K.fk(x,w)},
-Yx:function(a,b){return b.ky(this)},
+this.Lv=new K.fk(x,w)},
+RR:function(a,b){return b.ky(this)},
 $asAy:function(){return[U.K9]},
-$isK9:true},J1:{"":"Tp;a,b",
-call$1:function(a){if(J.ja(a,new K.JH())===!0)this.a.PI(this.b)},
+$isK9:true,
+$ishw:true},J1:{"":"Tp;a,b",
+call$1:function(a){return this.a.DX(this.b)},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},JH:{"":"Tp;",
-call$1:function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isW4},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},fk:{"":"a;F5,bm",$isfk:true},wL:{"":"a;UR,ex",
-call$1:function(a){return this.UR.F2(this.ex,[a],null).Ax},
+$is_Dv:true},fk:{"":"a;kF,bm",$isfk:true},wL:{"":"a;lR,ex",
+call$1:function(a){return this.lR.F2(this.ex,[a],null).Ax},
 "+call:1:0":0,
 $iswL:true,
 $isEH:true,
@@ -19246,10 +18428,10 @@
 $is_Dv:true},B0:{"":"a;G1>",
 bu:function(a){return"EvalException: "+this.G1},
 $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,x
-if(a==null?b==null:a===b)return!0
+static:{yN:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{ZP:function(a,b){var z,y,x
+z=J.x(a)
+if(z.n(a,b))return!0
 if(a==null||b==null)return!1
-z=J.U6(a)
 if(!J.xC(z.gB(a),b.length))return!1
 y=0
 while(!0){x=z.gB(a)
@@ -19258,11 +18440,11 @@
 x=z.t(a,y)
 if(y>=b.length)throw H.e(b,y)
 if(!J.xC(x,b[y]))return!1;++y}return!0},au:function(a){a.toString
-return U.OT(H.n3(a,0,new U.xs()))},dj:function(a,b){var z=J.WB(a,b)
+return U.Up(H.n3(a,0,new U.xs()))},Zm:function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")throw H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return(a^C.jn.m(a,6))>>>0},OT:function(a){if(typeof a!=="number")throw H.s(a)
+return(a^C.jn.m(a,6))>>>0},Up:function(a){if(typeof a!=="number")throw H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^C.jn.m(a,11))>>>0
 return 536870911&a+((16383&a)<<15>>>0)},Fq:{"":"a;",
@@ -19270,371 +18452,358 @@
 "+invoke:3:0":0,
 "*invoke":[35],
 CI:function(a,b){return this.F2(a,b,null)},
-"+invoke:2:0":0},Af:{"":"a;"},EZ:{"":"Af;",
-Yx:function(a,b){return b.W9(this)},
-$isEZ:true},no:{"":"Af;P>",
+"+invoke:2:0":0},hw:{"":"a;",$ishw:true},EZ:{"":"hw;",
+RR:function(a,b){return b.W9(this)},
+$isEZ:true},no:{"":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-Yx:function(a,b){return b.I6(this)},
+RR:function(a,b){return b.I6(this)},
 bu:function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isno",[H.ip(this,"no",0)],"$asno")
+z=H.RB(b,"$isno",[H.W8(this,"no",0)],"$asno")
 return z&&J.xC(J.Vm(b),this.P)},
-gEo:function(a){return J.le(this.P)},
-$isno:true},kB:{"":"Af;Pu>",
-Yx:function(a,b){return b.o0(this)},
+giO:function(a){return J.v1(this.P)},
+$isno:true},kB:{"":"hw;Pu>",
+RR:function(a,b){return b.o0(this)},
 bu:function(a){return"{"+H.d(this.Pu)+"}"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},
-gEo:function(a){return U.au(this.Pu)},
-$iskB:true},dC:{"":"Af;G3>,v4<",
-Yx:function(a,b){return b.YV(this)},
+return typeof b==="object"&&b!==null&&!!z.$iskB&&U.ZP(z.gPu(b),this.Pu)},
+giO:function(a){return U.au(this.Pu)},
+$iskB:true},ae:{"":"hw;G3>,v4<",
+RR:function(a,b){return b.YV(this)},
 bu:function(a){return H.d(this.G3)+": "+H.d(this.v4)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$isdC)z=J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)
-else z=!1
-return z},
-gEo:function(a){var z,y
-z=J.le(this.G3.P)
-y=J.le(this.v4)
-return U.OT(U.dj(U.dj(0,z),y))},
-$isdC:true},Iq:{"":"Af;wz<",
-Yx:function(a,b){return b.LT(this)},
+return typeof b==="object"&&b!==null&&!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
+giO:function(a){var z,y
+z=J.v1(this.G3.P)
+y=J.v1(this.v4)
+return U.Up(U.Zm(U.Zm(0,z),y))},
+$isae:true},Iq:{"":"hw;wz",
+RR:function(a,b){return b.LT(this)},
 bu:function(a){return"("+H.d(this.wz)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 return typeof b==="object"&&b!==null&&!!z.$isIq&&J.xC(b.wz,this.wz)},
-gEo:function(a){return J.le(this.wz)},
-$isIq:true},w6:{"":"Af;P>",
+giO:function(a){return J.v1(this.wz)},
+$isIq:true},w6:{"":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-Yx:function(a,b){return b.qv(this)},
+RR:function(a,b){return b.qv(this)},
 bu:function(a){return this.P},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
 return typeof b==="object"&&b!==null&&!!z.$isw6&&J.xC(z.gP(b),this.P)},
-gEo:function(a){return J.le(this.P)},
-$isw6:true},jK:{"":"Af;kp>,wz<",
-Yx:function(a,b){return b.Hx(this)},
+giO:function(a){return J.v1(this.P)},
+$isw6:true},jK:{"":"hw;kp>,wz<",
+RR:function(a,b){return b.Hx(this)},
 bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$isjK)z=J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)
-else z=!1
-return z},
-gEo:function(a){var z,y
-z=J.le(this.kp)
-y=J.le(this.wz)
-return U.OT(U.dj(U.dj(0,z),y))},
-$isjK:true},uk:{"":"Af;kp>,Bb>,ip>",
-Yx:function(a,b){return b.im(this)},
-bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.ip)+")"},
+return typeof b==="object"&&b!==null&&!!z.$isjK&&J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)},
+giO:function(a){var z,y
+z=J.v1(this.kp)
+y=J.v1(this.wz)
+return U.Up(U.Zm(U.Zm(0,z),y))},
+$isjK:true},uk:{"":"hw;kp>,Bb>,T8>",
+RR:function(a,b){return b.im(this)},
+bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$isuk)z=J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gip(b),this.ip)
-else z=!1
-return z},
-gEo:function(a){var z,y,x
-z=J.le(this.kp)
-y=J.le(this.Bb)
-x=J.le(this.ip)
-return U.OT(U.dj(U.dj(U.dj(0,z),y),x))},
-$isuk:true},K9:{"":"Af;Bb>,ip>",
-Yx:function(a,b){return b.ky(this)},
-bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.ip)+")"},
+return typeof b==="object"&&b!==null&&!!z.$isuk&&J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+giO:function(a){var z,y,x
+z=J.v1(this.kp)
+y=J.v1(this.Bb)
+x=J.v1(this.T8)
+return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
+$isuk:true},K9:{"":"hw;Bb>,T8>",
+RR:function(a,b){return b.ky(this)},
+bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$isK9)z=J.xC(z.gBb(b),this.Bb)&&J.xC(z.gip(b),this.ip)
-else z=!1
-return z},
-gEo:function(a){var z,y
+return typeof b==="object"&&b!==null&&!!z.$isK9&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+giO:function(a){var z,y
 z=this.Bb
-z=z.gEo(z)
-y=J.le(this.ip)
-return U.OT(U.dj(U.dj(0,z),y))},
-$isK9:true},RW:{"":"Af;hP<,bP>,re<",
-Yx:function(a,b){return b.Y7(this)},
+z=z.giO(z)
+y=J.v1(this.T8)
+return U.Up(U.Zm(U.Zm(0,z),y))},
+$isK9:true},RW:{"":"hw;hP<,bP>,re<",
+RR:function(a,b){return b.Y7(this)},
 glT:function(){return this.re==null},
 bu:function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$isRW)z=J.xC(b.ghP(),this.hP)&&J.xC(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)
-else z=!1
-return z},
-gEo:function(a){var z,y,x
-z=J.le(this.hP)
-y=J.le(this.bP)
+return typeof b==="object"&&b!==null&&!!z.$isRW&&J.xC(b.ghP(),this.hP)&&J.xC(z.gbP(b),this.bP)&&U.ZP(b.gre(),this.re)},
+giO:function(a){var z,y,x
+z=J.v1(this.hP)
+y=J.v1(this.bP)
 x=U.au(this.re)
-return U.OT(U.dj(U.dj(U.dj(0,z),y),x))},
+return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isRW:true},xs:{"":"Tp;",
-call$2:function(a,b){return U.dj(a,J.le(b))},
+call$2:function(a,b){return U.Zm(a,J.v1(b))},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{FX:{"":"a;rp,Yf,mV,V6,NA",
+$is_bh:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{FX:{"":"a;Sk,Ix,ku,fL,lQ",
 oK:function(){var z,y
-this.mV=this.Yf.zl()
-z=this.mV
+this.ku=this.Ix.zl()
+z=this.ku
 z.toString
-y=new H.wi(z,z.length,0,null)
-H.VM(y,[H.ip(z,"Q",0)])
-this.V6=y
-this.Bp()
-return this.Te()},
-zM:function(a,b){var z
-if(a!=null){z=J.Iz(this.NA)
+y=new H.a7(z,z.length,0,null)
+H.VM(y,[H.W8(z,"Q",0)])
+this.fL=y
+this.w5()
+return this.o9()},
+Gd:function(a,b){var z
+if(a!=null){z=J.Iz(this.lQ)
 z=z==null?a!=null:z!==a}else z=!1
-if(!z)z=b!=null&&!J.xC(J.Vm(this.NA),b)
+if(!z)z=b!=null&&!J.xC(J.Vm(this.lQ),b)
 else z=!0
-if(z)throw H.b(Y.RV("Expected "+b+": "+H.d(this.NA)))
-this.NA=this.V6.G()?this.V6.M4:null},
-Bp:function(){return this.zM(null,null)},
-Te:function(){if(this.NA==null){this.rp.toString
-return C.fx}var z=this.ia()
-return z==null?null:this.oX(z,0)},
-oX:function(a,b){var z,y,x,w,v,u
-for(z=this.rp;y=this.NA,y!=null;){x=J.RE(y)
+if(z)throw H.b(Y.RV("Expected "+b+": "+H.d(this.lQ)))
+this.lQ=this.fL.G()?this.fL.mD:null},
+w5:function(){return this.Gd(null,null)},
+o9:function(){if(this.lQ==null){this.Sk.toString
+return C.OL}var z=this.Dl()
+return z==null?null:this.BH(z,0)},
+BH:function(a,b){var z,y,x,w,v,u
+for(z=this.Sk;y=this.lQ,y!=null;){x=J.RE(y)
 w=x.gfY(y)
-if(w===9)if(J.xC(x.gP(y),"(")){v=this.rD()
+if(w===9)if(J.xC(x.gP(y),"(")){v=this.qk()
 z.toString
-a=new U.RW(a,null,v)}else if(J.xC(J.Vm(this.NA),"[")){u=this.Ew()
+a=new U.RW(a,null,v)}else if(J.xC(J.Vm(this.lQ),"[")){u=this.bK()
 v=u==null?[]:[u]
 z.toString
 a=new U.RW(a,"[]",v)}else break
-else if(w===3){this.Bp()
-a=this.Xx(a,this.ia())}else if(w===10&&J.xC(x.gP(y),"in"))a=this.eV(a)
-else{y=this.NA
-if(J.Iz(y)===8&&J.J5(y.gG8(),b))a=this.ZJ(a)
+else if(w===3){this.w5()
+a=this.ct(a,this.Dl())}else if(w===10&&J.xC(x.gP(y),"in"))a=this.xo(a)
+else{y=this.lQ
+if(J.Iz(y)===8&&J.J5(y.gG8(),b))a=this.Tw(a)
 else break}}return a},
-Xx:function(a,b){var z,y
+ct:function(a,b){var z,y
 if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
-this.rp.toString
+this.Sk.toString
 return new U.RW(a,z,null)}else{if(typeof b==="object"&&b!==null&&!!b.$isRW){z=b.ghP()
 y=J.x(z)
 y=typeof z==="object"&&z!==null&&!!y.$isw6
 z=y}else z=!1
 if(z){z=J.Vm(b.ghP())
 y=b.gre()
-this.rp.toString
+this.Sk.toString
 return new U.RW(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},
-ZJ:function(a){var z,y,x,w
-z=this.NA
-this.Bp()
-y=this.ia()
-while(!0){x=this.NA
+Tw:function(a){var z,y,x,w
+z=this.lQ
+this.w5()
+y=this.Dl()
+while(!0){x=this.lQ
 if(x!=null){w=J.Iz(x)
 x=(w===8||w===3||w===9)&&J.xZ(x.gG8(),z.gG8())}else x=!1
 if(!x)break
-y=this.oX(y,this.NA.gG8())}x=J.Vm(z)
-this.rp.toString
+y=this.BH(y,this.lQ.gG8())}x=J.Vm(z)
+this.Sk.toString
 return new U.uk(x,a,y)},
-ia:function(){var z,y,x,w
-z=this.NA
+Dl:function(){var z,y,x,w
+z=this.lQ
 y=J.RE(z)
 if(y.gfY(z)===8){x=y.gP(z)
 z=J.x(x)
-if(z.n(x,"+")||z.n(x,"-")){this.Bp()
-z=J.Iz(this.NA)
-if(z===6){z=H.BU(H.d(x)+H.d(J.Vm(this.NA)),null,null)
-this.rp.toString
+if(z.n(x,"+")||z.n(x,"-")){this.w5()
+z=J.Iz(this.lQ)
+if(z===6){z=H.BU(H.d(x)+H.d(J.Vm(this.lQ)),null,null)
+this.Sk.toString
 x=new U.no(z)
 x.$builtinTypeInfo=[null]
-this.Bp()
-return x}else{y=this.rp
-if(z===7){z=H.mO(H.d(x)+H.d(J.Vm(this.NA)),null)
+this.w5()
+return x}else{y=this.Sk
+if(z===7){z=H.IH(H.d(x)+H.d(J.Vm(this.lQ)),null)
 y.toString
 x=new U.no(z)
 x.$builtinTypeInfo=[null]
-this.Bp()
-return x}else{w=this.oX(this.LY(),11)
+this.w5()
+return x}else{w=this.BH(this.lb(),11)
 y.toString
-return new U.jK(x,w)}}}else if(z.n(x,"!")){this.Bp()
-w=this.oX(this.LY(),11)
-this.rp.toString
-return new U.jK(x,w)}}return this.LY()},
-LY:function(){var z,y,x
-z=this.NA
+return new U.jK(x,w)}}}else if(z.n(x,"!")){this.w5()
+w=this.BH(this.lb(),11)
+this.Sk.toString
+return new U.jK(x,w)}}return this.lb()},
+lb:function(){var z,y,x
+z=this.lQ
 y=J.RE(z)
 switch(y.gfY(z)){case 10:x=y.gP(z)
 z=J.x(x)
-if(z.n(x,"this")){this.Bp()
-this.rp.toString
+if(z.n(x,"this")){this.w5()
+this.Sk.toString
 return new U.w6("this")}else if(z.n(x,"in"))return
 throw H.b(new P.AT("unrecognized keyword: "+H.d(x)))
-case 2:return this.ng()
-case 1:return this.ef()
-case 6:return this.DS()
-case 7:return this.xJ()
-case 9:if(J.xC(y.gP(z),"("))return this.I1()
-else if(J.xC(J.Vm(this.NA),"{"))return this.pH()
+case 2:return this.Cy()
+case 1:return this.qF()
+case 6:return this.Ud()
+case 7:return this.tw()
+case 9:if(J.xC(y.gP(z),"("))return this.Pj()
+else if(J.xC(J.Vm(this.lQ),"{"))return this.Wc()
 return
 default:return}},
-pH:function(){var z,y,x,w,v
+Wc:function(){var z,y,x,w,v
 z=[]
-y=this.rp
-do{this.Bp()
-x=this.NA
+y=this.Sk
+do{this.w5()
+x=this.lQ
 w=J.RE(x)
 if(w.gfY(x)===9&&J.xC(w.gP(x),"}"))break
-x=J.Vm(this.NA)
+x=J.Vm(this.lQ)
 y.toString
 v=new U.no(x)
 v.$builtinTypeInfo=[null]
-this.Bp()
-this.zM(5,":")
-z.push(new U.dC(v,this.Te()))
-x=this.NA}while(x!=null&&J.xC(J.Vm(x),","))
-this.zM(9,"}")
+this.w5()
+this.Gd(5,":")
+z.push(new U.ae(v,this.o9()))
+x=this.lQ}while(x!=null&&J.xC(J.Vm(x),","))
+this.Gd(9,"}")
 return new U.kB(z)},
-eV:function(a){var z,y
+xo:function(a){var z,y
 z=J.x(a)
 if(typeof a!=="object"||a===null||!z.$isw6)throw H.b(Y.RV("in... statements must start with an identifier"))
-this.Bp()
-y=this.Te()
-this.rp.toString
+this.w5()
+y=this.o9()
+this.Sk.toString
 return new U.K9(a,y)},
-ng:function(){var z,y,x
-if(J.xC(J.Vm(this.NA),"true")){this.Bp()
-this.rp.toString
+Cy:function(){var z,y,x
+if(J.xC(J.Vm(this.lQ),"true")){this.w5()
+this.Sk.toString
 z=new U.no(!0)
 H.VM(z,[null])
-return z}if(J.xC(J.Vm(this.NA),"false")){this.Bp()
-this.rp.toString
+return z}if(J.xC(J.Vm(this.lQ),"false")){this.w5()
+this.Sk.toString
 z=new U.no(!1)
 H.VM(z,[null])
-return z}if(J.xC(J.Vm(this.NA),"null")){this.Bp()
-this.rp.toString
+return z}if(J.xC(J.Vm(this.lQ),"null")){this.w5()
+this.Sk.toString
 z=new U.no(null)
 H.VM(z,[null])
-return z}y=this.Xi()
-x=this.rD()
+return z}y=this.nt()
+x=this.qk()
 if(x==null)return y
-else{this.rp.toString
+else{this.Sk.toString
 return new U.RW(y,null,x)}},
-Xi:function(){var z,y,x
-z=this.NA
+nt:function(){var z,y,x
+z=this.lQ
 y=J.RE(z)
 if(y.gfY(z)!==2)throw H.b(Y.RV("expected identifier: "+H.d(z)+".value"))
 x=y.gP(z)
-this.Bp()
-this.rp.toString
+this.w5()
+this.Sk.toString
 return new U.w6(x)},
-rD:function(){var z,y,x
-z=this.NA
+qk:function(){var z,y,x
+z=this.lQ
 if(z!=null){y=J.RE(z)
 z=y.gfY(z)===9&&J.xC(y.gP(z),"(")}else z=!1
 if(z){x=[]
-do{this.Bp()
-z=this.NA
+do{this.w5()
+z=this.lQ
 y=J.RE(z)
 if(y.gfY(z)===9&&J.xC(y.gP(z),")"))break
-x.push(this.Te())
-z=this.NA}while(z!=null&&J.xC(J.Vm(z),","))
-this.zM(9,")")
+x.push(this.o9())
+z=this.lQ}while(z!=null&&J.xC(J.Vm(z),","))
+this.Gd(9,")")
 return x}return},
-Ew:function(){var z,y,x
-z=this.NA
+bK:function(){var z,y,x
+z=this.lQ
 if(z!=null){y=J.RE(z)
 z=y.gfY(z)===9&&J.xC(y.gP(z),"[")}else z=!1
-if(z){this.Bp()
-x=this.Te()
-this.zM(9,"]")
+if(z){this.w5()
+x=this.o9()
+this.Gd(9,"]")
 return x}return},
-I1:function(){this.Bp()
-var z=this.Te()
-this.zM(9,")")
-this.rp.toString
+Pj:function(){this.w5()
+var z=this.o9()
+this.Gd(9,")")
+this.Sk.toString
 return new U.Iq(z)},
-ef:function(){var z,y
-z=J.Vm(this.NA)
-this.rp.toString
+qF:function(){var z,y
+z=J.Vm(this.lQ)
+this.Sk.toString
 y=new U.no(z)
 H.VM(y,[null])
-this.Bp()
+this.w5()
 return y},
-iV:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.NA)),null,null)
-this.rp.toString
+pT:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.lQ)),null,null)
+this.Sk.toString
 y=new U.no(z)
 H.VM(y,[null])
-this.Bp()
+this.w5()
 return y},
-DS:function(){return this.iV("")},
-u3:function(a){var z,y
-z=H.mO(H.d(a)+H.d(J.Vm(this.NA)),null)
-this.rp.toString
+Ud:function(){return this.pT("")},
+yj:function(a){var z,y
+z=H.IH(H.d(a)+H.d(J.Vm(this.lQ)),null)
+this.Sk.toString
 y=new U.no(z)
 H.VM(y,[null])
-this.Bp()
+this.w5()
 return y},
-xJ:function(){return this.u3("")},
-static:{ww:function(a,b){var z,y
-z=P.p9("")
-y=new U.Fq()
-return new T.FX(y,new Y.hc([],z,new P.WU(a,0,0,null),null),null,null,null)}}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{Dc:function(a){var z=new K.Bt(a)
+tw:function(){return this.yj("")},
+static:{ww:function(a,b){var z,y,x
+z=[]
+H.VM(z,[Y.Pn])
+y=P.p9("")
+x=new U.Fq()
+return new T.FX(x,new Y.hc(z,y,new P.WU(a,0,0,null),null),null,null,null)}}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{Dc:function(a){var z=new K.Bt(a)
 H.VM(z,[null])
-return z},O1:{"":"a;vH>-,P>-",
+return z},Ae:{"":"a;vH>-,P>-",
 r6:function(a,b){return this.P.call$1(b)},
-$isO1:true,
+$isAe:true,
 "@":function(){return[C.nJ]},
 "<>":[3],
-static:{i0:function(a,b,c){var z=new K.O1(a,b)
+static:{i0:function(a,b,c){var z=new K.Ae(a,b)
 H.VM(z,[c])
 return z
-"25,26,27,28,29"},"+new IndexedValue:2:0":1}},"+IndexedValue": [],Bt:{"":"mW;YR",
+"25,26,27,28,29"},"+new IndexedValue:2:0":1}},"+IndexedValue": [0],Bt:{"":"mW;YR",
 gA:function(a){var z=J.GP(this.YR)
 z=new K.vR(z,0,null)
-H.VM(z,[H.ip(this,"Bt",0)])
+H.VM(z,[H.W8(this,"Bt",0)])
 return z},
 gB:function(a){return J.q8(this.YR)},
 "+length":0,
 gl0:function(a){return J.FN(this.YR)},
 "+isEmpty":0,
-gFV:function(a){var z=J.n9(this.YR)
-z=new K.O1(0,z)
-H.VM(z,[H.ip(this,"Bt",0)])
-return z},
 grZ:function(a){var z,y,x
 z=this.YR
 y=J.U6(z)
 x=J.xH(y.gB(z),1)
 z=y.grZ(z)
-z=new K.O1(x,z)
-H.VM(z,[H.ip(this,"Bt",0)])
+z=new K.Ae(x,z)
+H.VM(z,[H.W8(this,"Bt",0)])
 return z},
 Zv:function(a,b){var z=J.i4(this.YR,b)
-z=new K.O1(b,z)
-H.VM(z,[H.ip(this,"Bt",0)])
+z=new K.Ae(b,z)
+H.VM(z,[H.W8(this,"Bt",0)])
 return z},
-$asmW:function(a){return[[K.O1,a]]},
-$ascX:function(a){return[[K.O1,a]]}},vR:{"":"Yl;Ee,wX,CD",
+$asmW:function(a){return[[K.Ae,a]]},
+$ascX:function(a){return[[K.Ae,a]]}},vR:{"":"Fl;Ee,wX,CD",
 gl:function(){return this.CD},
 "+current":0,
 G:function(){var z,y
 z=this.Ee
 if(z.G()){y=this.wX
 this.wX=y+1
-z=new K.O1(y,z.gl())
+z=new K.Ae(y,z.gl())
 H.VM(z,[null])
 this.CD=z
 return!0}this.CD=null
 return!1},
-$asYl:function(a){return[[K.O1,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{xq:function(a,b){var z,y,x
-z=J.RE(a)
-if(z.glc(a).x4(b)===!0)return J.UQ(z.glc(a),b)
-y=a.gAY()
-if(y!=null&&!J.xC(y.gvd(),C.PU)){x=Z.xq(a.gAY(),b)
-if(x!=null)return x}for(z=J.GP(a.gkZ());z.G();){x=Z.xq(z.gl(),b)
-if(x!=null)return x}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{TI:function(a){var z
+$asFl:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{xq:function(a,b){var z,y,x
+if(a.gYK().x4(b)===!0)return J.UQ(a.gYK(),b)
+z=a.gAY()
+if(z!=null&&!J.xC(z.gvd(),C.PU)){y=Z.xq(a.gAY(),b)
+if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.xq(x.gl(),b)
+if(y!=null)return y}return}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{TI:function(a){var z
 if(typeof a!=="number")throw H.s(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90||a===95||a===36||a>127
 else z=!0
@@ -19650,13 +18819,14 @@
 case 118:return 11
 default:return a}},Pn:{"":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
-bu:function(a){return"("+this.fY+", '"+this.P+"')"}},hc:{"":"a;MV,wV,jI,x0",
+bu:function(a){return"("+this.fY+", '"+this.P+"')"},
+$isPn:true},hc:{"":"a;MV,wV,jI,x0",
 zl:function(){var z,y,x,w,v
 z=this.jI
 this.x0=z.G()?z.Wn:null
 for(y=this.MV;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.Wn:null
-else if(x===34||x===39)this.WG()
-else if(Y.TI(x))this.zI()
+else if(x===34||x===39)this.DS()
+else if(Y.TI(x))this.y3()
 else{x=this.x0
 if(typeof x!=="number")throw H.s(x)
 if(48<=x&&x<=57)this.jj()
@@ -19666,13 +18836,13 @@
 if(48<=x&&x<=57)this.e1()
 else y.push(new Y.Pn(3,".",11))}else if(x===44){this.x0=z.G()?z.Wn:null
 y.push(new Y.Pn(4,",",0))}else if(x===58){this.x0=z.G()?z.Wn:null
-y.push(new Y.Pn(5,":",0))}else if(C.Nm.tg(C.xu,x))this.Hp()
+y.push(new Y.Pn(5,":",0))}else if(C.Nm.tg(C.xu,x))this.yV()
 else if(C.Nm.tg(C.iq,this.x0)){w=P.O8(1,this.x0,J.im)
 w.$builtinTypeInfo=[J.im]
 v=H.eT(w)
-y.push(new Y.Pn(9,v,C.Ur.t(C.Ur,v)))
+y.push(new Y.Pn(9,v,C.dj.t(C.dj,v)))
 this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
-WG:function(){var z,y,x,w,v
+DS:function(){var z,y,x,w,v
 z=this.x0
 y=this.jI
 this.x0=y.G()?y.Wn:null
@@ -19689,7 +18859,7 @@
 x.vM=x.vM+w}this.x0=y.G()?y.Wn:null}this.MV.push(new Y.Pn(1,x.vM,0))
 x.vM=""
 this.x0=y.G()?y.Wn:null},
-zI:function(){var z,y,x,w,v
+y3:function(){var z,y,x,w,v
 z=this.jI
 y=this.wV
 while(!0){x=this.x0
@@ -19734,7 +18904,7 @@
 z.vM=z.vM+x
 this.x0=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
 z.vM=""},
-Hp:function(){var z,y,x,w,v,u
+yV:function(){var z,y,x,w,v,u
 z=this.x0
 y=this.jI
 this.x0=y.G()?y.Wn:null
@@ -19745,145 +18915,151 @@
 u.$builtinTypeInfo=[J.im]
 v=H.eT(u)}}else{u=P.O8(1,z,J.im)
 u.$builtinTypeInfo=[J.im]
-v=H.eT(u)}this.MV.push(new Y.Pn(8,v,C.Ur.t(C.Ur,v)))}},hA:{"":"a;G1>",
+v=H.eT(u)}this.MV.push(new Y.Pn(8,v,C.dj.t(C.dj,v)))}},hA:{"":"a;G1>",
 bu:function(a){return"ParseException: "+this.G1},
 static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{fr:{"":"a;",
-DV:function(a){return J.qg(a,this)},
-gnG:function(){return new H.Pm(this,S.fr.prototype.DV,null,"DV")}},cfS:{"":"fr;",
+DV:function(a){return J.UK(a,this)},
+gnG:function(){return new H.Pm(this,S.fr.prototype.DV,null,"DV")}},a0:{"":"fr;",
 W9:function(a){return this.xn(a)},
-LT:function(a){a.Yx(a,this)
+LT:function(a){a.RR(a,this)
 this.xn(a)},
 Y7:function(a){var z,y
-J.qg(a.ghP(),this)
+J.UK(a.ghP(),this)
 z=a.gre()
-if(z!=null)for(z.toString,y=new H.wi(z,z.length,0,null),H.VM(y,[H.ip(z,"Q",0)]);y.G();)J.qg(y.M4,this)
+if(z!=null)for(z.toString,y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G();)J.UK(y.mD,this)
 this.xn(a)},
 I6:function(a){return this.xn(a)},
 o0:function(a){var z,y
-for(z=a.gPu(a),y=new H.wi(z,z.length,0,null),H.VM(y,[H.ip(z,"Q",0)]);y.G();)J.qg(y.M4,this)
+for(z=a.gPu(a),y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G();)J.UK(y.mD,this)
 this.xn(a)},
-YV:function(a){J.qg(a.gG3(a),this)
-J.qg(a.gv4(),this)
+YV:function(a){J.UK(a.gG3(a),this)
+J.UK(a.gv4(),this)
 this.xn(a)},
 qv:function(a){return this.xn(a)},
-im:function(a){J.qg(a.gBb(a),this)
-J.qg(a.gip(a),this)
+im:function(a){J.UK(a.gBb(a),this)
+J.UK(a.gT8(a),this)
 this.xn(a)},
-Hx:function(a){J.qg(a.gwz(),this)
+Hx:function(a){J.UK(a.gwz(),this)
 this.xn(a)},
-ky:function(a){J.qg(a.gBb(a),this)
-J.qg(a.gip(a),this)
-this.xn(a)}}}],["response_viewer_element","package:observatory/src/observatory_elements/response_viewer.dart",,Q,{M9:{"":["uL;tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+ky:function(a){J.UK(a.gBb(a),this)
+J.UK(a.gT8(a),this)
+this.xn(a)}}}],["response_viewer_element","package:observatory/src/observatory_elements/response_viewer.dart",,Q,{NQ:{"":["uL;tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 "@":function(){return[C.Ig]},
 static:{Zo:function(a){var z,y,x,w,v
-z=$.R8()
+z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
-v=new B.br(P.Py(null,null,null,x,w),null,null)
+v=new V.br(P.Py(null,null,null,x,w),null,null)
 H.VM(v,[x,w])
 a.Ye=z
 a.mT=y
 a.KM=v
 C.Cc.ZL(a)
-C.Cc.XI(a)
+C.Cc.FH(a)
 return a
-"30"},"+new ResponseViewerElement$created:0:0":1}},"+ResponseViewerElement": []}],["stack_trace_element","package:observatory/src/observatory_elements/stack_trace.dart",,X,{uw:{"":["WZq;Qq%-,jH,Wd,tH-,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"30"},"+new ResponseViewerElement$created:0:0":1}},"+ResponseViewerElement": [24]}],["stack_trace_element","package:observatory/src/observatory_elements/stack_trace.dart",,X,{uw:{"":["WZq;Qq%-,VJ,Ai,tH-,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM-",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
 gtN:function(a){return a.Qq
 "32,33,34"},
 "+trace":1,
-stN:function(a,b){a.Qq=this.ct(a,C.Uu,a.Qq,b)
+stN:function(a,b){a.Qq=this.pD(a,C.kw,a.Qq,b)
 "35,28,32,33"},
 "+trace=":1,
 "@":function(){return[C.js]},
 static:{bV:function(a){var z,y,x,w,v,u
 z=H.B7([],P.L5(null,null,null,null,null))
-z=B.tB(z)
-y=$.R8()
+z=R.Jk(z)
+y=$.Nd()
 x=P.Py(null,null,null,J.O,W.I0)
 w=J.O
 v=W.cv
-u=new B.br(P.Py(null,null,null,w,v),null,null)
+u=new V.br(P.Py(null,null,null,w,v),null,null)
 H.VM(u,[w,v])
 a.Qq=z
 a.Ye=y
 a.mT=x
 a.KM=u
 C.bg.ZL(a)
-C.bg.XI(a)
+C.bg.FH(a)
 return a
-"31"},"+new StackTraceElement$created:0:0":1}},"+StackTraceElement": [],WZq:{"":"uL+Pi;",$iswn:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{IP:function(a){var z=J.RE(a)
+"31"},"+new StackTraceElement$created:0:0":1}},"+StackTraceElement": [102],WZq:{"":"uL+Pi;",$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{IP:function(a){var z=J.RE(a)
 if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.io.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)}},bM:function(a){var z,y
+switch(z.gr9(a)){case"checkbox":return $.FF().aM(a)
+case"radio":case"select-multiple":case"select-one":return z.gEr(a)
+default:return z.gLm(a)}},HP:function(a,b,c,d,e){var z,y,x,w
+if(b==null)return
+z=b.N2
+if(z!=null){M.Ky(a).wh(z)
+if(d!=null)M.Ky(a).sxT(d)}z=b.Cd
+if(z!=null)M.mV(z,a,c,e)
+z=b.wd
+if(z==null)return
+for(y=a.firstChild,x=0;y!=null;y=y.nextSibling,x=w){w=x+1
+if(x>=z.length)throw H.e(z,x)
+M.HP(y,z[x],c,d,e)}},bM:function(a){var z,y
 for(;z=J.RE(a),y=z.gKV(a),y!=null;a=y);if(typeof a==="object"&&a!==null&&!!z.$isYN||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},jo:function(a,b){var z,y,x,w
-z=J.RE(a)
-y=z.Yv(a,!1)
-x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$iscv)if(y.localName!=="template")x=x.gQg(y).MW.hasAttribute("template")===!0&&C.uE.x4(x.gqn(y))===!0
-else x=!0
-else x=!1
-if(x){M.Ky(y).wh(a)
-if(b!=null)M.Ky(y).sxT(b)}for(w=z.gq6(a);w!=null;w=w.nextSibling)y.appendChild(M.jo(w,b))
-return y},ON:function(a,b,c){var z,y,x,w
+return},pN:function(a,b){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)y=M.F5(a)
-else if(typeof a==="object"&&a!==null&&!!z.$iskJ){x=M.WG(a.textContent)
-y=x!=null?["text",x]:null}else y=null
-if(y!=null)M.mV(y,a,b,c)
-for(w=a.firstChild;w!=null;w=w.nextSibling)M.ON(w,b,c)},F5:function(a){var z,y
+if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
+if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
+if(y!=null)return["text",y]}return},F5:function(a,b){var z,y
 z={}
 z.a=null
 z.b=!1
 z.c=!1
 y=new W.E9(a)
-y.aN(y,new M.NW(z,M.wR(a)))
+y.aN(y,new M.NW(z,a,b,M.wR(a)))
 if(z.b&&!z.c){if(z.a==null)z.a=[]
 y=z.a
 y.push("bind")
-y.push(M.WG("{{}}"))}return z.a},mV:function(a,b,c,d){var z,y,x,w
-for(z=0;y=a.length,z<y;z+=2){x=a[z]
-w=z+1
-if(w>=y)throw H.e(a,w)
-M.Wh(b,x,a[w],c,d)}},Wh:function(a,b,c,d,e){var z,y,x,w
-z=J.U6(c)
-if(J.xC(z.gB(c),3)&&J.FN(z.t(c,0))===!0&&J.FN(z.t(c,2))===!0){M.wP(a,b,d,z.t(c,1),e)
-return}y=new B.zF(null,P.L5(null,null,null,null,null),P.L5(null,null,null,null,null),null,!1,null,null)
-y.yZ=null
-y.vY=!0
-y.yZ=new M.Hh(c)
-y.fu()
-x=1
-while(!0){w=z.gB(c)
-if(typeof w!=="number")throw H.s(w)
-if(!(x<w))break
-M.wP(y,x,d,z.t(c,x),e)
-x+=2}y.WS()
-z=J.x(a)
-J.kk(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a),b,y,"value")},wP:function(a,b,c,d,e){var z,y
-if(e!=null){e.toString
-z=A.j3(c,d,b,a,T.G3.prototype.ghA.call(e))
-if(z!=null){c=z
-d="value"}}y=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!y.$iszF)y.Zf(a,b,c,d)
-else J.kk(typeof a==="object"&&a!==null&&!!y.$ishs?a:M.Ky(a),b,c,d)},WG:function(a){var z,y,x,w,v,u
+y.push(M.F4("{{}}","bind",a,b))}return z.a},mV: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=d!=null,y=J.x(b),y=typeof b==="object"&&b!==null&&!!y.$ishs,x=0;w=a.length,x<w;x+=2){v=a[x]
+u=x+1
+if(u>=w)throw H.e(a,u)
+t=a[u]
+u=t.gEJ()
+if(1>=u.length)throw H.e(u,1)
+s=u[1]
+if(t.gqz()){w=t.gEJ()
+if(2>=w.length)throw H.e(w,2)
+r=w[2]
+if(r!=null){q=r.call$2(c,b)
+if(q!=null){p=q
+s="value"}else p=c}else p=c
+if(!t.gaW()){p=L.ao(p,s,t.gcK())
+s="value"}}else{o=new Y.J3([],[],null,t.gcK(),!1,!1,null,null)
+for(w=o.b9,n=1;u=t.gEJ(),m=u.length,n<m;n+=3){l=u[n]
+k=n+1
+if(k>=m)throw H.e(u,k)
+r=u[k]
+q=r!=null?r.call$2(c,b):null
+if(q!=null){j=q
+l="value"}else j=c
+if(o.YX)H.vh(new P.lj("Cannot add more paths once started."))
+w.push(L.ao(j,l,null))}o.wE(o)
+p=o
+s="value"}i=J.tb(y?b:M.Ky(b),v,p,s)
+if(z)d.push(i)}},F4:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.U6(a)
 if(z.gl0(a)===!0)return
 y=z.gB(a)
 if(typeof y!=="number")throw H.s(y)
-x=null
-w=0
-for(;w<y;){v=z.XU(a,"{{",w)
-u=v<0?-1:z.XU(a,"}}",v+2)
-if(u<0){if(x==null)return
-x.push(z.yn(a,w))
-break}if(x==null)x=[]
-x.push(z.JT(a,w,v))
-x.push(C.xB.bS(z.JT(a,v+2,u)))
-w=u+2}if(w===y)x.push("")
-return x},cZ:function(a,b){var z,y,x
+x=d==null
+w=null
+v=0
+for(;v<y;){u=z.XU(a,"{{",v)
+t=u<0?-1:z.XU(a,"}}",u+2)
+if(t<0){if(w==null)return
+w.push(z.yn(a,v))
+break}if(w==null)w=[]
+w.push(z.JT(a,v,u))
+s=C.xB.bS(z.JT(a,u+2,t))
+w.push(s)
+if(x)r=null
+else{d.toString
+r=A.lJ(s,b,c,T.e9.prototype.gca.call(d))}w.push(r)
+v=t+2}if(v===y)w.push("")
+return M.hp(w)},cZ:function(a,b){var z,y,x
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
@@ -19892,89 +19068,82 @@
 x=x.nextSibling}},Ky:function(a){var z,y,x
 z=$.cm()
 z.toString
-y=H.VK(a,"expando$values")
-x=y==null?null:H.VK(y,z.J4())
+y=H.of(a,"expando$values")
+x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
 z=J.RE(a)
 if(typeof a==="object"&&a!==null&&!!z.$isMi)x=new M.ee(a,null,null)
 else if(typeof a==="object"&&a!==null&&!!z.$islp)x=new M.ug(a,null,null)
 else if(typeof a==="object"&&a!==null&&!!z.$isAE)x=new M.VT(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!z.$iscv){if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+else if(typeof a==="object"&&a!==null&&!!z.$iscv){if(z.gjU(a)!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gjU(a))===!0
 else z=!0
-x=z?new M.DT(null,null,null,!1,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!z.$iskJ?new M.XT(a,null,null):new M.hs(a,null,null)
+x=z?new M.DT(null,null,null,!1,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!z.$iskJ?new M.XT(a,null,null):new M.hs(a,null,null)
 z=$.cm()
 z.u(z,a,x)
 return x},wR:function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+if(typeof a==="object"&&a!==null&&!!z.$iscv)if(z.gjU(a)!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gjU(a))===!0
 else z=!0
 else z=!1
-return z},V2:{"":"hs;N1,mD,Ck",
-Zf:function(a,b,c,d){var z,y,x
+return z},V2:{"":"hs;N1,bn,Ck",
+Z1:function(a,b,c,d){var z,y,x
+J.MV(this.glN(),b)
 z=this.gN1()
 y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?this.gN1():this,b)
-z=this.gN1()
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isQl&&J.xC(b,"value")){z=J.MX(this.gN1())
+if(typeof z==="object"&&z!==null&&!!y.$isQl&&J.xC(b,"value")){z=H.Go(this.gN1(),"$isQl")
+z.toString
+z=new W.E9(z)
 z.Rz(z,b)
 z=this.gN1()
 y=d!=null?d:""
-x=new M.rP(null,z,c,null,null,"value",y)
-x.CX()
+x=new M.jY(null,z,c,null,null,"value",y)
+x.Og(z,"value",c,d)
 x.Ca=M.IP(z).yI(x.gqf())}else x=M.hN(this.gN1(),b,c,d)
 z=this.gCd(this)
 z.u(z,b,x)
-return x}},D8:{"":"TR;Y0,N1,lr,ND,B5,eS,ay",
-gH:function(){return M.TR.prototype.gH.call(this)},
+return x}},D8:{"":"TR;Y0,LO,ZY,xS,PB,eS,Ii",
 EC:function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
 y=this.eS
-if(z)J.MX(M.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
-else{z=J.MX(M.TR.prototype.gH.call(this))
-z.Rz(z,y)}}else{z=J.MX(M.TR.prototype.gH.call(this))
+if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
+else{z=J.Vs(X.TR.prototype.gH.call(this))
+z.Rz(z,y)}}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
 z.MW.setAttribute(this.eS,y)}},
-gH0:function(){return new H.Pm(this,M.D8.prototype.EC,null,"EC")},
 static:{hN:function(a,b,c,d){var z,y,x
 z=J.rY(b)
 y=z.Tc(b,"?")
-if(y){x=J.MX(a)
+if(y){x=J.Vs(a)
 x.Rz(x,b)
 b=z.JT(b,0,J.xH(z.gB(b),1))}z=d!=null?d:""
 z=new M.D8(y,a,c,null,null,b,z)
-z.CX()
-return z}}},rP:{"":"NP;Ca,N1,lr,ND,B5,eS,ay",
+z.Og(a,b,c,d)
+return z}}},jY:{"":"NP;Ca,LO,ZY,xS,PB,eS,Ii",
 gH:function(){return M.NP.prototype.gH.call(this)},
 EC:function(a){var z,y,x,w,v,u
-z=J.cp(M.NP.prototype.gH.call(this))
+z=J.Lp(M.NP.prototype.gH.call(this))
 y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.QE(M.Ky(z))
-w=x.t(x,"value")
-x=J.x(w)
-if(typeof w==="object"&&w!==null&&!!x.$isSA){v=z.value
-u=w}else{v=null
+if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
+w=J.x(x)
+if(typeof x==="object"&&x!==null&&!!w.$isSA){v=z.value
+u=x}else{v=null
 u=null}}else{v=null
 u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gN1()!=null&&!J.xC(y.gP(z),v))u.FC(null)},
-gH0:function(){return new H.Pm(this,M.rP.prototype.EC,null,"EC")}},ll:{"":"TR;",
-gH0:function(){return new H.Pm(this,M.ll.prototype.EC,null,"EC")},
-gqf:function(){return new H.Pm(this,M.ll.prototype.FC,null,"FC")},
-cO:function(a){if(this.N1==null)return
+if(u!=null&&u.gLO()!=null&&!J.xC(y.gP(z),v))u.FC(null)}},ll:{"":"TR;",
+cO:function(a){if(this.LO==null)return
 this.Ca.ed()
-M.TR.prototype.cO.call(this,this)},
-gJK:function(a){return new H.MT(this,M.ll.prototype.cO,a,"cO")}},lP:{"":"Tp;",
+X.TR.prototype.cO.call(this,this)}},Uf:{"":"Tp;",
 call$0:function(){var z,y,x,w,v
-z=document.createElement("div",null).appendChild(W.en(null))
+z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
-y.st5(z,"checkbox")
+y.sr9(z,"checkbox")
 x=[]
 w=y.gVl(z)
 v=new W.Ov(0,w.uv,w.Ph,W.aF(new M.ik(x)),w.Sg)
-H.VM(v,[H.ip(w,"RO",0)])
+H.VM(v,[H.W8(w,"RO",0)])
 v.Zz()
-y=y.gi9(z)
+y=y.gEr(z)
 v=new W.Ov(0,y.uv,y.Ph,W.aF(new M.LfS(x)),y.Sg)
-H.VM(v,[H.ip(y,"RO",0)])
+H.VM(v,[H.W8(y,"RO",0)])
 v.Zz()
 z.dispatchEvent(W.H6("click",!1,0,!0,!0,0,0,!1,0,!1,null,0,0,!1,window))
 return x.length===1?C.mt:C.Nm.gFV(x)},
@@ -19990,29 +19159,25 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},NP:{"":"ll;Ca,N1,lr,ND,B5,eS,ay",
-gH:function(){return M.TR.prototype.gH.call(this)},
+$is_Dv:true},NP:{"":"ll;Ca,LO,ZY,xS,PB,eS,Ii",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:function(a){var z=this.gH()
 J.ta(z,a==null?"":H.d(a))},
-gH0:function(){return new H.Pm(this,M.NP.prototype.EC,null,"EC")},
 FC:function(a){var z=J.Vm(this.gH())
-J.ta(this.ND,z)
+J.ta(this.xS,z)
 O.Y3()},
-gqf:function(){return new H.Pm(this,M.NP.prototype.FC,null,"FC")}},Vh:{"":"ll;Ca,N1,lr,ND,B5,eS,ay",
-gH:function(){return M.TR.prototype.gH.call(this)},
-EC:function(a){var z=M.TR.prototype.gH.call(this)
-J.Ae(z,null!=a&&!1!==a)},
-gH0:function(){return new H.Pm(this,M.Vh.prototype.EC,null,"EC")},
-FC:function(a){var z,y,x,w,v
-z=J.K0(M.TR.prototype.gH.call(this))
-J.ta(this.ND,z)
-z=M.TR.prototype.gH.call(this)
+gqf:function(){return new H.Pm(this,M.NP.prototype.FC,null,"FC")}},Vh:{"":"ll;Ca,LO,ZY,xS,PB,eS,Ii",
+EC:function(a){var z=X.TR.prototype.gH.call(this)
+J.rP(z,null!=a&&!1!==a)},
+FC:function(a){var z,y,x,w
+z=J.Hf(X.TR.prototype.gH.call(this))
+J.ta(this.xS,z)
+z=X.TR.prototype.gH.call(this)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.xC(J.zH(M.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(M.TR.prototype.gH.call(this)));z.G();){x=z.gl()
+if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.xC(J.Ja(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){x=z.gl()
 y=J.x(x)
-w=J.QE(typeof x==="object"&&x!==null&&!!y.$ishs?x:M.Ky(x))
-v=w.t(w,"checked")
-if(v!=null)J.ta(v,!1)}O.Y3()},
+w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$ishs?x:M.Ky(x)),"checked")
+if(w!=null)J.ta(w,!1)}O.Y3()},
 gqf:function(){return new H.Pm(this,M.Vh.prototype.FC,null,"FC")},
 static:{kv:function(a){var z,y,x,w
 z=J.RE(a)
@@ -20027,7 +19192,7 @@
 z=this.a
 y=J.x(a)
 if(!y.n(a,z))if(typeof a==="object"&&a!==null&&!!y.$isMi)if(a.type==="radio"){y=a.name
-z=J.tE(z)
+z=J.DA(z)
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
@@ -20041,31 +19206,29 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},SA:{"":"ll;Ca,N1,lr,ND,B5,eS,ay",
-gH:function(){return M.TR.prototype.gH.call(this)},
+$is_Dv:true},SA:{"":"ll;Ca,LO,ZY,xS,PB,eS,Ii",
 EC:function(a){var z={}
 if(this.Gh(a)===!0)return
 z.a=4
 P.rb(new M.zV(z,this,a))},
-gH0:function(){return new H.Pm(this,M.SA.prototype.EC,null,"EC")},
 Gh:function(a){var z,y,x
 z=this.eS
 y=J.x(z)
-if(y.n(z,"selectedIndex")){x=M.qb(a)
-J.Tq(M.TR.prototype.gH.call(this),x)
-z=J.m4(M.TR.prototype.gH.call(this))
-return z==null?x==null:z===x}else if(y.n(z,"value")){z=M.TR.prototype.gH.call(this)
+if(y.n(z,"selectedIndex")){x=M.oj(a)
+J.Mu(X.TR.prototype.gH.call(this),x)
+z=J.m4(X.TR.prototype.gH.call(this))
+return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
 J.ta(z,a==null?"":H.d(a))
-return J.xC(J.Vm(M.TR.prototype.gH.call(this)),a)}},
+return J.xC(J.Vm(X.TR.prototype.gH.call(this)),a)}},
 FC:function(a){var z,y
 z=this.eS
 y=J.x(z)
-if(y.n(z,"selectedIndex")){z=J.m4(M.TR.prototype.gH.call(this))
-J.ta(this.ND,z)}else if(y.n(z,"value")){z=J.Vm(M.TR.prototype.gH.call(this))
-J.ta(this.ND,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)}},
 gqf:function(){return new H.Pm(this,M.SA.prototype.FC,null,"FC")},
 $isSA:true,
-static:{qb:function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
+static:{oj:function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},zV:{"":"Tp;a,b,c",
 call$0:function(){var z,y
 if(this.b.Gh(this.c)!==!0){z=this.a
@@ -20081,117 +19244,166 @@
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},ee:{"":"V2;N1,mD,Ck",
+$is_Dv:true},ee:{"":"V2;N1,bn,Ck",
 gN1:function(){return this.N1},
-Zf:function(a,b,c,d){var z,y,x,w
+Z1:function(a,b,c,d){var z,y,x,w
 z=J.x(b)
-if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Zf.call(this,this,b,c,d)
+if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
 x=J.x(y)
 J.MV(typeof y==="object"&&y!==null&&!!x.$ishs?this.gN1():this,b)
-w=J.MX(this.N1)
+w=J.Vs(this.N1)
 w.Rz(w,b)
 w=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
 y=d!=null?d:""
 y=new M.NP(null,z,c,null,null,"value",y)
-y.CX()
+y.Og(z,"value",c,d)
 y.Ca=M.IP(z).yI(y.gqf())
 z=y}else{z=this.N1
 y=d!=null?d:""
 y=new M.Vh(null,z,c,null,null,"checked",y)
-y.CX()
+y.Og(z,"checked",c,d)
 y.Ca=M.IP(z).yI(y.gqf())
 z=y}w.u(w,b,z)
-return z}},hs:{"":"a;N1<,mD,Ck@",
-Zf:function(a,b,c,d){var z,y
+return z}},XI:{"":"a;Cd>,wd,N2,oA",static:{lX:function(a,b){var z,y,x,w,v,u,t,s,r
+z=M.pN(a,b)
+y=J.x(a)
+if(typeof a==="object"&&a!==null&&!!y.$iscv)if(y.gjU(a)!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gjU(a))===!0
+else x=!0
+else x=!1
+if(x){w=a
+v=!0}else{v=!1
+w=null}for(u=y.gq6(a),t=null,s=0;u!=null;u=u.nextSibling,++s){r=M.lX(u,b)
+if(t==null)t=P.A(y.gyT(a).NL.childNodes.length,null)
+if(s>=t.length)throw H.e(t,s)
+t[s]=r
+if(r.oA)v=!0}return new M.XI(z,t,w,v)}}},hs:{"":"a;N1<,bn,Ck?",
+Z1:function(a,b,c,d){var z,y
 window
 z=$.UT()
 y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
 z.toString
 if(typeof console!="undefined")console.error(y)},
 Ih:function(a,b){var z,y
-if(this.mD==null)return
+if(this.bn==null)return
 z=this.gCd(this)
 y=z.Rz(z,b)
 if(y!=null)J.wC(y)},
 GB:function(a){var z,y,x
-if(this.mD==null)return
-for(z=this.gCd(this),z=z.gUQ(z),y=z.V8,y=y.gA(y),y=new H.MH(null,y,z.Wz),H.VM(y,[H.ip(z,"i1",0),H.ip(z,"i1",1)]);y.G();){x=y.M4
-if(x!=null)J.wC(x)}this.mD=null},
-gJg:function(a){return new H.MT(this,M.hs.prototype.GB,a,"GB")},
-gCd:function(a){if(this.mD==null)this.mD=P.L5(null,null,null,J.O,M.TR)
-return this.mD},
-$ishs:true},yp:{"":"a;KO,lC,k8"},T4:{"":"a;"},TR:{"":"a;N1<,ay>",
-gH:function(){return this.N1},
-gP:function(a){return J.Vm(this.ND)},
-"+value":0,
-r6:function(a,b){return this.gP(a).call$1(b)},
-sP:function(a,b){J.ta(this.ND,b)},
-"+value=":0,
-CX:function(){var z,y
-z=this.lr
+if(this.bn==null)return
+for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.W8(z,"mW",0)),y=new H.a7(z,z.length,0,null),H.VM(y,[H.W8(z,"Q",0)]);y.G();){x=y.mD
+if(x!=null)J.wC(x)}this.bn=null},
+gCd:function(a){if(this.bn==null)this.bn=P.L5(null,null,null,J.O,X.TR)
+return this.bn},
+glN:function(){var z,y
+z=this.gN1()
 y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isWR&&J.xC(this.ay,"value")
-y=this.lr
-if(z)this.ND=y
-else this.ND=B.ao(y,this.ay)
-this.B5=this.ND.yw(this.gH0())},
-gH0:function(){return new H.Pm(this,M.TR.prototype.EC,null,"EC")},
-cO:function(a){var z
-if(this.N1==null)return
-z=this.B5
-if(z!=null)z.ed()
-this.B5=null
-this.ND=null
-this.N1=null
-this.lr=null},
-gJK:function(a){return new H.MT(this,M.TR.prototype.cO,a,"cO")},
-$isTR:true},ug:{"":"V2;N1,mD,Ck",
+return typeof z==="object"&&z!==null&&!!y.$ishs?this.gN1():this},
+$ishs:true},yp:{"":"a;KO,lC,k8"},ug:{"":"V2;N1,bn,Ck",
 gN1:function(){return this.N1},
-Zf:function(a,b,c,d){var z,y,x,w
+Z1:function(a,b,c,d){var z,y,x,w
 if(J.xC(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
-if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Zf.call(this,this,b,c,d)
+if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 y=J.x(z)
 J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?this.gN1():this,b)
-x=J.MX(this.N1)
+x=J.Vs(this.N1)
 x.Rz(x,b)
 x=this.gCd(this)
 w=this.N1
 z=d!=null?d:""
 z=new M.SA(null,w,c,null,null,b,z)
-z.CX()
+z.Og(w,b,c,d)
 z.Ca=M.IP(w).yI(z.gqf())
 x.u(x,b,z)
-return z}},DT:{"":"V2;lr,xT?,CF@,Ds,QO?,Me?,mj?,N1,mD,Ck",
+return z}},DT:{"":"V2;lr,xT?,kr<,Ds,QO?,jH?,mj?,zx@,N1,bn,Ck",
 gN1:function(){return this.N1},
-Zf:function(a,b,c,d){var z,y
-switch(b){case"bind":case"repeat":case"if":z=this.gN1()
+glN:function(){var z,y
+z=this.N1
 y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?this.gN1():this,b)
-if(this.CF==null){z=new M.TG(this.N1,[],null,null,!1,null)
-y=new B.zF(null,P.L5(null,null,null,null,null),P.L5(null,null,null,null,null),null,!1,null,null)
-y.yZ=z.goq()
-y.fu()
-z.O4=y
-this.CF=z}z=this.gCd(this)
-y=M.eh(this,b,c,d)
+return typeof z==="object"&&z!==null&&!!y.$isDT?this.N1:this},
+Z1:function(a,b,c,d){var z,y
+d=d!=null?d:""
+if(this.kr==null)this.kr=new M.TG(this,[],null,!1,!1,!1,!1,!1,null,null,null,null,null,null,null,null,!1,null,null)
+switch(b){case"bind":z=this.kr
+z.TU=!0
+z.d6=c
+z.XV=d
+this.jq()
+z=this.gCd(this)
+y=new M.N9(this,c,b,d)
 z.u(z,b,y)
 return y
-default:return M.V2.prototype.Zf.call(this,this,b,c,d)}},
-ZK:function(a,b){var z,y,x
+case"repeat":z=this.kr
+z.A7=!0
+z.JM=c
+z.yO=d
+this.jq()
+z=this.gCd(this)
+y=new M.N9(this,c,b,d)
+z.u(z,b,y)
+return y
+case"if":z=this.kr
+z.Q3=!0
+z.rV=c
+z.eD=d
+this.jq()
+z=this.gCd(this)
+y=new M.N9(this,c,b,d)
+z.u(z,b,y)
+return y
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},
+Ih:function(a,b){var z
+switch(b){case"bind":z=this.kr
+if(z==null)return
+z.TU=!1
+z.d6=null
+z.XV=null
+this.jq()
+z=this.gCd(this)
+z.Rz(z,b)
+return
+case"repeat":z=this.kr
+if(z==null)return
+z.A7=!1
+z.JM=null
+z.yO=null
+this.jq()
+z=this.gCd(this)
+z.Rz(z,b)
+return
+case"if":z=this.kr
+if(z==null)return
+z.Q3=!1
+z.rV=null
+z.eD=null
+this.jq()
+z=this.gCd(this)
+z.Rz(z,b)
+return
+default:M.hs.prototype.Ih.call(this,this,b)
+return}},
+jq:function(){var z=this.kr
+if(!z.t9){z.t9=!0
+P.rb(this.kr.gjM())}},
+a5:function(a,b,c){var z,y,x,w,v
 z=this.gnv()
 y=J.x(z)
-x=M.jo(J.NQ(typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z)),b)
-M.ON(x,a,b)
-M.cZ(x,a)
-return x},
+z=typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z)
+x=J.nX(z)
+w=z.gzx()
+if(w==null){w=M.lX(x,b)
+z.szx(w)}v=w.oA?M.Fz(x):J.zZ(x,!0)
+M.HP(v,w,a,b,c)
+M.cZ(v,a)
+return v},
+ZK:function(a,b){return this.a5(a,b,null)},
 gzH:function(){return this.xT},
 gnv:function(){var z,y,x,w,v
-this.bY()
-z=J.MX(this.N1).MW.getAttribute("ref")
+this.Sy()
+z=J.Vs(this.N1).MW.getAttribute("ref")
 if(z!=null){y=M.bM(this.N1)
 x=y!=null?J.K3(y,z):null}else x=null
 if(x==null){x=this.QO
@@ -20199,8 +19411,8 @@
 v=(typeof x==="object"&&x!==null&&!!w.$ishs?x:M.Ky(x)).gnv()
 return v!=null?v:x},
 gjb:function(a){var z
-this.bY()
-z=this.Me
+this.Sy()
+z=this.jH
 return z!=null?z:H.Go(this.N1,"$isyY").content},
 wh:function(a){var z,y,x,w,v,u
 if(this.mj===!0)return!1
@@ -20212,7 +19424,7 @@
 w=!x
 if(w){z=this.N1
 y=J.RE(z)
-z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
+z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gjU(z))===!0}else z=!1
 if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
 v=M.eX(this.N1)
 z=J.x(v)
@@ -20222,14 +19434,24 @@
 y=J.x(z)
 x=typeof z==="object"&&z!==null&&!!y.$isyY
 u=!0}else{v=this
-u=!1}if(!x)v.sMe(J.bs(M.nk(J.VN(v.gN1()))))
+u=!1}if(!x)v.sjH(J.bs(M.nk(J.VN(v.gN1()))))
 if(a!=null)v.sQO(a)
 else if(w)M.KE(v,this.N1,u)
-else M.GM(J.NQ(v))
+else M.GM(J.nX(v))
 return!0},
-bY:function(){return this.wh(null)},
-static:{"":"mn,Sf,To",nk:function(a){var z,y,x
-if(W.Pv(a.defaultView)==null)return a
+Sy:function(){return this.wh(null)},
+$isDT:true,
+static:{"":"mn,Sf,To",Fz:function(a){var z,y,x,w
+z=J.RE(a)
+y=z.Yv(a,!1)
+x=J.RE(y)
+if(typeof y==="object"&&y!==null&&!!x.$iscv)if(x.gjU(y)!=="template")x=x.gQg(y).MW.hasAttribute("template")===!0&&C.uE.x4(x.gjU(y))===!0
+else x=!0
+else x=!1
+if(x)return y
+for(w=z.gq6(a);w!=null;w=w.nextSibling)y.appendChild(M.Fz(w))
+return y},nk:function(a){var z,y,x
+if(W.uV(a.defaultView)==null)return a
 z=$.LQ()
 y=z.t(z,a)
 if(y==null){y=a.implementation.createHTMLDocument("")
@@ -20238,8 +19460,8 @@
 z.u(z,a,y)}return y},eX:function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
-J.te(z.gKV(a),y,a)
-for(x=z.gQg(a),x=x.gvc(x),x=P.F(x,!0,H.ip(x,"Q",0)),w=new H.wi(x,x.length,0,null),H.VM(w,[H.ip(x,"Q",0)]);w.G();){v=w.M4
+z.gKV(a).insertBefore(y,a)
+for(x=z.gQg(a),x=x.gvc(x),x=P.F(x,!0,H.W8(x,"Q",0)),w=new H.a7(x,x.length,0,null),H.VM(w,[H.W8(x,"Q",0)]);w.G();){v=w.mD
 switch(v){case"template":x=z.gQg(a).MW
 x.getAttribute(v)
 x.removeAttribute(v)
@@ -20251,7 +19473,7 @@
 new W.E9(y).MW.setAttribute(v,u)
 break
 default:}}return y},KE:function(a,b,c){var z,y,x,w
-z=J.NQ(a)
+z=J.nX(a)
 if(c){J.BM(z,b)
 return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},GM:function(a){var z,y
 z=new M.OB()
@@ -20260,43 +19482,41 @@
 y.aN(y,z)},oR:function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
-z.textContent="template,\nthead[template],\ntbody[template],\ntfoot[template],\nth[template],\ntr[template],\ntd[template],\ncaption[template],\ncolgroup[template],\ncol[template],\noption[template] {\n  display: none;\n}"
+z.textContent=$.cz()+" { display: none; }"
 document.head.appendChild(z)}}},OB:{"":"Tp;",
 call$1:function(a){var z
 if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.NQ(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a)))}},
+M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a)))}},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},w7:{"":"Tp;",
+$is_Dv:true},Ra:{"":"Tp;",
 call$1:function(a){return H.d(a)+"[template]"},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},N9:{"":"TR;ud,N1,lr,ND,B5,eS,ay",
-CX:function(){},
-EC:function(a){},
-gH0:function(){return new H.Pm(this,M.N9.prototype.EC,null,"EC")},
-cO:function(a){var z,y
-if(this.N1==null)return
-z=this.ud.CF
-if(z!=null){y=z.O4
-y.Ih(y,this.eS)}M.TR.prototype.cO.call(this,this)},
-gJK:function(a){return new H.MT(this,M.N9.prototype.cO,a,"cO")},
-RG:function(a,b,c,d){var z=this.ud.CF.O4
-z.Zf(z,this.eS,c,this.ay)},
-static:{eh:function(a,b,c,d){var z,y
-z=a.N1
-y=d!=null?d:""
-y=new M.N9(a,z,c,null,null,b,y)
-y.CX()
-y.RG(a,b,c,d)
-return y}}},NW:{"":"Tp;a,b",
+$is_Dv:true},N9:{"":"a;ud,lr,eS,Ii>",
+gP:function(a){return J.Vm(this.gND())},
+"+value":0,
+r6:function(a,b){return this.gP(a).call$1(b)},
+sP:function(a,b){J.ta(this.gND(),b)},
+"+value=":0,
+gND:function(){var z,y
+z=this.lr
+y=J.x(z)
+if((typeof z==="object"&&z!==null&&!!y.$isD7||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.xC(this.Ii,"value"))return this.lr
+return L.ao(this.lr,this.Ii,null)},
+cO:function(a){var z=this.ud
+if(z==null)return
+z.Ih(z,this.eS)
+this.lr=null
+this.ud=null},
+$isTR:true},NW:{"":"Tp;a,b,c,d",
 call$2:function(a,b){var z,y
-if(this.b){z=J.x(a)
-if(z.n(a,"if"))this.a.b=!0
-else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
-if(J.xC(b,""))b="{{}}"}}y=M.WG(b)
+for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
+if(this.d)if(z.n(a,"if")){this.a.b=!0
+if(J.xC(b,""))b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
+if(J.xC(b,""))b="{{}}"}y=M.F4(b,a,this.b,this.c)
 if(y!=null){z=this.a
 if(z.a==null)z.a=[]
 z=z.a
@@ -20304,359 +19524,282 @@
 z.push(y)}},
 "+call:2:0":0,
 $isEH:true,
-$is_bh:true},Hh:{"":"Tp;a",
-call$1:function(a){var z,y,x,w,v,u,t,s,r
-z=P.p9("")
-y=this.a
-x=J.U6(y)
-w=J.U6(a)
-v=0
-u=!0
-while(!0){t=x.gB(y)
-if(typeof t!=="number")throw H.s(t)
-if(!(v<t))break
-if(u){s=x.t(y,v)
-s=typeof s==="string"?s:H.d(s)
-z.vM=z.vM+s}else{r=w.t(a,v)
-if(r!=null){s=typeof r==="string"?r:H.d(r)
-z.vM=z.vM+s}}++v
-u=!u}return z.vM},
-"+call:1:0":0,
-$isEH:true,
-$is_HB:true,
-$is_Dv:true},TG:{"":"a;kU,YC,O4,xG,pq,zJ",
-PE:function(a){var z
-if(this.pq)return
-if(a.x4("if")===!0){z=J.UQ(a,"if")
-z=!(null!=z&&!1!==z)}else z=!1
-if(z)this.EC(null)
-else if(a.x4("repeat")===!0)this.EC(J.UQ(a,"repeat"))
-else if(a.x4("bind")===!0||a.x4("if")===!0)this.EC([J.UQ(a,"bind")])
-else this.EC(null)
-return},
-goq:function(){return new H.Pm(this,M.TG.prototype.PE,null,"PE")},
-EC:function(a){var z,y,x,w
-z=J.x(a)
-if(typeof a!=="object"||a===null||a.constructor!==Array&&!z.$isList)a=null
-y=this.xG
+$is_bh:true},HS:{"":"a;EJ<,bX",
+gqz:function(){return this.EJ.length===4},
+gaW:function(){var z,y
+z=this.EJ
+y=z.length
+if(y===4){if(0>=y)throw H.e(z,0)
+if(J.xC(z[0],"")){if(3>=z.length)throw H.e(z,3)
+z=J.xC(z[3],"")}else z=!1}else z=!1
+return z},
+gcK:function(){return this.bX},
+JI:function(a){var z,y
+if(a==null)a=""
+z=this.EJ
+if(0>=z.length)throw H.e(z,0)
+y=H.d(z[0])+H.d(a)
+if(3>=z.length)throw H.e(z,3)
+return y+H.d(z[3])},
+gBg:function(){return new H.Pm(this,M.HS.prototype.JI,null,"JI")},
+DJ:function(a){var z,y,x,w,v,u,t
+z=this.EJ
+if(0>=z.length)throw H.e(z,0)
+y=P.p9(z[0])
+for(x=J.U6(a),w=1;w<z.length;w+=3){v=x.t(a,C.jn.Z(w-1,3))
+if(v!=null){u=typeof v==="string"?v:H.d(v)
+y.vM=y.vM+u}t=w+2
+if(t>=z.length)throw H.e(z,t)
+u=z[t]
+u=typeof u==="string"?u:H.d(u)
+y.vM=y.vM+u}return y.vM},
+gqD:function(){return new H.Pm(this,M.HS.prototype.DJ,null,"DJ")},
+Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()},
+static:{hp:function(a){var z=new M.HS(a,null)
+z.Yn(a)
+return z}}},TG:{"":"a;e9,YC,xG,pq,t9,A7,TU,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
+Mv:function(a){return this.DO.call$1(a)},
+WS:function(){var z,y,x,w,v,u
+this.t9=!1
+z=this.FS
+if(z!=null){z.ed()
+this.FS=null}z=this.A7
+if(!z&&!this.TU){this.Az(null)
+return}y=z?this.JM:this.d6
+x=z?this.yO:this.XV
+if(!this.Q3)w=L.ao(y,x,z?null:new M.ts())
+else{w=new Y.J3([],[],null,new M.Kj(z),!1,!1,null,null)
+if(w.YX)H.vh(new P.lj("Cannot add more paths once started."))
+z=w.b9
+z.push(L.ao(y,x,null))
+v=this.rV
+u=this.eD
+if(w.YX)H.vh(new P.lj("Cannot add more paths once started."))
+z.push(L.ao(v,u,null))
+w.wE(w)}this.FS=w.gqh(w).yI(new M.VU(this))
+this.Az(w.gP(w))},
+gjM:function(){return new P.Ip(this,M.TG.prototype.WS,null,"WS")},
+Az:function(a){var z,y,x,w
+z=this.xG
 this.Gb()
-this.xG=a
-z=this.xG
-x=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!x.$iswn)this.zJ=x.gqh(H.Go(z,"$iswn")).yI(this.gnB())
-z=this.xG
-z=z!=null?z:[]
-x=y!=null?y:[]
-w=O.Bs(z,0,J.q8(z),x,0,J.q8(x))
-if(w.length>0)this.Vh(w)
-if(this.O4.j9.hr===0){this.cO(this)
-M.Ky(this.kU).sCF(null)}},
-gH0:function(){return new H.Pm(this,M.TG.prototype.EC,null,"EC")},
-wx:function(a){var z,y,x
-if(J.xC(a,-1))return this.kU
-z=this.YC
-if(a>>>0!==a||a>=z.length)throw H.e(z,a)
-y=z[a]
-if(M.wR(y)){z=this.kU
-z=y==null?z!=null:y!==z}else z=!1
-if(z){x=M.Ky(y).gCF()
-if(x!=null)return x.wx(x.YC.length-1)}return y},
-qw:function(a,b,c){var z,y,x,w,v,u
-z=this.wx(J.xH(a,1))
-y=b!=null
-if(y)x=b.lastChild
-else{w=J.U6(c)
-x=J.xZ(w.gB(c),0)?w.grZ(c):null}if(x==null)x=z
-C.Nm.kF(this.YC,a,x)
-v=J.TZ(this.kU)
-u=J.Yi(z)
-if(y){J.te(v,b,u)
-return}for(y=J.GP(c),w=J.RE(v);y.G();)w.mK(v,y.gl(),u)},
-MC:function(a){var z,y,x,w,v,u
+y=J.w1(a)
+if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList))this.xG=a
+else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$iscX))this.xG=y.br(a)
+else this.xG=null
+if(this.xG!=null&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gRT().yI(this.gZX())
+y=z!=null?z:[]
+x=this.xG
+x=x!=null?x:[]
+w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
+if(w.length!==0)this.El(w)},
+wx:function(a){var z,y,x,w
+z=J.x(a)
+if(z.n(a,-1))return this.e9.N1
+y=this.YC
+z=z.U(a,2)
+if(z>>>0!==z||z>=y.length)throw H.e(y,z)
+x=y[z]
+if(M.wR(x)){z=this.e9.N1
+z=x==null?z==null:x===z}else z=!0
+if(z)return x
+w=M.Ky(x).gkr()
+if(w==null)return x
+return w.wx(C.jn.Z(w.YC.length,2)-1)},
+lP:function(a,b,c,d){var z,y,x,w,v,u
+z=J.Wx(a)
+y=this.wx(z.W(a,1))
+x=b!=null
+if(x)w=b.lastChild
+else w=c!=null&&J.pO(c)?J.MQ(c):null
+if(w==null)w=y
+z=z.U(a,2)
+H.IC(this.YC,z,[w,d])
+v=J.TZ(this.e9.N1)
+u=J.tx(y)
+if(x)v.insertBefore(b,u)
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},
+MC:function(a){var z,y,x,w,v,u,t,s
 z=[]
-y=this.wx(J.xH(a,1))
-x=this.wx(a)
-C.Nm.W4(this.YC,a)
-J.TZ(this.kU)
-for(w=J.RE(y);!J.xC(x,y);){v=w.gzW(y)
-if(v==null?x==null:v===x)x=y
-u=v.parentNode
-if(u!=null)u.removeChild(v)
-z.push(v)}return z},
-tf:function(a,b){if(b!=null)return b.tf(this.kU,a)
-return a},
-Vh:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z.$builtinTypeInfo=[W.KV]
+y=J.Wx(a)
+x=this.wx(y.W(a,1))
+w=this.wx(a)
+v=this.YC
+u=J.WB(y.U(a,2),1)
+if(u>>>0!==u||u>=v.length)throw H.e(v,u)
+t=v[u]
+C.Nm.UZ(v,y.U(a,2),J.WB(y.U(a,2),2))
+J.TZ(this.e9.N1)
+for(y=J.RE(x);!J.xC(w,x);){s=y.guD(x)
+if(s==null?w==null:s===w)w=x
+v=s.parentNode
+if(v!=null)v.removeChild(s)
+z.push(s)}return new M.Ya(z,t)},
+El:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
-a=J.vo(a,new M.lE())
-z=this.kU
-y=J.RE(z)
-x=typeof z==="object"&&z!==null&&!!y.$ishs
-w=(x?z:M.Ky(z)).gzH()
-if(y.gKV(z)==null||W.Pv(y.gM0(z).defaultView)==null){this.cO(this)
-return}v=P.Py(P.N3,null,null,null,null)
-for(y=a.gA(a),u=y.N4,t=0;y.G();){s=u.gl()
-r=J.RE(s)
-q=0
-while(!0){p=s.gos()
-if(typeof p!=="number")throw H.s(p)
-if(!(q<p))break
-c$1:{o=this.MC(J.WB(r.gvH(s),t))
-if(o.length===0)break c$1
-v.u(v,M.Ky(C.Nm.gFV(o)).gCk().k8,o)}++q}r=s.gNg()
+z=this.e9
+y=z.N1
+x=z.N1
+w=J.x(x)
+v=(typeof x==="object"&&x!==null&&!!w.$isDT?z.N1:z).gzH()
+x=J.RE(y)
+if(x.gKV(y)==null||W.uV(x.gM0(y).defaultView)==null){this.cO(this)
+return}if(!this.U9){this.U9=!0
+if(v!=null){this.DO=v.A5(y)
+this.Fy=null}}u=P.Py(P.N3,null,null,P.a,M.Ya)
+for(x=J.w1(a),w=x.gA(a),t=0;w.G();){s=w.gl()
+for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)u.u(u,r.mD,this.MC(J.WB(q.gvH(s),t)))
+r=s.gNg()
 if(typeof r!=="number")throw H.s(r)
-t-=r}for(y=a.gA(a),u=y.N4;y.G();){s=u.gl()
-for(r=J.RE(s),n=r.gvH(s);p=J.Wx(n),p.C(n,J.WB(r.gvH(s),s.gNg()));n=p.g(n,1)){m=J.UQ(this.xG,n)
-o=v.Rz(v,m)
-if(o==null){l=this.tf(m,w)
-k=(x?z:M.Ky(z)).ZK(l,w)}else k=null
-this.qw(n,k,o)}}for(y=v.gUQ(v),x=y.V8,x=x.gA(x),x=new H.MH(null,x,y.Wz),H.VM(x,[H.ip(y,"i1",0),H.ip(y,"i1",1)]);x.G();)J.kH(x.M4,M.zr)},
-gnB:function(){return new H.Pm(this,M.TG.prototype.Vh,null,"Vh")},
-Gb:function(){var z=this.zJ
+t-=r}for(x=x.gA(a);x.G();){s=x.gl()
+for(w=J.RE(s),p=w.gvH(s);r=J.Wx(p),r.C(p,J.WB(w.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
+n=u.Rz(u,o)
+if(n!=null&&J.pO(J.Y5(n))){q=J.RE(n)
+m=q.gkU(n)
+l=q.gyT(n)
+k=null}else{m=[]
+if(this.DO!=null)o=this.Mv(o)
+k=o!=null?z.a5(o,v,m):null
+l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),x=z.Kw,x=x.gA(x),x=new H.MH(null,x,z.ew),H.VM(x,[H.W8(z,"i1",0),H.W8(z,"i1",1)]);x.G();)this.uS(J.AB(x.mD))},
+gZX:function(){return new H.Pm(this,M.TG.prototype.El,null,"El")},
+uS:function(a){var z
+for(z=J.GP(a);z.G();)J.wC(z.gl())},
+Gb:function(){var z=this.IY
 if(z==null)return
 z.ed()
-this.zJ=null},
-cO:function(a){var z
+this.IY=null},
+cO:function(a){var z,y
 if(this.pq)return
 this.Gb()
-z=this.O4
-z.cO(z)
-C.Nm.sB(this.YC,0)
-this.pq=!0},
-gJK:function(a){return new H.MT(this,M.TG.prototype.cO,a,"cO")},
-static:{Ny:function(a){var z,y,x,w,v
-z=M.Ky(a)
-z.sCk(null)
-y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
-else x=!0
-else x=!1
-if(x){w=z.gCF()
-if(w!=null){w.cO(w)
-z.sCF(null)}}J.AA(typeof a==="object"&&a!==null&&!!y.$ishs?a:M.Ky(a))
-for(v=y.gq6(a);v!=null;v=J.Yi(v))M.Ny(v)}}},lE:{"":"Tp;",
-call$1:function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isW4},
+for(z=this.YC,y=1;y<z.length;y+=2)this.uS(z[y])
+C.Nm.sB(z,0)
+z=this.FS
+if(z!=null){z.ed()
+this.FS=null}this.e9.kr=null
+this.pq=!0}},ts:{"":"Tp;",
+call$1:function(a){return[a]},
 "+call:1:0":0,
 $isEH:true,
 $is_HB:true,
-$is_Dv:true},XT:{"":"hs;N1,mD,Ck",
-Zf:function(a,b,c,d){var z,y
-if(!J.xC(b,"text"))return M.hs.prototype.Zf.call(this,this,b,c,d)
+$is_Dv:true},Kj:{"":"Tp;a",
+call$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]},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},VU:{"":"Tp;b",
+call$1:function(a){return this.b.Az(J.iZ(J.MQ(a)))},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true},Ya:{"":"a;yT>,kU>",$isYa:true},XT:{"":"hs;N1,bn,Ck",
+Z1:function(a,b,c,d){var z,y,x
+if(!J.xC(b,"text"))return M.hs.prototype.Z1.call(this,this,b,c,d)
 this.Ih(this,b)
 z=this.gCd(this)
-y=d!=null?d:""
-y=new M.ic(this.N1,c,null,null,"text",y)
-y.CX()
-z.u(z,b,y)
-return y}},ic:{"":"TR;N1,lr,ND,B5,eS,ay",
-EC:function(a){var z=this.N1
-J.c9(z,a==null?"":H.d(a))},
-gH0:function(){return new H.Pm(this,M.ic.prototype.EC,null,"EC")}},VT:{"":"V2;N1,mD,Ck",
+y=this.N1
+x=d!=null?d:""
+x=new M.ic(y,c,null,null,"text",x)
+x.Og(y,"text",c,d)
+z.u(z,b,x)
+return x}},ic:{"":"TR;LO,ZY,xS,PB,eS,Ii",
+EC:function(a){var z=this.LO
+J.c9(z,a==null?"":H.d(a))}},VT:{"":"V2;N1,bn,Ck",
 gN1:function(){return this.N1},
-Zf:function(a,b,c,d){var z,y,x,w
-if(!J.xC(b,"value"))return M.V2.prototype.Zf.call(this,this,b,c,d)
+Z1:function(a,b,c,d){var z,y,x,w
+if(!J.xC(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 y=J.x(z)
 J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?this.gN1():this,b)
-x=J.MX(this.N1)
+x=J.Vs(this.N1)
 x.Rz(x,b)
 x=this.gCd(this)
 w=this.N1
 z=d!=null?d:""
 z=new M.NP(null,w,c,null,null,"value",z)
-z.CX()
+z.Og(w,"value",c,d)
 z.Ca=M.IP(w).yI(z.gqf())
 x.u(x,b,z)
-return z}}}],["template_binding.src.list_diff","package:template_binding/src/list_diff.dart",,O,{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)
-x=P.A(z,null)
-if(typeof z!=="number")throw H.s(z)
-w=x.length
-v=0
-for(;v<z;++v){u=P.A(y,null)
-if(v>=w)throw H.e(x,v)
-x[v]=u
-u=x[v]
-if(0>=u.length)throw H.e(u,0)
-u[0]=v}if(typeof y!=="number")throw H.s(y)
-t=0
-for(;t<y;++t){if(0>=w)throw H.e(x,0)
-u=x[0]
-if(t>=u.length)throw H.e(u,t)
-u[t]=t}for(u=J.U6(d),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){p=u.t(d,q)
-o=s.t(a,b+t-1)
-n=x[r]
-m=t-1
-if(p==null?o==null:p===o){if(v>=w)throw H.e(x,v)
-p=x[v]
-if(r>=w)throw H.e(x,r)
-if(m>=n.length)throw H.e(n,m)
-m=n[m]
-if(t>=p.length)throw H.e(p,t)
-p[t]=m}else{if(r>=w)throw H.e(x,r)
-if(t>=n.length)throw H.e(n,t)
-l=J.WB(n[t],1)
-if(v>=w)throw H.e(x,v)
-p=x[v]
-if(m>=p.length)throw H.e(p,m)
-k=J.WB(p[m],1)
-m=x[v]
-p=P.J(l,k)
-if(t>=m.length)throw H.e(m,t)
-m[t]=p}}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)throw H.e(a,0)
-x=a[0].length-1
-if(y<0)throw H.e(a,y)
-w=a[y]
-if(x<0||x>=w.length)throw H.e(w,x)
-v=w[x]
-u=[]
-while(!0){if(!(y>0||x>0))break
-c$0:{if(y===0){u.push(2);--x
-break c$0}if(x===0){u.push(3);--y
-break c$0}w=y-1
-if(w<0)throw H.e(a,w)
-t=a[w]
-s=x-1
-r=t.length
-if(s<0||s>=r)throw H.e(t,s)
-q=t[s]
-if(x<0||x>=r)throw H.e(t,x)
-p=t[x]
-if(y<0)throw H.e(a,y)
-t=a[y]
-if(s>=t.length)throw H.e(t,s)
-o=t[s]
-n=P.J(P.J(p,o),q)
-if(n===q){if(J.xC(q,v))u.push(0)
-else{u.push(1)
-v=q}x=s
-y=w}else if(n===p){u.push(3)
-v=p
-y=w}else{u.push(2)
-v=o
-x=s}}}z=new H.iK(u)
-H.VM(z,[null])
-return z.br(z)},rB:function(a,b,c){var z,y,x,w,v
-for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x){w=z.t(a,x)
-v=y.t(b,x)
-if(w==null?v!=null:w!==v)return x}return c},xU:function(a,b,c){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=z.gB(a)
-x=J.U6(b)
-w=x.gB(b)
-v=0
-while(!0){if(v<c){y=J.xH(y,1)
-u=z.t(a,y)
-w=J.xH(w,1)
-t=x.t(b,w)
-t=u==null?t==null:u===t
-u=t}else u=!1
-if(!u)break;++v}return v},Bs:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o
-z=J.Wx(c)
-y=J.Wx(f)
-x=P.J(z.W(c,b),y.W(f,e))
-w=b===0&&e===0?O.rB(a,d,x):0
-v=z.n(c,J.q8(a))&&y.n(f,J.q8(d))?O.xU(a,d,x-w):0
-b+=w
-e+=w
-c=z.W(c,v)
-f=y.W(f,v)
-z=J.Wx(c)
-if(J.xC(z.W(c,b),0)&&J.xC(J.xH(f,e),0))return C.xD
-if(b===c){z=[]
-u=new O.y3(b,z,0)
-if(typeof f!=="number")throw H.s(f)
-z=u.Il
-y=J.U6(d)
-for(;e<f;e=t){t=e+1
-z.push(y.t(d,e))}return[u]}else if(e===f){z=z.W(c,b)
-y=[]
-return[new O.y3(b,y,z)]}s=O.Mw(O.f6(a,b,c,d,e,f))
-r=[]
-for(z=J.U6(d),q=e,p=b,u=null,o=0;o<s.length;++o)switch(s[o]){case 0:if(u!=null){r.push(u)
-u=null}++p;++q
-break
-case 1:if(u==null){y=[]
-u=new O.y3(p,y,0)}u.dM=J.WB(u.dM,1);++p
-u.Il.push(z.t(d,q));++q
-break
-case 2:if(u==null){y=[]
-u=new O.y3(p,y,0)}u.dM=J.WB(u.dM,1);++p
-break
-case 3:if(u==null){y=[]
-u=new O.y3(p,y,0)}u.Il.push(z.t(d,q));++q
-break
-default:}if(u!=null)r.push(u)
-return r},y3:{"":"a;vH>,Il,dM",
-gNg:function(){return this.dM},
-gos:function(){return this.Il.length},
-VD:function(a,b){var z
-J.u6(b,this.vH)
-if(!J.xC(this.dM,this.Il.length))return!0
-z=this.dM
-if(typeof z!=="number")throw H.s(z)
-return J.u6(b,this.vH+z)},
-gqh:function(a){return new J.C7(this,O.y3.prototype.VD,a,"VD")},
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" index: "+H.d(this.vH)+", removed: "+H.d(this.Il)+", addedCount: "+H.d(this.dM)+">"},
-$isW4:true,
-$isyj:true}}],["unmodifiable_collection","package:unmodifiable_collection/unmodifiable_collection.dart",,F,{Oh:{"":"a;QD",
-gB:function(a){return this.QD.hr},
+return z}}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{T4:{"":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{TR:{"":"a;LO<,Ii>",
+gH:function(){return this.LO},
+gP:function(a){return J.Vm(this.xS)},
+"+value":0,
+r6:function(a,b){return this.gP(a).call$1(b)},
+sP:function(a,b){J.ta(this.xS,b)},
+"+value=":0,
+cO:function(a){var z
+if(this.LO==null)return
+z=this.PB
+if(z!=null)z.ed()
+this.PB=null
+this.xS=null
+this.LO=null
+this.ZY=null},
+Og:function(a,b,c,d){var z,y
+z=this.ZY
+y=J.x(z)
+z=(typeof z==="object"&&z!==null&&!!y.$isD7||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.xC(d,"value")
+y=this.ZY
+if(z)this.xS=y
+else this.xS=L.ao(y,this.Ii,null)
+this.PB=J.Ib(this.xS).yI(new X.VD(this))
+this.EC(J.Vm(this.xS))},
+$isTR:true},VD:{"":"Tp;a",
+call$1:function(a){var z=this.a
+return z.EC(J.Vm(z.xS))},
+"+call:1:0":0,
+$isEH:true,
+$is_HB:true,
+$is_Dv:true}}],["unmodifiable_collection","package:unmodifiable_collection/unmodifiable_collection.dart",,F,{Oh:{"":"a;Mw",
+gB:function(a){return this.Mw.X5},
 "+length":0,
-gl0:function(a){return this.QD.hr===0},
+gl0:function(a){return this.Mw.X5===0},
 "+isEmpty":0,
-gor:function(a){return this.QD.hr!==0},
+gor:function(a){return this.Mw.X5!==0},
 "+isNotEmpty":0,
-t:function(a,b){var z=this.QD
+t:function(a,b){var z=this.Mw
 return z.t(z,b)},
 "+[]:1:0":0,
-x4:function(a){return this.QD.x4(a)},
+x4:function(a){return this.Mw.x4(a)},
 "+containsKey:1:0":0,
-PF:function(a){return this.QD.PF(a)},
+PF:function(a){return this.Mw.PF(a)},
 "+containsValue:1:0":0,
-aN:function(a,b){var z=this.QD
+aN:function(a,b){var z=this.Mw
 return z.aN(z,b)},
 gvc:function(a){var z,y
-z=this.QD
-y=new P.Tz(z)
-H.VM(y,[H.ip(z,"YB",0)])
+z=this.Mw
+y=new P.Cm(z)
+H.VM(y,[H.W8(z,"YB",0)])
 return y},
 "+keys":0,
-gUQ:function(a){var z=this.QD
+gUQ:function(a){var z=this.Mw
 return z.gUQ(z)},
 "+values":0,
 u:function(a,b,c){return F.TM()},
 "+[]=:2:0":0,
-to:function(a,b){F.TM()},
 Rz:function(a,b){F.TM()},
-$isZ0:true,
+$isL8:true,
 static:{TM:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))}}}}],])
 I.$finishClasses($$,$,null)
 $$=null
-init.globalFunctions.NB=H.NB=new H.Wv(H.Mg,"NB")
+init.globalFunctions.NB=H.NB=new H.zy(H.Mg,"NB")
 init.globalFunctions.Rm=H.Rm=new H.Nb(H.vx,"Rm")
-init.globalFunctions.Eu=H.Eu=new H.Fy(H.Ju,"Eu")
+init.globalFunctions.Eu=H.Eu=new H.HB(H.Ju,"Eu")
 init.globalFunctions.eH=H.eH=new H.eU(H.ft,"eH")
-init.globalFunctions.Qv=H.Qv=new H.Wv(H.pe,"Qv")
-init.globalFunctions.qA=H.qA=new H.Nb(H.Ph,"qA")
-init.globalFunctions.nY=H.nY=new H.Nb(H.f4,"nY")
-init.globalFunctions.D3=H.D3=new H.Nb(H.vK,"D3")
-init.globalFunctions.Bi=H.Bi=new H.Nb(H.mv,"Bi")
-init.globalFunctions.tu=H.tu=new H.Nb(H.Tx,"tu")
-init.globalFunctions.DA=H.DA=new H.Nb(H.xb,"DA")
-init.globalFunctions.dq=H.dq=new H.Wv(H.jm,"dq")
-init.globalFunctions.hk=E.hk=new H.Fy(E.E2,"hk")
+init.globalFunctions.Qv=H.Qv=new H.zy(H.pe,"Qv")
+init.globalFunctions.qg=E.qg=new H.HB(E.E2,"qg")
 init.globalFunctions.Yf=H.Yf=new H.Nb(H.vn,"Yf")
-init.globalFunctions.qZ=P.qZ=new H.Fy(P.BG,"qZ")
-init.globalFunctions.CJ=P.CJ=new H.Nb(P.SN,"CJ")
-init.globalFunctions.AY=P.AY=new P.WvQ(P.SZ,"AY")
-init.globalFunctions.No=P.No=new H.Fy(P.ax,"No")
+init.globalFunctions.qZ=P.qZ=new H.HB(P.BG,"qZ")
+init.globalFunctions.Xw=P.Xw=new H.Nb(P.YE,"Xw")
+init.globalFunctions.AY=P.AY=new P.ADW(P.SZ,"AY")
+init.globalFunctions.No=P.No=new H.HB(P.ax,"No")
 init.globalFunctions.xP=P.xP=new P.Ri(P.L2,"xP")
 init.globalFunctions.AI=P.AI=new P.kq(P.T8,"AI")
-init.globalFunctions.Un=P.Un=new P.Ri(P.yv,"Un")
+init.globalFunctions.MM=P.MM=new P.Ri(P.V7,"MM")
 init.globalFunctions.C9=P.C9=new P.Ag(P.Qx,"C9")
 init.globalFunctions.Qk=P.Qk=new P.kq(P.Ee,"Qk")
 init.globalFunctions.zi=P.zi=new P.kq(P.cQ,"zi")
@@ -20666,26 +19809,24 @@
 init.globalFunctions.ZB=P.ZB=new P.kq(P.Jj,"ZB")
 init.globalFunctions.jt=P.jt=new H.Nb(P.CI,"jt")
 init.globalFunctions.LS=P.LS=new P.Ri(P.qc,"LS")
-init.globalFunctions.iv=P.iv=new H.Wv(P.Ou,"iv")
+init.globalFunctions.iv=P.iv=new H.zy(P.Ou,"iv")
 init.globalFunctions.py=P.py=new H.Nb(P.T9,"py")
-init.globalFunctions.BC=P.BC=new H.Nb(P.tp,"BC")
-init.globalFunctions.n4=P.n4=new H.Wv(P.Wc,"n4")
-init.globalFunctions.N3=P.N3=new H.Wv(P.ad,"N3")
+init.globalFunctions.n4=P.n4=new H.zy(P.Wc,"n4")
+init.globalFunctions.N3=P.N3=new H.zy(P.ad,"N3")
 init.globalFunctions.J2=P.J2=new H.Nb(P.xv,"J2")
 init.globalFunctions.ya=P.ya=new P.PW(P.QA,"ya")
-init.globalFunctions.mz=W.mz=new H.Nb(W.Fz,"mz")
+init.globalFunctions.f0=W.f0=new H.Nb(W.UE,"f0")
 init.globalFunctions.V5=W.V5=new H.Nb(W.GO,"V5")
 init.globalFunctions.cn=W.cn=new H.Nb(W.Yb,"cn")
 init.globalFunctions.A6=W.A6=new P.kq(W.Qp,"A6")
 init.globalFunctions.uu=P.uu=new P.kq(P.R4,"uu")
 init.globalFunctions.En=P.En=new H.Nb(P.wY,"En")
 init.globalFunctions.Xl=P.Xl=new H.Nb(P.dU,"Xl")
-init.globalFunctions.Ft=B.Ft=new H.Nb(B.tB,"Ft")
-init.globalFunctions.PB=A.PB=new H.Fy(A.ei,"PB")
+init.globalFunctions.np=R.np=new H.Nb(R.Jk,"np")
+init.globalFunctions.PB=A.PB=new H.HB(A.ei,"PB")
 init.globalFunctions.qP=T.qP=new H.Nb(T.ul,"qP")
 init.globalFunctions.Fx=T.Fx=new H.Nb(T.PX,"Fx")
-init.globalFunctions.G5=K.G5=new H.Nb(K.Dc,"G5")
-init.globalFunctions.zr=M.zr=new H.Nb(M.Ny,"zr")
+init.globalFunctions.ZO=K.ZO=new H.Nb(K.Dc,"ZO")
 J.O.$isString=true
 J.O.$isfR=true
 J.O.$asfR=[J.O]
@@ -20698,35 +19839,9 @@
 J.im.$isfR=true
 J.im.$asfR=[J.P]
 J.im.$isa=true
-W.ba.$isa=true
-W.xr.$isa=true
-W.l8.$isa=true
-W.dZ.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
-W.Io.$isa=true
-W.lw.$isa=true
-P.tn.$isa=true
-W.a3.$isa=true
-W.A1.$isD0=true
-W.A1.$isa=true
-W.MN.$isD0=true
-W.MN.$isa=true
-W.KI.$isa=true
-W.x8.$isD0=true
-W.x8.$isa=true
-W.qp.$isa=true
-W.AW.$isa=true
-W.T5.$isa=true
-P.D5.$isD0=true
-P.D5.$isa=true
-P.zY.$isa=true
-P.Dd.$isa=true
-P.c7.$isa=true
-P.Xk.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
 J.Pp.$isdouble=true
 J.Pp.$isfR=true
 J.Pp.$asfR=[J.P]
@@ -20750,29 +19865,29 @@
 N.Ng.$asfR=[N.Ng]
 N.Ng.$isa=true
 P.a1.$isa=true
-U.EZ.$isAf=true
+U.EZ.$ishw=true
 U.EZ.$isa=true
-U.uk.$isAf=true
-U.uk.$isa=true
-U.K9.$isAf=true
-U.K9.$isa=true
-U.RW.$isAf=true
+U.RW.$ishw=true
 U.RW.$isa=true
-U.jK.$isAf=true
-U.jK.$isa=true
-U.kB.$isAf=true
-U.kB.$isa=true
-U.dC.$isAf=true
-U.dC.$isa=true
-U.w6.$isw6=true
-U.w6.$isAf=true
-U.w6.$isa=true
-U.no.$isAf=true
+U.uk.$ishw=true
+U.uk.$isa=true
+U.K9.$ishw=true
+U.K9.$isa=true
+U.no.$ishw=true
 U.no.$isa=true
-K.O1.$isO1=true
-K.O1.$isa=true
-J.yE.$isbool=true
-J.yE.$isa=true
+U.jK.$ishw=true
+U.jK.$isa=true
+U.w6.$isw6=true
+U.w6.$ishw=true
+U.w6.$isa=true
+U.ae.$ishw=true
+U.ae.$isa=true
+U.kB.$ishw=true
+U.kB.$isa=true
+K.Ae.$isAe=true
+K.Ae.$isa=true
+J.kn.$isbool=true
+J.kn.$isa=true
 P.wv.$iswv=true
 P.wv.$isa=true
 W.Lq.$isea=true
@@ -20782,9 +19897,9 @@
 A.XP.$isKV=true
 A.XP.$isD0=true
 A.XP.$isa=true
-P.VL.$isVL=true
-P.VL.$isQF=true
-P.VL.$isa=true
+P.vr.$isvr=true
+P.vr.$isQF=true
+P.vr.$isa=true
 P.D4.$isD4=true
 P.D4.$isQF=true
 P.D4.$isQF=true
@@ -20801,22 +19916,35 @@
 P.Ms.$isQF=true
 P.Ms.$isQF=true
 P.Ms.$isa=true
-M.TR.$isa=true
+P.Fw.$isQF=true
+P.Fw.$isa=true
+P.X9.$isQF=true
+P.X9.$isa=true
+X.TR.$isa=true
 N.TJ.$isa=true
+T.yj.$isyj=true
+T.yj.$isa=true
+P.NL.$isQF=true
+P.NL.$isa=true
 P.RY.$isQF=true
 P.RY.$isa=true
-B.yj.$isyj=true
-B.yj.$isa=true
 P.QF.$isQF=true
 P.QF.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
+F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.qh.$isqh=true
 P.qh.$isa=true
 W.Aj.$isea=true
 W.Aj.$isa=true
+G.W4.$isW4=true
+G.W4.$isa=true
+M.Ya.$isa=true
+Y.Pn.$isa=true
+U.hw.$ishw=true
+U.hw.$isa=true
 A.dM.$iscv=true
 A.dM.$isKV=true
 A.dM.$isD0=true
@@ -20843,8 +19971,8 @@
 L.bv.$isa=true
 W.fJ.$isD0=true
 W.fJ.$isa=true
-W.kQ.$isea=true
-W.kQ.$isa=true
+W.ew.$isea=true
+W.ew.$isa=true
 P.mE.$ismE=true
 P.mE.$isa=true
 P.KA.$isKA=true
@@ -20870,10 +19998,12 @@
 P.JB.$isa=true
 P.jp.$isjp=true
 P.jp.$isa=true
-P.EH.$isEH=true
-P.EH.$isa=true
 P.aY.$isaY=true
 P.aY.$isa=true
+P.L8.$isL8=true
+P.L8.$isa=true
+P.EH.$isEH=true
+P.EH.$isa=true
 W.D0.$isD0=true
 W.D0.$isa=true
 P.dX.$isdX=true
@@ -20892,14 +20022,10 @@
 P.iP.$isa=true
 P.fI.$isfI=true
 P.fI.$isa=true
-T.mY.$ismY=true
-T.mY.$isa=true
-U.Af.$isAf=true
-U.Af.$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
-if(!(a instanceof P.a))return J.kd.prototype
+if(!(a instanceof P.a))return J.is.prototype
 return a}
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
@@ -20913,11 +20039,11 @@
 return J.ks(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
-if(!(a instanceof P.a))return J.kd.prototype
+if(!(a instanceof P.a))return J.is.prototype
 return a}
 J.rY=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
-if(!(a instanceof P.a))return J.kd.prototype
+if(!(a instanceof P.a))return J.is.prototype
 return a}
 J.w1=function(a){if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
@@ -20927,81 +20053,192 @@
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.im.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.PE.prototype
-if(typeof a=="boolean")return J.yE.prototype
+if(typeof a=="boolean")return J.kn.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
 return J.ks(a)}
-C.fx=new U.EZ()
-C.Gw=new H.Fu()
+C.OL=new U.EZ()
+C.Gw=new H.SJ()
 C.E3=new J.Q()
-C.Fm=new J.yE()
+C.Fm=new J.kn()
 C.yX=new J.Pp()
 C.c1=new J.im()
 C.oD=new J.P()
 C.Kn=new J.O()
 C.lM=new P.by()
-C.mI=new B.Mu()
+C.mI=new K.Fa()
 C.Us=new A.yL()
-C.nJ=new B.vl()
-C.Ku=new J.kd()
-C.Wj=new P.yR()
-C.za=new A.i2()
-C.NU=new P.MA()
+C.nJ=new K.ma()
+C.Wj=new P.dp()
+C.za=new A.Mh()
+C.NU=new P.R8()
 C.v8=new P.W5()
-C.ka=Z.aC.prototype
+C.kk=Z.aC.prototype
 C.YD=F.Be.prototype
 C.j8=R.i6.prototype
-C.QQ=new A.V3("disassembly-entry")
-C.lu=new A.V3("observatory-element")
-C.es=new A.V3("isolate-summary")
+C.Vy=new A.V3("disassembly-entry")
+C.J0=new A.V3("observatory-element")
+C.aM=new A.V3("isolate-summary")
 C.Ig=new A.V3("response-viewer")
 C.nu=new A.V3("function-view")
 C.xW=new A.V3("code-view")
 C.aQ=new A.V3("class-view")
 C.Oy=new A.V3("library-view")
-C.aB=new A.V3("message-viewer")
+C.c0=new A.V3("message-viewer")
 C.js=new A.V3("stack-trace")
 C.jF=new A.V3("isolate-list")
 C.KG=new A.V3("navigation-bar")
 C.Gu=new A.V3("collapsible-content")
 C.bd=new A.V3("observatory-application")
 C.uW=new A.V3("error-view")
-C.zD=new A.V3("json-view")
-C.My=new A.V3("field-view")
+C.HN=new A.V3("json-view")
+C.mv=new A.V3("field-view")
 C.Tl=E.Fv.prototype
 C.RT=new P.a6(0)
-C.OD=F.Ir.prototype
-C.mt=H.VM(new W.I2("change"),[W.ea])
-C.T1=H.VM(new W.I2("click"),[W.Aj])
-C.MD=H.VM(new W.I2("error"),[W.kQ])
-C.PP=H.VM(new W.I2("hashchange"),[W.ea])
-C.io=H.VM(new W.I2("input"),[W.ea])
-C.fK=H.VM(new W.I2("load"),[W.kQ])
+C.OD=F.I3.prototype
+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.io=H.VM(new W.e0("input"),[W.ea])
+C.fK=H.VM(new W.e0("load"),[W.ew])
 C.lS=A.Gk.prototype
 C.PJ=N.Ds.prototype
 C.W3=W.fJ.prototype
 C.Dh=L.u7.prototype
 C.nM=D.St.prototype
 C.Nm=J.Q.prototype
-C.YI=J.Pp.prototype
+C.ON=J.Pp.prototype
 C.jn=J.im.prototype
 C.jN=J.PE.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
+C.Mc=function(hooks) {
+  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
+  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
+}
+C.dE=function(hooks) {
+  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+  if (userAgent.indexOf("Firefox") == -1) return hooks;
+  var getTag = hooks.getTag;
+  var quickMap = {
+    "BeforeUnloadEvent": "Event",
+    "DataTransfer": "Clipboard",
+    "GeoGeolocation": "Geolocation",
+    "WorkerMessageEvent": "MessageEvent",
+    "XMLDocument": "Document"};
+  function getTagFirefox(o) {
+    var tag = getTag(o);
+    return quickMap[tag] || tag;
+  }
+  hooks.getTag = getTagFirefox;
+}
+C.Mo=function getTagFallback(o) {
+  if (o == null) return "Null";
+  var constructor = o.constructor;
+  if (typeof constructor == "function") {
+    var name = constructor.builtin$cls;
+    if (typeof name == "string") return name;
+    name = constructor.name;
+    if (typeof name == "string"
+        && name !== ""
+        && name !== "Object"
+        && name !== "Function.prototype") {
+      return name;
+    }
+  }
+  var s = Object.prototype.toString.call(o);
+  return s.substring(8, s.length - 1);
+}
+C.dK=function(getTagFallback) {
+  return function(hooks) {
+    if (typeof navigator != "object") return hooks;
+    var userAgent = navigator.userAgent;
+    if (userAgent.indexOf("Chrome") >= 0 ||
+        userAgent.indexOf("DumpRenderTree") >= 0) {
+      return hooks;
+    }
+    hooks.getTag = getTagFallback;
+  };
+}
+C.XQ=function(hooks) { return hooks; }
+
+C.HX=function() {
+  function typeNameInChrome(obj) { return obj.constructor.name; }
+  function getUnknownTag(object, tag) {
+    if (/^HTML[A-Z].*Element$/.test(tag)) {
+      var name = Object.prototype.toString.call(object);
+      if (name == "[object Object]") return null;
+      return "HTMLElement";
+    }
+  }
+  function getUnknownTagGenericBrowser(object, tag) {
+    if (object instanceof HTMLElement) return "HTMLElement";
+    return getUnknownTag(object, tag);
+  }
+  function prototypeForTag(tag) {
+    if (typeof window == "undefined") return null;
+    if (typeof window[tag] == "undefined") return null;
+    var constructor = window[tag];
+    if (typeof constructor != "function") return null;
+    return constructor.prototype;
+  }
+  function discriminator(tag) { return null; }
+  var isBrowser = typeof navigator == "object";
+  return {
+    getTag: typeNameInChrome,
+    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
+    prototypeForTag: prototypeForTag,
+    discriminator: discriminator };
+}
 C.i7=    ((typeof version == "function" && typeof os == "object" && "system" in os)
     || (typeof navigator == "object"
         && navigator.userAgent.indexOf('Chrome') != -1))
         ? function(x) { return x.$dartCachedLength || x.length; }
         : function(x) { return x.length; };
 
-C.A3=new P.Mx(null)
-C.Ap=new P.ct(null)
-C.GB=Z.vj.prototype
+C.Px=function(hooks) {
+  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+  if (userAgent.indexOf("Trident/") == -1) return hooks;
+  var getTag = hooks.getTag;
+  var quickMap = {
+    "BeforeUnloadEvent": "Event",
+    "DataTransfer": "Clipboard",
+    "HTMLDDElement": "HTMLElement",
+    "HTMLDTElement": "HTMLElement",
+    "HTMLPhraseElement": "HTMLElement",
+    "Position": "Geoposition"
+  };
+  function getTagIE(o) {
+    var tag = getTag(o);
+    var newTag = quickMap[tag];
+    if (newTag) return newTag;
+    if (tag == "Document") {
+      if (!!o.xmlVersion) return "!Document";
+      return "!HTMLDocument";
+    }
+    if (tag == "Object") {
+      if (window.DataView && (o instanceof window.DataView)) return "DataView";
+    }
+    return tag;
+  }
+  function prototypeForTagIE(tag) {
+    if (tag == "Document") return null;
+    var constructor = window[tag];
+    if (constructor == null) return null;
+    return constructor.prototype;
+  }
+  hooks.getTag = getTagIE;
+  hooks.prototypeForTag = prototypeForTagIE;
+}
+C.A3=new P.QM(null)
+C.jZ=Z.vj.prototype
+C.VZ=new N.Ng("FINER",400)
 C.R5=new N.Ng("FINE",500)
 C.IF=new N.Ng("INFO",800)
 C.UP=new N.Ng("WARNING",900)
-C.Bn=M.CX.prototype
+C.MG=M.CX.prototype
 I.makeConstantList = function(list) {
   list.immutable$list = true;
   list.fixed$length = true;
@@ -21011,6 +20248,9 @@
 C.mK=I.makeConstantList([0,0,26624,1023,65534,2047,65534,2047])
 C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
 C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
+C.Me=H.VM(I.makeConstantList([]),[P.Ms])
+C.dn=H.VM(I.makeConstantList([]),[P.Fw])
+C.hU=H.VM(I.makeConstantList([]),[P.X9])
 C.xD=I.makeConstantList([])
 C.Qy=I.makeConstantList(["in","this"])
 C.kg=I.makeConstantList([0,0,24576,1023,65534,34815,65534,18431])
@@ -21018,29 +20258,30 @@
 C.iq=I.makeConstantList([40,41,91,93,123,125])
 C.zJ=I.makeConstantList(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
 C.uE=new H.LP(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zJ)
-C.iO=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.FS=new H.LP(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.iO)
+C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.FS=new H.LP(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.qr=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.Ur=new H.LP(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.qr)
-C.j1=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LP(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.j1)
+C.dj=new H.LP(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.qr)
+C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.LP(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
 C.ME=I.makeConstantList(["enumerate"])
-C.va=new H.LP(1,{enumerate:K.G5},C.ME)
+C.va=new H.LP(1,{enumerate:K.ZO},C.ME)
 C.Wp=L.Nh.prototype
-C.vE=Q.ih.prototype
+C.Xg=Q.ih.prototype
 C.t5=W.BH.prototype
-C.HB=V.F1.prototype
+C.k0=V.F1.prototype
 C.Pf=Z.uL.prototype
-C.zb=A.XP.prototype
-C.Iv=A.ir.prototype
-C.Cc=Q.M9.prototype
+C.xk=A.XP.prototype
+C.GB=A.ir.prototype
+C.Cc=Q.NQ.prototype
 C.bg=X.uw.prototype
 C.PU=new H.GD("dart.core.Object")
 C.nz=new H.GD("dart.core.DateTime")
 C.Ts=new H.GD("dart.core.bool")
 C.A5=new H.GD("Directory")
 C.pk=new H.GD("Platform")
-C.b0=new H.GD("app")
+C.fz=new H.GD("[]")
+C.wh=new H.GD("app")
 C.Ka=new H.GD("call")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
@@ -21050,80 +20291,88 @@
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
 C.yh=new H.GD("error")
+C.Yn=new H.GD("error_obj")
 C.WQ=new H.GD("field")
 C.nf=new H.GD("function")
 C.AZ=new H.GD("dart.core.String")
-C.tx=new H.GD("iconClass")
+C.Di=new H.GD("iconClass")
 C.eJ=new H.GD("instruction")
 C.Y2=new H.GD("isolate")
-C.B1=new H.GD("json")
+C.Gd=new H.GD("json")
 C.Wn=new H.GD("length")
 C.EV=new H.GD("library")
 C.PC=new H.GD("dart.core.int")
 C.wt=new H.GD("members")
 C.KY=new H.GD("messageType")
 C.YS=new H.GD("name")
+C.OV=new H.GD("noSuchMethod")
 C.Ws=new H.GD("operatingSystem")
-C.NA=new H.GD("prefix")
+C.qb=new H.GD("prefix")
 C.Qi=new H.GD("registerCallback")
 C.wH=new H.GD("responses")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
-C.Uu=new H.GD("trace")
+C.eC=new H.GD("[]=")
+C.kw=new H.GD("trace")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
-C.z9=new H.GD("void")
 C.QK=new H.GD("window")
-C.Tn=H.mm('xh')
-C.AK=new H.Lm(C.Tn,"T",0)
-C.SH=H.mm('br')
-C.dK=new H.Lm(C.SH,"K",0)
-C.Mt=H.mm('Pc')
-C.cB=new H.Lm(C.Mt,"E",0)
-C.lb=H.mm('O1')
-C.qt=new H.Lm(C.lb,"V",0)
-C.Df=new H.Lm(C.SH,"V",0)
-C.G6=H.mm('F1')
+C.vO=H.mm('br')
+C.wK=new H.Lm(C.vO,"K",0)
+C.SL=H.mm('Ae')
+C.WX=new H.Lm(C.SL,"V",0)
+C.QJ=H.mm('xh')
+C.wW=new H.Lm(C.QJ,"T",0)
+C.wa=new H.Lm(C.vO,"V",0)
+C.Ti=H.mm('wn')
+C.Mt=new H.Lm(C.Ti,"E",0)
+C.qM=H.mm('F1')
 C.NM=H.mm('Nh')
-C.FQ=H.mm('a')
+C.nY=H.mm('a')
 C.Yc=H.mm('iP')
 C.LN=H.mm('Be')
 C.Qa=H.mm('u7')
 C.xS=H.mm('UZ')
 C.PT=H.mm('CX')
 C.Op=H.mm('G8')
+C.xF=H.mm('NQ')
 C.b4=H.mm('ih')
 C.hG=H.mm('ir')
 C.dA=H.mm('Ms')
-C.Qw=H.mm('Fv')
+C.mo=H.mm('Fv')
 C.O4=H.mm('double')
 C.xE=H.mm('aC')
 C.yw=H.mm('int')
 C.vuj=H.mm('uw')
-C.yW=H.mm('M9')
-C.C6=H.mm('vj')
+C.Tq=H.mm('vj')
 C.CT=H.mm('St')
 C.Q4=H.mm('uL')
-C.hT=H.mm('EH')
+C.yQ=H.mm('EH')
 C.Db=H.mm('String')
+C.yg=H.mm('I3')
 C.XU=H.mm('i6')
 C.Bm=H.mm('XP')
 C.HL=H.mm('bool')
 C.HH=H.mm('dynamic')
 C.Gp=H.mm('cw')
-C.mnH=H.mm('Ds')
-C.xF=H.mm('Ir')
+C.Sa=H.mm('Ds')
 C.CS=H.mm('vm')
 C.XK=H.mm('Gk')
 C.GX=H.mm('c8')
-C.dy=new P.u5(!1)
-C.ol=W.Oi.prototype
-C.hi=H.VM(new W.bO(W.mz),[W.Lq])
-C.z3=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null,null)
-$.XE=null
+C.vB=J.is.prototype
+C.dy=new P.z0(!1)
+C.ol=W.K5.prototype
+C.hi=H.VM(new W.kG(W.f0),[W.Lq])
+C.Qq=new P.wJ(null,null,null,null,null,null,null,null,null,null,null,null)
+$.lE=null
 $.b9=1
-$.z7="$cachedFunction"
+$.te="$cachedFunction"
 $.eb="$cachedInvocation"
+$.NF=null
+$.TX=null
+$.x7=null
+$.nw=null
+$.vv=null
 $.Bv=null
 $.oK=null
 $.tY=null
@@ -21142,20 +20391,20 @@
 $.uP=!0
 $.To=null
 J.AA=function(a){return J.RE(a).GB(a)}
+J.AB=function(a){return J.RE(a).gkU(a)}
+J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
-J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
 J.B8=function(a){return J.RE(a).gQ0(a)}
 J.BM=function(a,b){return J.RE(a).jx(a,b)}
-J.Br=function(a,b,c){return J.rY(a).wL(a,b,c)}
-J.CC=function(a){return J.RE(a).gmH(a)}
-J.Dn=function(a,b){return J.w1(a).zV(a,b)}
+J.C0=function(a,b){return J.w1(a).ez(a,b)}
+J.Co=function(a){return J.RE(a).gcC(a)}
+J.DA=function(a){return J.RE(a).goc(a)}
+J.DB=function(a,b){return J.w1(a).Ay(a,b)}
 J.Dz=function(a,b){return J.rY(a).j(a,b)}
 J.EC=function(a){return J.RE(a).giC(a)}
-J.EM=function(a){return J.RE(a).gV5(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.Ei=function(a){return J.RE(a).gI(a)}
 J.F8=function(a){return J.RE(a).gjO(a)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FW=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
@@ -21168,103 +20417,104 @@
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.Hb=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
+J.Hf=function(a){return J.RE(a).gTq(a)}
+J.I8=function(a,b,c){return J.rY(a).wL(a,b,c)}
 J.Ib=function(a){return J.RE(a).gqh(a)}
+J.Ir=function(a){return J.RE(a).gHs(a)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
-J.K0=function(a){return J.RE(a).gd4(a)}
+J.Ja=function(a){return J.RE(a).gr9(a)}
 J.K3=function(a,b){return J.RE(a).Kb(a,b)}
 J.L9=function(a,b){return J.RE(a).Id(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
-J.M6=function(a){return J.RE(a).grk(a)}
+J.Lp=function(a){return J.RE(a).geT(a)}
 J.MK=function(a,b){return J.RE(a).Md(a,b)}
 J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MV=function(a,b){return J.RE(a).Ih(a,b)}
-J.MX=function(a){return J.RE(a).gQg(a)}
+J.Mu=function(a,b){return J.RE(a).sig(a,b)}
 J.Mz=function(a){return J.rY(a).hc(a)}
-J.N7=function(a,b){return J.RE(a).srk(a,b)}
-J.NQ=function(a){return J.RE(a).gjb(a)}
-J.Nd=function(a){return J.w1(a).br(a)}
 J.Or=function(a){return J.RE(a).yx(a)}
-J.Ow=function(a){return J.RE(a).gvc(a)}
-J.PF=function(a){return J.RE(a).gF7(a)}
+J.Pr=function(a,b){return J.w1(a).eR(a,b)}
 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.Q3=function(a,b){return J.RE(a).sr9(a,b)}
 J.QE=function(a){return J.RE(a).gCd(a)}
+J.RF=function(a,b){return J.RE(a).WO(a,b)}
+J.Ro=function(a){return J.RE(a).gjU(a)}
 J.TD=function(a){return J.RE(a).i4(a)}
 J.TZ=function(a){return J.RE(a).gKV(a)}
-J.Tq=function(a,b){return J.RE(a).sig(a,b)}
 J.Tr=function(a){return J.RE(a).gCj(a)}
-J.UK=function(a,b){return J.RE(a).WO(a,b)}
+J.UK=function(a,b){return J.RE(a).RR(a,b)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.wV(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
 J.US=function(a,b){return J.RE(a).pr(a,b)}
 J.UU=function(a,b){return J.U6(a).u8(a,b)}
+J.UW=function(a){return J.RE(a).gLU(a)}
+J.UX=function(a){return J.RE(a).gmW(a)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
 J.VN=function(a){return J.RE(a).gM0(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
+J.Vs=function(a){return J.RE(a).gQg(a)}
 J.Vw=function(a,b,c){return J.U6(a).Is(a,b,c)}
 J.W7=function(a){return J.RE(a).Nz(a)}
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.WI=function(a){return J.RE(a).gG3(a)}
-J.Yi=function(a){return J.RE(a).gzW(a)}
-J.Z1=function(a,b){return J.rY(a).yn(a,b)}
+J.We=function(a,b){return J.RE(a).scC(a,b)}
+J.Y5=function(a){return J.RE(a).gyT(a)}
+J.Z0=function(a){return J.RE(a).ghr(a)}
 J.Z7=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
+J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bh=function(a,b,c){return J.rY(a).JT(a,b,c)}
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.co=function(a,b){return J.rY(a).nC(a,b)}
-J.cp=function(a){return J.RE(a).geT(a)}
-J.cs=function(a){return J.RE(a).gE3(a)}
 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.em=function(a,b){return J.Wx(a).WZ(a,b)}
+J.f5=function(a){return J.RE(a).gI(a)}
+J.fP=function(a){return J.RE(a).gDg(a)}
 J.fU=function(a){return J.RE(a).gEX(a)}
-J.fl=function(a,b){return J.RE(a).st5(a,b)}
 J.hI=function(a){return J.RE(a).gUQ(a)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
+J.iY=function(a){return J.RE(a).gvc(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)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
 return J.w1(a).u(a,b,c)}
-J.kk=function(a,b,c,d){return J.RE(a).Zf(a,b,c,d)}
-J.kl=function(a,b){return J.w1(a).ez(a,b)}
 J.l2=function(a){return J.RE(a).gN(a)}
 J.lB=function(a){return J.RE(a).gP1(a)}
-J.le=function(a){return J.x(a).gEo(a)}
 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.mX=function(a){return J.RE(a).gay(a)}
-J.n9=function(a){return J.w1(a).gFV(a)}
-J.nU=function(a){return J.RE(a).gBg(a)}
+J.nX=function(a){return J.RE(a).gjb(a)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
-J.oP=function(a){return J.RE(a).gqn(a)}
 J.og=function(a,b){return J.RE(a).sIt(a,b)}
 J.p0=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Wx(a).U(a,b)}
-J.pN=function(a){return J.RE(a).gmW(a)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
 J.q8=function(a){return J.U6(a).gB(a)}
+J.qA=function(a){return J.w1(a).br(a)}
 J.qV=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
-J.qg=function(a,b){return J.RE(a).Yx(a,b)}
+J.rP=function(a,b){return J.RE(a).sTq(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
-J.tE=function(a){return J.RE(a).goc(a)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
-J.te=function(a,b,c){return J.RE(a).mK(a,b,c)}
+J.tb=function(a,b,c,d){return J.RE(a).Z1(a,b,c,d)}
+J.tx=function(a){return J.RE(a).guD(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
+J.v1=function(a){return J.x(a).giO(a)}
 J.vX=function(a){return J.w1(a).wg(a)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
@@ -21279,14 +20529,15 @@
 J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.z2=function(a){return J.RE(a).gG1(a)}
-J.zH=function(a){return J.RE(a).gt5(a)}
-$.Dq=["Ay","BC","BN","BT","Ba","C","C0","C8","CH","Ch","D","D3","D6","DX","Df","Dh","E","Ec","F","Fr","Fv","GB","HG","Hs","Id","Ih","Im","Is","J","J3","JP","JT","JV","Ja","Jk","KJ","Kb","LO","LV","Md","Mi","Mu","Nj","Nz","O","On","PM","Pa","Pk","Pv","Qh","R3","R4","RB","Rz","SZ","T","T2","TH","TP","TW","Tc","Td","U","U2","UD","UH","UZ","Uc","V","V1","VD","Vr","Vy","W","W3","W4","WO","WZ","Wt","XG","XI","XU","Xl","Y9","YU","YW","Ys","Yv","Yx","Z","Z0","Z2","ZF","ZL","ZP","Zf","Zv","a0","aC","aN","aq","bA","bS","br","bu","cO","cn","ct","d0","dR","dd","du","ea","er","es","ev","ez","f6","fd","fj","fk","fm","g","gA","gAQ","gB","gBb","gBg","gCd","gCj","gDD","gE3","gE8","gEX","gEl","gEo","gF1","gF7","gFT","gFV","gFe","gG0","gG1","gG3","gG6","gGL","gGj","gI","gJS","gJf","gKE","gKM","gKV","gLA","gLm","gM0","gMB","gMR","gMj","gN","gNI","gOL","gP","gP1","gPu","gPw","gPy","gQ0","gQW","gQg","gQq","gR","gRA","gRu","gTM","gTn","gUQ","gUV","gV5","gVA","gVl","gXf","gZw","gay","gbP","gbx","gd4","geT","geb","gey","gfY","gfg","gi0","gi9","giC","giI","gig","gip","gjL","gjO","gjb","gjr","gkc","gkf","gkp","gl0","glb","glc","gmH","gmW","gmm","gn4","goM","goc","gor","gpQ","gpo","gq6","gqC","gqh","gqn","gr3","grK","grZ","grk","gt0","gt5","gtD","gtH","gtN","gtT","gv6","gvH","gvc","gvu","gxj","gxr","gys","gzP","gzW","gzZ","h","h8","hc","hv","i","i4","iA","iM","iw","j","jT","jx","kF","kJ","kO","kP","l5","lj","m","mK","mv","n","nC","nH","oB","oP","oW","od","oo","pZ","pl","pr","q1","r6","rJ","rS","sAQ","sB","sEl","sF1","sFT","sG1","sGj","sIt","sMR","sMj","sNI","sOL","sP","sPw","sPy","sQq","sRu","sTn","sVA","sXf","sZw","sa4","sd4","seb","si0","siI","sig","sjO","sjr","skc","skf","slb","soc","srk","st0","st5","stD","stH","stN","stT","svu","sxj","sxr","szZ","t","tZ","tg","tt","u","u5","u8","vs","wL","wR","wg","x3","y0","yC","ym","yn","yq","yu","yx","yy","z2","zV"]
-$.Au=[C.G6,V.F1,{created:V.fv},C.NM,L.Nh,{created:L.rJ},C.LN,F.Be,{created:F.Fe},C.Qa,L.u7,{created:L.Tt},C.xS,P.UZ,{},C.PT,M.CX,{created:M.SP},C.Op,P.G8,{},C.b4,Q.ih,{created:Q.BW},C.hG,A.ir,{created:A.oa},C.Qw,E.Fv,{created:E.AH},C.xE,Z.aC,{created:Z.zg},C.vuj,X.uw,{created:X.bV},C.yW,Q.M9,{created:Q.Zo},C.C6,Z.vj,{created:Z.un},C.CT,D.St,{created:D.N5},C.Q4,Z.uL,{created:Z.Hx},C.XU,R.i6,{created:R.IT},C.Bm,A.XP,{created:A.XL},C.mnH,N.Ds,{created:N.p7},C.xF,F.Ir,{created:F.TW},C.XK,A.Gk,{created:A.cY}]
+J.zZ=function(a,b){return J.RE(a).Yv(a,b)}
+J.zj=function(a){return J.RE(a).gvH(a)}
+$.Dq=["Ay","BN","BT","Ba","C","C0","C8","Ch","D","D3","D6","Dh","E","Ec","F","FH","Fr","GB","HG","Hn","Id","Ih","Im","Is","J","J3","JP","JT","JV","Ja","Jk","Kb","LV","Md","Mi","Mu","Nj","Nz","O","On","PM","Pa","Pk","Pv","R3","R4","RB","RR","Rz","SZ","T","T2","TH","TP","TW","Tc","Td","U","UD","UH","UZ","Uc","V","V1","Vr","Vy","W","W3","W4","WO","Wt","Wz","XG","XU","Xl","Y9","YU","YW","Ys","Yv","Z","Z1","Z2","ZB","ZF","ZL","ZP","Zv","aC","aN","aq","bA","bS","br","bu","cO","cn","d0","dR","dd","du","eR","ea","er","es","ev","ez","f6","fd","fj","fk","fm","g","gA","gAQ","gB","gBb","gCd","gCj","gDD","gDg","gE8","gEX","gEr","gF1","gFJ","gFT","gFV","gFe","gG0","gG1","gG3","gGL","gHs","gI","gIi","gJS","gJf","gKE","gKM","gKV","gLA","gLU","gLm","gM0","gMB","gMj","gN","gNI","gP","gP1","gP2","gPp","gPu","gPw","gPy","gQ0","gQG","gQW","gQg","gQq","gRu","gT8","gTM","gTn","gTq","gUQ","gUV","gVA","gVB","gVl","gXB","gXf","gXt","gZw","gai","gbP","gbx","gcC","geT","geb","gey","gfY","ghO","ghr","gi0","giC","giI","giO","gig","gjL","gjO","gjU","gjb","gkU","gkc","gkf","gkp","gl0","glc","gmW","gmm","gn4","goc","gor","gpQ","gpo","gq6","gqC","gqh","gql","gr3","gr9","grK","grZ","gt0","gtD","gtH","gtN","gtT","guD","gvH","gvc","gvt","gxj","gxr","gyT","gys","gzP","gzZ","h","h8","hc","i","i4","iA","iM","iw","j","jT","jx","kO","l5","l8","lj","m","mK","mv","n","nB","nC","nH","nP","ni","oB","oW","od","oo","oq","pD","pZ","pl","pr","qZ","r6","rJ","rS","sAQ","sB","sF1","sFJ","sFT","sG1","sIt","sMj","sNI","sP","sP2","sPw","sPy","sQG","sQq","sRu","sTn","sTq","sVA","sVB","sXB","sXf","sZw","sa4","sai","scC","seb","shO","si0","siI","sig","sjO","skc","skf","soc","sql","sr9","st0","stD","stH","stN","stT","svt","sxj","sxr","szZ","t","tZ","tg","tt","u","u5","u8","uG","vs","w3","wE","wL","wR","wg","x3","xI","xe","y0","yC","yc","ym","yn","yq","yu","yx","yy","z2","zV"]
+$.Au=[C.qM,V.F1,{created:V.fv},C.NM,L.Nh,{created:L.rJ},C.LN,F.Be,{created:F.Fe},C.Qa,L.u7,{created:L.ip},C.xS,P.UZ,{},C.PT,M.CX,{created:M.SP},C.Op,P.G8,{},C.xF,Q.NQ,{created:Q.Zo},C.b4,Q.ih,{created:Q.BW},C.hG,A.ir,{created:A.oa},C.mo,E.Fv,{created:E.AH},C.xE,Z.aC,{created:Z.zg},C.vuj,X.uw,{created:X.bV},C.Tq,Z.vj,{created:Z.un},C.CT,D.St,{created:D.N5},C.Q4,Z.uL,{created:Z.Hx},C.yg,F.I3,{created:F.TW},C.XU,R.i6,{created:R.IT},C.Bm,A.XP,{created:A.XL},C.Sa,N.Ds,{created:N.p7},C.XK,A.Gk,{created:A.cY}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","pG","Qm",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","Rs",function(){return H.yl()})
+I.$lazy($,"thisScript","Kb","Cl",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){var z=new P.kM(null)
 H.VM(z,[J.im])
 return z})
@@ -21296,38 +20547,36 @@
 I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(H.pb())})
 I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.cM(H.S7(void 0))})
 I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(H.u9())})
-I.$lazy($,"nullPropertyPattern","BX","zO",function(){return H.cM(H.Mj(null))})
-I.$lazy($,"nullLiteralPropertyPattern","tt","uN",function(){return H.cM(H.Qd())})
+I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
+I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.cM(H.Qd())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
 I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.cM(H.m0())})
-I.$lazy($,"getTypeNameOf","Zv","nn",function(){return H.VP()})
-I.$lazy($,"customElementsReady","Am","i5",function(){return new B.wJ().call$0()})
+I.$lazy($,"customElementsReady","Am","i5",function(){return new B.zO().call$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return P.A(null,null)})
 I.$lazy($,"validationPattern","zP","R0",function(){return new H.VR(H.v4("^(?:[a-zA-Z$][a-zA-Z$0-9_]*\\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|-|unary-|\\[\\]=|~|==|\\[\\]|\\*|/|%|~/|\\+|<<|>>|>=|>|<=|<|&|\\^|\\|)$",!1,!0,!1),null,null)})
 I.$lazy($,"_dynamicType","QG","Cr",function(){return new H.EE(C.nN)})
-I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.z9)})
-I.$lazy($,"librariesByName","Ct","zX",function(){return H.dF()})
-I.$lazy($,"currentJsMirrorSystem","GR","Cm",function(){return new H.Sn(null,new H.Lj($globalState.N0))})
+I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
+I.$lazy($,"currentJsMirrorSystem","GR","At",function(){return new H.Sn(null,new H.Lj($globalState.N0))})
 I.$lazy($,"mangledNames","tj","bx",function(){return H.hY(init.mangledNames,!1)})
 I.$lazy($,"reflectiveNames","DE","I6",function(){return H.YK($.bx())})
 I.$lazy($,"mangledGlobalNames","iC","Sl",function(){return H.hY(init.mangledGlobalNames,!0)})
-I.$lazy($,"_stackTraceExpando","MG","ij",function(){var z=new P.kM("asynchronous error")
-H.VM(z,[null])
-return z})
 I.$lazy($,"_asyncCallbacks","r1","P8",function(){return P.NZ(null,{func:"X0",void:true})})
-I.$lazy($,"_toStringVisiting","xg","OA",function(){return P.zM(null)})
+I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return P.A(null,null)})
 I.$lazy($,"_splitRe","Um","cO",function(){return new H.VR(H.v4("^(?:([^:/?#]+):)?(?://(?:([^/?#]*)@)?(?:([\\w\\d\\-\\u0100-\\uffff.%]*)|\\[([A-Fa-f0-9:.]*)\\])(?::([0-9]+))?)?([^?#[]+)?(?:\\?([^#]*))?(?:#(.*))?$",!1,!0,!1),null,null)})
 I.$lazy($,"_safeConsole","wk","UT",function(){return new W.QZ()})
 I.$lazy($,"webkitEvents","fD","Vp",function(){return H.B7(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],P.L5(null,null,null,null,null))})
-I.$lazy($,"context","eo","LX",function(){return P.EQ(function() { return this; }())})
-I.$lazy($,"_loggers","Uj","Iu",function(){return H.B7([],P.L5(null,null,null,null,null))})
+I.$lazy($,"context","eo","LX",function(){return P.ND(function() { return this; }())})
+I.$lazy($,"_loggers","Uj","Iu",function(){var z=H.B7([],P.L5(null,null,null,null,null))
+H.VM(z,[J.O,N.TJ])
+return z})
 I.$lazy($,"currentIsolateMatcher","qY","oy",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"_objectType","YQ","D7",function(){return P.re(C.FQ)})
-I.$lazy($,"_pathRegExp","Jm","tN",function(){return new B.Md().call$0()})
+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.lP().call$0()})
 I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
-I.$lazy($,"_logger","y7","aT",function(){return N.Jx("Observable.dirtyCheck")})
-I.$lazy($,"_builder","Pr","rL",function(){return B.mq(null,null)})
+I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
+I.$lazy($,"_builder","RU","vw",function(){return B.mq(null,null)})
 I.$lazy($,"posix","yr","IX",function(){return new B.BE("posix","/",new H.VR(H.v4("/",!1,!0,!1),null,null),new H.VR(H.v4("[^/]$",!1,!0,!1),null,null),new H.VR(H.v4("^/",!1,!0,!1),null,null),null)})
 I.$lazy($,"windows","ho","CE",function(){return new B.Qb("windows","\\",new H.VR(H.v4("[/\\\\]",!1,!0,!1),null,null),new H.VR(H.v4("[^/\\\\]$",!1,!0,!1),null,null),new H.VR(H.v4("^(\\\\\\\\|[a-zA-Z]:[/\\\\])",!1,!0,!1),null,null),null)})
 I.$lazy($,"url","ak","LT",function(){return new B.xI("url","/",new H.VR(H.v4("/",!1,!0,!1),null,null),new H.VR(H.v4("(^[a-zA-Z][-+.a-zA-Z\\d]*://|[^/])$",!1,!0,!1),null,null),new H.VR(H.v4("[a-zA-Z][-+.a-zA-Z\\d]*://[^/]*",!1,!0,!1),null,null),new H.VR(H.v4("^/",!1,!0,!1),null,null),null)})
@@ -21336,9 +20585,10 @@
 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($,"_reverseEventTranslations","fp","pT",function(){return new A.w9().call$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","W1","R8",function(){var z=P.L5(null,null,null,J.O,P.a)
+I.$lazy($,"_objectType","Cy","Tf",function(){return P.re(C.nY)})
+I.$lazy($,"_reverseEventTranslations","fp","pT",function(){return new A.w12().call$0()})
+I.$lazy($,"bindPattern","ZA","VC",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)
 z.Ay(z,C.va)
 return new A.HJ(z)})
 I.$lazy($,"_ready","tS","mC",function(){var z,y
@@ -21354,35 +20604,35 @@
 I.$lazy($,"_shadowHost","cU","od",function(){var z=new P.kM(null)
 H.VM(z,[A.dM])
 return z})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
-I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
-I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
-I.$lazy($,"_packageRoot","Po","rw",function(){var z=J.CC(C.ol.gmW(window))
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.UW(C.ol.gmW(window)),null,null)})
+I.$lazy($,"_libs","D9","UG",function(){return $.At().gvU()})
+I.$lazy($,"_rootUri","aU","RQ",function(){return $.At().F1.gcZ().gFP()})
+I.$lazy($,"_packageRoot","Po","rw",function(){var z=J.UW(C.ol.gmW(window))
 z=P.r6($.cO().ej(z)).r0
-return H.d($.rL().tM(z))+"/packages/"})
-I.$lazy($,"_typeHandlers","FZ","WJ",function(){return new Z.W6().call$0()})
+return H.d($.vw().tM(z))+"/packages/"})
+I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
+I.$lazy($,"_typeHandlers","FZ","WJ",function(){return new Z.Md().call$0()})
 I.$lazy($,"_jsHelper","zU","Yr",function(){var z,y
-z=$.Cm().gvU()
+z=$.At().gvU()
 y=P.r6($.cO().ej("dart:_js_helper"))
 z=z.nb
 return z.t(z,y)})
-I.$lazy($,"_mangledNameField","AU","av",function(){return new M.w10().call$0()})
+I.$lazy($,"_mangledNameField","AU","av",function(){return new M.w13().call$0()})
 I.$lazy($,"_logger","Kp","IS",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","Hf","Gn",function(){return H.B7(["+",new K.Uf(),"-",new K.Ra(),"*",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.w2()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_UNARY_OPERATORS","ju","YG",function(){return H.B7(["+",new K.w3(),"-",new K.w4(),"!",new K.w5()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
+I.$lazy($,"_BINARY_OPERATORS","tB","bF",function(){return H.B7(["+",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()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_UNARY_OPERATORS","ju","YG",function(){return H.B7(["+",new K.w9(),"-",new K.w10(),"!",new K.w11()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Uf().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){var z=new P.kM(null)
 H.VM(z,[null])
 return z})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){var z=J.kl(C.uE.gvc(C.uE),new M.w7())
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){var z=J.C0(C.uE.gvc(C.uE),new M.Ra())
 return"template, "+z.zV(z,", ")})
 I.$lazy($,"_expando","fF","cm",function(){var z=new P.kM("template_binding")
 H.VM(z,[null])
 return z})
-J.vB["%"]="DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedNumberList|SVGAnimatedString|SpeechRecognitionAlternative"
 
 init.functionAliases={}
-init.metadata=[P.a,C.dK,C.Df,C.qt,C.cB,C.AK,P.uq,"name",J.O,Z.aC,F.Be,R.i6,W.Oi,E.Fv,F.Ir,A.Gk,N.Ds,L.u7,D.St,Z.vj,M.CX,L.Nh,Q.ih,V.F1,Z.uL,[K.O1,3],"index",J.im,"value",3,Q.M9,X.uw,P.Z0,C.nJ,C.Us,,C.mI,J.yE,"r","e",W.ea,"detail","target",W.KV,[J.Q,H.Zk],"methodOwner",P.NL,[J.Q,P.RY],"fieldOwner",[P.Z0,P.wv,P.RS],[P.Z0,P.wv,P.RY],[P.Z0,P.wv,P.QF],P.VL,"fieldName",P.wv,"arg",H.Uz,[J.Q,P.VL],P.Ms,"memberName","positionalArguments",J.Q,"namedArguments",[P.Z0,P.wv,null],[J.Q,P.Ms],[J.Q,P.Fw],[J.Q,P.X9],"i","oldValue","key","m",[J.Q,P.Z0],"l","objectId","cid","isolateId",L.mL,"newValue",5,4,[P.cX,1],[P.cX,2],2,1,"v",];$=null
+init.metadata=[P.a,C.wK,C.wa,C.WX,C.Mt,C.wW,P.uq,"name",J.O,Z.aC,F.Be,R.i6,W.K5,E.Fv,F.I3,A.Gk,N.Ds,L.u7,D.St,Z.vj,M.CX,L.Nh,Q.ih,V.F1,Z.uL,[K.Ae,3],"index",J.im,"value",3,Q.NQ,X.uw,P.L8,C.nJ,C.Us,,Z.Vf,F.tu,C.mI,J.kn,"r","e",W.ea,"detail","target",W.KV,R.Vc,[P.L8,P.wv,P.RS],[J.Q,H.Zk],"methodOwner",P.NL,[J.Q,P.RY],"fieldOwner",[P.L8,P.wv,P.RY],[P.L8,P.wv,P.QF],[P.L8,P.wv,P.NL],P.vr,"fieldName",P.wv,"arg",H.Uz,[J.Q,P.vr],P.Ms,"memberName","positionalArguments",J.Q,"namedArguments",[P.L8,P.wv,null],[J.Q,P.Ms],"owner",[J.Q,P.Fw],[J.Q,P.X9],H.Un,"key",P.QF,H.Tp,"tv","i",E.WZ,F.pv,A.Vfx,N.Dsd,D.tuj,"oldValue",Z.Vct,M.D13,"m",[J.Q,P.L8],"l","objectId","cid","isolateId",L.mL,Z.Xf,5,"newValue",4,[P.cX,1],[P.cX,2],2,1,"v",X.WZq,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -21444,9 +20694,9 @@
   init.currentScript = currentScript;
 
   if (typeof dartMainRunner === "function") {
-    dartMainRunner(function() { H.wW(E.hk); });
+    dartMainRunner(function() { H.Vg(E.qg); });
   } else {
-    H.wW(E.hk);
+    H.Vg(E.qg);
   }
 })
 function init(){I.p={}
@@ -21525,7 +20775,7 @@
 x[s]=h
 g[s]=h}v=null
 var f={}
-init.interceptorsByTag={}
+init.interceptorsByTag=Object.create(null)
 init.leafTags={}
 function finishClass(a8){var e=Object.prototype.hasOwnProperty
 if(e.call(f,a8))return
@@ -21565,22 +20815,1565 @@
 return Isolate}}
 })()
 function dart_precompiled($collectedClasses){var $desc
+function qE(){}qE.builtin$cls="qE"
+if(!"name" in qE)qE.name="qE"
+$desc=$collectedClasses.qE
+if($desc instanceof Array)$desc=$desc[1]
+qE.prototype=$desc
+function Yy(){}Yy.builtin$cls="Yy"
+if(!"name" in Yy)Yy.name="Yy"
+$desc=$collectedClasses.Yy
+if($desc instanceof Array)$desc=$desc[1]
+Yy.prototype=$desc
+function Ps(){}Ps.builtin$cls="Ps"
+if(!"name" in Ps)Ps.name="Ps"
+$desc=$collectedClasses.Ps
+if($desc instanceof Array)$desc=$desc[1]
+Ps.prototype=$desc
+Ps.prototype.gcC=function(receiver){return receiver.hash}
+Ps.prototype.scC=function(receiver,v){return receiver.hash=v}
+Ps.prototype.gLU=function(receiver){return receiver.href}
+Ps.prototype.gN=function(receiver){return receiver.target}
+Ps.prototype.gr9=function(receiver){return receiver.type}
+Ps.prototype.sr9=function(receiver,v){return receiver.type=v}
+function rK(){}rK.builtin$cls="rK"
+if(!"name" in rK)rK.name="rK"
+$desc=$collectedClasses.rK
+if($desc instanceof Array)$desc=$desc[1]
+rK.prototype=$desc
+function fY(){}fY.builtin$cls="fY"
+if(!"name" in fY)fY.name="fY"
+$desc=$collectedClasses.fY
+if($desc instanceof Array)$desc=$desc[1]
+fY.prototype=$desc
+fY.prototype.gcC=function(receiver){return receiver.hash}
+fY.prototype.gLU=function(receiver){return receiver.href}
+fY.prototype.gN=function(receiver){return receiver.target}
+function Mr(){}Mr.builtin$cls="Mr"
+if(!"name" in Mr)Mr.name="Mr"
+$desc=$collectedClasses.Mr
+if($desc instanceof Array)$desc=$desc[1]
+Mr.prototype=$desc
+function zx(){}zx.builtin$cls="zx"
+if(!"name" in zx)zx.name="zx"
+$desc=$collectedClasses.zx
+if($desc instanceof Array)$desc=$desc[1]
+zx.prototype=$desc
+function ct(){}ct.builtin$cls="ct"
+if(!"name" in ct)ct.name="ct"
+$desc=$collectedClasses.ct
+if($desc instanceof Array)$desc=$desc[1]
+ct.prototype=$desc
+function nB(){}nB.builtin$cls="nB"
+if(!"name" in nB)nB.name="nB"
+$desc=$collectedClasses.nB
+if($desc instanceof Array)$desc=$desc[1]
+nB.prototype=$desc
+nB.prototype.gLU=function(receiver){return receiver.href}
+nB.prototype.gN=function(receiver){return receiver.target}
+function i3(){}i3.builtin$cls="i3"
+if(!"name" in i3)i3.name="i3"
+$desc=$collectedClasses.i3
+if($desc instanceof Array)$desc=$desc[1]
+i3.prototype=$desc
+function it(){}it.builtin$cls="it"
+if(!"name" in it)it.name="it"
+$desc=$collectedClasses.it
+if($desc instanceof Array)$desc=$desc[1]
+it.prototype=$desc
+function Az(){}Az.builtin$cls="Az"
+if(!"name" in Az)Az.name="Az"
+$desc=$collectedClasses.Az
+if($desc instanceof Array)$desc=$desc[1]
+Az.prototype=$desc
+Az.prototype.gr9=function(receiver){return receiver.type}
+function QP(){}QP.builtin$cls="QP"
+if(!"name" in QP)QP.name="QP"
+$desc=$collectedClasses.QP
+if($desc instanceof Array)$desc=$desc[1]
+QP.prototype=$desc
+function QW(){}QW.builtin$cls="QW"
+if(!"name" in QW)QW.name="QW"
+$desc=$collectedClasses.QW
+if($desc instanceof Array)$desc=$desc[1]
+QW.prototype=$desc
+QW.prototype.gMB=function(receiver){return receiver.form}
+QW.prototype.goc=function(receiver){return receiver.name}
+QW.prototype.soc=function(receiver,v){return receiver.name=v}
+QW.prototype.gr9=function(receiver){return receiver.type}
+QW.prototype.sr9=function(receiver,v){return receiver.type=v}
+QW.prototype.gP=function(receiver){return receiver.value}
+QW.prototype.sP=function(receiver,v){return receiver.value=v}
+function n6(){}n6.builtin$cls="n6"
+if(!"name" in n6)n6.name="n6"
+$desc=$collectedClasses.n6
+if($desc instanceof Array)$desc=$desc[1]
+n6.prototype=$desc
+function Ny(){}Ny.builtin$cls="Ny"
+if(!"name" in Ny)Ny.name="Ny"
+$desc=$collectedClasses.Ny
+if($desc instanceof Array)$desc=$desc[1]
+Ny.prototype=$desc
+function OM(){}OM.builtin$cls="OM"
+if(!"name" in OM)OM.name="OM"
+$desc=$collectedClasses.OM
+if($desc instanceof Array)$desc=$desc[1]
+OM.prototype=$desc
+OM.prototype.gB=function(receiver){return receiver.length}
+function QQ(){}QQ.builtin$cls="QQ"
+if(!"name" in QQ)QQ.name="QQ"
+$desc=$collectedClasses.QQ
+if($desc instanceof Array)$desc=$desc[1]
+QQ.prototype=$desc
+QQ.prototype.gtT=function(receiver){return receiver.code}
+function MA(){}MA.builtin$cls="MA"
+if(!"name" in MA)MA.name="MA"
+$desc=$collectedClasses.MA
+if($desc instanceof Array)$desc=$desc[1]
+MA.prototype=$desc
+function y4(){}y4.builtin$cls="y4"
+if(!"name" in y4)y4.name="y4"
+$desc=$collectedClasses.y4
+if($desc instanceof Array)$desc=$desc[1]
+y4.prototype=$desc
+function d7(){}d7.builtin$cls="d7"
+if(!"name" in d7)d7.name="d7"
+$desc=$collectedClasses.d7
+if($desc instanceof Array)$desc=$desc[1]
+d7.prototype=$desc
+function Rb(){}Rb.builtin$cls="Rb"
+if(!"name" in Rb)Rb.name="Rb"
+$desc=$collectedClasses.Rb
+if($desc instanceof Array)$desc=$desc[1]
+Rb.prototype=$desc
+function oJ(){}oJ.builtin$cls="oJ"
+if(!"name" in oJ)oJ.name="oJ"
+$desc=$collectedClasses.oJ
+if($desc instanceof Array)$desc=$desc[1]
+oJ.prototype=$desc
+oJ.prototype.gB=function(receiver){return receiver.length}
+function DG(){}DG.builtin$cls="DG"
+if(!"name" in DG)DG.name="DG"
+$desc=$collectedClasses.DG
+if($desc instanceof Array)$desc=$desc[1]
+DG.prototype=$desc
+function mN(){}mN.builtin$cls="mN"
+if(!"name" in mN)mN.name="mN"
+$desc=$collectedClasses.mN
+if($desc instanceof Array)$desc=$desc[1]
+mN.prototype=$desc
+function vH(){}vH.builtin$cls="vH"
+if(!"name" in vH)vH.name="vH"
+$desc=$collectedClasses.vH
+if($desc instanceof Array)$desc=$desc[1]
+vH.prototype=$desc
+function hh(){}hh.builtin$cls="hh"
+if(!"name" in hh)hh.name="hh"
+$desc=$collectedClasses.hh
+if($desc instanceof Array)$desc=$desc[1]
+hh.prototype=$desc
+function Em(){}Em.builtin$cls="Em"
+if(!"name" in Em)Em.name="Em"
+$desc=$collectedClasses.Em
+if($desc instanceof Array)$desc=$desc[1]
+Em.prototype=$desc
+function Sb(){}Sb.builtin$cls="Sb"
+if(!"name" in Sb)Sb.name="Sb"
+$desc=$collectedClasses.Sb
+if($desc instanceof Array)$desc=$desc[1]
+Sb.prototype=$desc
+function rV(){}rV.builtin$cls="rV"
+if(!"name" in rV)rV.name="rV"
+$desc=$collectedClasses.rV
+if($desc instanceof Array)$desc=$desc[1]
+rV.prototype=$desc
+function Wy(){}Wy.builtin$cls="Wy"
+if(!"name" in Wy)Wy.name="Wy"
+$desc=$collectedClasses.Wy
+if($desc instanceof Array)$desc=$desc[1]
+Wy.prototype=$desc
+function YN(){}YN.builtin$cls="YN"
+if(!"name" in YN)YN.name="YN"
+$desc=$collectedClasses.YN
+if($desc instanceof Array)$desc=$desc[1]
+YN.prototype=$desc
+function bA(){}bA.builtin$cls="bA"
+if(!"name" in bA)bA.name="bA"
+$desc=$collectedClasses.bA
+if($desc instanceof Array)$desc=$desc[1]
+bA.prototype=$desc
+function Wq(){}Wq.builtin$cls="Wq"
+if(!"name" in Wq)Wq.name="Wq"
+$desc=$collectedClasses.Wq
+if($desc instanceof Array)$desc=$desc[1]
+Wq.prototype=$desc
+function rz(){}rz.builtin$cls="rz"
+if(!"name" in rz)rz.name="rz"
+$desc=$collectedClasses.rz
+if($desc instanceof Array)$desc=$desc[1]
+rz.prototype=$desc
+rz.prototype.gG1=function(receiver){return receiver.message}
+rz.prototype.goc=function(receiver){return receiver.name}
+function BK(){}BK.builtin$cls="BK"
+if(!"name" in BK)BK.name="BK"
+$desc=$collectedClasses.BK
+if($desc instanceof Array)$desc=$desc[1]
+BK.prototype=$desc
+BK.prototype.gG1=function(receiver){return receiver.message}
+function wj(){}wj.builtin$cls="wj"
+if(!"name" in wj)wj.name="wj"
+$desc=$collectedClasses.wj
+if($desc instanceof Array)$desc=$desc[1]
+wj.prototype=$desc
+function cv(){}cv.builtin$cls="cv"
+if(!"name" in cv)cv.name="cv"
+$desc=$collectedClasses.cv
+if($desc instanceof Array)$desc=$desc[1]
+cv.prototype=$desc
+cv.prototype.gxr=function(receiver){return receiver.className}
+cv.prototype.sxr=function(receiver,v){return receiver.className=v}
+cv.prototype.gjO=function(receiver){return receiver.id}
+cv.prototype.sjO=function(receiver,v){return receiver.id=v}
+function Fs(){}Fs.builtin$cls="Fs"
+if(!"name" in Fs)Fs.name="Fs"
+$desc=$collectedClasses.Fs
+if($desc instanceof Array)$desc=$desc[1]
+Fs.prototype=$desc
+Fs.prototype.goc=function(receiver){return receiver.name}
+Fs.prototype.soc=function(receiver,v){return receiver.name=v}
+Fs.prototype.gLA=function(receiver){return receiver.src}
+Fs.prototype.gr9=function(receiver){return receiver.type}
+Fs.prototype.sr9=function(receiver,v){return receiver.type=v}
+function SX(){}SX.builtin$cls="SX"
+if(!"name" in SX)SX.name="SX"
+$desc=$collectedClasses.SX
+if($desc instanceof Array)$desc=$desc[1]
+SX.prototype=$desc
+SX.prototype.gkc=function(receiver){return receiver.error}
+SX.prototype.gG1=function(receiver){return receiver.message}
+function ea(){}ea.builtin$cls="ea"
+if(!"name" in ea)ea.name="ea"
+$desc=$collectedClasses.ea
+if($desc instanceof Array)$desc=$desc[1]
+ea.prototype=$desc
+ea.prototype.sIt=function(receiver,v){return receiver._selector=v}
+ea.prototype.gXt=function(receiver){return receiver.bubbles}
+ea.prototype.gIi=function(receiver){return receiver.path}
+ea.prototype.gr9=function(receiver){return receiver.type}
+function D0(){}D0.builtin$cls="D0"
+if(!"name" in D0)D0.name="D0"
+$desc=$collectedClasses.D0
+if($desc instanceof Array)$desc=$desc[1]
+D0.prototype=$desc
+function as(){}as.builtin$cls="as"
+if(!"name" in as)as.name="as"
+$desc=$collectedClasses.as
+if($desc instanceof Array)$desc=$desc[1]
+as.prototype=$desc
+as.prototype.gMB=function(receiver){return receiver.form}
+as.prototype.goc=function(receiver){return receiver.name}
+as.prototype.soc=function(receiver,v){return receiver.name=v}
+as.prototype.gr9=function(receiver){return receiver.type}
+function T5(){}T5.builtin$cls="T5"
+if(!"name" in T5)T5.name="T5"
+$desc=$collectedClasses.T5
+if($desc instanceof Array)$desc=$desc[1]
+T5.prototype=$desc
+T5.prototype.goc=function(receiver){return receiver.name}
+function Aa(){}Aa.builtin$cls="Aa"
+if(!"name" in Aa)Aa.name="Aa"
+$desc=$collectedClasses.Aa
+if($desc instanceof Array)$desc=$desc[1]
+Aa.prototype=$desc
+Aa.prototype.gtT=function(receiver){return receiver.code}
+function u5(){}u5.builtin$cls="u5"
+if(!"name" in u5)u5.name="u5"
+$desc=$collectedClasses.u5
+if($desc instanceof Array)$desc=$desc[1]
+u5.prototype=$desc
+function Yu(){}Yu.builtin$cls="Yu"
+if(!"name" in Yu)Yu.name="Yu"
+$desc=$collectedClasses.Yu
+if($desc instanceof Array)$desc=$desc[1]
+Yu.prototype=$desc
+Yu.prototype.gB=function(receiver){return receiver.length}
+Yu.prototype.gbP=function(receiver){return receiver.method}
+Yu.prototype.goc=function(receiver){return receiver.name}
+Yu.prototype.soc=function(receiver,v){return receiver.name=v}
+Yu.prototype.gN=function(receiver){return receiver.target}
+function iG(){}iG.builtin$cls="iG"
+if(!"name" in iG)iG.name="iG"
+$desc=$collectedClasses.iG
+if($desc instanceof Array)$desc=$desc[1]
+iG.prototype=$desc
+function jP(){}jP.builtin$cls="jP"
+if(!"name" in jP)jP.name="jP"
+$desc=$collectedClasses.jP
+if($desc instanceof Array)$desc=$desc[1]
+jP.prototype=$desc
+function U2(){}U2.builtin$cls="U2"
+if(!"name" in U2)U2.name="U2"
+$desc=$collectedClasses.U2
+if($desc instanceof Array)$desc=$desc[1]
+U2.prototype=$desc
+function tA(){}tA.builtin$cls="tA"
+if(!"name" in tA)tA.name="tA"
+$desc=$collectedClasses.tA
+if($desc instanceof Array)$desc=$desc[1]
+tA.prototype=$desc
+function xn(){}xn.builtin$cls="xn"
+if(!"name" in xn)xn.name="xn"
+$desc=$collectedClasses.xn
+if($desc instanceof Array)$desc=$desc[1]
+xn.prototype=$desc
+function Vb(){}Vb.builtin$cls="Vb"
+if(!"name" in Vb)Vb.name="Vb"
+$desc=$collectedClasses.Vb
+if($desc instanceof Array)$desc=$desc[1]
+Vb.prototype=$desc
+function QH(){}QH.builtin$cls="QH"
+if(!"name" in QH)QH.name="QH"
+$desc=$collectedClasses.QH
+if($desc instanceof Array)$desc=$desc[1]
+QH.prototype=$desc
+function ST(){}ST.builtin$cls="ST"
+if(!"name" in ST)ST.name="ST"
+$desc=$collectedClasses.ST
+if($desc instanceof Array)$desc=$desc[1]
+ST.prototype=$desc
+function X2(){}X2.builtin$cls="X2"
+if(!"name" in X2)X2.name="X2"
+$desc=$collectedClasses.X2
+if($desc instanceof Array)$desc=$desc[1]
+X2.prototype=$desc
+function fJ(){}fJ.builtin$cls="fJ"
+if(!"name" in fJ)fJ.name="fJ"
+$desc=$collectedClasses.fJ
+if($desc instanceof Array)$desc=$desc[1]
+fJ.prototype=$desc
+fJ.prototype.giC=function(receiver){return receiver.responseText}
+fJ.prototype.gys=function(receiver){return receiver.status}
+fJ.prototype.gpo=function(receiver){return receiver.statusText}
+function Vi(){}Vi.builtin$cls="Vi"
+if(!"name" in Vi)Vi.name="Vi"
+$desc=$collectedClasses.Vi
+if($desc instanceof Array)$desc=$desc[1]
+Vi.prototype=$desc
+function tX(){}tX.builtin$cls="tX"
+if(!"name" in tX)tX.name="tX"
+$desc=$collectedClasses.tX
+if($desc instanceof Array)$desc=$desc[1]
+tX.prototype=$desc
+tX.prototype.goc=function(receiver){return receiver.name}
+tX.prototype.soc=function(receiver,v){return receiver.name=v}
+tX.prototype.gLA=function(receiver){return receiver.src}
+function Sg(){}Sg.builtin$cls="Sg"
+if(!"name" in Sg)Sg.name="Sg"
+$desc=$collectedClasses.Sg
+if($desc instanceof Array)$desc=$desc[1]
+Sg.prototype=$desc
+function pA(){}pA.builtin$cls="pA"
+if(!"name" in pA)pA.name="pA"
+$desc=$collectedClasses.pA
+if($desc instanceof Array)$desc=$desc[1]
+pA.prototype=$desc
+pA.prototype.gLA=function(receiver){return receiver.src}
+function Mi(){}Mi.builtin$cls="Mi"
+if(!"name" in Mi)Mi.name="Mi"
+$desc=$collectedClasses.Mi
+if($desc instanceof Array)$desc=$desc[1]
+Mi.prototype=$desc
+Mi.prototype.gTq=function(receiver){return receiver.checked}
+Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
+Mi.prototype.gMB=function(receiver){return receiver.form}
+Mi.prototype.gqC=function(receiver){return receiver.list}
+Mi.prototype.goc=function(receiver){return receiver.name}
+Mi.prototype.soc=function(receiver,v){return receiver.name=v}
+Mi.prototype.gLA=function(receiver){return receiver.src}
+Mi.prototype.gr9=function(receiver){return receiver.type}
+Mi.prototype.sr9=function(receiver,v){return receiver.type=v}
+Mi.prototype.gP=function(receiver){return receiver.value}
+Mi.prototype.sP=function(receiver,v){return receiver.value=v}
+function Gt(){}Gt.builtin$cls="Gt"
+if(!"name" in Gt)Gt.name="Gt"
+$desc=$collectedClasses.Gt
+if($desc instanceof Array)$desc=$desc[1]
+Gt.prototype=$desc
+Gt.prototype.gmW=function(receiver){return receiver.location}
+function In(){}In.builtin$cls="In"
+if(!"name" in In)In.name="In"
+$desc=$collectedClasses.In
+if($desc instanceof Array)$desc=$desc[1]
+In.prototype=$desc
+In.prototype.gMB=function(receiver){return receiver.form}
+In.prototype.goc=function(receiver){return receiver.name}
+In.prototype.soc=function(receiver,v){return receiver.name=v}
+In.prototype.gr9=function(receiver){return receiver.type}
+function Gx(){}Gx.builtin$cls="Gx"
+if(!"name" in Gx)Gx.name="Gx"
+$desc=$collectedClasses.Gx
+if($desc instanceof Array)$desc=$desc[1]
+Gx.prototype=$desc
+Gx.prototype.gP=function(receiver){return receiver.value}
+Gx.prototype.sP=function(receiver,v){return receiver.value=v}
+function eP(){}eP.builtin$cls="eP"
+if(!"name" in eP)eP.name="eP"
+$desc=$collectedClasses.eP
+if($desc instanceof Array)$desc=$desc[1]
+eP.prototype=$desc
+eP.prototype.gMB=function(receiver){return receiver.form}
+function AL(){}AL.builtin$cls="AL"
+if(!"name" in AL)AL.name="AL"
+$desc=$collectedClasses.AL
+if($desc instanceof Array)$desc=$desc[1]
+AL.prototype=$desc
+AL.prototype.gMB=function(receiver){return receiver.form}
+function Og(){}Og.builtin$cls="Og"
+if(!"name" in Og)Og.name="Og"
+$desc=$collectedClasses.Og
+if($desc instanceof Array)$desc=$desc[1]
+Og.prototype=$desc
+Og.prototype.gLU=function(receiver){return receiver.href}
+Og.prototype.gr9=function(receiver){return receiver.type}
+Og.prototype.sr9=function(receiver,v){return receiver.type=v}
+function cS(){}cS.builtin$cls="cS"
+if(!"name" in cS)cS.name="cS"
+$desc=$collectedClasses.cS
+if($desc instanceof Array)$desc=$desc[1]
+cS.prototype=$desc
+cS.prototype.gcC=function(receiver){return receiver.hash}
+cS.prototype.scC=function(receiver,v){return receiver.hash=v}
+cS.prototype.gLU=function(receiver){return receiver.href}
+function M6(){}M6.builtin$cls="M6"
+if(!"name" in M6)M6.name="M6"
+$desc=$collectedClasses.M6
+if($desc instanceof Array)$desc=$desc[1]
+M6.prototype=$desc
+M6.prototype.goc=function(receiver){return receiver.name}
+M6.prototype.soc=function(receiver,v){return receiver.name=v}
+function El(){}El.builtin$cls="El"
+if(!"name" in El)El.name="El"
+$desc=$collectedClasses.El
+if($desc instanceof Array)$desc=$desc[1]
+El.prototype=$desc
+El.prototype.gkc=function(receiver){return receiver.error}
+El.prototype.gLA=function(receiver){return receiver.src}
+function zm(){}zm.builtin$cls="zm"
+if(!"name" in zm)zm.name="zm"
+$desc=$collectedClasses.zm
+if($desc instanceof Array)$desc=$desc[1]
+zm.prototype=$desc
+zm.prototype.gtT=function(receiver){return receiver.code}
+function SV(){}SV.builtin$cls="SV"
+if(!"name" in SV)SV.name="SV"
+$desc=$collectedClasses.SV
+if($desc instanceof Array)$desc=$desc[1]
+SV.prototype=$desc
+SV.prototype.gtT=function(receiver){return receiver.code}
+function aB(){}aB.builtin$cls="aB"
+if(!"name" in aB)aB.name="aB"
+$desc=$collectedClasses.aB
+if($desc instanceof Array)$desc=$desc[1]
+aB.prototype=$desc
+aB.prototype.gG1=function(receiver){return receiver.message}
+function ku(){}ku.builtin$cls="ku"
+if(!"name" in ku)ku.name="ku"
+$desc=$collectedClasses.ku
+if($desc instanceof Array)$desc=$desc[1]
+ku.prototype=$desc
+ku.prototype.gG1=function(receiver){return receiver.message}
+function Ih(){}Ih.builtin$cls="Ih"
+if(!"name" in Ih)Ih.name="Ih"
+$desc=$collectedClasses.Ih
+if($desc instanceof Array)$desc=$desc[1]
+Ih.prototype=$desc
+function cW(){}cW.builtin$cls="cW"
+if(!"name" in cW)cW.name="cW"
+$desc=$collectedClasses.cW
+if($desc instanceof Array)$desc=$desc[1]
+cW.prototype=$desc
+cW.prototype.gjO=function(receiver){return receiver.id}
+function DK(){}DK.builtin$cls="DK"
+if(!"name" in DK)DK.name="DK"
+$desc=$collectedClasses.DK
+if($desc instanceof Array)$desc=$desc[1]
+DK.prototype=$desc
+function qm(){}qm.builtin$cls="qm"
+if(!"name" in qm)qm.name="qm"
+$desc=$collectedClasses.qm
+if($desc instanceof Array)$desc=$desc[1]
+qm.prototype=$desc
+function ZY(){}ZY.builtin$cls="ZY"
+if(!"name" in ZY)ZY.name="ZY"
+$desc=$collectedClasses.ZY
+if($desc instanceof Array)$desc=$desc[1]
+ZY.prototype=$desc
+function cx(){}cx.builtin$cls="cx"
+if(!"name" in cx)cx.name="cx"
+$desc=$collectedClasses.cx
+if($desc instanceof Array)$desc=$desc[1]
+cx.prototype=$desc
+function la(){}la.builtin$cls="la"
+if(!"name" in la)la.name="la"
+$desc=$collectedClasses.la
+if($desc instanceof Array)$desc=$desc[1]
+la.prototype=$desc
+la.prototype.gjb=function(receiver){return receiver.content}
+la.prototype.goc=function(receiver){return receiver.name}
+la.prototype.soc=function(receiver,v){return receiver.name=v}
+function Vn(){}Vn.builtin$cls="Vn"
+if(!"name" in Vn)Vn.name="Vn"
+$desc=$collectedClasses.Vn
+if($desc instanceof Array)$desc=$desc[1]
+Vn.prototype=$desc
+Vn.prototype.gP=function(receiver){return receiver.value}
+Vn.prototype.sP=function(receiver,v){return receiver.value=v}
+function PG(){}PG.builtin$cls="PG"
+if(!"name" in PG)PG.name="PG"
+$desc=$collectedClasses.PG
+if($desc instanceof Array)$desc=$desc[1]
+PG.prototype=$desc
+function xe(){}xe.builtin$cls="xe"
+if(!"name" in xe)xe.name="xe"
+$desc=$collectedClasses.xe
+if($desc instanceof Array)$desc=$desc[1]
+xe.prototype=$desc
+function Hw(){}Hw.builtin$cls="Hw"
+if(!"name" in Hw)Hw.name="Hw"
+$desc=$collectedClasses.Hw
+if($desc instanceof Array)$desc=$desc[1]
+Hw.prototype=$desc
+function bn(){}bn.builtin$cls="bn"
+if(!"name" in bn)bn.name="bn"
+$desc=$collectedClasses.bn
+if($desc instanceof Array)$desc=$desc[1]
+bn.prototype=$desc
+function Im(){}Im.builtin$cls="Im"
+if(!"name" in Im)Im.name="Im"
+$desc=$collectedClasses.Im
+if($desc instanceof Array)$desc=$desc[1]
+Im.prototype=$desc
+Im.prototype.gjO=function(receiver){return receiver.id}
+Im.prototype.goc=function(receiver){return receiver.name}
+Im.prototype.gr9=function(receiver){return receiver.type}
+function oB(){}oB.builtin$cls="oB"
+if(!"name" in oB)oB.name="oB"
+$desc=$collectedClasses.oB
+if($desc instanceof Array)$desc=$desc[1]
+oB.prototype=$desc
+function Aj(){}Aj.builtin$cls="Aj"
+if(!"name" in Aj)Aj.name="Aj"
+$desc=$collectedClasses.Aj
+if($desc instanceof Array)$desc=$desc[1]
+Aj.prototype=$desc
+function oU(){}oU.builtin$cls="oU"
+if(!"name" in oU)oU.name="oU"
+$desc=$collectedClasses.oU
+if($desc instanceof Array)$desc=$desc[1]
+oU.prototype=$desc
+function qT(){}qT.builtin$cls="qT"
+if(!"name" in qT)qT.name="qT"
+$desc=$collectedClasses.qT
+if($desc instanceof Array)$desc=$desc[1]
+qT.prototype=$desc
+qT.prototype.gG1=function(receiver){return receiver.message}
+qT.prototype.goc=function(receiver){return receiver.name}
+function KV(){}KV.builtin$cls="KV"
+if(!"name" in KV)KV.name="KV"
+$desc=$collectedClasses.KV
+if($desc instanceof Array)$desc=$desc[1]
+KV.prototype=$desc
+KV.prototype.gq6=function(receiver){return receiver.firstChild}
+KV.prototype.guD=function(receiver){return receiver.nextSibling}
+KV.prototype.gM0=function(receiver){return receiver.ownerDocument}
+KV.prototype.geT=function(receiver){return receiver.parentElement}
+KV.prototype.gKV=function(receiver){return receiver.parentNode}
+KV.prototype.sa4=function(receiver,v){return receiver.textContent=v}
+function BH(){}BH.builtin$cls="BH"
+if(!"name" in BH)BH.name="BH"
+$desc=$collectedClasses.BH
+if($desc instanceof Array)$desc=$desc[1]
+BH.prototype=$desc
+function mh(){}mh.builtin$cls="mh"
+if(!"name" in mh)mh.name="mh"
+$desc=$collectedClasses.mh
+if($desc instanceof Array)$desc=$desc[1]
+mh.prototype=$desc
+mh.prototype.gr9=function(receiver){return receiver.type}
+mh.prototype.sr9=function(receiver,v){return receiver.type=v}
+function G7(){}G7.builtin$cls="G7"
+if(!"name" in G7)G7.name="G7"
+$desc=$collectedClasses.G7
+if($desc instanceof Array)$desc=$desc[1]
+G7.prototype=$desc
+G7.prototype.gMB=function(receiver){return receiver.form}
+G7.prototype.goc=function(receiver){return receiver.name}
+G7.prototype.soc=function(receiver,v){return receiver.name=v}
+G7.prototype.gr9=function(receiver){return receiver.type}
+G7.prototype.sr9=function(receiver,v){return receiver.type=v}
+function wq(){}wq.builtin$cls="wq"
+if(!"name" in wq)wq.name="wq"
+$desc=$collectedClasses.wq
+if($desc instanceof Array)$desc=$desc[1]
+wq.prototype=$desc
+function Ql(){}Ql.builtin$cls="Ql"
+if(!"name" in Ql)Ql.name="Ql"
+$desc=$collectedClasses.Ql
+if($desc instanceof Array)$desc=$desc[1]
+Ql.prototype=$desc
+Ql.prototype.gMB=function(receiver){return receiver.form}
+Ql.prototype.gvH=function(receiver){return receiver.index}
+Ql.prototype.gP=function(receiver){return receiver.value}
+Ql.prototype.sP=function(receiver,v){return receiver.value=v}
+function Xp(){}Xp.builtin$cls="Xp"
+if(!"name" in Xp)Xp.name="Xp"
+$desc=$collectedClasses.Xp
+if($desc instanceof Array)$desc=$desc[1]
+Xp.prototype=$desc
+Xp.prototype.gMB=function(receiver){return receiver.form}
+Xp.prototype.goc=function(receiver){return receiver.name}
+Xp.prototype.soc=function(receiver,v){return receiver.name=v}
+Xp.prototype.gr9=function(receiver){return receiver.type}
+Xp.prototype.gP=function(receiver){return receiver.value}
+Xp.prototype.sP=function(receiver,v){return receiver.value=v}
+function bP(){}bP.builtin$cls="bP"
+if(!"name" in bP)bP.name="bP"
+$desc=$collectedClasses.bP
+if($desc instanceof Array)$desc=$desc[1]
+bP.prototype=$desc
+function mX(){}mX.builtin$cls="mX"
+if(!"name" in mX)mX.name="mX"
+$desc=$collectedClasses.mX
+if($desc instanceof Array)$desc=$desc[1]
+mX.prototype=$desc
+function SN(){}SN.builtin$cls="SN"
+if(!"name" in SN)SN.name="SN"
+$desc=$collectedClasses.SN
+if($desc instanceof Array)$desc=$desc[1]
+SN.prototype=$desc
+function HD(){}HD.builtin$cls="HD"
+if(!"name" in HD)HD.name="HD"
+$desc=$collectedClasses.HD
+if($desc instanceof Array)$desc=$desc[1]
+HD.prototype=$desc
+HD.prototype.goc=function(receiver){return receiver.name}
+HD.prototype.soc=function(receiver,v){return receiver.name=v}
+HD.prototype.gP=function(receiver){return receiver.value}
+HD.prototype.sP=function(receiver,v){return receiver.value=v}
+function ni(){}ni.builtin$cls="ni"
+if(!"name" in ni)ni.name="ni"
+$desc=$collectedClasses.ni
+if($desc instanceof Array)$desc=$desc[1]
+ni.prototype=$desc
+function p3(){}p3.builtin$cls="p3"
+if(!"name" in p3)p3.name="p3"
+$desc=$collectedClasses.p3
+if($desc instanceof Array)$desc=$desc[1]
+p3.prototype=$desc
+p3.prototype.gtT=function(receiver){return receiver.code}
+p3.prototype.gG1=function(receiver){return receiver.message}
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
+if($desc instanceof Array)$desc=$desc[1]
+qj.prototype=$desc
+function qW(){}qW.builtin$cls="qW"
+if(!"name" in qW)qW.name="qW"
+$desc=$collectedClasses.qW
+if($desc instanceof Array)$desc=$desc[1]
+qW.prototype=$desc
+qW.prototype.gN=function(receiver){return receiver.target}
+function KR(){}KR.builtin$cls="KR"
+if(!"name" in KR)KR.name="KR"
+$desc=$collectedClasses.KR
+if($desc instanceof Array)$desc=$desc[1]
+KR.prototype=$desc
+KR.prototype.gP=function(receiver){return receiver.value}
+KR.prototype.sP=function(receiver,v){return receiver.value=v}
+function ew(){}ew.builtin$cls="ew"
+if(!"name" in ew)ew.name="ew"
+$desc=$collectedClasses.ew
+if($desc instanceof Array)$desc=$desc[1]
+ew.prototype=$desc
+function fs(){}fs.builtin$cls="fs"
+if(!"name" in fs)fs.name="fs"
+$desc=$collectedClasses.fs
+if($desc instanceof Array)$desc=$desc[1]
+fs.prototype=$desc
+function bX(){}bX.builtin$cls="bX"
+if(!"name" in bX)bX.name="bX"
+$desc=$collectedClasses.bX
+if($desc instanceof Array)$desc=$desc[1]
+bX.prototype=$desc
+function BL(){}BL.builtin$cls="BL"
+if(!"name" in BL)BL.name="BL"
+$desc=$collectedClasses.BL
+if($desc instanceof Array)$desc=$desc[1]
+BL.prototype=$desc
+function MC(){}MC.builtin$cls="MC"
+if(!"name" in MC)MC.name="MC"
+$desc=$collectedClasses.MC
+if($desc instanceof Array)$desc=$desc[1]
+MC.prototype=$desc
+function Mx(){}Mx.builtin$cls="Mx"
+if(!"name" in Mx)Mx.name="Mx"
+$desc=$collectedClasses.Mx
+if($desc instanceof Array)$desc=$desc[1]
+Mx.prototype=$desc
+function j2(){}j2.builtin$cls="j2"
+if(!"name" in j2)j2.name="j2"
+$desc=$collectedClasses.j2
+if($desc instanceof Array)$desc=$desc[1]
+j2.prototype=$desc
+j2.prototype.gLA=function(receiver){return receiver.src}
+j2.prototype.gr9=function(receiver){return receiver.type}
+j2.prototype.sr9=function(receiver,v){return receiver.type=v}
+function yz(){}yz.builtin$cls="yz"
+if(!"name" in yz)yz.name="yz"
+$desc=$collectedClasses.yz
+if($desc instanceof Array)$desc=$desc[1]
+yz.prototype=$desc
+function lp(){}lp.builtin$cls="lp"
+if(!"name" in lp)lp.name="lp"
+$desc=$collectedClasses.lp
+if($desc instanceof Array)$desc=$desc[1]
+lp.prototype=$desc
+lp.prototype.gMB=function(receiver){return receiver.form}
+lp.prototype.gB=function(receiver){return receiver.length}
+lp.prototype.sB=function(receiver,v){return receiver.length=v}
+lp.prototype.goc=function(receiver){return receiver.name}
+lp.prototype.soc=function(receiver,v){return receiver.name=v}
+lp.prototype.gig=function(receiver){return receiver.selectedIndex}
+lp.prototype.sig=function(receiver,v){return receiver.selectedIndex=v}
+lp.prototype.gr9=function(receiver){return receiver.type}
+lp.prototype.gP=function(receiver){return receiver.value}
+lp.prototype.sP=function(receiver,v){return receiver.value=v}
+function kd(){}kd.builtin$cls="kd"
+if(!"name" in kd)kd.name="kd"
+$desc=$collectedClasses.kd
+if($desc instanceof Array)$desc=$desc[1]
+kd.prototype=$desc
+function I0(){}I0.builtin$cls="I0"
+if(!"name" in I0)I0.name="I0"
+$desc=$collectedClasses.I0
+if($desc instanceof Array)$desc=$desc[1]
+I0.prototype=$desc
+I0.prototype.gpQ=function(receiver){return receiver.applyAuthorStyles}
+function QR(){}QR.builtin$cls="QR"
+if(!"name" in QR)QR.name="QR"
+$desc=$collectedClasses.QR
+if($desc instanceof Array)$desc=$desc[1]
+QR.prototype=$desc
+QR.prototype.gLA=function(receiver){return receiver.src}
+QR.prototype.gr9=function(receiver){return receiver.type}
+QR.prototype.sr9=function(receiver,v){return receiver.type=v}
+function Cp(){}Cp.builtin$cls="Cp"
+if(!"name" in Cp)Cp.name="Cp"
+$desc=$collectedClasses.Cp
+if($desc instanceof Array)$desc=$desc[1]
+Cp.prototype=$desc
+function ua(){}ua.builtin$cls="ua"
+if(!"name" in ua)ua.name="ua"
+$desc=$collectedClasses.ua
+if($desc instanceof Array)$desc=$desc[1]
+ua.prototype=$desc
+function zD(){}zD.builtin$cls="zD"
+if(!"name" in zD)zD.name="zD"
+$desc=$collectedClasses.zD
+if($desc instanceof Array)$desc=$desc[1]
+zD.prototype=$desc
+zD.prototype.gkc=function(receiver){return receiver.error}
+zD.prototype.gG1=function(receiver){return receiver.message}
+function Ul(){}Ul.builtin$cls="Ul"
+if(!"name" in Ul)Ul.name="Ul"
+$desc=$collectedClasses.Ul
+if($desc instanceof Array)$desc=$desc[1]
+Ul.prototype=$desc
+function G0(){}G0.builtin$cls="G0"
+if(!"name" in G0)G0.name="G0"
+$desc=$collectedClasses.G0
+if($desc instanceof Array)$desc=$desc[1]
+G0.prototype=$desc
+G0.prototype.goc=function(receiver){return receiver.name}
+function wb(){}wb.builtin$cls="wb"
+if(!"name" in wb)wb.name="wb"
+$desc=$collectedClasses.wb
+if($desc instanceof Array)$desc=$desc[1]
+wb.prototype=$desc
+wb.prototype.gG3=function(receiver){return receiver.key}
+wb.prototype.gzZ=function(receiver){return receiver.newValue}
+wb.prototype.gjL=function(receiver){return receiver.oldValue}
+function fq(){}fq.builtin$cls="fq"
+if(!"name" in fq)fq.name="fq"
+$desc=$collectedClasses.fq
+if($desc instanceof Array)$desc=$desc[1]
+fq.prototype=$desc
+fq.prototype.gr9=function(receiver){return receiver.type}
+fq.prototype.sr9=function(receiver,v){return receiver.type=v}
+function h4(){}h4.builtin$cls="h4"
+if(!"name" in h4)h4.name="h4"
+$desc=$collectedClasses.h4
+if($desc instanceof Array)$desc=$desc[1]
+h4.prototype=$desc
+function qk(){}qk.builtin$cls="qk"
+if(!"name" in qk)qk.name="qk"
+$desc=$collectedClasses.qk
+if($desc instanceof Array)$desc=$desc[1]
+qk.prototype=$desc
+function GI(){}GI.builtin$cls="GI"
+if(!"name" in GI)GI.name="GI"
+$desc=$collectedClasses.GI
+if($desc instanceof Array)$desc=$desc[1]
+GI.prototype=$desc
+function Tb(){}Tb.builtin$cls="Tb"
+if(!"name" in Tb)Tb.name="Tb"
+$desc=$collectedClasses.Tb
+if($desc instanceof Array)$desc=$desc[1]
+Tb.prototype=$desc
+function Iv(){}Iv.builtin$cls="Iv"
+if(!"name" in Iv)Iv.name="Iv"
+$desc=$collectedClasses.Iv
+if($desc instanceof Array)$desc=$desc[1]
+Iv.prototype=$desc
+function BT(){}BT.builtin$cls="BT"
+if(!"name" in BT)BT.name="BT"
+$desc=$collectedClasses.BT
+if($desc instanceof Array)$desc=$desc[1]
+BT.prototype=$desc
+function yY(){}yY.builtin$cls="yY"
+if(!"name" in yY)yY.name="yY"
+$desc=$collectedClasses.yY
+if($desc instanceof Array)$desc=$desc[1]
+yY.prototype=$desc
+yY.prototype.gjb=function(receiver){return receiver.content}
+function kJ(){}kJ.builtin$cls="kJ"
+if(!"name" in kJ)kJ.name="kJ"
+$desc=$collectedClasses.kJ
+if($desc instanceof Array)$desc=$desc[1]
+kJ.prototype=$desc
+function AE(){}AE.builtin$cls="AE"
+if(!"name" in AE)AE.name="AE"
+$desc=$collectedClasses.AE
+if($desc instanceof Array)$desc=$desc[1]
+AE.prototype=$desc
+AE.prototype.gMB=function(receiver){return receiver.form}
+AE.prototype.goc=function(receiver){return receiver.name}
+AE.prototype.soc=function(receiver,v){return receiver.name=v}
+AE.prototype.gr9=function(receiver){return receiver.type}
+AE.prototype.gP=function(receiver){return receiver.value}
+AE.prototype.sP=function(receiver,v){return receiver.value=v}
+function xV(){}xV.builtin$cls="xV"
+if(!"name" in xV)xV.name="xV"
+$desc=$collectedClasses.xV
+if($desc instanceof Array)$desc=$desc[1]
+xV.prototype=$desc
+function FH(){}FH.builtin$cls="FH"
+if(!"name" in FH)FH.name="FH"
+$desc=$collectedClasses.FH
+if($desc instanceof Array)$desc=$desc[1]
+FH.prototype=$desc
+function y6(){}y6.builtin$cls="y6"
+if(!"name" in y6)y6.name="y6"
+$desc=$collectedClasses.y6
+if($desc instanceof Array)$desc=$desc[1]
+y6.prototype=$desc
+function RH(){}RH.builtin$cls="RH"
+if(!"name" in RH)RH.name="RH"
+$desc=$collectedClasses.RH
+if($desc instanceof Array)$desc=$desc[1]
+RH.prototype=$desc
+RH.prototype.gfY=function(receiver){return receiver.kind}
+RH.prototype.gLA=function(receiver){return receiver.src}
+function pU(){}pU.builtin$cls="pU"
+if(!"name" in pU)pU.name="pU"
+$desc=$collectedClasses.pU
+if($desc instanceof Array)$desc=$desc[1]
+pU.prototype=$desc
+function Lq(){}Lq.builtin$cls="Lq"
+if(!"name" in Lq)Lq.name="Lq"
+$desc=$collectedClasses.Lq
+if($desc instanceof Array)$desc=$desc[1]
+Lq.prototype=$desc
+function Mf(){}Mf.builtin$cls="Mf"
+if(!"name" in Mf)Mf.name="Mf"
+$desc=$collectedClasses.Mf
+if($desc instanceof Array)$desc=$desc[1]
+Mf.prototype=$desc
+function BR(){}BR.builtin$cls="BR"
+if(!"name" in BR)BR.name="BR"
+$desc=$collectedClasses.BR
+if($desc instanceof Array)$desc=$desc[1]
+BR.prototype=$desc
+function r4(){}r4.builtin$cls="r4"
+if(!"name" in r4)r4.name="r4"
+$desc=$collectedClasses.r4
+if($desc instanceof Array)$desc=$desc[1]
+r4.prototype=$desc
+function aG(){}aG.builtin$cls="aG"
+if(!"name" in aG)aG.name="aG"
+$desc=$collectedClasses.aG
+if($desc instanceof Array)$desc=$desc[1]
+aG.prototype=$desc
+function J6(){}J6.builtin$cls="J6"
+if(!"name" in J6)J6.name="J6"
+$desc=$collectedClasses.J6
+if($desc instanceof Array)$desc=$desc[1]
+J6.prototype=$desc
+function K5(){}K5.builtin$cls="K5"
+if(!"name" in K5)K5.name="K5"
+$desc=$collectedClasses.K5
+if($desc instanceof Array)$desc=$desc[1]
+K5.prototype=$desc
+K5.prototype.goc=function(receiver){return receiver.name}
+K5.prototype.soc=function(receiver,v){return receiver.name=v}
+K5.prototype.gys=function(receiver){return receiver.status}
+function UM(){}UM.builtin$cls="UM"
+if(!"name" in UM)UM.name="UM"
+$desc=$collectedClasses.UM
+if($desc instanceof Array)$desc=$desc[1]
+UM.prototype=$desc
+UM.prototype.goc=function(receiver){return receiver.name}
+UM.prototype.gP=function(receiver){return receiver.value}
+UM.prototype.sP=function(receiver,v){return receiver.value=v}
+function WS(){}WS.builtin$cls="WS"
+if(!"name" in WS)WS.name="WS"
+$desc=$collectedClasses.WS
+if($desc instanceof Array)$desc=$desc[1]
+WS.prototype=$desc
+function rq(){}rq.builtin$cls="rq"
+if(!"name" in rq)rq.name="rq"
+$desc=$collectedClasses.rq
+if($desc instanceof Array)$desc=$desc[1]
+rq.prototype=$desc
+function nK(){}nK.builtin$cls="nK"
+if(!"name" in nK)nK.name="nK"
+$desc=$collectedClasses.nK
+if($desc instanceof Array)$desc=$desc[1]
+nK.prototype=$desc
+function kc(){}kc.builtin$cls="kc"
+if(!"name" in kc)kc.name="kc"
+$desc=$collectedClasses.kc
+if($desc instanceof Array)$desc=$desc[1]
+kc.prototype=$desc
+function ij(){}ij.builtin$cls="ij"
+if(!"name" in ij)ij.name="ij"
+$desc=$collectedClasses.ij
+if($desc instanceof Array)$desc=$desc[1]
+ij.prototype=$desc
+function ty(){}ty.builtin$cls="ty"
+if(!"name" in ty)ty.name="ty"
+$desc=$collectedClasses.ty
+if($desc instanceof Array)$desc=$desc[1]
+ty.prototype=$desc
+function Nf(){}Nf.builtin$cls="Nf"
+if(!"name" in Nf)Nf.name="Nf"
+$desc=$collectedClasses.Nf
+if($desc instanceof Array)$desc=$desc[1]
+Nf.prototype=$desc
+function Nc(){}Nc.builtin$cls="Nc"
+if(!"name" in Nc)Nc.name="Nc"
+$desc=$collectedClasses.Nc
+if($desc instanceof Array)$desc=$desc[1]
+Nc.prototype=$desc
+function rj(){}rj.builtin$cls="rj"
+if(!"name" in rj)rj.name="rj"
+$desc=$collectedClasses.rj
+if($desc instanceof Array)$desc=$desc[1]
+rj.prototype=$desc
+function rh(){}rh.builtin$cls="rh"
+if(!"name" in rh)rh.name="rh"
+$desc=$collectedClasses.rh
+if($desc instanceof Array)$desc=$desc[1]
+rh.prototype=$desc
+function Zv(){}Zv.builtin$cls="Zv"
+if(!"name" in Zv)Zv.name="Zv"
+$desc=$collectedClasses.Zv
+if($desc instanceof Array)$desc=$desc[1]
+Zv.prototype=$desc
+function Q7(){}Q7.builtin$cls="Q7"
+if(!"name" in Q7)Q7.name="Q7"
+$desc=$collectedClasses.Q7
+if($desc instanceof Array)$desc=$desc[1]
+Q7.prototype=$desc
+function hF(){}hF.builtin$cls="hF"
+if(!"name" in hF)hF.name="hF"
+$desc=$collectedClasses.hF
+if($desc instanceof Array)$desc=$desc[1]
+hF.prototype=$desc
+function yK(){}yK.builtin$cls="yK"
+if(!"name" in yK)yK.name="yK"
+$desc=$collectedClasses.yK
+if($desc instanceof Array)$desc=$desc[1]
+yK.prototype=$desc
+function Y0(){}Y0.builtin$cls="Y0"
+if(!"name" in Y0)Y0.name="Y0"
+$desc=$collectedClasses.Y0
+if($desc instanceof Array)$desc=$desc[1]
+Y0.prototype=$desc
+Y0.prototype.gN=function(receiver){return receiver.target}
+Y0.prototype.gLU=function(receiver){return receiver.href}
+function ZJ(){}ZJ.builtin$cls="ZJ"
+if(!"name" in ZJ)ZJ.name="ZJ"
+$desc=$collectedClasses.ZJ
+if($desc instanceof Array)$desc=$desc[1]
+ZJ.prototype=$desc
+ZJ.prototype.gLU=function(receiver){return receiver.href}
+function mU(){}mU.builtin$cls="mU"
+if(!"name" in mU)mU.name="mU"
+$desc=$collectedClasses.mU
+if($desc instanceof Array)$desc=$desc[1]
+mU.prototype=$desc
+function eZ(){}eZ.builtin$cls="eZ"
+if(!"name" in eZ)eZ.name="eZ"
+$desc=$collectedClasses.eZ
+if($desc instanceof Array)$desc=$desc[1]
+eZ.prototype=$desc
+function Ak(){}Ak.builtin$cls="Ak"
+if(!"name" in Ak)Ak.name="Ak"
+$desc=$collectedClasses.Ak
+if($desc instanceof Array)$desc=$desc[1]
+Ak.prototype=$desc
+function y5(){}y5.builtin$cls="y5"
+if(!"name" in y5)y5.name="y5"
+$desc=$collectedClasses.y5
+if($desc instanceof Array)$desc=$desc[1]
+y5.prototype=$desc
+function nV(){}nV.builtin$cls="nV"
+if(!"name" in nV)nV.name="nV"
+$desc=$collectedClasses.nV
+if($desc instanceof Array)$desc=$desc[1]
+nV.prototype=$desc
+function Zc(){}Zc.builtin$cls="Zc"
+if(!"name" in Zc)Zc.name="Zc"
+$desc=$collectedClasses.Zc
+if($desc instanceof Array)$desc=$desc[1]
+Zc.prototype=$desc
+function ui(){}ui.builtin$cls="ui"
+if(!"name" in ui)ui.name="ui"
+$desc=$collectedClasses.ui
+if($desc instanceof Array)$desc=$desc[1]
+ui.prototype=$desc
+function D6(){}D6.builtin$cls="D6"
+if(!"name" in D6)D6.name="D6"
+$desc=$collectedClasses.D6
+if($desc instanceof Array)$desc=$desc[1]
+D6.prototype=$desc
+function DQ(){}DQ.builtin$cls="DQ"
+if(!"name" in DQ)DQ.name="DQ"
+$desc=$collectedClasses.DQ
+if($desc instanceof Array)$desc=$desc[1]
+DQ.prototype=$desc
+function Sm(){}Sm.builtin$cls="Sm"
+if(!"name" in Sm)Sm.name="Sm"
+$desc=$collectedClasses.Sm
+if($desc instanceof Array)$desc=$desc[1]
+Sm.prototype=$desc
+function dx(){}dx.builtin$cls="dx"
+if(!"name" in dx)dx.name="dx"
+$desc=$collectedClasses.dx
+if($desc instanceof Array)$desc=$desc[1]
+dx.prototype=$desc
+function es(){}es.builtin$cls="es"
+if(!"name" in es)es.name="es"
+$desc=$collectedClasses.es
+if($desc instanceof Array)$desc=$desc[1]
+es.prototype=$desc
+function eG(){}eG.builtin$cls="eG"
+if(!"name" in eG)eG.name="eG"
+$desc=$collectedClasses.eG
+if($desc instanceof Array)$desc=$desc[1]
+eG.prototype=$desc
+function lv(){}lv.builtin$cls="lv"
+if(!"name" in lv)lv.name="lv"
+$desc=$collectedClasses.lv
+if($desc instanceof Array)$desc=$desc[1]
+lv.prototype=$desc
+lv.prototype.gr9=function(receiver){return receiver.type}
+lv.prototype.gUQ=function(receiver){return receiver.values}
+function pf(){}pf.builtin$cls="pf"
+if(!"name" in pf)pf.name="pf"
+$desc=$collectedClasses.pf
+if($desc instanceof Array)$desc=$desc[1]
+pf.prototype=$desc
+function NV(){}NV.builtin$cls="NV"
+if(!"name" in NV)NV.name="NV"
+$desc=$collectedClasses.NV
+if($desc instanceof Array)$desc=$desc[1]
+NV.prototype=$desc
+NV.prototype.gkp=function(receiver){return receiver.operator}
+function W1(){}W1.builtin$cls="W1"
+if(!"name" in W1)W1.name="W1"
+$desc=$collectedClasses.W1
+if($desc instanceof Array)$desc=$desc[1]
+W1.prototype=$desc
+function zo(){}zo.builtin$cls="zo"
+if(!"name" in zo)zo.name="zo"
+$desc=$collectedClasses.zo
+if($desc instanceof Array)$desc=$desc[1]
+zo.prototype=$desc
+function wf(){}wf.builtin$cls="wf"
+if(!"name" in wf)wf.name="wf"
+$desc=$collectedClasses.wf
+if($desc instanceof Array)$desc=$desc[1]
+wf.prototype=$desc
+function TU(){}TU.builtin$cls="TU"
+if(!"name" in TU)TU.name="TU"
+$desc=$collectedClasses.TU
+if($desc instanceof Array)$desc=$desc[1]
+TU.prototype=$desc
+function bb(){}bb.builtin$cls="bb"
+if(!"name" in bb)bb.name="bb"
+$desc=$collectedClasses.bb
+if($desc instanceof Array)$desc=$desc[1]
+bb.prototype=$desc
+function VE(){}VE.builtin$cls="VE"
+if(!"name" in VE)VE.name="VE"
+$desc=$collectedClasses.VE
+if($desc instanceof Array)$desc=$desc[1]
+VE.prototype=$desc
+function zp(){}zp.builtin$cls="zp"
+if(!"name" in zp)zp.name="zp"
+$desc=$collectedClasses.zp
+if($desc instanceof Array)$desc=$desc[1]
+zp.prototype=$desc
+function Xu(){}Xu.builtin$cls="Xu"
+if(!"name" in Xu)Xu.name="Xu"
+$desc=$collectedClasses.Xu
+if($desc instanceof Array)$desc=$desc[1]
+Xu.prototype=$desc
+function lu(){}lu.builtin$cls="lu"
+if(!"name" in lu)lu.name="lu"
+$desc=$collectedClasses.lu
+if($desc instanceof Array)$desc=$desc[1]
+lu.prototype=$desc
+function tk(){}tk.builtin$cls="tk"
+if(!"name" in tk)tk.name="tk"
+$desc=$collectedClasses.tk
+if($desc instanceof Array)$desc=$desc[1]
+tk.prototype=$desc
+function me(){}me.builtin$cls="me"
+if(!"name" in me)me.name="me"
+$desc=$collectedClasses.me
+if($desc instanceof Array)$desc=$desc[1]
+me.prototype=$desc
+me.prototype.gLU=function(receiver){return receiver.href}
+function qN(){}qN.builtin$cls="qN"
+if(!"name" in qN)qN.name="qN"
+$desc=$collectedClasses.qN
+if($desc instanceof Array)$desc=$desc[1]
+qN.prototype=$desc
+function NY(){}NY.builtin$cls="NY"
+if(!"name" in NY)NY.name="NY"
+$desc=$collectedClasses.NY
+if($desc instanceof Array)$desc=$desc[1]
+NY.prototype=$desc
+function d4(){}d4.builtin$cls="d4"
+if(!"name" in d4)d4.name="d4"
+$desc=$collectedClasses.d4
+if($desc instanceof Array)$desc=$desc[1]
+d4.prototype=$desc
+d4.prototype.gkp=function(receiver){return receiver.operator}
+function MI(){}MI.builtin$cls="MI"
+if(!"name" in MI)MI.name="MI"
+$desc=$collectedClasses.MI
+if($desc instanceof Array)$desc=$desc[1]
+MI.prototype=$desc
+function ca(){}ca.builtin$cls="ca"
+if(!"name" in ca)ca.name="ca"
+$desc=$collectedClasses.ca
+if($desc instanceof Array)$desc=$desc[1]
+ca.prototype=$desc
+function kK(){}kK.builtin$cls="kK"
+if(!"name" in kK)kK.name="kK"
+$desc=$collectedClasses.kK
+if($desc instanceof Array)$desc=$desc[1]
+kK.prototype=$desc
+function eW(){}eW.builtin$cls="eW"
+if(!"name" in eW)eW.name="eW"
+$desc=$collectedClasses.eW
+if($desc instanceof Array)$desc=$desc[1]
+eW.prototype=$desc
+function um(){}um.builtin$cls="um"
+if(!"name" in um)um.name="um"
+$desc=$collectedClasses.um
+if($desc instanceof Array)$desc=$desc[1]
+um.prototype=$desc
+function Fu(){}Fu.builtin$cls="Fu"
+if(!"name" in Fu)Fu.name="Fu"
+$desc=$collectedClasses.Fu
+if($desc instanceof Array)$desc=$desc[1]
+Fu.prototype=$desc
+Fu.prototype.gr9=function(receiver){return receiver.type}
+function OE(){}OE.builtin$cls="OE"
+if(!"name" in OE)OE.name="OE"
+$desc=$collectedClasses.OE
+if($desc instanceof Array)$desc=$desc[1]
+OE.prototype=$desc
+OE.prototype.gLU=function(receiver){return receiver.href}
+function l6(){}l6.builtin$cls="l6"
+if(!"name" in l6)l6.name="l6"
+$desc=$collectedClasses.l6
+if($desc instanceof Array)$desc=$desc[1]
+l6.prototype=$desc
+function BA(){}BA.builtin$cls="BA"
+if(!"name" in BA)BA.name="BA"
+$desc=$collectedClasses.BA
+if($desc instanceof Array)$desc=$desc[1]
+BA.prototype=$desc
+function tp(){}tp.builtin$cls="tp"
+if(!"name" in tp)tp.name="tp"
+$desc=$collectedClasses.tp
+if($desc instanceof Array)$desc=$desc[1]
+tp.prototype=$desc
+function rE(){}rE.builtin$cls="rE"
+if(!"name" in rE)rE.name="rE"
+$desc=$collectedClasses.rE
+if($desc instanceof Array)$desc=$desc[1]
+rE.prototype=$desc
+rE.prototype.gLU=function(receiver){return receiver.href}
+function CC(){}CC.builtin$cls="CC"
+if(!"name" in CC)CC.name="CC"
+$desc=$collectedClasses.CC
+if($desc instanceof Array)$desc=$desc[1]
+CC.prototype=$desc
+function PQ(){}PQ.builtin$cls="PQ"
+if(!"name" in PQ)PQ.name="PQ"
+$desc=$collectedClasses.PQ
+if($desc instanceof Array)$desc=$desc[1]
+PQ.prototype=$desc
+function uz(){}uz.builtin$cls="uz"
+if(!"name" in uz)uz.name="uz"
+$desc=$collectedClasses.uz
+if($desc instanceof Array)$desc=$desc[1]
+uz.prototype=$desc
+function Yd(){}Yd.builtin$cls="Yd"
+if(!"name" in Yd)Yd.name="Yd"
+$desc=$collectedClasses.Yd
+if($desc instanceof Array)$desc=$desc[1]
+Yd.prototype=$desc
+function U0(){}U0.builtin$cls="U0"
+if(!"name" in U0)U0.name="U0"
+$desc=$collectedClasses.U0
+if($desc instanceof Array)$desc=$desc[1]
+U0.prototype=$desc
+function AD(){}AD.builtin$cls="AD"
+if(!"name" in AD)AD.name="AD"
+$desc=$collectedClasses.AD
+if($desc instanceof Array)$desc=$desc[1]
+AD.prototype=$desc
+function Gr(){}Gr.builtin$cls="Gr"
+if(!"name" in Gr)Gr.name="Gr"
+$desc=$collectedClasses.Gr
+if($desc instanceof Array)$desc=$desc[1]
+Gr.prototype=$desc
+Gr.prototype.gLU=function(receiver){return receiver.href}
+function tc(){}tc.builtin$cls="tc"
+if(!"name" in tc)tc.name="tc"
+$desc=$collectedClasses.tc
+if($desc instanceof Array)$desc=$desc[1]
+tc.prototype=$desc
+function GH(){}GH.builtin$cls="GH"
+if(!"name" in GH)GH.name="GH"
+$desc=$collectedClasses.GH
+if($desc instanceof Array)$desc=$desc[1]
+GH.prototype=$desc
+function lo(){}lo.builtin$cls="lo"
+if(!"name" in lo)lo.name="lo"
+$desc=$collectedClasses.lo
+if($desc instanceof Array)$desc=$desc[1]
+lo.prototype=$desc
+function NJ(){}NJ.builtin$cls="NJ"
+if(!"name" in NJ)NJ.name="NJ"
+$desc=$collectedClasses.NJ
+if($desc instanceof Array)$desc=$desc[1]
+NJ.prototype=$desc
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
+if($desc instanceof Array)$desc=$desc[1]
+nd.prototype=$desc
+nd.prototype.gr9=function(receiver){return receiver.type}
+nd.prototype.sr9=function(receiver,v){return receiver.type=v}
+nd.prototype.gLU=function(receiver){return receiver.href}
+function vt(){}vt.builtin$cls="vt"
+if(!"name" in vt)vt.name="vt"
+$desc=$collectedClasses.vt
+if($desc instanceof Array)$desc=$desc[1]
+vt.prototype=$desc
+function rQ(){}rQ.builtin$cls="rQ"
+if(!"name" in rQ)rQ.name="rQ"
+$desc=$collectedClasses.rQ
+if($desc instanceof Array)$desc=$desc[1]
+rQ.prototype=$desc
+function EU(){}EU.builtin$cls="EU"
+if(!"name" in EU)EU.name="EU"
+$desc=$collectedClasses.EU
+if($desc instanceof Array)$desc=$desc[1]
+EU.prototype=$desc
+EU.prototype.gr9=function(receiver){return receiver.type}
+EU.prototype.sr9=function(receiver,v){return receiver.type=v}
+function LR(){}LR.builtin$cls="LR"
+if(!"name" in LR)LR.name="LR"
+$desc=$collectedClasses.LR
+if($desc instanceof Array)$desc=$desc[1]
+LR.prototype=$desc
+function MB(){}MB.builtin$cls="MB"
+if(!"name" in MB)MB.name="MB"
+$desc=$collectedClasses.MB
+if($desc instanceof Array)$desc=$desc[1]
+MB.prototype=$desc
+function hy(){}hy.builtin$cls="hy"
+if(!"name" in hy)hy.name="hy"
+$desc=$collectedClasses.hy
+if($desc instanceof Array)$desc=$desc[1]
+hy.prototype=$desc
+function r8(){}r8.builtin$cls="r8"
+if(!"name" in r8)r8.name="r8"
+$desc=$collectedClasses.r8
+if($desc instanceof Array)$desc=$desc[1]
+r8.prototype=$desc
+function aS(){}aS.builtin$cls="aS"
+if(!"name" in aS)aS.name="aS"
+$desc=$collectedClasses.aS
+if($desc instanceof Array)$desc=$desc[1]
+aS.prototype=$desc
+function CG(){}CG.builtin$cls="CG"
+if(!"name" in CG)CG.name="CG"
+$desc=$collectedClasses.CG
+if($desc instanceof Array)$desc=$desc[1]
+CG.prototype=$desc
+function qF(){}qF.builtin$cls="qF"
+if(!"name" in qF)qF.name="qF"
+$desc=$collectedClasses.qF
+if($desc instanceof Array)$desc=$desc[1]
+qF.prototype=$desc
+function MT(){}MT.builtin$cls="MT"
+if(!"name" in MT)MT.name="MT"
+$desc=$collectedClasses.MT
+if($desc instanceof Array)$desc=$desc[1]
+MT.prototype=$desc
+function Rk(){}Rk.builtin$cls="Rk"
+if(!"name" in Rk)Rk.name="Rk"
+$desc=$collectedClasses.Rk
+if($desc instanceof Array)$desc=$desc[1]
+Rk.prototype=$desc
+Rk.prototype.gbP=function(receiver){return receiver.method}
+Rk.prototype.gLU=function(receiver){return receiver.href}
+function Eo(){}Eo.builtin$cls="Eo"
+if(!"name" in Eo)Eo.name="Eo"
+$desc=$collectedClasses.Eo
+if($desc instanceof Array)$desc=$desc[1]
+Eo.prototype=$desc
+function Dn(){}Dn.builtin$cls="Dn"
+if(!"name" in Dn)Dn.name="Dn"
+$desc=$collectedClasses.Dn
+if($desc instanceof Array)$desc=$desc[1]
+Dn.prototype=$desc
+function ox(){}ox.builtin$cls="ox"
+if(!"name" in ox)ox.name="ox"
+$desc=$collectedClasses.ox
+if($desc instanceof Array)$desc=$desc[1]
+ox.prototype=$desc
+ox.prototype.gLU=function(receiver){return receiver.href}
+function ZD(){}ZD.builtin$cls="ZD"
+if(!"name" in ZD)ZD.name="ZD"
+$desc=$collectedClasses.ZD
+if($desc instanceof Array)$desc=$desc[1]
+ZD.prototype=$desc
+function NE(){}NE.builtin$cls="NE"
+if(!"name" in NE)NE.name="NE"
+$desc=$collectedClasses.NE
+if($desc instanceof Array)$desc=$desc[1]
+NE.prototype=$desc
+function wD(){}wD.builtin$cls="wD"
+if(!"name" in wD)wD.name="wD"
+$desc=$collectedClasses.wD
+if($desc instanceof Array)$desc=$desc[1]
+wD.prototype=$desc
+wD.prototype.gLU=function(receiver){return receiver.href}
+function BD(){}BD.builtin$cls="BD"
+if(!"name" in BD)BD.name="BD"
+$desc=$collectedClasses.BD
+if($desc instanceof Array)$desc=$desc[1]
+BD.prototype=$desc
+function vRT(){}vRT.builtin$cls="vRT"
+if(!"name" in vRT)vRT.name="vRT"
+$desc=$collectedClasses.vRT
+if($desc instanceof Array)$desc=$desc[1]
+vRT.prototype=$desc
+function Fi(){}Fi.builtin$cls="Fi"
+if(!"name" in Fi)Fi.name="Fi"
+$desc=$collectedClasses.Fi
+if($desc instanceof Array)$desc=$desc[1]
+Fi.prototype=$desc
+function Qr(){}Qr.builtin$cls="Qr"
+if(!"name" in Qr)Qr.name="Qr"
+$desc=$collectedClasses.Qr
+if($desc instanceof Array)$desc=$desc[1]
+Qr.prototype=$desc
+function mj(){}mj.builtin$cls="mj"
+if(!"name" in mj)mj.name="mj"
+$desc=$collectedClasses.mj
+if($desc instanceof Array)$desc=$desc[1]
+mj.prototype=$desc
+function cB(){}cB.builtin$cls="cB"
+if(!"name" in cB)cB.name="cB"
+$desc=$collectedClasses.cB
+if($desc instanceof Array)$desc=$desc[1]
+cB.prototype=$desc
+function uY(){}uY.builtin$cls="uY"
+if(!"name" in uY)uY.name="uY"
+$desc=$collectedClasses.uY
+if($desc instanceof Array)$desc=$desc[1]
+uY.prototype=$desc
+function yR(){}yR.builtin$cls="yR"
+if(!"name" in yR)yR.name="yR"
+$desc=$collectedClasses.yR
+if($desc instanceof Array)$desc=$desc[1]
+yR.prototype=$desc
+function AX(){}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
+if($desc instanceof Array)$desc=$desc[1]
+AX.prototype=$desc
+function xJ(){}xJ.builtin$cls="xJ"
+if(!"name" in xJ)xJ.name="xJ"
+$desc=$collectedClasses.xJ
+if($desc instanceof Array)$desc=$desc[1]
+xJ.prototype=$desc
+function l4(){}l4.builtin$cls="l4"
+if(!"name" in l4)l4.name="l4"
+$desc=$collectedClasses.l4
+if($desc instanceof Array)$desc=$desc[1]
+l4.prototype=$desc
+function Et(){}Et.builtin$cls="Et"
+if(!"name" in Et)Et.name="Et"
+$desc=$collectedClasses.Et
+if($desc instanceof Array)$desc=$desc[1]
+Et.prototype=$desc
+function NC(){}NC.builtin$cls="NC"
+if(!"name" in NC)NC.name="NC"
+$desc=$collectedClasses.NC
+if($desc instanceof Array)$desc=$desc[1]
+NC.prototype=$desc
+function nb(){}nb.builtin$cls="nb"
+if(!"name" in nb)nb.name="nb"
+$desc=$collectedClasses.nb
+if($desc instanceof Array)$desc=$desc[1]
+nb.prototype=$desc
+function By(){}By.builtin$cls="By"
+if(!"name" in By)By.name="By"
+$desc=$collectedClasses.By
+if($desc instanceof Array)$desc=$desc[1]
+By.prototype=$desc
+function xt(){}xt.builtin$cls="xt"
+if(!"name" in xt)xt.name="xt"
+$desc=$collectedClasses.xt
+if($desc instanceof Array)$desc=$desc[1]
+xt.prototype=$desc
+function tG(){}tG.builtin$cls="tG"
+if(!"name" in tG)tG.name="tG"
+$desc=$collectedClasses.tG
+if($desc instanceof Array)$desc=$desc[1]
+tG.prototype=$desc
+function P0(){}P0.builtin$cls="P0"
+if(!"name" in P0)P0.name="P0"
+$desc=$collectedClasses.P0
+if($desc instanceof Array)$desc=$desc[1]
+P0.prototype=$desc
+function Jq(){}Jq.builtin$cls="Jq"
+if(!"name" in Jq)Jq.name="Jq"
+$desc=$collectedClasses.Jq
+if($desc instanceof Array)$desc=$desc[1]
+Jq.prototype=$desc
+function Xr(){}Xr.builtin$cls="Xr"
+if(!"name" in Xr)Xr.name="Xr"
+$desc=$collectedClasses.Xr
+if($desc instanceof Array)$desc=$desc[1]
+Xr.prototype=$desc
+function qD(){}qD.builtin$cls="qD"
+if(!"name" in qD)qD.name="qD"
+$desc=$collectedClasses.qD
+if($desc instanceof Array)$desc=$desc[1]
+qD.prototype=$desc
+function Cf(){}Cf.builtin$cls="Cf"
+if(!"name" in Cf)Cf.name="Cf"
+$desc=$collectedClasses.Cf
+if($desc instanceof Array)$desc=$desc[1]
+Cf.prototype=$desc
+Cf.prototype.gtT=function(receiver){return receiver.code}
+Cf.prototype.gG1=function(receiver){return receiver.message}
+function AS(){}AS.builtin$cls="AS"
+if(!"name" in AS)AS.name="AS"
+$desc=$collectedClasses.AS
+if($desc instanceof Array)$desc=$desc[1]
+AS.prototype=$desc
+function Kq(){}Kq.builtin$cls="Kq"
+if(!"name" in Kq)Kq.name="Kq"
+$desc=$collectedClasses.Kq
+if($desc instanceof Array)$desc=$desc[1]
+Kq.prototype=$desc
+function oI(){}oI.builtin$cls="oI"
+if(!"name" in oI)oI.name="oI"
+$desc=$collectedClasses.oI
+if($desc instanceof Array)$desc=$desc[1]
+oI.prototype=$desc
+function mJ(){}mJ.builtin$cls="mJ"
+if(!"name" in mJ)mJ.name="mJ"
+$desc=$collectedClasses.mJ
+if($desc instanceof Array)$desc=$desc[1]
+mJ.prototype=$desc
+function rF(){}rF.builtin$cls="rF"
+if(!"name" in rF)rF.name="rF"
+$desc=$collectedClasses.rF
+if($desc instanceof Array)$desc=$desc[1]
+rF.prototype=$desc
+function vi(){}vi.builtin$cls="vi"
+if(!"name" in vi)vi.name="vi"
+$desc=$collectedClasses.vi
+if($desc instanceof Array)$desc=$desc[1]
+vi.prototype=$desc
+function ZX(){}ZX.builtin$cls="ZX"
+if(!"name" in ZX)ZX.name="ZX"
+$desc=$collectedClasses.ZX
+if($desc instanceof Array)$desc=$desc[1]
+ZX.prototype=$desc
+function hn(){}hn.builtin$cls="hn"
+if(!"name" in hn)hn.name="hn"
+$desc=$collectedClasses.hn
+if($desc instanceof Array)$desc=$desc[1]
+hn.prototype=$desc
+function nE(){}nE.builtin$cls="nE"
+if(!"name" in nE)nE.name="nE"
+$desc=$collectedClasses.nE
+if($desc instanceof Array)$desc=$desc[1]
+nE.prototype=$desc
+function zt(){}zt.builtin$cls="zt"
+if(!"name" in zt)zt.name="zt"
+$desc=$collectedClasses.zt
+if($desc instanceof Array)$desc=$desc[1]
+zt.prototype=$desc
+function F0(){}F0.builtin$cls="F0"
+if(!"name" in F0)F0.name="F0"
+$desc=$collectedClasses.F0
+if($desc instanceof Array)$desc=$desc[1]
+F0.prototype=$desc
 function Lt(tT){this.tT=tT}Lt.builtin$cls="Lt"
 if(!"name" in Lt)Lt.name="Lt"
 $desc=$collectedClasses.Lt
 if($desc instanceof Array)$desc=$desc[1]
 Lt.prototype=$desc
 Lt.prototype.gtT=function(receiver){return this.tT}
-function vB(){}vB.builtin$cls="vB"
-if(!"name" in vB)vB.name="vB"
-$desc=$collectedClasses.vB
+function Gv(){}Gv.builtin$cls="Gv"
+if(!"name" in Gv)Gv.name="Gv"
+$desc=$collectedClasses.Gv
 if($desc instanceof Array)$desc=$desc[1]
-vB.prototype=$desc
-function yE(){}yE.builtin$cls="bool"
-if(!"name" in yE)yE.name="yE"
-$desc=$collectedClasses.yE
+Gv.prototype=$desc
+function kn(){}kn.builtin$cls="bool"
+if(!"name" in kn)kn.name="kn"
+$desc=$collectedClasses.kn
 if($desc instanceof Array)$desc=$desc[1]
-yE.prototype=$desc
+kn.prototype=$desc
 function PE(){}PE.builtin$cls="PE"
 if(!"name" in PE)PE.name="PE"
 $desc=$collectedClasses.PE
@@ -21596,33 +22389,26 @@
 $desc=$collectedClasses.Tm
 if($desc instanceof Array)$desc=$desc[1]
 Tm.prototype=$desc
-function kd(){}kd.builtin$cls="kd"
-if(!"name" in kd)kd.name="kd"
-$desc=$collectedClasses.kd
+function is(){}is.builtin$cls="is"
+if(!"name" in is)is.name="is"
+$desc=$collectedClasses.is
 if($desc instanceof Array)$desc=$desc[1]
-kd.prototype=$desc
+is.prototype=$desc
 function Q(){}Q.builtin$cls="List"
 if(!"name" in Q)Q.name="Q"
 $desc=$collectedClasses.Q
 if($desc instanceof Array)$desc=$desc[1]
 Q.prototype=$desc
-function C7(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}C7.builtin$cls="C7"
-$desc=$collectedClasses.C7
-if($desc instanceof Array)$desc=$desc[1]
-C7.prototype=$desc
 function jx(){}jx.builtin$cls="jx"
 if(!"name" in jx)jx.name="jx"
 $desc=$collectedClasses.jx
 if($desc instanceof Array)$desc=$desc[1]
 jx.prototype=$desc
-function y4(){}y4.builtin$cls="y4"
-if(!"name" in y4)y4.name="y4"
-$desc=$collectedClasses.y4
+function ZC(){}ZC.builtin$cls="ZC"
+if(!"name" in ZC)ZC.name="ZC"
+$desc=$collectedClasses.ZC
 if($desc instanceof Array)$desc=$desc[1]
-y4.prototype=$desc
+ZC.prototype=$desc
 function Jt(){}Jt.builtin$cls="Jt"
 if(!"name" in Jt)Jt.name="Jt"
 $desc=$collectedClasses.Jt
@@ -21658,19 +22444,19 @@
 $desc=$collectedClasses.JO
 if($desc instanceof Array)$desc=$desc[1]
 JO.prototype=$desc
-function O2(Hg,NO,hJ,N0,yc,Xz,Ai,EF,ji,i2,rj,XC,zz){this.Hg=Hg
-this.NO=NO
+function O2(Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2,rj,XC,w2){this.Hg=Hg
+this.oL=oL
 this.hJ=hJ
 this.N0=N0
-this.yc=yc
+this.Nr=Nr
 this.Xz=Xz
-this.Ai=Ai
+this.vu=vu
 this.EF=EF
 this.ji=ji
 this.i2=i2
 this.rj=rj
 this.XC=XC
-this.zz=zz}O2.builtin$cls="O2"
+this.w2=w2}O2.builtin$cls="O2"
 if(!"name" in O2)O2.name="O2"
 $desc=$collectedClasses.O2
 if($desc instanceof Array)$desc=$desc[1]
@@ -21693,13 +22479,6 @@
 $desc=$collectedClasses.cC
 if($desc instanceof Array)$desc=$desc[1]
 cC.prototype=$desc
-function Ip(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}Ip.builtin$cls="Ip"
-$desc=$collectedClasses.Ip
-if($desc instanceof Array)$desc=$desc[1]
-Ip.prototype=$desc
 function RA(a){this.a=a}RA.builtin$cls="RA"
 if(!"name" in RA)RA.name="RA"
 $desc=$collectedClasses.RA
@@ -21716,11 +22495,11 @@
 IY.prototype.sF1=function(receiver,v){return this.F1=v}
 IY.prototype.gG1=function(receiver){return this.G1}
 IY.prototype.sG1=function(receiver,v){return this.G1=v}
-function In(){}In.builtin$cls="In"
-if(!"name" in In)In.name="In"
-$desc=$collectedClasses.In
+function JH(){}JH.builtin$cls="JH"
+if(!"name" in JH)JH.name="JH"
+$desc=$collectedClasses.JH
 if($desc instanceof Array)$desc=$desc[1]
-In.prototype=$desc
+JH.prototype=$desc
 function jl(a,b,c,d,e){this.a=a
 this.b=b
 this.c=c
@@ -21730,13 +22509,13 @@
 $desc=$collectedClasses.jl
 if($desc instanceof Array)$desc=$desc[1]
 jl.prototype=$desc
-function BR(){}BR.builtin$cls="BR"
-if(!"name" in BR)BR.name="BR"
-$desc=$collectedClasses.BR
+function Iy(){}Iy.builtin$cls="Iy"
+if(!"name" in Iy)Iy.name="Iy"
+$desc=$collectedClasses.Iy
 if($desc instanceof Array)$desc=$desc[1]
-BR.prototype=$desc
-function JM(JE,Jz){this.JE=JE
-this.Jz=Jz}JM.builtin$cls="JM"
+Iy.prototype=$desc
+function JM(JE,tv){this.JE=JE
+this.tv=tv}JM.builtin$cls="JM"
 if(!"name" in JM)JM.name="JM"
 $desc=$collectedClasses.JM
 if($desc instanceof Array)$desc=$desc[1]
@@ -21754,9 +22533,9 @@
 $desc=$collectedClasses.JG
 if($desc instanceof Array)$desc=$desc[1]
 JG.prototype=$desc
-function ns(Ws,bv,Jz){this.Ws=Ws
+function ns(Ws,bv,tv){this.Ws=Ws
 this.bv=bv
-this.Jz=Jz}ns.builtin$cls="ns"
+this.tv=tv}ns.builtin$cls="ns"
 if(!"name" in ns)ns.name="ns"
 $desc=$collectedClasses.ns
 if($desc instanceof Array)$desc=$desc[1]
@@ -21767,39 +22546,39 @@
 $desc=$collectedClasses.wd
 if($desc instanceof Array)$desc=$desc[1]
 wd.prototype=$desc
-function TA(qK,da){this.qK=qK
+function TA(ng,da){this.ng=ng
 this.da=da}TA.builtin$cls="TA"
 if(!"name" in TA)TA.name="TA"
 $desc=$collectedClasses.TA
 if($desc instanceof Array)$desc=$desc[1]
 TA.prototype=$desc
-TA.prototype.gqK=function(){return this.qK}
+TA.prototype.gng=function(){return this.ng}
 TA.prototype.gda=function(){return this.da}
-function MT(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}MT.builtin$cls="MT"
-$desc=$collectedClasses.MT
+function YP(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}YP.builtin$cls="YP"
+$desc=$collectedClasses.YP
 if($desc instanceof Array)$desc=$desc[1]
-MT.prototype=$desc
+YP.prototype=$desc
 function yc(a){this.a=a}yc.builtin$cls="yc"
 if(!"name" in yc)yc.name="yc"
 $desc=$collectedClasses.yc
 if($desc instanceof Array)$desc=$desc[1]
 yc.prototype=$desc
-function I9(Gx,il){this.Gx=Gx
-this.il=il}I9.builtin$cls="I9"
+function I9(Gx,mR){this.Gx=Gx
+this.mR=mR}I9.builtin$cls="I9"
 if(!"name" in I9)I9.name="I9"
 $desc=$collectedClasses.I9
 if($desc instanceof Array)$desc=$desc[1]
 I9.prototype=$desc
-function Bj(CN,il){this.CN=CN
-this.il=il}Bj.builtin$cls="Bj"
+function Bj(CN,mR){this.CN=CN
+this.mR=mR}Bj.builtin$cls="Bj"
 if(!"name" in Bj)Bj.name="Bj"
 $desc=$collectedClasses.Bj
 if($desc instanceof Array)$desc=$desc[1]
 Bj.prototype=$desc
-function NO(il){this.il=il}NO.builtin$cls="NO"
+function NO(mR){this.mR=mR}NO.builtin$cls="NO"
 if(!"name" in NO)NO.name="NO"
 $desc=$collectedClasses.NO
 if($desc instanceof Array)$desc=$desc[1]
@@ -21809,11 +22588,11 @@
 $desc=$collectedClasses.II
 if($desc instanceof Array)$desc=$desc[1]
 II.prototype=$desc
-function fP(MD){this.MD=MD}fP.builtin$cls="fP"
-if(!"name" in fP)fP.name="fP"
-$desc=$collectedClasses.fP
+function aJ(MD){this.MD=MD}aJ.builtin$cls="aJ"
+if(!"name" in aJ)aJ.name="aJ"
+$desc=$collectedClasses.aJ
 if($desc instanceof Array)$desc=$desc[1]
-fP.prototype=$desc
+aJ.prototype=$desc
 function X1(){}X1.builtin$cls="X1"
 if(!"name" in X1)X1.name="X1"
 $desc=$collectedClasses.X1
@@ -21824,10 +22603,10 @@
 $desc=$collectedClasses.HU
 if($desc instanceof Array)$desc=$desc[1]
 HU.prototype=$desc
-function Pm(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}Pm.builtin$cls="Pm"
+function Pm(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}Pm.builtin$cls="Pm"
 $desc=$collectedClasses.Pm
 if($desc instanceof Array)$desc=$desc[1]
 Pm.prototype=$desc
@@ -21842,11 +22621,11 @@
 $desc=$collectedClasses.OW
 if($desc instanceof Array)$desc=$desc[1]
 OW.prototype=$desc
-function jP(){}jP.builtin$cls="jP"
-if(!"name" in jP)jP.name="jP"
-$desc=$collectedClasses.jP
+function Dd(){}Dd.builtin$cls="Dd"
+if(!"name" in Dd)Dd.name="Dd"
+$desc=$collectedClasses.Dd
 if($desc instanceof Array)$desc=$desc[1]
-jP.prototype=$desc
+Dd.prototype=$desc
 function AP(){}AP.builtin$cls="AP"
 if(!"name" in AP)AP.name="AP"
 $desc=$collectedClasses.AP
@@ -21876,20 +22655,20 @@
 $desc=$collectedClasses.oH
 if($desc instanceof Array)$desc=$desc[1]
 oH.prototype=$desc
-function LP(B,eZ,tc){this.B=B
-this.eZ=eZ
-this.tc=tc}LP.builtin$cls="LP"
+function LP(B,il,js){this.B=B
+this.il=il
+this.js=js}LP.builtin$cls="LP"
 if(!"name" in LP)LP.name="LP"
 $desc=$collectedClasses.LP
 if($desc instanceof Array)$desc=$desc[1]
 LP.prototype=$desc
 LP.prototype.gB=function(receiver){return this.B}
-function QS(a,b){this.a=a
-this.b=b}QS.builtin$cls="QS"
-if(!"name" in QS)QS.name="QS"
-$desc=$collectedClasses.QS
+function c2(a,b){this.a=a
+this.b=b}c2.builtin$cls="c2"
+if(!"name" in c2)c2.name="c2"
+$desc=$collectedClasses.c2
 if($desc instanceof Array)$desc=$desc[1]
-QS.prototype=$desc
+c2.prototype=$desc
 function WT(a,b){this.a=a
 this.b=b}WT.builtin$cls="WT"
 if(!"name" in WT)WT.name="WT"
@@ -21901,17 +22680,17 @@
 $desc=$collectedClasses.p8
 if($desc instanceof Array)$desc=$desc[1]
 p8.prototype=$desc
-function XR(Y3){this.Y3=Y3}XR.builtin$cls="XR"
+function XR(Nt){this.Nt=Nt}XR.builtin$cls="XR"
 if(!"name" in XR)XR.name="XR"
 $desc=$collectedClasses.XR
 if($desc instanceof Array)$desc=$desc[1]
 XR.prototype=$desc
-function LI(lK,cC,xI,rq,FX,Nc){this.lK=lK
-this.cC=cC
-this.xI=xI
-this.rq=rq
-this.FX=FX
-this.Nc=Nc}LI.builtin$cls="LI"
+function LI(t5,Qp,GF,FQ,md,mG){this.t5=t5
+this.Qp=Qp
+this.GF=GF
+this.FQ=FQ
+this.md=md
+this.mG=mG}LI.builtin$cls="LI"
 if(!"name" in LI)LI.name="LI"
 $desc=$collectedClasses.LI
 if($desc instanceof Array)$desc=$desc[1]
@@ -21948,30 +22727,30 @@
 $desc=$collectedClasses.t2
 if($desc instanceof Array)$desc=$desc[1]
 t2.prototype=$desc
-function Zr(bT,rq,Xs,Fa,Ga,EP){this.bT=bT
-this.rq=rq
-this.Xs=Xs
-this.Fa=Fa
-this.Ga=Ga
-this.EP=EP}Zr.builtin$cls="Zr"
+function Zr(i9,FQ,Vv,yB,Sp,lv){this.i9=i9
+this.FQ=FQ
+this.Vv=Vv
+this.yB=yB
+this.Sp=Sp
+this.lv=lv}Zr.builtin$cls="Zr"
 if(!"name" in Zr)Zr.name="Zr"
 $desc=$collectedClasses.Zr
 if($desc instanceof Array)$desc=$desc[1]
 Zr.prototype=$desc
-function W0(V7,Ga){this.V7=V7
-this.Ga=Ga}W0.builtin$cls="W0"
-if(!"name" in W0)W0.name="W0"
-$desc=$collectedClasses.W0
+function ZQ(Zf,Sp){this.Zf=Zf
+this.Sp=Sp}ZQ.builtin$cls="ZQ"
+if(!"name" in ZQ)ZQ.name="ZQ"
+$desc=$collectedClasses.ZQ
 if($desc instanceof Array)$desc=$desc[1]
-W0.prototype=$desc
-function az(V7,Ga,EP){this.V7=V7
-this.Ga=Ga
-this.EP=EP}az.builtin$cls="az"
+ZQ.prototype=$desc
+function az(Zf,Sp,lv){this.Zf=Zf
+this.Sp=Sp
+this.lv=lv}az.builtin$cls="az"
 if(!"name" in az)az.name="az"
 $desc=$collectedClasses.az
 if($desc instanceof Array)$desc=$desc[1]
 az.prototype=$desc
-function vV(V7){this.V7=V7}vV.builtin$cls="vV"
+function vV(Zf){this.Zf=Zf}vV.builtin$cls="vV"
 if(!"name" in vV)vV.name="vV"
 $desc=$collectedClasses.vV
 if($desc instanceof Array)$desc=$desc[1]
@@ -21981,8 +22760,8 @@
 $desc=$collectedClasses.Hk
 if($desc instanceof Array)$desc=$desc[1]
 Hk.prototype=$desc
-function XO(lA,ui){this.lA=lA
-this.ui=ui}XO.builtin$cls="XO"
+function XO(MP,bQ){this.MP=MP
+this.bQ=bQ}XO.builtin$cls="XO"
 if(!"name" in XO)XO.name="XO"
 $desc=$collectedClasses.XO
 if($desc instanceof Array)$desc=$desc[1]
@@ -22027,17 +22806,17 @@
 $desc=$collectedClasses.Tp
 if($desc instanceof Array)$desc=$desc[1]
 Tp.prototype=$desc
-function v(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}v.builtin$cls="v"
+function v(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}v.builtin$cls="v"
 if(!"name" in v)v.name="v"
 $desc=$collectedClasses.v
 if($desc instanceof Array)$desc=$desc[1]
 v.prototype=$desc
-v.prototype.gnw=function(){return this.nw}
-v.prototype.gjm=function(){return this.jm}
-v.prototype.gRA=function(receiver){return this.RA}
+v.prototype.gwc=function(){return this.wc}
+v.prototype.gnn=function(){return this.nn}
+v.prototype.gPp=function(receiver){return this.Pp}
 function Z3(Jy){this.Jy=Jy}Z3.builtin$cls="Z3"
 if(!"name" in Z3)Z3.name="Z3"
 $desc=$collectedClasses.Z3
@@ -22066,49 +22845,60 @@
 if($desc instanceof Array)$desc=$desc[1]
 Eq.prototype=$desc
 Eq.prototype.gG1=function(receiver){return this.G1}
-function cu(LU,ke){this.LU=LU
-this.ke=ke}cu.builtin$cls="cu"
+function cu(IE,rE){this.IE=IE
+this.rE=rE}cu.builtin$cls="cu"
 if(!"name" in cu)cu.name="cu"
 $desc=$collectedClasses.cu
 if($desc instanceof Array)$desc=$desc[1]
 cu.prototype=$desc
-cu.prototype.gLU=function(){return this.LU}
-function Lm(XP,oc,M7){this.XP=XP
+cu.prototype.gIE=function(){return this.IE}
+function Lm(h7,oc,kU){this.h7=h7
 this.oc=oc
-this.M7=M7}Lm.builtin$cls="Lm"
+this.kU=kU}Lm.builtin$cls="Lm"
 if(!"name" in Lm)Lm.name="Lm"
 $desc=$collectedClasses.Lm
 if($desc instanceof Array)$desc=$desc[1]
 Lm.prototype=$desc
-Lm.prototype.gXP=function(){return this.XP}
+Lm.prototype.gh7=function(){return this.h7}
 Lm.prototype.goc=function(receiver){return this.oc}
-function Vs(a){this.a=a}Vs.builtin$cls="Vs"
-if(!"name" in Vs)Vs.name="Vs"
-$desc=$collectedClasses.Vs
+Lm.prototype.gkU=function(receiver){return this.kU}
+function dC(a){this.a=a}dC.builtin$cls="dC"
+if(!"name" in dC)dC.name="dC"
+$desc=$collectedClasses.dC
 if($desc instanceof Array)$desc=$desc[1]
-Vs.prototype=$desc
-function VR(Ej,Ii,Ua){this.Ej=Ej
-this.Ii=Ii
-this.Ua=Ua}VR.builtin$cls="VR"
+dC.prototype=$desc
+function wN(b){this.b=b}wN.builtin$cls="wN"
+if(!"name" in wN)wN.name="wN"
+$desc=$collectedClasses.wN
+if($desc instanceof Array)$desc=$desc[1]
+wN.prototype=$desc
+function VX(c){this.c=c}VX.builtin$cls="VX"
+if(!"name" in VX)VX.name="VX"
+$desc=$collectedClasses.VX
+if($desc instanceof Array)$desc=$desc[1]
+VX.prototype=$desc
+function VR(SQ,h2,fX){this.SQ=SQ
+this.h2=h2
+this.fX=fX}VR.builtin$cls="VR"
 if(!"name" in VR)VR.name="VR"
 $desc=$collectedClasses.VR
 if($desc instanceof Array)$desc=$desc[1]
 VR.prototype=$desc
-function EK(zO,QK){this.zO=zO
-this.QK=QK}EK.builtin$cls="EK"
+function EK(zO,oH){this.zO=zO
+this.oH=oH}EK.builtin$cls="EK"
 if(!"name" in EK)EK.name="EK"
 $desc=$collectedClasses.EK
 if($desc instanceof Array)$desc=$desc[1]
 EK.prototype=$desc
-function KW(Gf,rv){this.Gf=Gf
-this.rv=rv}KW.builtin$cls="KW"
+function KW(td,BZ){this.td=td
+this.BZ=BZ}KW.builtin$cls="KW"
 if(!"name" in KW)KW.name="KW"
 $desc=$collectedClasses.KW
 if($desc instanceof Array)$desc=$desc[1]
 KW.prototype=$desc
-function Pb(VV,rv,Wh){this.VV=VV
-this.rv=rv
-this.Wh=Wh}Pb.builtin$cls="Pb"
+function Pb(EW,BZ,Jz){this.EW=EW
+this.BZ=BZ
+this.Jz=Jz}Pb.builtin$cls="Pb"
 if(!"name" in Pb)Pb.name="Pb"
 $desc=$collectedClasses.Pb
 if($desc instanceof Array)$desc=$desc[1]
@@ -22120,14 +22910,14 @@
 $desc=$collectedClasses.tQ
 if($desc instanceof Array)$desc=$desc[1]
 tQ.prototype=$desc
-function aC(lb,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.lb=lb
-this.jH=jH
-this.Wd=Wd
+function aC(FJ,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.FJ=FJ
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -22140,23 +22930,23 @@
 $desc=$collectedClasses.aC
 if($desc instanceof Array)$desc=$desc[1]
 aC.prototype=$desc
-aC.prototype.glb=function(receiver){return receiver.lb}
-aC.prototype.glb.$reflectable=1
-aC.prototype.slb=function(receiver,v){return receiver.lb=v}
-aC.prototype.slb.$reflectable=1
+aC.prototype.gFJ=function(receiver){return receiver.FJ}
+aC.prototype.gFJ.$reflectable=1
+aC.prototype.sFJ=function(receiver,v){return receiver.FJ=v}
+aC.prototype.sFJ.$reflectable=1
 function Vf(){}Vf.builtin$cls="Vf"
 if(!"name" in Vf)Vf.name="Vf"
 $desc=$collectedClasses.Vf
 if($desc instanceof Array)$desc=$desc[1]
 Vf.prototype=$desc
-function Be(Zw,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Zw=Zw
-this.jH=jH
-this.Wd=Wd
+function Be(Zw,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Zw=Zw
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -22173,21 +22963,21 @@
 Be.prototype.gZw.$reflectable=1
 Be.prototype.sZw=function(receiver,v){return receiver.Zw=v}
 Be.prototype.sZw.$reflectable=1
-function Vc(){}Vc.builtin$cls="Vc"
-if(!"name" in Vc)Vc.name="Vc"
-$desc=$collectedClasses.Vc
+function tu(){}tu.builtin$cls="tu"
+if(!"name" in tu)tu.name="tu"
+$desc=$collectedClasses.tu
 if($desc instanceof Array)$desc=$desc[1]
-Vc.prototype=$desc
-function i6(Xf,VA,El,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Xf=Xf
+tu.prototype=$desc
+function i6(Xf,VA,P2,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Xf=Xf
 this.VA=VA
-this.El=El
-this.jH=jH
-this.Wd=Wd
+this.P2=P2
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -22208,122 +22998,140 @@
 i6.prototype.gVA.$reflectable=1
 i6.prototype.sVA=function(receiver,v){return receiver.VA=v}
 i6.prototype.sVA.$reflectable=1
-i6.prototype.gEl=function(receiver){return receiver.El}
-i6.prototype.gEl.$reflectable=1
-i6.prototype.sEl=function(receiver,v){return receiver.El=v}
-i6.prototype.sEl.$reflectable=1
-function WZ(){}WZ.builtin$cls="WZ"
-if(!"name" in WZ)WZ.name="WZ"
-$desc=$collectedClasses.WZ
+i6.prototype.gP2=function(receiver){return receiver.P2}
+i6.prototype.gP2.$reflectable=1
+i6.prototype.sP2=function(receiver,v){return receiver.P2=v}
+i6.prototype.sP2.$reflectable=1
+function Vc(){}Vc.builtin$cls="Vc"
+if(!"name" in Vc)Vc.name="Vc"
+$desc=$collectedClasses.Vc
 if($desc instanceof Array)$desc=$desc[1]
-WZ.prototype=$desc
-function wJ(){}wJ.builtin$cls="wJ"
-if(!"name" in wJ)wJ.name="wJ"
-$desc=$collectedClasses.wJ
+Vc.prototype=$desc
+function zO(){}zO.builtin$cls="zO"
+if(!"name" in zO)zO.name="zO"
+$desc=$collectedClasses.zO
 if($desc instanceof Array)$desc=$desc[1]
-wJ.prototype=$desc
+zO.prototype=$desc
 function aL(){}aL.builtin$cls="aL"
 if(!"name" in aL)aL.name="aL"
 $desc=$collectedClasses.aL
 if($desc instanceof Array)$desc=$desc[1]
 aL.prototype=$desc
-function bX(V8,aZ,r8){this.V8=V8
-this.aZ=aZ
-this.r8=r8}bX.builtin$cls="bX"
-if(!"name" in bX)bX.name="bX"
-$desc=$collectedClasses.bX
+function nH(Kw,Bz,n1){this.Kw=Kw
+this.Bz=Bz
+this.n1=n1}nH.builtin$cls="nH"
+if(!"name" in nH)nH.name="nH"
+$desc=$collectedClasses.nH
 if($desc instanceof Array)$desc=$desc[1]
-bX.prototype=$desc
-function wi(V8,Vt,q5,M4){this.V8=V8
-this.Vt=Vt
-this.q5=q5
-this.M4=M4}wi.builtin$cls="wi"
-if(!"name" in wi)wi.name="wi"
-$desc=$collectedClasses.wi
+nH.prototype=$desc
+function a7(Kw,qn,j2,mD){this.Kw=Kw
+this.qn=qn
+this.j2=j2
+this.mD=mD}a7.builtin$cls="a7"
+if(!"name" in a7)a7.name="a7"
+$desc=$collectedClasses.a7
 if($desc instanceof Array)$desc=$desc[1]
-wi.prototype=$desc
-function i1(V8,Wz){this.V8=V8
-this.Wz=Wz}i1.builtin$cls="i1"
+a7.prototype=$desc
+function i1(Kw,ew){this.Kw=Kw
+this.ew=ew}i1.builtin$cls="i1"
 if(!"name" in i1)i1.name="i1"
 $desc=$collectedClasses.i1
 if($desc instanceof Array)$desc=$desc[1]
 i1.prototype=$desc
-function xy(V8,Wz){this.V8=V8
-this.Wz=Wz}xy.builtin$cls="xy"
+function xy(Kw,ew){this.Kw=Kw
+this.ew=ew}xy.builtin$cls="xy"
 if(!"name" in xy)xy.name="xy"
 $desc=$collectedClasses.xy
 if($desc instanceof Array)$desc=$desc[1]
 xy.prototype=$desc
-function MH(M4,N4,Wz){this.M4=M4
-this.N4=N4
-this.Wz=Wz}MH.builtin$cls="MH"
+function MH(mD,RX,ew){this.mD=mD
+this.RX=RX
+this.ew=ew}MH.builtin$cls="MH"
 if(!"name" in MH)MH.name="MH"
 $desc=$collectedClasses.MH
 if($desc instanceof Array)$desc=$desc[1]
 MH.prototype=$desc
-function A8(uk,Wz){this.uk=uk
-this.Wz=Wz}A8.builtin$cls="A8"
+function A8(qb,ew){this.qb=qb
+this.ew=ew}A8.builtin$cls="A8"
 if(!"name" in A8)A8.name="A8"
 $desc=$collectedClasses.A8
 if($desc instanceof Array)$desc=$desc[1]
 A8.prototype=$desc
-function U5(V8,Wz){this.V8=V8
-this.Wz=Wz}U5.builtin$cls="U5"
+function U5(Kw,ew){this.Kw=Kw
+this.ew=ew}U5.builtin$cls="U5"
 if(!"name" in U5)U5.name="U5"
 $desc=$collectedClasses.U5
 if($desc instanceof Array)$desc=$desc[1]
 U5.prototype=$desc
-function SO(N4,Wz){this.N4=N4
-this.Wz=Wz}SO.builtin$cls="SO"
+function SO(RX,ew){this.RX=RX
+this.ew=ew}SO.builtin$cls="SO"
 if(!"name" in SO)SO.name="SO"
 $desc=$collectedClasses.SO
 if($desc instanceof Array)$desc=$desc[1]
 SO.prototype=$desc
-function zs(V8,Wz){this.V8=V8
-this.Wz=Wz}zs.builtin$cls="zs"
+function zs(Kw,ew){this.Kw=Kw
+this.ew=ew}zs.builtin$cls="zs"
 if(!"name" in zs)zs.name="zs"
 $desc=$collectedClasses.zs
 if($desc instanceof Array)$desc=$desc[1]
 zs.prototype=$desc
-function rR(N4,Wz,Qy,M4){this.N4=N4
-this.Wz=Wz
-this.Qy=Qy
-this.M4=M4}rR.builtin$cls="rR"
+function rR(RX,ew,IO,mD){this.RX=RX
+this.ew=ew
+this.IO=IO
+this.mD=mD}rR.builtin$cls="rR"
 if(!"name" in rR)rR.name="rR"
 $desc=$collectedClasses.rR
 if($desc instanceof Array)$desc=$desc[1]
 rR.prototype=$desc
-function Fu(){}Fu.builtin$cls="Fu"
-if(!"name" in Fu)Fu.name="Fu"
-$desc=$collectedClasses.Fu
+function AM(Kw,xZ){this.Kw=Kw
+this.xZ=xZ}AM.builtin$cls="AM"
+if(!"name" in AM)AM.name="AM"
+$desc=$collectedClasses.AM
 if($desc instanceof Array)$desc=$desc[1]
-Fu.prototype=$desc
+AM.prototype=$desc
+function d5(Kw,xZ){this.Kw=Kw
+this.xZ=xZ}d5.builtin$cls="d5"
+if(!"name" in d5)d5.name="d5"
+$desc=$collectedClasses.d5
+if($desc instanceof Array)$desc=$desc[1]
+d5.prototype=$desc
+function U1(RX,xZ){this.RX=RX
+this.xZ=xZ}U1.builtin$cls="U1"
+if(!"name" in U1)U1.name="U1"
+$desc=$collectedClasses.U1
+if($desc instanceof Array)$desc=$desc[1]
+U1.prototype=$desc
+function SJ(){}SJ.builtin$cls="SJ"
+if(!"name" in SJ)SJ.name="SJ"
+$desc=$collectedClasses.SJ
+if($desc instanceof Array)$desc=$desc[1]
+SJ.prototype=$desc
 function SU(){}SU.builtin$cls="SU"
 if(!"name" in SU)SU.name="SU"
 $desc=$collectedClasses.SU
 if($desc instanceof Array)$desc=$desc[1]
 SU.prototype=$desc
-function Ja(){}Ja.builtin$cls="Ja"
-if(!"name" in Ja)Ja.name="Ja"
-$desc=$collectedClasses.Ja
+function Tv(){}Tv.builtin$cls="Tv"
+if(!"name" in Tv)Tv.name="Tv"
+$desc=$collectedClasses.Tv
 if($desc instanceof Array)$desc=$desc[1]
-Ja.prototype=$desc
+Tv.prototype=$desc
 function XC(){}XC.builtin$cls="XC"
 if(!"name" in XC)XC.name="XC"
 $desc=$collectedClasses.XC
 if($desc instanceof Array)$desc=$desc[1]
 XC.prototype=$desc
-function iK(uk){this.uk=uk}iK.builtin$cls="iK"
+function iK(qb){this.qb=qb}iK.builtin$cls="iK"
 if(!"name" in iK)iK.name="iK"
 $desc=$collectedClasses.iK
 if($desc instanceof Array)$desc=$desc[1]
 iK.prototype=$desc
-function GD(E3){this.E3=E3}GD.builtin$cls="GD"
+function GD(hr){this.hr=hr}GD.builtin$cls="GD"
 if(!"name" in GD)GD.name="GD"
 $desc=$collectedClasses.GD
 if($desc instanceof Array)$desc=$desc[1]
 GD.prototype=$desc
-GD.prototype.gE3=function(receiver){return this.E3}
+GD.prototype.ghr=function(receiver){return this.hr}
 function Sn(L5,F1){this.L5=L5
 this.F1=F1}Sn.builtin$cls="Sn"
 if(!"name" in Sn)Sn.name="Sn"
@@ -22357,7 +23165,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 am.prototype=$desc
 am.prototype.gIf=function(){return this.If}
-function cw(XP,xW,LQ,If){this.XP=XP
+function cw(h7,xW,LQ,If){this.h7=h7
 this.xW=xW
 this.LQ=LQ
 this.If=If}cw.builtin$cls="cw"
@@ -22365,25 +23173,25 @@
 $desc=$collectedClasses.cw
 if($desc instanceof Array)$desc=$desc[1]
 cw.prototype=$desc
-cw.prototype.gXP=function(){return this.XP}
+cw.prototype.gh7=function(){return this.h7}
 function EE(If){this.If=If}EE.builtin$cls="EE"
 if(!"name" in EE)EE.name="EE"
 $desc=$collectedClasses.EE
 if($desc instanceof Array)$desc=$desc[1]
 EE.prototype=$desc
-function Uz(FP,aP,wP,le,LB,GD,ae,SD,tB,P8,mX,T1,fX,M2,uA,Db,Ok,If){this.FP=FP
+function Uz(FP,aP,wP,le,LB,rv,ae,SD,tB,P8,mX,T1,Ly,M2,uA,Db,Ok,If){this.FP=FP
 this.aP=aP
 this.wP=wP
 this.le=le
 this.LB=LB
-this.GD=GD
+this.rv=rv
 this.ae=ae
 this.SD=SD
 this.tB=tB
 this.P8=P8
 this.mX=mX
 this.T1=T1
-this.fX=fX
+this.Ly=Ly
 this.M2=M2
 this.uA=uA
 this.Db=Db
@@ -22394,18 +23202,28 @@
 if($desc instanceof Array)$desc=$desc[1]
 Uz.prototype=$desc
 Uz.prototype.gFP=function(){return this.FP}
-Uz.prototype.gGD=function(){return this.GD}
+Uz.prototype.grv=function(){return this.rv}
 Uz.prototype.gae=function(){return this.ae}
-function Xd(){}Xd.builtin$cls="Xd"
-if(!"name" in Xd)Xd.name="Xd"
-$desc=$collectedClasses.Xd
+function uh(){}uh.builtin$cls="uh"
+if(!"name" in uh)uh.name="uh"
+$desc=$collectedClasses.uh
 if($desc instanceof Array)$desc=$desc[1]
-Xd.prototype=$desc
+uh.prototype=$desc
 function Kv(a){this.a=a}Kv.builtin$cls="Kv"
 if(!"name" in Kv)Kv.name="Kv"
 $desc=$collectedClasses.Kv
 if($desc instanceof Array)$desc=$desc[1]
 Kv.prototype=$desc
+function oP(a){this.a=a}oP.builtin$cls="oP"
+if(!"name" in oP)oP.name="oP"
+$desc=$collectedClasses.oP
+if($desc instanceof Array)$desc=$desc[1]
+oP.prototype=$desc
+function YX(a){this.a=a}YX.builtin$cls="YX"
+if(!"name" in YX)YX.name="YX"
+$desc=$collectedClasses.YX
+if($desc instanceof Array)$desc=$desc[1]
+YX.prototype=$desc
 function BI(AY,XW,BB,If){this.AY=AY
 this.XW=XW
 this.BB=BB
@@ -22420,11 +23238,11 @@
 $desc=$collectedClasses.y1
 if($desc instanceof Array)$desc=$desc[1]
 y1.prototype=$desc
-function U2(){}U2.builtin$cls="U2"
-if(!"name" in U2)U2.name="U2"
-$desc=$collectedClasses.U2
+function M2(){}M2.builtin$cls="M2"
+if(!"name" in M2)M2.name="M2"
+$desc=$collectedClasses.M2
 if($desc instanceof Array)$desc=$desc[1]
-U2.prototype=$desc
+M2.prototype=$desc
 function iu(Ax){this.Ax=Ax}iu.builtin$cls="iu"
 if(!"name" in iu)iu.name="iu"
 $desc=$collectedClasses.iu
@@ -22441,13 +23259,19 @@
 $desc=$collectedClasses.zE
 if($desc instanceof Array)$desc=$desc[1]
 zE.prototype=$desc
-function bl(NK,EZ,M2,T1,fX,FU,jd,If){this.NK=NK
+function bl(NK,EZ,ut,Db,uA,b0,M2,T1,Ly,FU,jd,qN,qm,If){this.NK=NK
 this.EZ=EZ
+this.ut=ut
+this.Db=Db
+this.uA=uA
+this.b0=b0
 this.M2=M2
 this.T1=T1
-this.fX=fX
+this.Ly=Ly
 this.FU=FU
 this.jd=jd
+this.qN=qN
+this.qm=qm
 this.If=If}bl.builtin$cls="bl"
 if(!"name" in bl)bl.name="bl"
 $desc=$collectedClasses.bl
@@ -22468,7 +23292,12 @@
 $desc=$collectedClasses.Tc
 if($desc instanceof Array)$desc=$desc[1]
 Tc.prototype=$desc
-function Wf(WL,Tx,H8,Ht,pz,le,qN,jd,tB,b0,FU,T1,fX,M2,uA,Db,Ok,qm,UF,nz,If){this.WL=WL
+function Ax(a){this.a=a}Ax.builtin$cls="Ax"
+if(!"name" in Ax)Ax.name="Ax"
+$desc=$collectedClasses.Ax
+if($desc instanceof Array)$desc=$desc[1]
+Ax.prototype=$desc
+function Wf(WL,Tx,H8,Ht,pz,le,qN,jd,tB,b0,FU,T1,Ly,M2,uA,Db,Ok,qm,UF,nz,If){this.WL=WL
 this.Tx=Tx
 this.H8=H8
 this.Ht=Ht
@@ -22480,7 +23309,7 @@
 this.b0=b0
 this.FU=FU
 this.T1=T1
-this.fX=fX
+this.Ly=Ly
 this.M2=M2
 this.uA=uA
 this.Db=Db
@@ -22531,10 +23360,10 @@
 Wf.prototype.gT1.$reflectable=1
 Wf.prototype.sT1=function(v){return this.T1=v}
 Wf.prototype.sT1.$reflectable=1
-Wf.prototype.gfX=function(){return this.fX}
-Wf.prototype.gfX.$reflectable=1
-Wf.prototype.sfX=function(v){return this.fX=v}
-Wf.prototype.sfX.$reflectable=1
+Wf.prototype.gLy=function(){return this.Ly}
+Wf.prototype.gLy.$reflectable=1
+Wf.prototype.sLy=function(v){return this.Ly=v}
+Wf.prototype.sLy.$reflectable=1
 Wf.prototype.gM2=function(){return this.M2}
 Wf.prototype.gM2.$reflectable=1
 Wf.prototype.sM2=function(v){return this.M2=v}
@@ -22563,22 +23392,27 @@
 Wf.prototype.gnz.$reflectable=1
 Wf.prototype.snz=function(v){return this.nz=v}
 Wf.prototype.snz.$reflectable=1
-function Rk(){}Rk.builtin$cls="Rk"
-if(!"name" in Rk)Rk.name="Rk"
-$desc=$collectedClasses.Rk
+function Un(){}Un.builtin$cls="Un"
+if(!"name" in Un)Un.name="Un"
+$desc=$collectedClasses.Un
 if($desc instanceof Array)$desc=$desc[1]
-Rk.prototype=$desc
-function Gt(a){this.a=a}Gt.builtin$cls="Gt"
-if(!"name" in Gt)Gt.name="Gt"
-$desc=$collectedClasses.Gt
+Un.prototype=$desc
+function Ei(a){this.a=a}Ei.builtin$cls="Ei"
+if(!"name" in Ei)Ei.name="Ei"
+$desc=$collectedClasses.Ei
 if($desc instanceof Array)$desc=$desc[1]
-Gt.prototype=$desc
-function J0(){}J0.builtin$cls="J0"
-if(!"name" in J0)J0.name="J0"
-$desc=$collectedClasses.J0
+Ei.prototype=$desc
+function U7(b){this.b=b}U7.builtin$cls="U7"
+if(!"name" in U7)U7.name="U7"
+$desc=$collectedClasses.U7
 if($desc instanceof Array)$desc=$desc[1]
-J0.prototype=$desc
-function Ld(cK,V5,Fo,n6,nz,le,If){this.cK=cK
+U7.prototype=$desc
+function t0(a){this.a=a}t0.builtin$cls="t0"
+if(!"name" in t0)t0.name="t0"
+$desc=$collectedClasses.t0
+if($desc instanceof Array)$desc=$desc[1]
+t0.prototype=$desc
+function Ld(ao,V5,Fo,n6,nz,le,If){this.ao=ao
 this.V5=V5
 this.Fo=Fo
 this.n6=n6
@@ -22589,24 +23423,24 @@
 $desc=$collectedClasses.Ld
 if($desc instanceof Array)$desc=$desc[1]
 Ld.prototype=$desc
-Ld.prototype.gcK=function(){return this.cK}
-Ld.prototype.gV5=function(receiver){return this.V5}
+Ld.prototype.gao=function(){return this.ao}
+Ld.prototype.gV5=function(){return this.V5}
 Ld.prototype.gFo=function(){return this.Fo}
 function Sz(Ax){this.Ax=Ax}Sz.builtin$cls="Sz"
 if(!"name" in Sz)Sz.name="Sz"
 $desc=$collectedClasses.Sz
 if($desc instanceof Array)$desc=$desc[1]
 Sz.prototype=$desc
-function Zk(dl,Yq,lT,hB,Fo,xV,kN,nz,le,A9,Cr,If){this.dl=dl
+function Zk(dl,Yq,lT,hB,Fo,xV,qx,nz,le,G6,Cr,If){this.dl=dl
 this.Yq=Yq
 this.lT=lT
 this.hB=hB
 this.Fo=Fo
 this.xV=xV
-this.kN=kN
+this.qx=qx
 this.nz=nz
 this.le=le
-this.A9=A9
+this.G6=G6
 this.Cr=Cr
 this.If=If}Zk.builtin$cls="Zk"
 if(!"name" in Zk)Zk.name="Zk"
@@ -22617,14 +23451,14 @@
 Zk.prototype.ghB=function(){return this.hB}
 Zk.prototype.gFo=function(){return this.Fo}
 Zk.prototype.gxV=function(){return this.xV}
-function fu(XP,Ad,If){this.XP=XP
+function fu(h7,Ad,If){this.h7=h7
 this.Ad=Ad
 this.If=If}fu.builtin$cls="fu"
 if(!"name" in fu)fu.name="fu"
 $desc=$collectedClasses.fu
 if($desc instanceof Array)$desc=$desc[1]
 fu.prototype=$desc
-fu.prototype.gXP=function(){return this.XP}
+fu.prototype.gh7=function(){return this.h7}
 function ng(WL,CM,If){this.WL=WL
 this.CM=CM
 this.If=If}ng.builtin$cls="ng"
@@ -22632,16 +23466,22 @@
 $desc=$collectedClasses.ng
 if($desc instanceof Array)$desc=$desc[1]
 ng.prototype=$desc
-function Ar(d9,o3,yA,zs,XP){this.d9=d9
+ng.prototype.gWL=function(){return this.WL}
+function Ar(d9,o3,yA,zM,h7){this.d9=d9
 this.o3=o3
 this.yA=yA
-this.zs=zs
-this.XP=XP}Ar.builtin$cls="Ar"
+this.zM=zM
+this.h7=h7}Ar.builtin$cls="Ar"
 if(!"name" in Ar)Ar.name="Ar"
 $desc=$collectedClasses.Ar
 if($desc instanceof Array)$desc=$desc[1]
 Ar.prototype=$desc
-Ar.prototype.gXP=function(){return this.XP}
+Ar.prototype.gh7=function(){return this.h7}
+function jB(a){this.a=a}jB.builtin$cls="jB"
+if(!"name" in jB)jB.name="jB"
+$desc=$collectedClasses.jB
+if($desc instanceof Array)$desc=$desc[1]
+jB.prototype=$desc
 function ye(){}ye.builtin$cls="ye"
 if(!"name" in ye)ye.name="ye"
 $desc=$collectedClasses.ye
@@ -22696,6 +23536,13 @@
 JI.prototype.siE=function(v){return this.iE=v}
 JI.prototype.gSJ=function(){return this.SJ}
 JI.prototype.sSJ=function(v){return this.SJ=v}
+function Ip(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}Ip.builtin$cls="Ip"
+$desc=$collectedClasses.Ip
+if($desc instanceof Array)$desc=$desc[1]
+Ip.prototype=$desc
 function WV(nL,QC,iE,SJ){this.nL=nL
 this.QC=QC
 this.iE=iE
@@ -22710,10 +23557,17 @@
 WV.prototype.siE=function(v){return this.iE=v}
 WV.prototype.gSJ=function(){return this.SJ}
 WV.prototype.sSJ=function(v){return this.SJ=v}
-function CQ(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}CQ.builtin$cls="CQ"
+function C7(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}C7.builtin$cls="C7"
+$desc=$collectedClasses.C7
+if($desc instanceof Array)$desc=$desc[1]
+C7.prototype=$desc
+function CQ(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}CQ.builtin$cls="CQ"
 $desc=$collectedClasses.CQ
 if($desc instanceof Array)$desc=$desc[1]
 CQ.prototype=$desc
@@ -22778,13 +23632,6 @@
 $desc=$collectedClasses.TP
 if($desc instanceof Array)$desc=$desc[1]
 TP.prototype=$desc
-function P0(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}P0.builtin$cls="P0"
-$desc=$collectedClasses.P0
-if($desc instanceof Array)$desc=$desc[1]
-P0.prototype=$desc
 function Zf(MM){this.MM=MM}Zf.builtin$cls="Zf"
 if(!"name" in Zf)Zf.name="Zf"
 $desc=$collectedClasses.Zf
@@ -22854,37 +23701,37 @@
 $desc=$collectedClasses.wB
 if($desc instanceof Array)$desc=$desc[1]
 wB.prototype=$desc
-function Gv(a,h){this.a=a
-this.h=h}Gv.builtin$cls="Gv"
-if(!"name" in Gv)Gv.name="Gv"
-$desc=$collectedClasses.Gv
+function Pu(a,h){this.a=a
+this.h=h}Pu.builtin$cls="Pu"
+if(!"name" in Pu)Pu.name="Pu"
+$desc=$collectedClasses.Pu
 if($desc instanceof Array)$desc=$desc[1]
-Gv.prototype=$desc
+Pu.prototype=$desc
 function qh(){}qh.builtin$cls="qh"
 if(!"name" in qh)qh.name="qh"
 $desc=$collectedClasses.qh
 if($desc instanceof Array)$desc=$desc[1]
 qh.prototype=$desc
-function Lp(a,b,c,d,e){this.a=a
+function QC(a,b,c,d,e){this.a=a
 this.b=b
 this.c=c
 this.d=d
-this.e=e}Lp.builtin$cls="Lp"
-if(!"name" in Lp)Lp.name="Lp"
-$desc=$collectedClasses.Lp
-if($desc instanceof Array)$desc=$desc[1]
-Lp.prototype=$desc
-function Rv(f){this.f=f}Rv.builtin$cls="Rv"
-if(!"name" in Rv)Rv.name="Rv"
-$desc=$collectedClasses.Rv
-if($desc instanceof Array)$desc=$desc[1]
-Rv.prototype=$desc
-function QC(g,h){this.g=g
-this.h=h}QC.builtin$cls="QC"
+this.e=e}QC.builtin$cls="QC"
 if(!"name" in QC)QC.name="QC"
 $desc=$collectedClasses.QC
 if($desc instanceof Array)$desc=$desc[1]
 QC.prototype=$desc
+function Yl(f){this.f=f}Yl.builtin$cls="Yl"
+if(!"name" in Yl)Yl.name="Yl"
+$desc=$collectedClasses.Yl
+if($desc instanceof Array)$desc=$desc[1]
+Yl.prototype=$desc
+function Rv(g,h){this.g=g
+this.h=h}Rv.builtin$cls="Rv"
+if(!"name" in Rv)Rv.name="Rv"
+$desc=$collectedClasses.Rv
+if($desc instanceof Array)$desc=$desc[1]
+Rv.prototype=$desc
 function YJ(a,b,c,d){this.a=a
 this.b=b
 this.c=c
@@ -23017,46 +23864,19 @@
 $desc=$collectedClasses.Z5
 if($desc instanceof Array)$desc=$desc[1]
 Z5.prototype=$desc
-function Om(a,b,c,d){this.a=a
+function ii(a,b,c){this.a=a
 this.b=b
-this.c=c
-this.d=d}Om.builtin$cls="Om"
-if(!"name" in Om)Om.name="Om"
-$desc=$collectedClasses.Om
+this.c=c}ii.builtin$cls="ii"
+if(!"name" in ii)ii.name="ii"
+$desc=$collectedClasses.ii
 if($desc instanceof Array)$desc=$desc[1]
-Om.prototype=$desc
-function Sq(e,f){this.e=e
-this.f=f}Sq.builtin$cls="Sq"
-if(!"name" in Sq)Sq.name="Sq"
-$desc=$collectedClasses.Sq
+ii.prototype=$desc
+function ib(a,d){this.a=a
+this.d=d}ib.builtin$cls="ib"
+if(!"name" in ib)ib.name="ib"
+$desc=$collectedClasses.ib
 if($desc instanceof Array)$desc=$desc[1]
-Sq.prototype=$desc
-function KU(a,g,h){this.a=a
-this.g=g
-this.h=h}KU.builtin$cls="KU"
-if(!"name" in KU)KU.name="KU"
-$desc=$collectedClasses.KU
-if($desc instanceof Array)$desc=$desc[1]
-KU.prototype=$desc
-function Yd(i,j){this.i=i
-this.j=j}Yd.builtin$cls="Yd"
-if(!"name" in Yd)Yd.name="Yd"
-$desc=$collectedClasses.Yd
-if($desc instanceof Array)$desc=$desc[1]
-Yd.prototype=$desc
-function qC(a,b,c){this.a=a
-this.b=b
-this.c=c}qC.builtin$cls="qC"
-if(!"name" in qC)qC.name="qC"
-$desc=$collectedClasses.qC
-if($desc instanceof Array)$desc=$desc[1]
-qC.prototype=$desc
-function j5(a,d){this.a=a
-this.d=d}j5.builtin$cls="j5"
-if(!"name" in j5)j5.name="j5"
-$desc=$collectedClasses.j5
-if($desc instanceof Array)$desc=$desc[1]
-j5.prototype=$desc
+ib.prototype=$desc
 function MO(){}MO.builtin$cls="MO"
 if(!"name" in MO)MO.name="MO"
 $desc=$collectedClasses.MO
@@ -23082,31 +23902,31 @@
 $desc=$collectedClasses.vp
 if($desc instanceof Array)$desc=$desc[1]
 vp.prototype=$desc
-function of(){}of.builtin$cls="of"
-if(!"name" in of)of.name="of"
-$desc=$collectedClasses.of
+function lk(){}lk.builtin$cls="lk"
+if(!"name" in lk)lk.name="lk"
+$desc=$collectedClasses.lk
 if($desc instanceof Array)$desc=$desc[1]
-of.prototype=$desc
-function q1(nL,p4,Z9,QC,iP,Gv,Ip){this.nL=nL
+lk.prototype=$desc
+function Gh(nL,p4,Z9,QC,iP,Gv,Ip){this.nL=nL
 this.p4=p4
 this.Z9=Z9
 this.QC=QC
 this.iP=iP
 this.Gv=Gv
-this.Ip=Ip}q1.builtin$cls="q1"
-if(!"name" in q1)q1.name="q1"
-$desc=$collectedClasses.q1
+this.Ip=Ip}Gh.builtin$cls="Gh"
+if(!"name" in Gh)Gh.name="Gh"
+$desc=$collectedClasses.Gh
 if($desc instanceof Array)$desc=$desc[1]
-q1.prototype=$desc
-q1.prototype.gnL=function(){return this.nL}
-q1.prototype.gp4=function(){return this.p4}
-q1.prototype.gZ9=function(){return this.Z9}
-q1.prototype.gQC=function(){return this.QC}
-function rK(){}rK.builtin$cls="rK"
-if(!"name" in rK)rK.name="rK"
-$desc=$collectedClasses.rK
+Gh.prototype=$desc
+Gh.prototype.gnL=function(){return this.nL}
+Gh.prototype.gp4=function(){return this.p4}
+Gh.prototype.gZ9=function(){return this.Z9}
+Gh.prototype.gQC=function(){return this.QC}
+function XB(){}XB.builtin$cls="XB"
+if(!"name" in XB)XB.name="XB"
+$desc=$collectedClasses.XB
 if($desc instanceof Array)$desc=$desc[1]
-rK.prototype=$desc
+XB.prototype=$desc
 function ly(nL,p4,Z9,QC,iP,Gv,Ip){this.nL=nL
 this.p4=p4
 this.Z9=Z9
@@ -23122,17 +23942,16 @@
 ly.prototype.gp4=function(){return this.p4}
 ly.prototype.gZ9=function(){return this.Z9}
 ly.prototype.gQC=function(){return this.QC}
-function QW(){}QW.builtin$cls="QW"
-if(!"name" in QW)QW.name="QW"
-$desc=$collectedClasses.QW
+function cK(){}cK.builtin$cls="cK"
+if(!"name" in cK)cK.name="cK"
+$desc=$collectedClasses.cK
 if($desc instanceof Array)$desc=$desc[1]
-QW.prototype=$desc
+cK.prototype=$desc
 function O9(Y8){this.Y8=Y8}O9.builtin$cls="O9"
 if(!"name" in O9)O9.name="O9"
 $desc=$collectedClasses.O9
 if($desc instanceof Array)$desc=$desc[1]
 O9.prototype=$desc
-O9.prototype.gY8=function(){return this.Y8}
 function yU(Y8,dB,o7,Bd,Lj,Gv,lz,Ri){this.Y8=Y8
 this.dB=dB
 this.o7=o7
@@ -23204,11 +24023,11 @@
 DS.prototype=$desc
 DS.prototype.gkc=function(receiver){return this.kc}
 DS.prototype.gI4=function(){return this.I4}
-function yR(){}yR.builtin$cls="yR"
-if(!"name" in yR)yR.name="yR"
-$desc=$collectedClasses.yR
+function dp(){}dp.builtin$cls="dp"
+if(!"name" in dp)dp.name="dp"
+$desc=$collectedClasses.dp
 if($desc instanceof Array)$desc=$desc[1]
-yR.prototype=$desc
+dp.prototype=$desc
 function B3(){}B3.builtin$cls="B3"
 if(!"name" in B3)B3.name="B3"
 $desc=$collectedClasses.B3
@@ -23227,13 +24046,13 @@
 $desc=$collectedClasses.ny
 if($desc instanceof Array)$desc=$desc[1]
 ny.prototype=$desc
-function v1(a,b,c){this.a=a
+function dR(a,b,c){this.a=a
 this.b=b
-this.c=c}v1.builtin$cls="v1"
-if(!"name" in v1)v1.name="v1"
-$desc=$collectedClasses.v1
+this.c=c}dR.builtin$cls="dR"
+if(!"name" in dR)dR.name="dR"
+$desc=$collectedClasses.dR
 if($desc instanceof Array)$desc=$desc[1]
-v1.prototype=$desc
+dR.prototype=$desc
 function uR(a,b){this.a=a
 this.b=b}uR.builtin$cls="uR"
 if(!"name" in uR)uR.name="uR"
@@ -23251,20 +24070,6 @@
 $desc=$collectedClasses.YR
 if($desc instanceof Array)$desc=$desc[1]
 YR.prototype=$desc
-function eO(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}eO.builtin$cls="eO"
-$desc=$collectedClasses.eO
-if($desc instanceof Array)$desc=$desc[1]
-eO.prototype=$desc
-function Dw(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}Dw.builtin$cls="Dw"
-$desc=$collectedClasses.Dw
-if($desc instanceof Array)$desc=$desc[1]
-Dw.prototype=$desc
 function fB(UY,hG,dB,o7,Bd,Lj,Gv,lz,Ri){this.UY=UY
 this.hG=hG
 this.dB=dB
@@ -23278,8 +24083,14 @@
 $desc=$collectedClasses.fB
 if($desc instanceof Array)$desc=$desc[1]
 fB.prototype=$desc
-fB.prototype.ghG=function(){return this.hG}
-function nO(me,Sb){this.me=me
+function eO(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}eO.builtin$cls="eO"
+$desc=$collectedClasses.eO
+if($desc instanceof Array)$desc=$desc[1]
+eO.prototype=$desc
+function nO(qs,Sb){this.qs=qs
 this.Sb=Sb}nO.builtin$cls="nO"
 if(!"name" in nO)nO.name="nO"
 $desc=$collectedClasses.nO
@@ -23291,6 +24102,12 @@
 $desc=$collectedClasses.t3
 if($desc instanceof Array)$desc=$desc[1]
 t3.prototype=$desc
+function dq(Em,Sb){this.Em=Em
+this.Sb=Sb}dq.builtin$cls="dq"
+if(!"name" in dq)dq.name="dq"
+$desc=$collectedClasses.dq
+if($desc instanceof Array)$desc=$desc[1]
+dq.prototype=$desc
 function dX(){}dX.builtin$cls="dX"
 if(!"name" in dX)dX.name="dX"
 $desc=$collectedClasses.dX
@@ -23301,7 +24118,7 @@
 $desc=$collectedClasses.aY
 if($desc instanceof Array)$desc=$desc[1]
 aY.prototype=$desc
-function yQ(E2,cP,vo,eo,Ka,Xp,fb,rb,Vd,Zq,rF,JS,iq){this.E2=E2
+function wJ(E2,cP,vo,eo,Ka,Xp,fb,rb,Zq,rF,JS,iq){this.E2=E2
 this.cP=cP
 this.vo=vo
 this.eo=eo
@@ -23309,27 +24126,25 @@
 this.Xp=Xp
 this.fb=fb
 this.rb=rb
-this.Vd=Vd
 this.Zq=Zq
 this.rF=rF
 this.JS=JS
-this.iq=iq}yQ.builtin$cls="yQ"
-if(!"name" in yQ)yQ.name="yQ"
-$desc=$collectedClasses.yQ
+this.iq=iq}wJ.builtin$cls="wJ"
+if(!"name" in wJ)wJ.name="wJ"
+$desc=$collectedClasses.wJ
 if($desc instanceof Array)$desc=$desc[1]
-yQ.prototype=$desc
-yQ.prototype.gE2=function(){return this.E2}
-yQ.prototype.gcP=function(){return this.cP}
-yQ.prototype.gvo=function(){return this.vo}
-yQ.prototype.geo=function(){return this.eo}
-yQ.prototype.gKa=function(){return this.Ka}
-yQ.prototype.gXp=function(){return this.Xp}
-yQ.prototype.gfb=function(){return this.fb}
-yQ.prototype.grb=function(){return this.rb}
-yQ.prototype.gVd=function(){return this.Vd}
-yQ.prototype.gZq=function(){return this.Zq}
-yQ.prototype.gJS=function(receiver){return this.JS}
-yQ.prototype.giq=function(){return this.iq}
+wJ.prototype=$desc
+wJ.prototype.gE2=function(){return this.E2}
+wJ.prototype.gcP=function(){return this.cP}
+wJ.prototype.gvo=function(){return this.vo}
+wJ.prototype.geo=function(){return this.eo}
+wJ.prototype.gKa=function(){return this.Ka}
+wJ.prototype.gXp=function(){return this.Xp}
+wJ.prototype.gfb=function(){return this.fb}
+wJ.prototype.grb=function(){return this.rb}
+wJ.prototype.gZq=function(){return this.Zq}
+wJ.prototype.gJS=function(receiver){return this.JS}
+wJ.prototype.giq=function(){return this.iq}
 function e4(){}e4.builtin$cls="e4"
 if(!"name" in e4)e4.name="e4"
 $desc=$collectedClasses.e4
@@ -23345,20 +24160,6 @@
 $desc=$collectedClasses.Id
 if($desc instanceof Array)$desc=$desc[1]
 Id.prototype=$desc
-function cP(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}cP.builtin$cls="cP"
-$desc=$collectedClasses.cP
-if($desc instanceof Array)$desc=$desc[1]
-cP.prototype=$desc
-function SV(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}SV.builtin$cls="SV"
-$desc=$collectedClasses.SV
-if($desc instanceof Array)$desc=$desc[1]
-SV.prototype=$desc
 function fZ(){}fZ.builtin$cls="fZ"
 if(!"name" in fZ)fZ.name="fZ"
 $desc=$collectedClasses.fZ
@@ -23370,12 +24171,12 @@
 $desc=$collectedClasses.TF
 if($desc instanceof Array)$desc=$desc[1]
 TF.prototype=$desc
-function K5(c,d){this.c=c
-this.d=d}K5.builtin$cls="K5"
-if(!"name" in K5)K5.name="K5"
-$desc=$collectedClasses.K5
+function Xz(c,d){this.c=c
+this.d=d}Xz.builtin$cls="Xz"
+if(!"name" in Xz)Xz.name="Xz"
+$desc=$collectedClasses.Xz
 if($desc instanceof Array)$desc=$desc[1]
-K5.prototype=$desc
+Xz.prototype=$desc
 function Cg(a,b){this.a=a
 this.b=b}Cg.builtin$cls="Cg"
 if(!"name" in Cg)Cg.name="Cg"
@@ -23397,13 +24198,6 @@
 uo.prototype=$desc
 uo.prototype.geT=function(receiver){return this.eT}
 uo.prototype.gtp=function(){return this.tp}
-function bq(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}bq.builtin$cls="bq"
-$desc=$collectedClasses.bq
-if($desc instanceof Array)$desc=$desc[1]
-bq.prototype=$desc
 function pK(a,b){this.a=a
 this.b=b}pK.builtin$cls="pK"
 if(!"name" in pK)pK.name="pK"
@@ -23426,12 +24220,12 @@
 $desc=$collectedClasses.W5
 if($desc instanceof Array)$desc=$desc[1]
 W5.prototype=$desc
-function MA(){}MA.builtin$cls="MA"
-if(!"name" in MA)MA.name="MA"
-$desc=$collectedClasses.MA
+function R8(){}R8.builtin$cls="R8"
+if(!"name" in R8)R8.name="R8"
+$desc=$collectedClasses.R8
 if($desc instanceof Array)$desc=$desc[1]
-MA.prototype=$desc
-function k6(hr,vv,OX,OB,aw){this.hr=hr
+R8.prototype=$desc
+function k6(X5,vv,OX,OB,aw){this.X5=X5
 this.vv=vv
 this.OX=OX
 this.OB=OB
@@ -23451,10 +24245,10 @@
 $desc=$collectedClasses.ce
 if($desc instanceof Array)$desc=$desc[1]
 ce.prototype=$desc
-function o2(m6,Q6,zx,hr,vv,OX,OB,aw){this.m6=m6
+function o2(m6,Q6,bR,X5,vv,OX,OB,aw){this.m6=m6
 this.Q6=Q6
-this.zx=zx
-this.hr=hr
+this.bR=bR
+this.X5=X5
 this.vv=vv
 this.OX=OX
 this.OB=OB
@@ -23473,15 +24267,15 @@
 $desc=$collectedClasses.fG
 if($desc instanceof Array)$desc=$desc[1]
 fG.prototype=$desc
-function nm(Fb,aw,zi,fD){this.Fb=Fb
+function EQ(Fb,aw,zi,fD){this.Fb=Fb
 this.aw=aw
 this.zi=zi
-this.fD=fD}nm.builtin$cls="nm"
-if(!"name" in nm)nm.name="nm"
-$desc=$collectedClasses.nm
+this.fD=fD}EQ.builtin$cls="EQ"
+if(!"name" in EQ)EQ.name="EQ"
+$desc=$collectedClasses.EQ
 if($desc instanceof Array)$desc=$desc[1]
-nm.prototype=$desc
-function YB(hr,vv,OX,OB,H9,lX,zN){this.hr=hr
+EQ.prototype=$desc
+function YB(X5,vv,OX,OB,H9,lX,zN){this.X5=X5
 this.vv=vv
 this.OX=OX
 this.OB=OB
@@ -23508,7 +24302,7 @@
 $desc=$collectedClasses.S9
 if($desc instanceof Array)$desc=$desc[1]
 S9.prototype=$desc
-function ey(hr,vv,OX,OB,H9,lX,zN){this.hr=hr
+function ey(X5,vv,OX,OB,H9,lX,zN){this.X5=X5
 this.vv=vv
 this.OX=OX
 this.OB=OB
@@ -23519,10 +24313,10 @@
 $desc=$collectedClasses.ey
 if($desc instanceof Array)$desc=$desc[1]
 ey.prototype=$desc
-function xd(m6,Q6,zx,hr,vv,OX,OB,H9,lX,zN){this.m6=m6
+function xd(m6,Q6,bR,X5,vv,OX,OB,H9,lX,zN){this.m6=m6
 this.Q6=Q6
-this.zx=zx
-this.hr=hr
+this.bR=bR
+this.X5=X5
 this.vv=vv
 this.OX=OX
 this.OB=OB
@@ -23538,8 +24332,8 @@
 $desc=$collectedClasses.v6
 if($desc instanceof Array)$desc=$desc[1]
 v6.prototype=$desc
-function db(kh,cA,DG,zQ){this.kh=kh
-this.cA=cA
+function db(kh,S4,DG,zQ){this.kh=kh
+this.S4=S4
 this.DG=DG
 this.zQ=zQ}db.builtin$cls="db"
 if(!"name" in db)db.name="db"
@@ -23547,17 +24341,17 @@
 if($desc instanceof Array)$desc=$desc[1]
 db.prototype=$desc
 db.prototype.gkh=function(){return this.kh}
-db.prototype.gcA=function(){return this.cA}
-db.prototype.scA=function(v){return this.cA=v}
+db.prototype.gS4=function(){return this.S4}
+db.prototype.sS4=function(v){return this.S4=v}
 db.prototype.gDG=function(){return this.DG}
 db.prototype.sDG=function(v){return this.DG=v}
 db.prototype.gzQ=function(){return this.zQ}
 db.prototype.szQ=function(v){return this.zQ=v}
-function Tz(Fb){this.Fb=Fb}Tz.builtin$cls="Tz"
-if(!"name" in Tz)Tz.name="Tz"
-$desc=$collectedClasses.Tz
+function Cm(Fb){this.Fb=Fb}Cm.builtin$cls="Cm"
+if(!"name" in Cm)Cm.name="Cm"
+$desc=$collectedClasses.Cm
 if($desc instanceof Array)$desc=$desc[1]
-Tz.prototype=$desc
+Cm.prototype=$desc
 function N6(Fb,zN,zq,fD){this.Fb=Fb
 this.zN=zN
 this.zq=zq
@@ -23571,7 +24365,7 @@
 $desc=$collectedClasses.jg
 if($desc instanceof Array)$desc=$desc[1]
 jg.prototype=$desc
-function YO(hr,vv,OX,OB,DM){this.hr=hr
+function YO(X5,vv,OX,OB,DM){this.X5=X5
 this.vv=vv
 this.OX=OX
 this.OB=OB
@@ -23588,7 +24382,7 @@
 $desc=$collectedClasses.oz
 if($desc instanceof Array)$desc=$desc[1]
 oz.prototype=$desc
-function b6(hr,vv,OX,OB,H9,lX,zN){this.hr=hr
+function b6(X5,vv,OX,OB,H9,lX,zN){this.X5=X5
 this.vv=vv
 this.OX=OX
 this.OB=OB
@@ -23629,21 +24423,11 @@
 $desc=$collectedClasses.u3
 if($desc instanceof Array)$desc=$desc[1]
 u3.prototype=$desc
-function mk(){}mk.builtin$cls="mk"
-if(!"name" in mk)mk.name="mk"
-$desc=$collectedClasses.mk
-if($desc instanceof Array)$desc=$desc[1]
-mk.prototype=$desc
 function mW(){}mW.builtin$cls="mW"
 if(!"name" in mW)mW.name="mW"
 $desc=$collectedClasses.mW
 if($desc instanceof Array)$desc=$desc[1]
 mW.prototype=$desc
-function n0(){}n0.builtin$cls="n0"
-if(!"name" in n0)n0.name="n0"
-$desc=$collectedClasses.n0
-if($desc instanceof Array)$desc=$desc[1]
-n0.prototype=$desc
 function ar(){}ar.builtin$cls="ar"
 if(!"name" in ar)ar.name="ar"
 $desc=$collectedClasses.ar
@@ -23654,12 +24438,12 @@
 $desc=$collectedClasses.lD
 if($desc instanceof Array)$desc=$desc[1]
 lD.prototype=$desc
-function ZQ(a,b){this.a=a
-this.b=b}ZQ.builtin$cls="ZQ"
-if(!"name" in ZQ)ZQ.name="ZQ"
-$desc=$collectedClasses.ZQ
+function W0(a,b){this.a=a
+this.b=b}W0.builtin$cls="W0"
+if(!"name" in W0)W0.name="W0"
+$desc=$collectedClasses.W0
 if($desc instanceof Array)$desc=$desc[1]
-ZQ.prototype=$desc
+W0.prototype=$desc
 function Sw(v5,av,HV,qT){this.v5=v5
 this.av=av
 this.HV=HV
@@ -23677,20 +24461,20 @@
 $desc=$collectedClasses.o0
 if($desc instanceof Array)$desc=$desc[1]
 o0.prototype=$desc
-function a1(G3,Bb,ip){this.G3=G3
+function a1(G3,Bb,T8){this.G3=G3
 this.Bb=Bb
-this.ip=ip}a1.builtin$cls="a1"
+this.T8=T8}a1.builtin$cls="a1"
 if(!"name" in a1)a1.name="a1"
 $desc=$collectedClasses.a1
 if($desc instanceof Array)$desc=$desc[1]
 a1.prototype=$desc
 a1.prototype.gG3=function(receiver){return this.G3}
 a1.prototype.gBb=function(receiver){return this.Bb}
-a1.prototype.gip=function(receiver){return this.ip}
-function jp(P,G3,Bb,ip){this.P=P
+a1.prototype.gT8=function(receiver){return this.T8}
+function jp(P,G3,Bb,T8){this.P=P
 this.G3=G3
 this.Bb=Bb
-this.ip=ip}jp.builtin$cls="jp"
+this.T8=T8}jp.builtin$cls="jp"
 if(!"name" in jp)jp.name="jp"
 $desc=$collectedClasses.jp
 if($desc instanceof Array)$desc=$desc[1]
@@ -23702,8 +24486,8 @@
 $desc=$collectedClasses.Xt
 if($desc instanceof Array)$desc=$desc[1]
 Xt.prototype=$desc
-function Ba(Cw,zx,aY,iW,J0,qT,bb){this.Cw=Cw
-this.zx=zx
+function Ba(Cw,bR,aY,iW,J0,qT,bb){this.Cw=Cw
+this.bR=bR
 this.aY=aY
 this.iW=iW
 this.J0=J0
@@ -23725,11 +24509,11 @@
 $desc=$collectedClasses.LD
 if($desc instanceof Array)$desc=$desc[1]
 LD.prototype=$desc
-function pi(){}pi.builtin$cls="pi"
-if(!"name" in pi)pi.name="pi"
-$desc=$collectedClasses.pi
+function YI(){}YI.builtin$cls="YI"
+if(!"name" in YI)YI.name="YI"
+$desc=$collectedClasses.YI
 if($desc instanceof Array)$desc=$desc[1]
-pi.prototype=$desc
+YI.prototype=$desc
 function OG(Dn){this.Dn=Dn}OG.builtin$cls="OG"
 if(!"name" in OG)OG.name="OG"
 $desc=$collectedClasses.OG
@@ -23758,20 +24542,20 @@
 $desc=$collectedClasses.ZM
 if($desc instanceof Array)$desc=$desc[1]
 ZM.prototype=$desc
-function Iy(Dn,Ln,qT,bb,ya){this.Dn=Dn
+function HW(Dn,Ln,qT,bb,ya){this.Dn=Dn
 this.Ln=Ln
 this.qT=qT
 this.bb=bb
-this.ya=ya}Iy.builtin$cls="Iy"
-if(!"name" in Iy)Iy.name="Iy"
-$desc=$collectedClasses.Iy
+this.ya=ya}HW.builtin$cls="HW"
+if(!"name" in HW)HW.name="HW"
+$desc=$collectedClasses.HW
 if($desc instanceof Array)$desc=$desc[1]
-Iy.prototype=$desc
-function CM(){}CM.builtin$cls="CM"
-if(!"name" in CM)CM.name="CM"
-$desc=$collectedClasses.CM
+HW.prototype=$desc
+function JC(){}JC.builtin$cls="JC"
+if(!"name" in JC)JC.name="JC"
+$desc=$collectedClasses.JC
 if($desc instanceof Array)$desc=$desc[1]
-CM.prototype=$desc
+JC.prototype=$desc
 function f1(a){this.a=a}f1.builtin$cls="f1"
 if(!"name" in f1)f1.name="f1"
 $desc=$collectedClasses.f1
@@ -23792,51 +24576,21 @@
 $desc=$collectedClasses.ob
 if($desc instanceof Array)$desc=$desc[1]
 ob.prototype=$desc
-function Ud(Ct,FN){this.Ct=Ct
-this.FN=FN}Ud.builtin$cls="Ud"
-if(!"name" in Ud)Ud.name="Ud"
-$desc=$collectedClasses.Ud
-if($desc instanceof Array)$desc=$desc[1]
-Ud.prototype=$desc
-function K8(Ct,FN){this.Ct=Ct
-this.FN=FN}K8.builtin$cls="K8"
-if(!"name" in K8)K8.name="K8"
-$desc=$collectedClasses.K8
-if($desc instanceof Array)$desc=$desc[1]
-K8.prototype=$desc
 function by(){}by.builtin$cls="by"
 if(!"name" in by)by.name="by"
 $desc=$collectedClasses.by
 if($desc instanceof Array)$desc=$desc[1]
 by.prototype=$desc
-function ct(uD){this.uD=uD}ct.builtin$cls="ct"
-if(!"name" in ct)ct.name="ct"
-$desc=$collectedClasses.ct
+function QM(N5){this.N5=N5}QM.builtin$cls="QM"
+if(!"name" in QM)QM.name="QM"
+$desc=$collectedClasses.QM
 if($desc instanceof Array)$desc=$desc[1]
-ct.prototype=$desc
-function Mx(N5){this.N5=N5}Mx.builtin$cls="Mx"
-if(!"name" in Mx)Mx.name="Mx"
-$desc=$collectedClasses.Mx
+QM.prototype=$desc
+function z0(lH){this.lH=lH}z0.builtin$cls="z0"
+if(!"name" in z0)z0.name="z0"
+$desc=$collectedClasses.z0
 if($desc instanceof Array)$desc=$desc[1]
-Mx.prototype=$desc
-function Sh(WE,Mw,JN){this.WE=WE
-this.Mw=Mw
-this.JN=JN}Sh.builtin$cls="Sh"
-if(!"name" in Sh)Sh.name="Sh"
-$desc=$collectedClasses.Sh
-if($desc instanceof Array)$desc=$desc[1]
-Sh.prototype=$desc
-function IH(a,b){this.a=a
-this.b=b}IH.builtin$cls="IH"
-if(!"name" in IH)IH.name="IH"
-$desc=$collectedClasses.IH
-if($desc instanceof Array)$desc=$desc[1]
-IH.prototype=$desc
-function u5(lH){this.lH=lH}u5.builtin$cls="u5"
-if(!"name" in u5)u5.name="u5"
-$desc=$collectedClasses.u5
-if($desc instanceof Array)$desc=$desc[1]
-u5.prototype=$desc
+z0.prototype=$desc
 function Vx(){}Vx.builtin$cls="Vx"
 if(!"name" in Vx)Vx.name="Vx"
 $desc=$collectedClasses.Vx
@@ -23849,21 +24603,6 @@
 $desc=$collectedClasses.Rw
 if($desc instanceof Array)$desc=$desc[1]
 Rw.prototype=$desc
-function GY(lH){this.lH=lH}GY.builtin$cls="GY"
-if(!"name" in GY)GY.name="GY"
-$desc=$collectedClasses.GY
-if($desc instanceof Array)$desc=$desc[1]
-GY.prototype=$desc
-function jZ(lH,aS,rU,nt,iU,VN){this.lH=lH
-this.aS=aS
-this.rU=rU
-this.nt=nt
-this.iU=iU
-this.VN=VN}jZ.builtin$cls="jZ"
-if(!"name" in jZ)jZ.name="jZ"
-$desc=$collectedClasses.jZ
-if($desc instanceof Array)$desc=$desc[1]
-jZ.prototype=$desc
 function h0(a){this.a=a}h0.builtin$cls="h0"
 if(!"name" in h0)h0.name="h0"
 $desc=$collectedClasses.h0
@@ -23874,11 +24613,11 @@
 $desc=$collectedClasses.CL
 if($desc instanceof Array)$desc=$desc[1]
 CL.prototype=$desc
-function uA(OF){this.OF=OF}uA.builtin$cls="uA"
-if(!"name" in uA)uA.name="uA"
-$desc=$collectedClasses.uA
+function K8(OF){this.OF=OF}K8.builtin$cls="K8"
+if(!"name" in K8)K8.name="K8"
+$desc=$collectedClasses.K8
 if($desc instanceof Array)$desc=$desc[1]
-uA.prototype=$desc
+K8.prototype=$desc
 function a2(){}a2.builtin$cls="a2"
 if(!"name" in a2)a2.name="a2"
 $desc=$collectedClasses.a2
@@ -23889,13 +24628,13 @@
 $desc=$collectedClasses.fR
 if($desc instanceof Array)$desc=$desc[1]
 fR.prototype=$desc
-function iP(y3,aL){this.y3=y3
+function iP(rq,aL){this.rq=rq
 this.aL=aL}iP.builtin$cls="iP"
 if(!"name" in iP)iP.name="iP"
 $desc=$collectedClasses.iP
 if($desc instanceof Array)$desc=$desc[1]
 iP.prototype=$desc
-iP.prototype.gy3=function(){return this.y3}
+iP.prototype.grq=function(){return this.rq}
 function MF(){}MF.builtin$cls="MF"
 if(!"name" in MF)MF.name="MF"
 $desc=$collectedClasses.MF
@@ -24028,16 +24767,16 @@
 $desc=$collectedClasses.cX
 if($desc instanceof Array)$desc=$desc[1]
 cX.prototype=$desc
-function Yl(){}Yl.builtin$cls="Yl"
-if(!"name" in Yl)Yl.name="Yl"
-$desc=$collectedClasses.Yl
+function Fl(){}Fl.builtin$cls="Fl"
+if(!"name" in Fl)Fl.name="Fl"
+$desc=$collectedClasses.Fl
 if($desc instanceof Array)$desc=$desc[1]
-Yl.prototype=$desc
-function Z0(){}Z0.builtin$cls="Z0"
-if(!"name" in Z0)Z0.name="Z0"
-$desc=$collectedClasses.Z0
+Fl.prototype=$desc
+function L8(){}L8.builtin$cls="L8"
+if(!"name" in L8)L8.name="L8"
+$desc=$collectedClasses.L8
 if($desc instanceof Array)$desc=$desc[1]
-Z0.prototype=$desc
+L8.prototype=$desc
 function c8(){}c8.builtin$cls="c8"
 if(!"name" in c8)c8.name="c8"
 $desc=$collectedClasses.c8
@@ -24082,11 +24821,11 @@
 $desc=$collectedClasses.uq
 if($desc instanceof Array)$desc=$desc[1]
 uq.prototype=$desc
-function iD(NN,HC,r0,Fi,ku,tP,BJ,MS,yW){this.NN=NN
+function iD(NN,HC,r0,Fi,iV,tP,BJ,MS,yW){this.NN=NN
 this.HC=HC
 this.r0=r0
 this.Fi=Fi
-this.ku=ku
+this.iV=iV
 this.tP=tP
 this.BJ=BJ
 this.MS=MS
@@ -24149,11 +24888,11 @@
 $desc=$collectedClasses.Lk
 if($desc instanceof Array)$desc=$desc[1]
 Lk.prototype=$desc
-function ud(){}ud.builtin$cls="ud"
-if(!"name" in ud)ud.name="ud"
-$desc=$collectedClasses.ud
+function XZ(){}XZ.builtin$cls="XZ"
+if(!"name" in XZ)XZ.name="XZ"
+$desc=$collectedClasses.XZ
 if($desc instanceof Array)$desc=$desc[1]
-ud.prototype=$desc
+XZ.prototype=$desc
 function hQ(){}hQ.builtin$cls="hQ"
 if(!"name" in hQ)hQ.name="hQ"
 $desc=$collectedClasses.hQ
@@ -24195,32 +24934,22 @@
 $desc=$collectedClasses.BV
 if($desc instanceof Array)$desc=$desc[1]
 BV.prototype=$desc
-function id(){}id.builtin$cls="id"
-if(!"name" in id)id.name="id"
-$desc=$collectedClasses.id
+function E1(){}E1.builtin$cls="E1"
+if(!"name" in E1)E1.name="E1"
+$desc=$collectedClasses.E1
 if($desc instanceof Array)$desc=$desc[1]
-id.prototype=$desc
-function yo(){}yo.builtin$cls="yo"
-if(!"name" in yo)yo.name="yo"
-$desc=$collectedClasses.yo
-if($desc instanceof Array)$desc=$desc[1]
-yo.prototype=$desc
-function ec(){}ec.builtin$cls="ec"
-if(!"name" in ec)ec.name="ec"
-$desc=$collectedClasses.ec
-if($desc instanceof Array)$desc=$desc[1]
-ec.prototype=$desc
+E1.prototype=$desc
 function wz(Sn,Sc){this.Sn=Sn
 this.Sc=Sc}wz.builtin$cls="wz"
 if(!"name" in wz)wz.name="wz"
 $desc=$collectedClasses.wz
 if($desc instanceof Array)$desc=$desc[1]
 wz.prototype=$desc
-function Lc(){}Lc.builtin$cls="Lc"
-if(!"name" in Lc)Lc.name="Lc"
-$desc=$collectedClasses.Lc
+function B1(){}B1.builtin$cls="B1"
+if(!"name" in B1)B1.name="B1"
+$desc=$collectedClasses.B1
 if($desc instanceof Array)$desc=$desc[1]
-Lc.prototype=$desc
+B1.prototype=$desc
 function M5(){}M5.builtin$cls="M5"
 if(!"name" in M5)M5.name="M5"
 $desc=$collectedClasses.M5
@@ -24244,202 +24973,52 @@
 $desc=$collectedClasses.zL
 if($desc instanceof Array)$desc=$desc[1]
 zL.prototype=$desc
-function Gb(){}Gb.builtin$cls="Gb"
-if(!"name" in Gb)Gb.name="Gb"
-$desc=$collectedClasses.Gb
+function ec(){}ec.builtin$cls="ec"
+if(!"name" in ec)ec.name="ec"
+$desc=$collectedClasses.ec
 if($desc instanceof Array)$desc=$desc[1]
-Gb.prototype=$desc
-function xt(){}xt.builtin$cls="xt"
-if(!"name" in xt)xt.name="xt"
-$desc=$collectedClasses.xt
-if($desc instanceof Array)$desc=$desc[1]
-xt.prototype=$desc
-function ecX(){}ecX.builtin$cls="ecX"
-if(!"name" in ecX)ecX.name="ecX"
-$desc=$collectedClasses.ecX
-if($desc instanceof Array)$desc=$desc[1]
-ecX.prototype=$desc
+ec.prototype=$desc
 function Kx(){}Kx.builtin$cls="Kx"
 if(!"name" in Kx)Kx.name="Kx"
 $desc=$collectedClasses.Kx
 if($desc instanceof Array)$desc=$desc[1]
 Kx.prototype=$desc
-function hH(a){this.a=a}hH.builtin$cls="hH"
-if(!"name" in hH)hH.name="hH"
-$desc=$collectedClasses.hH
+function iO(a){this.a=a}iO.builtin$cls="iO"
+if(!"name" in iO)iO.name="iO"
+$desc=$collectedClasses.iO
 if($desc instanceof Array)$desc=$desc[1]
-hH.prototype=$desc
+iO.prototype=$desc
 function bU(b,c){this.b=b
 this.c=c}bU.builtin$cls="bU"
 if(!"name" in bU)bU.name="bU"
 $desc=$collectedClasses.bU
 if($desc instanceof Array)$desc=$desc[1]
 bU.prototype=$desc
-function nj(){}nj.builtin$cls="nj"
-if(!"name" in nj)nj.name="nj"
-$desc=$collectedClasses.nj
-if($desc instanceof Array)$desc=$desc[1]
-nj.prototype=$desc
-function w1p(){}w1p.builtin$cls="w1p"
-if(!"name" in w1p)w1p.name="w1p"
-$desc=$collectedClasses.w1p
-if($desc instanceof Array)$desc=$desc[1]
-w1p.prototype=$desc
 function e7(NL){this.NL=NL}e7.builtin$cls="e7"
 if(!"name" in e7)e7.name="e7"
 $desc=$collectedClasses.e7
 if($desc instanceof Array)$desc=$desc[1]
 e7.prototype=$desc
+function nj(){}nj.builtin$cls="nj"
+if(!"name" in nj)nj.name="nj"
+$desc=$collectedClasses.nj
+if($desc instanceof Array)$desc=$desc[1]
+nj.prototype=$desc
+function rl(){}rl.builtin$cls="rl"
+if(!"name" in rl)rl.name="rl"
+$desc=$collectedClasses.rl
+if($desc instanceof Array)$desc=$desc[1]
+rl.prototype=$desc
 function RAp(){}RAp.builtin$cls="RAp"
 if(!"name" in RAp)RAp.name="RAp"
 $desc=$collectedClasses.RAp
 if($desc instanceof Array)$desc=$desc[1]
 RAp.prototype=$desc
-function kEI(){}kEI.builtin$cls="kEI"
-if(!"name" in kEI)kEI.name="kEI"
-$desc=$collectedClasses.kEI
+function Gb(){}Gb.builtin$cls="Gb"
+if(!"name" in Gb)Gb.name="Gb"
+$desc=$collectedClasses.Gb
 if($desc instanceof Array)$desc=$desc[1]
-kEI.prototype=$desc
-function nNL(){}nNL.builtin$cls="nNL"
-if(!"name" in nNL)nNL.name="nNL"
-$desc=$collectedClasses.nNL
-if($desc instanceof Array)$desc=$desc[1]
-nNL.prototype=$desc
-function x5e(){}x5e.builtin$cls="x5e"
-if(!"name" in x5e)x5e.name="x5e"
-$desc=$collectedClasses.x5e
-if($desc instanceof Array)$desc=$desc[1]
-x5e.prototype=$desc
-function KS(){}KS.builtin$cls="KS"
-if(!"name" in KS)KS.name="KS"
-$desc=$collectedClasses.KS
-if($desc instanceof Array)$desc=$desc[1]
-KS.prototype=$desc
-function bD(){}bD.builtin$cls="bD"
-if(!"name" in bD)bD.name="bD"
-$desc=$collectedClasses.bD
-if($desc instanceof Array)$desc=$desc[1]
-bD.prototype=$desc
-function yoo(){}yoo.builtin$cls="yoo"
-if(!"name" in yoo)yoo.name="yoo"
-$desc=$collectedClasses.yoo
-if($desc instanceof Array)$desc=$desc[1]
-yoo.prototype=$desc
-function HRa(){}HRa.builtin$cls="HRa"
-if(!"name" in HRa)HRa.name="HRa"
-$desc=$collectedClasses.HRa
-if($desc instanceof Array)$desc=$desc[1]
-HRa.prototype=$desc
-function zLC(){}zLC.builtin$cls="zLC"
-if(!"name" in zLC)zLC.name="zLC"
-$desc=$collectedClasses.zLC
-if($desc instanceof Array)$desc=$desc[1]
-zLC.prototype=$desc
-function t7i(){}t7i.builtin$cls="t7i"
-if(!"name" in t7i)t7i.name="t7i"
-$desc=$collectedClasses.t7i
-if($desc instanceof Array)$desc=$desc[1]
-t7i.prototype=$desc
-function t8(){}t8.builtin$cls="t8"
-if(!"name" in t8)t8.name="t8"
-$desc=$collectedClasses.t8
-if($desc instanceof Array)$desc=$desc[1]
-t8.prototype=$desc
-function an(){}an.builtin$cls="an"
-if(!"name" in an)an.name="an"
-$desc=$collectedClasses.an
-if($desc instanceof Array)$desc=$desc[1]
-an.prototype=$desc
-function dxW(){}dxW.builtin$cls="dxW"
-if(!"name" in dxW)dxW.name="dxW"
-$desc=$collectedClasses.dxW
-if($desc instanceof Array)$desc=$desc[1]
-dxW.prototype=$desc
-function rrb(){}rrb.builtin$cls="rrb"
-if(!"name" in rrb)rrb.name="rrb"
-$desc=$collectedClasses.rrb
-if($desc instanceof Array)$desc=$desc[1]
-rrb.prototype=$desc
-function hmZ(){}hmZ.builtin$cls="hmZ"
-if(!"name" in hmZ)hmZ.name="hmZ"
-$desc=$collectedClasses.hmZ
-if($desc instanceof Array)$desc=$desc[1]
-hmZ.prototype=$desc
-function rla(){}rla.builtin$cls="rla"
-if(!"name" in rla)rla.name="rla"
-$desc=$collectedClasses.rla
-if($desc instanceof Array)$desc=$desc[1]
-rla.prototype=$desc
-function xth(){}xth.builtin$cls="xth"
-if(!"name" in xth)xth.name="xth"
-$desc=$collectedClasses.xth
-if($desc instanceof Array)$desc=$desc[1]
-xth.prototype=$desc
-function Gba(){}Gba.builtin$cls="Gba"
-if(!"name" in Gba)Gba.name="Gba"
-$desc=$collectedClasses.Gba
-if($desc instanceof Array)$desc=$desc[1]
-Gba.prototype=$desc
-function hw(){}hw.builtin$cls="hw"
-if(!"name" in hw)hw.name="hw"
-$desc=$collectedClasses.hw
-if($desc instanceof Array)$desc=$desc[1]
-hw.prototype=$desc
-function ST(){}ST.builtin$cls="ST"
-if(!"name" in ST)ST.name="ST"
-$desc=$collectedClasses.ST
-if($desc instanceof Array)$desc=$desc[1]
-ST.prototype=$desc
-function Ocb(){}Ocb.builtin$cls="Ocb"
-if(!"name" in Ocb)Ocb.name="Ocb"
-$desc=$collectedClasses.Ocb
-if($desc instanceof Array)$desc=$desc[1]
-Ocb.prototype=$desc
-function maa(){}maa.builtin$cls="maa"
-if(!"name" in maa)maa.name="maa"
-$desc=$collectedClasses.maa
-if($desc instanceof Array)$desc=$desc[1]
-maa.prototype=$desc
-function nja(){}nja.builtin$cls="nja"
-if(!"name" in nja)nja.name="nja"
-$desc=$collectedClasses.nja
-if($desc instanceof Array)$desc=$desc[1]
-nja.prototype=$desc
-function e0(){}e0.builtin$cls="e0"
-if(!"name" in e0)e0.name="e0"
-$desc=$collectedClasses.e0
-if($desc instanceof Array)$desc=$desc[1]
-e0.prototype=$desc
-function qba(){}qba.builtin$cls="qba"
-if(!"name" in qba)qba.name="qba"
-$desc=$collectedClasses.qba
-if($desc instanceof Array)$desc=$desc[1]
-qba.prototype=$desc
-function e5(){}e5.builtin$cls="e5"
-if(!"name" in e5)e5.name="e5"
-$desc=$collectedClasses.e5
-if($desc instanceof Array)$desc=$desc[1]
-e5.prototype=$desc
-function R2(){}R2.builtin$cls="R2"
-if(!"name" in R2)R2.name="R2"
-$desc=$collectedClasses.R2
-if($desc instanceof Array)$desc=$desc[1]
-R2.prototype=$desc
-function e6(){}e6.builtin$cls="e6"
-if(!"name" in e6)e6.name="e6"
-$desc=$collectedClasses.e6
-if($desc instanceof Array)$desc=$desc[1]
-e6.prototype=$desc
-function R3(){}R3.builtin$cls="R3"
-if(!"name" in R3)R3.name="R3"
-$desc=$collectedClasses.R3
-if($desc instanceof Array)$desc=$desc[1]
-R3.prototype=$desc
-function e8(){}e8.builtin$cls="e8"
-if(!"name" in e8)e8.name="e8"
-$desc=$collectedClasses.e8
-if($desc instanceof Array)$desc=$desc[1]
-e8.prototype=$desc
+Gb.prototype=$desc
 function cf(){}cf.builtin$cls="cf"
 if(!"name" in cf)cf.name="cf"
 $desc=$collectedClasses.cf
@@ -24486,6 +25065,11 @@
 $desc=$collectedClasses.I4
 if($desc instanceof Array)$desc=$desc[1]
 I4.prototype=$desc
+function e0(Ph){this.Ph=Ph}e0.builtin$cls="e0"
+if(!"name" in e0)e0.name="e0"
+$desc=$collectedClasses.e0
+if($desc instanceof Array)$desc=$desc[1]
+e0.prototype=$desc
 function RO(uv,Ph,Sg){this.uv=uv
 this.Ph=Ph
 this.Sg=Sg}RO.builtin$cls="RO"
@@ -24510,23 +25094,32 @@
 $desc=$collectedClasses.Ea
 if($desc instanceof Array)$desc=$desc[1]
 Ea.prototype=$desc
-function pu(DI,Sg,Ph){this.DI=DI
+function pu(AF,Sg,Ph){this.AF=AF
 this.Sg=Sg
 this.Ph=Ph}pu.builtin$cls="pu"
 if(!"name" in pu)pu.name="pu"
 $desc=$collectedClasses.pu
 if($desc instanceof Array)$desc=$desc[1]
 pu.prototype=$desc
-function iN(a){this.a=a}iN.builtin$cls="iN"
-if(!"name" in iN)iN.name="iN"
-$desc=$collectedClasses.iN
+function i2(a){this.a=a}i2.builtin$cls="i2"
+if(!"name" in i2)i2.name="i2"
+$desc=$collectedClasses.i2
 if($desc instanceof Array)$desc=$desc[1]
-iN.prototype=$desc
-function TX(b){this.b=b}TX.builtin$cls="TX"
-if(!"name" in TX)TX.name="TX"
-$desc=$collectedClasses.TX
+i2.prototype=$desc
+function b0(b){this.b=b}b0.builtin$cls="b0"
+if(!"name" in b0)b0.name="b0"
+$desc=$collectedClasses.b0
 if($desc instanceof Array)$desc=$desc[1]
-TX.prototype=$desc
+b0.prototype=$desc
+function Ov(VP,uv,Ph,u7,Sg){this.VP=VP
+this.uv=uv
+this.Ph=Ph
+this.u7=u7
+this.Sg=Sg}Ov.builtin$cls="Ov"
+if(!"name" in Ov)Ov.name="Ov"
+$desc=$collectedClasses.Ov
+if($desc instanceof Array)$desc=$desc[1]
+Ov.prototype=$desc
 function qO(aV,eM){this.aV=aV
 this.eM=eM}qO.builtin$cls="qO"
 if(!"name" in qO)qO.name="qO"
@@ -24539,25 +25132,11 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function Ov(VP,uv,Ph,u7,Sg){this.VP=VP
-this.uv=uv
-this.Ph=Ph
-this.u7=u7
-this.Sg=Sg}Ov.builtin$cls="Ov"
-if(!"name" in Ov)Ov.name="Ov"
-$desc=$collectedClasses.Ov
+function kG(bG){this.bG=bG}kG.builtin$cls="kG"
+if(!"name" in kG)kG.name="kG"
+$desc=$collectedClasses.kG
 if($desc instanceof Array)$desc=$desc[1]
-Ov.prototype=$desc
-function I2(Ph){this.Ph=Ph}I2.builtin$cls="I2"
-if(!"name" in I2)I2.name="I2"
-$desc=$collectedClasses.I2
-if($desc instanceof Array)$desc=$desc[1]
-I2.prototype=$desc
-function bO(bG){this.bG=bG}bO.builtin$cls="bO"
-if(!"name" in bO)bO.name="bO"
-$desc=$collectedClasses.bO
-if($desc instanceof Array)$desc=$desc[1]
-bO.prototype=$desc
+kG.prototype=$desc
 function Gm(){}Gm.builtin$cls="Gm"
 if(!"name" in Gm)Gm.name="Gm"
 $desc=$collectedClasses.Gm
@@ -24582,7 +25161,7 @@
 $desc=$collectedClasses.dW
 if($desc instanceof Array)$desc=$desc[1]
 dW.prototype=$desc
-function PA(wf){this.wf=wf}PA.builtin$cls="PA"
+function PA(mf){this.mf=mf}PA.builtin$cls="PA"
 if(!"name" in PA)PA.name="PA"
 $desc=$collectedClasses.PA
 if($desc instanceof Array)$desc=$desc[1]
@@ -24592,82 +25171,11 @@
 $desc=$collectedClasses.H2
 if($desc instanceof Array)$desc=$desc[1]
 H2.prototype=$desc
-H2.prototype.gWK=function(){return this.WK}
-function R7(){}R7.builtin$cls="R7"
-if(!"name" in R7)R7.name="R7"
-$desc=$collectedClasses.R7
-if($desc instanceof Array)$desc=$desc[1]
-R7.prototype=$desc
-function e9(){}e9.builtin$cls="e9"
-if(!"name" in e9)e9.name="e9"
-$desc=$collectedClasses.e9
-if($desc instanceof Array)$desc=$desc[1]
-e9.prototype=$desc
-function R9(){}R9.builtin$cls="R9"
-if(!"name" in R9)R9.name="R9"
-$desc=$collectedClasses.R9
-if($desc instanceof Array)$desc=$desc[1]
-R9.prototype=$desc
-function e10(){}e10.builtin$cls="e10"
-if(!"name" in e10)e10.name="e10"
-$desc=$collectedClasses.e10
-if($desc instanceof Array)$desc=$desc[1]
-e10.prototype=$desc
-function R10(){}R10.builtin$cls="R10"
-if(!"name" in R10)R10.name="R10"
-$desc=$collectedClasses.R10
-if($desc instanceof Array)$desc=$desc[1]
-R10.prototype=$desc
-function e11(){}e11.builtin$cls="e11"
-if(!"name" in e11)e11.name="e11"
-$desc=$collectedClasses.e11
-if($desc instanceof Array)$desc=$desc[1]
-e11.prototype=$desc
-function R11(){}R11.builtin$cls="R11"
-if(!"name" in R11)R11.name="R11"
-$desc=$collectedClasses.R11
-if($desc instanceof Array)$desc=$desc[1]
-R11.prototype=$desc
-function e12(){}e12.builtin$cls="e12"
-if(!"name" in e12)e12.name="e12"
-$desc=$collectedClasses.e12
-if($desc instanceof Array)$desc=$desc[1]
-e12.prototype=$desc
 function O7(CE){this.CE=CE}O7.builtin$cls="O7"
 if(!"name" in O7)O7.name="O7"
 $desc=$collectedClasses.O7
 if($desc instanceof Array)$desc=$desc[1]
 O7.prototype=$desc
-function R12(){}R12.builtin$cls="R12"
-if(!"name" in R12)R12.name="R12"
-$desc=$collectedClasses.R12
-if($desc instanceof Array)$desc=$desc[1]
-R12.prototype=$desc
-function e13(){}e13.builtin$cls="e13"
-if(!"name" in e13)e13.name="e13"
-$desc=$collectedClasses.e13
-if($desc instanceof Array)$desc=$desc[1]
-e13.prototype=$desc
-function R13(){}R13.builtin$cls="R13"
-if(!"name" in R13)R13.name="R13"
-$desc=$collectedClasses.R13
-if($desc instanceof Array)$desc=$desc[1]
-R13.prototype=$desc
-function e14(){}e14.builtin$cls="e14"
-if(!"name" in e14)e14.name="e14"
-$desc=$collectedClasses.e14
-if($desc instanceof Array)$desc=$desc[1]
-e14.prototype=$desc
-function R14(){}R14.builtin$cls="R14"
-if(!"name" in R14)R14.name="R14"
-$desc=$collectedClasses.R14
-if($desc instanceof Array)$desc=$desc[1]
-R14.prototype=$desc
-function e15(){}e15.builtin$cls="e15"
-if(!"name" in e15)e15.name="e15"
-$desc=$collectedClasses.e15
-if($desc instanceof Array)$desc=$desc[1]
-e15.prototype=$desc
 function HI(){}HI.builtin$cls="HI"
 if(!"name" in HI)HI.name="HI"
 $desc=$collectedClasses.HI
@@ -24678,16 +25186,21 @@
 $desc=$collectedClasses.E4
 if($desc instanceof Array)$desc=$desc[1]
 E4.prototype=$desc
-function ZG(a){this.a=a}ZG.builtin$cls="ZG"
-if(!"name" in ZG)ZG.name="ZG"
-$desc=$collectedClasses.ZG
-if($desc instanceof Array)$desc=$desc[1]
-ZG.prototype=$desc
 function r7(eh){this.eh=eh}r7.builtin$cls="r7"
 if(!"name" in r7)r7.name="r7"
 $desc=$collectedClasses.r7
 if($desc instanceof Array)$desc=$desc[1]
 r7.prototype=$desc
+function Tz(eh){this.eh=eh}Tz.builtin$cls="Tz"
+if(!"name" in Tz)Tz.name="Tz"
+$desc=$collectedClasses.Tz
+if($desc instanceof Array)$desc=$desc[1]
+Tz.prototype=$desc
+function Wk(){}Wk.builtin$cls="Wk"
+if(!"name" in Wk)Wk.name="Wk"
+$desc=$collectedClasses.Wk
+if($desc instanceof Array)$desc=$desc[1]
+Wk.prototype=$desc
 function DV(){}DV.builtin$cls="DV"
 if(!"name" in DV)DV.name="DV"
 $desc=$collectedClasses.DV
@@ -24698,53 +25211,56 @@
 $desc=$collectedClasses.Hp
 if($desc instanceof Array)$desc=$desc[1]
 Hp.prototype=$desc
-function U7(){}U7.builtin$cls="U7"
-if(!"name" in U7)U7.name="U7"
-$desc=$collectedClasses.U7
+function Nz(){}Nz.builtin$cls="Nz"
+if(!"name" in Nz)Nz.name="Nz"
+$desc=$collectedClasses.Nz
 if($desc instanceof Array)$desc=$desc[1]
-U7.prototype=$desc
-function vr(){}vr.builtin$cls="vr"
-if(!"name" in vr)vr.name="vr"
-$desc=$collectedClasses.vr
+Nz.prototype=$desc
+function Jd(){}Jd.builtin$cls="Jd"
+if(!"name" in Jd)Jd.name="Jd"
+$desc=$collectedClasses.Jd
 if($desc instanceof Array)$desc=$desc[1]
-vr.prototype=$desc
-function HD(){}HD.builtin$cls="HD"
-if(!"name" in HD)HD.name="HD"
-$desc=$collectedClasses.HD
+Jd.prototype=$desc
+function QS(){}QS.builtin$cls="QS"
+if(!"name" in QS)QS.name="QS"
+$desc=$collectedClasses.QS
 if($desc instanceof Array)$desc=$desc[1]
-HD.prototype=$desc
-function tn(Bb,G6,R,fg){this.Bb=Bb
-this.G6=G6
-this.R=R
-this.fg=fg}tn.builtin$cls="tn"
-if(!"name" in tn)tn.name="tn"
-$desc=$collectedClasses.tn
-if($desc instanceof Array)$desc=$desc[1]
-tn.prototype=$desc
-tn.prototype.gBb=function(receiver){return this.Bb}
-tn.prototype.gG6=function(receiver){return this.G6}
-tn.prototype.gR=function(receiver){return this.R}
-tn.prototype.gfg=function(receiver){return this.fg}
+QS.prototype=$desc
 function QF(){}QF.builtin$cls="QF"
 if(!"name" in QF)QF.name="QF"
 $desc=$collectedClasses.QF
 if($desc instanceof Array)$desc=$desc[1]
 QF.prototype=$desc
-function VL(){}VL.builtin$cls="VL"
-if(!"name" in VL)VL.name="VL"
-$desc=$collectedClasses.VL
+function NL(){}NL.builtin$cls="NL"
+if(!"name" in NL)NL.name="NL"
+$desc=$collectedClasses.NL
 if($desc instanceof Array)$desc=$desc[1]
-VL.prototype=$desc
+NL.prototype=$desc
+function vr(){}vr.builtin$cls="vr"
+if(!"name" in vr)vr.name="vr"
+$desc=$collectedClasses.vr
+if($desc instanceof Array)$desc=$desc[1]
+vr.prototype=$desc
 function D4(){}D4.builtin$cls="D4"
 if(!"name" in D4)D4.name="D4"
 $desc=$collectedClasses.D4
 if($desc instanceof Array)$desc=$desc[1]
 D4.prototype=$desc
+function X9(){}X9.builtin$cls="X9"
+if(!"name" in X9)X9.name="X9"
+$desc=$collectedClasses.X9
+if($desc instanceof Array)$desc=$desc[1]
+X9.prototype=$desc
 function Ms(){}Ms.builtin$cls="Ms"
 if(!"name" in Ms)Ms.name="Ms"
 $desc=$collectedClasses.Ms
 if($desc instanceof Array)$desc=$desc[1]
 Ms.prototype=$desc
+function Fw(){}Fw.builtin$cls="Fw"
+if(!"name" in Fw)Fw.name="Fw"
+$desc=$collectedClasses.Fw
+if($desc instanceof Array)$desc=$desc[1]
+Fw.prototype=$desc
 function RS(){}RS.builtin$cls="RS"
 if(!"name" in RS)RS.name="RS"
 $desc=$collectedClasses.RS
@@ -24760,14 +25276,14 @@
 $desc=$collectedClasses.Ys
 if($desc instanceof Array)$desc=$desc[1]
 Ys.prototype=$desc
-function WS(o9,m2,nV,V3){this.o9=o9
+function vg(c1,m2,nV,V3){this.c1=c1
 this.m2=m2
 this.nV=nV
-this.V3=V3}WS.builtin$cls="WS"
-if(!"name" in WS)WS.name="WS"
-$desc=$collectedClasses.WS
+this.V3=V3}vg.builtin$cls="vg"
+if(!"name" in vg)vg.name="vg"
+$desc=$collectedClasses.vg
 if($desc instanceof Array)$desc=$desc[1]
-WS.prototype=$desc
+vg.prototype=$desc
 function xG(){}xG.builtin$cls="xG"
 if(!"name" in xG)xG.name="xG"
 $desc=$collectedClasses.xG
@@ -24798,66 +25314,66 @@
 $desc=$collectedClasses.ZK
 if($desc instanceof Array)$desc=$desc[1]
 ZK.prototype=$desc
-function KB(){}KB.builtin$cls="KB"
-if(!"name" in KB)KB.name="KB"
-$desc=$collectedClasses.KB
+function Th(){}Th.builtin$cls="Th"
+if(!"name" in Th)Th.name="Th"
+$desc=$collectedClasses.Th
 if($desc instanceof Array)$desc=$desc[1]
-KB.prototype=$desc
-function nb(){}nb.builtin$cls="nb"
-if(!"name" in nb)nb.name="nb"
-$desc=$collectedClasses.nb
-if($desc instanceof Array)$desc=$desc[1]
-nb.prototype=$desc
-function Rb(){}Rb.builtin$cls="Rb"
-if(!"name" in Rb)Rb.name="Rb"
-$desc=$collectedClasses.Rb
-if($desc instanceof Array)$desc=$desc[1]
-Rb.prototype=$desc
+Th.prototype=$desc
 function Vju(){}Vju.builtin$cls="Vju"
 if(!"name" in Vju)Vju.name="Vju"
 $desc=$collectedClasses.Vju
 if($desc instanceof Array)$desc=$desc[1]
 Vju.prototype=$desc
-function xGn(){}xGn.builtin$cls="xGn"
-if(!"name" in xGn)xGn.name="xGn"
-$desc=$collectedClasses.xGn
+function KB(){}KB.builtin$cls="KB"
+if(!"name" in KB)KB.name="KB"
+$desc=$collectedClasses.KB
 if($desc instanceof Array)$desc=$desc[1]
-xGn.prototype=$desc
+KB.prototype=$desc
 function RKu(){}RKu.builtin$cls="RKu"
 if(!"name" in RKu)RKu.name="RKu"
 $desc=$collectedClasses.RKu
 if($desc instanceof Array)$desc=$desc[1]
 RKu.prototype=$desc
-function VWk(){}VWk.builtin$cls="VWk"
-if(!"name" in VWk)VWk.name="VWk"
-$desc=$collectedClasses.VWk
+function na(){}na.builtin$cls="na"
+if(!"name" in na)na.name="na"
+$desc=$collectedClasses.na
 if($desc instanceof Array)$desc=$desc[1]
-VWk.prototype=$desc
+na.prototype=$desc
 function TkQ(){}TkQ.builtin$cls="TkQ"
 if(!"name" in TkQ)TkQ.name="TkQ"
 $desc=$collectedClasses.TkQ
 if($desc instanceof Array)$desc=$desc[1]
 TkQ.prototype=$desc
-function DHb(){}DHb.builtin$cls="DHb"
-if(!"name" in DHb)DHb.name="DHb"
-$desc=$collectedClasses.DHb
+function xGn(){}xGn.builtin$cls="xGn"
+if(!"name" in xGn)xGn.name="xGn"
+$desc=$collectedClasses.xGn
 if($desc instanceof Array)$desc=$desc[1]
-DHb.prototype=$desc
+xGn.prototype=$desc
 function ZKG(){}ZKG.builtin$cls="ZKG"
 if(!"name" in ZKG)ZKG.name="ZKG"
 $desc=$collectedClasses.ZKG
 if($desc instanceof Array)$desc=$desc[1]
 ZKG.prototype=$desc
-function Hna(){}Hna.builtin$cls="Hna"
-if(!"name" in Hna)Hna.name="Hna"
-$desc=$collectedClasses.Hna
+function VWk(){}VWk.builtin$cls="VWk"
+if(!"name" in VWk)VWk.name="VWk"
+$desc=$collectedClasses.VWk
 if($desc instanceof Array)$desc=$desc[1]
-Hna.prototype=$desc
+VWk.prototype=$desc
 function w6W(){}w6W.builtin$cls="w6W"
 if(!"name" in w6W)w6W.name="w6W"
 $desc=$collectedClasses.w6W
 if($desc instanceof Array)$desc=$desc[1]
 w6W.prototype=$desc
+function DHb(){}DHb.builtin$cls="DHb"
+if(!"name" in DHb)DHb.name="DHb"
+$desc=$collectedClasses.DHb
+if($desc instanceof Array)$desc=$desc[1]
+DHb.prototype=$desc
+function z9g(){}z9g.builtin$cls="z9g"
+if(!"name" in z9g)z9g.name="z9g"
+$desc=$collectedClasses.z9g
+if($desc instanceof Array)$desc=$desc[1]
+z9g.prototype=$desc
 function G8(){}G8.builtin$cls="G8"
 if(!"name" in G8)G8.name="G8"
 $desc=$collectedClasses.G8
@@ -24868,14 +25384,14 @@
 $desc=$collectedClasses.UZ
 if($desc instanceof Array)$desc=$desc[1]
 UZ.prototype=$desc
-function Fv(FT,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.FT=FT
-this.jH=jH
-this.Wd=Wd
+function Fv(FT,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.FT=FT
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -24892,19 +25408,20 @@
 Fv.prototype.gFT.$reflectable=1
 Fv.prototype.sFT=function(receiver,v){return receiver.FT=v}
 Fv.prototype.sFT.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+function WZ(){}WZ.builtin$cls="WZ"
+if(!"name" in WZ)WZ.name="WZ"
+$desc=$collectedClasses.WZ
 if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
-function Ir(Py,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Py=Py
-this.jH=jH
-this.Wd=Wd
+WZ.prototype=$desc
+function I3(Py,hO,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Py=Py
+this.hO=hO
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -24912,28 +25429,32 @@
 this.Vk=Vk
 this.Ye=Ye
 this.mT=mT
-this.KM=KM}Ir.builtin$cls="Ir"
-if(!"name" in Ir)Ir.name="Ir"
-$desc=$collectedClasses.Ir
+this.KM=KM}I3.builtin$cls="I3"
+if(!"name" in I3)I3.name="I3"
+$desc=$collectedClasses.I3
 if($desc instanceof Array)$desc=$desc[1]
-Ir.prototype=$desc
-Ir.prototype.gPy=function(receiver){return receiver.Py}
-Ir.prototype.gPy.$reflectable=1
-Ir.prototype.sPy=function(receiver,v){return receiver.Py=v}
-Ir.prototype.sPy.$reflectable=1
-function wa(){}wa.builtin$cls="wa"
-if(!"name" in wa)wa.name="wa"
-$desc=$collectedClasses.wa
+I3.prototype=$desc
+I3.prototype.gPy=function(receiver){return receiver.Py}
+I3.prototype.gPy.$reflectable=1
+I3.prototype.sPy=function(receiver,v){return receiver.Py=v}
+I3.prototype.sPy.$reflectable=1
+I3.prototype.ghO=function(receiver){return receiver.hO}
+I3.prototype.ghO.$reflectable=1
+I3.prototype.shO=function(receiver,v){return receiver.hO=v}
+I3.prototype.shO.$reflectable=1
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-wa.prototype=$desc
-function Gk(OL,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.OL=OL
-this.jH=jH
-this.Wd=Wd
+pv.prototype=$desc
+function Gk(vt,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.vt=vt
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -24946,23 +25467,23 @@
 $desc=$collectedClasses.Gk
 if($desc instanceof Array)$desc=$desc[1]
 Gk.prototype=$desc
-Gk.prototype.gOL=function(receiver){return receiver.OL}
-Gk.prototype.gOL.$reflectable=1
-Gk.prototype.sOL=function(receiver,v){return receiver.OL=v}
-Gk.prototype.sOL.$reflectable=1
+Gk.prototype.gvt=function(receiver){return receiver.vt}
+Gk.prototype.gvt.$reflectable=1
+Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
+Gk.prototype.svt.$reflectable=1
 function Vfx(){}Vfx.builtin$cls="Vfx"
 if(!"name" in Vfx)Vfx.name="Vfx"
 $desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
 Vfx.prototype=$desc
-function Ds(jr,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.jr=jr
-this.jH=jH
-this.Wd=Wd
+function Ds(ql,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.ql=ql
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -24975,10 +25496,10 @@
 $desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
 Ds.prototype=$desc
-Ds.prototype.gjr=function(receiver){return receiver.jr}
-Ds.prototype.gjr.$reflectable=1
-Ds.prototype.sjr=function(receiver,v){return receiver.jr=v}
-Ds.prototype.sjr.$reflectable=1
+Ds.prototype.gql=function(receiver){return receiver.ql}
+Ds.prototype.gql.$reflectable=1
+Ds.prototype.sql=function(receiver,v){return receiver.ql=v}
+Ds.prototype.sql.$reflectable=1
 function Dsd(){}Dsd.builtin$cls="Dsd"
 if(!"name" in Dsd)Dsd.name="Dsd"
 $desc=$collectedClasses.Dsd
@@ -25018,11 +25539,11 @@
 $desc=$collectedClasses.GE
 if($desc instanceof Array)$desc=$desc[1]
 GE.prototype=$desc
-function u7(tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+function u7(tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25035,15 +25556,15 @@
 $desc=$collectedClasses.u7
 if($desc instanceof Array)$desc=$desc[1]
 u7.prototype=$desc
-function St(Pw,i0,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Pw=Pw
+function St(Pw,i0,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Pw=Pw
 this.i0=i0
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25069,15 +25590,15 @@
 $desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
 tuj.prototype=$desc
-function vj(eb,kf,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.eb=eb
+function vj(eb,kf,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.eb=eb
 this.kf=kf
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25103,14 +25624,14 @@
 $desc=$collectedClasses.Vct
 if($desc instanceof Array)$desc=$desc[1]
 Vct.prototype=$desc
-function CX(iI,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.iI=iI
-this.jH=jH
-this.Wd=Wd
+function CX(iI,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.iI=iI
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25145,11 +25666,11 @@
 TJ.prototype.goc=function(receiver){return this.oc}
 TJ.prototype.geT=function(receiver){return this.eT}
 TJ.prototype.gCj=function(receiver){return this.Cj}
-function aO(a){this.a=a}aO.builtin$cls="aO"
-if(!"name" in aO)aO.name="aO"
-$desc=$collectedClasses.aO
+function dG(a){this.a=a}dG.builtin$cls="dG"
+if(!"name" in dG)dG.name="dG"
+$desc=$collectedClasses.dG
 if($desc instanceof Array)$desc=$desc[1]
-aO.prototype=$desc
+dG.prototype=$desc
 function Ng(oc,P){this.oc=oc
 this.P=P}Ng.builtin$cls="Ng"
 if(!"name" in Ng)Ng.name="Ng"
@@ -25173,12 +25694,12 @@
 HV.prototype.gG1=function(receiver){return this.G1}
 HV.prototype.gkc=function(receiver){return this.kc}
 HV.prototype.gI4=function(){return this.I4}
-function Nh(Gj,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Gj=Gj
+function Nh(XB,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.XB=XB
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25191,10 +25712,10 @@
 $desc=$collectedClasses.Nh
 if($desc instanceof Array)$desc=$desc[1]
 Nh.prototype=$desc
-Nh.prototype.gGj=function(receiver){return receiver.Gj}
-Nh.prototype.gGj.$reflectable=1
-Nh.prototype.sGj=function(receiver,v){return receiver.Gj=v}
-Nh.prototype.sGj.$reflectable=1
+Nh.prototype.gXB=function(receiver){return receiver.XB}
+Nh.prototype.gXB.$reflectable=1
+Nh.prototype.sXB=function(receiver,v){return receiver.XB=v}
+Nh.prototype.sXB.$reflectable=1
 function fA(T9,Jt){this.T9=T9
 this.Jt=Jt}fA.builtin$cls="fA"
 if(!"name" in fA)fA.name="fA"
@@ -25206,27 +25727,27 @@
 $desc=$collectedClasses.tz
 if($desc instanceof Array)$desc=$desc[1]
 tz.prototype=$desc
-function bW(oc){this.oc=oc}bW.builtin$cls="bW"
-if(!"name" in bW)bW.name="bW"
-$desc=$collectedClasses.bW
+function jR(oc){this.oc=oc}jR.builtin$cls="jR"
+if(!"name" in jR)jR.name="jR"
+$desc=$collectedClasses.jR
 if($desc instanceof Array)$desc=$desc[1]
-bW.prototype=$desc
-bW.prototype.goc=function(receiver){return this.oc}
+jR.prototype=$desc
+jR.prototype.goc=function(receiver){return this.oc}
 function PO(){}PO.builtin$cls="PO"
 if(!"name" in PO)PO.name="PO"
 $desc=$collectedClasses.PO
 if($desc instanceof Array)$desc=$desc[1]
 PO.prototype=$desc
-function oB(){}oB.builtin$cls="oB"
-if(!"name" in oB)oB.name="oB"
-$desc=$collectedClasses.oB
+function c5(){}c5.builtin$cls="c5"
+if(!"name" in c5)c5.name="c5"
+$desc=$collectedClasses.c5
 if($desc instanceof Array)$desc=$desc[1]
-oB.prototype=$desc
-function ih(tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+c5.prototype=$desc
+function ih(tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25239,11 +25760,11 @@
 $desc=$collectedClasses.ih
 if($desc instanceof Array)$desc=$desc[1]
 ih.prototype=$desc
-function mL(Z6,lw,nI,jH,Wd){this.Z6=Z6
+function mL(Z6,lw,nI,VJ,Ai){this.Z6=Z6
 this.lw=lw
 this.nI=nI
-this.jH=jH
-this.Wd=Wd}mL.builtin$cls="mL"
+this.VJ=VJ
+this.Ai=Ai}mL.builtin$cls="mL"
 if(!"name" in mL)mL.name="mL"
 $desc=$collectedClasses.mL
 if($desc instanceof Array)$desc=$desc[1]
@@ -25254,10 +25775,10 @@
 mL.prototype.glw.$reflectable=1
 mL.prototype.gnI=function(){return this.nI}
 mL.prototype.gnI.$reflectable=1
-function bv(jO,oc,jH,Wd){this.jO=jO
+function bv(jO,oc,VJ,Ai){this.jO=jO
 this.oc=oc
-this.jH=jH
-this.Wd=Wd}bv.builtin$cls="bv"
+this.VJ=VJ
+this.Ai=Ai}bv.builtin$cls="bv"
 if(!"name" in bv)bv.name="bv"
 $desc=$collectedClasses.bv
 if($desc instanceof Array)$desc=$desc[1]
@@ -25266,10 +25787,10 @@
 bv.prototype.gjO.$reflectable=1
 bv.prototype.goc=function(receiver){return this.oc}
 bv.prototype.goc.$reflectable=1
-function pt(JR,i2,jH,Wd){this.JR=JR
+function pt(JR,i2,VJ,Ai){this.JR=JR
 this.i2=i2
-this.jH=jH
-this.Wd=Wd}pt.builtin$cls="pt"
+this.VJ=VJ
+this.Ai=Ai}pt.builtin$cls="pt"
 if(!"name" in pt)pt.name="pt"
 $desc=$collectedClasses.pt
 if($desc instanceof Array)$desc=$desc[1]
@@ -25293,30 +25814,30 @@
 $desc=$collectedClasses.vY
 if($desc instanceof Array)$desc=$desc[1]
 vY.prototype=$desc
-function zZ(c){this.c=c}zZ.builtin$cls="zZ"
-if(!"name" in zZ)zZ.name="zZ"
-$desc=$collectedClasses.zZ
-if($desc instanceof Array)$desc=$desc[1]
-zZ.prototype=$desc
-function dS(d){this.d=d}dS.builtin$cls="dS"
+function dS(c){this.c=c}dS.builtin$cls="dS"
 if(!"name" in dS)dS.name="dS"
 $desc=$collectedClasses.dS
 if($desc instanceof Array)$desc=$desc[1]
 dS.prototype=$desc
-function yV(JR,IT,jH,Wd){this.JR=JR
+function ZW(d){this.d=d}ZW.builtin$cls="ZW"
+if(!"name" in ZW)ZW.name="ZW"
+$desc=$collectedClasses.ZW
+if($desc instanceof Array)$desc=$desc[1]
+ZW.prototype=$desc
+function dZ(JR,IT,VJ,Ai){this.JR=JR
 this.IT=IT
-this.jH=jH
-this.Wd=Wd}yV.builtin$cls="yV"
-if(!"name" in yV)yV.name="yV"
-$desc=$collectedClasses.yV
+this.VJ=VJ
+this.Ai=Ai}dZ.builtin$cls="dZ"
+if(!"name" in dZ)dZ.name="dZ"
+$desc=$collectedClasses.dZ
 if($desc instanceof Array)$desc=$desc[1]
-yV.prototype=$desc
-yV.prototype.sJR=function(v){return this.JR=v}
-function OH(a){this.a=a}OH.builtin$cls="OH"
-if(!"name" in OH)OH.name="OH"
-$desc=$collectedClasses.OH
+dZ.prototype=$desc
+dZ.prototype.sJR=function(v){return this.JR=v}
+function Qe(a){this.a=a}Qe.builtin$cls="Qe"
+if(!"name" in Qe)Qe.name="Qe"
+$desc=$collectedClasses.Qe
 if($desc instanceof Array)$desc=$desc[1]
-OH.prototype=$desc
+Qe.prototype=$desc
 function Nu(JR,e0){this.JR=JR
 this.e0=e0}Nu.builtin$cls="Nu"
 if(!"name" in Nu)Nu.name="Nu"
@@ -25335,21 +25856,21 @@
 $desc=$collectedClasses.Ha
 if($desc instanceof Array)$desc=$desc[1]
 Ha.prototype=$desc
-function tb(JR,e0,j6,vm,jH,Wd){this.JR=JR
+function jI(JR,e0,oJ,vm,VJ,Ai){this.JR=JR
 this.e0=e0
-this.j6=j6
+this.oJ=oJ
 this.vm=vm
-this.jH=jH
-this.Wd=Wd}tb.builtin$cls="tb"
-if(!"name" in tb)tb.name="tb"
-$desc=$collectedClasses.tb
+this.VJ=VJ
+this.Ai=Ai}jI.builtin$cls="jI"
+if(!"name" in jI)jI.name="jI"
+$desc=$collectedClasses.jI
 if($desc instanceof Array)$desc=$desc[1]
-tb.prototype=$desc
-function F1(tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+jI.prototype=$desc
+function F1(tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25362,11 +25883,11 @@
 $desc=$collectedClasses.F1
 if($desc instanceof Array)$desc=$desc[1]
 F1.prototype=$desc
-function uL(tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+function uL(tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25406,154 +25927,37 @@
 $desc=$collectedClasses.qI
 if($desc instanceof Array)$desc=$desc[1]
 qI.prototype=$desc
+qI.prototype.gWA=function(){return this.WA}
 qI.prototype.goc=function(receiver){return this.oc}
 qI.prototype.gjL=function(receiver){return this.jL}
 qI.prototype.gzZ=function(receiver){return this.zZ}
-function W4(vH,os,Ng){this.vH=vH
-this.os=os
-this.Ng=Ng}W4.builtin$cls="W4"
-if(!"name" in W4)W4.name="W4"
-$desc=$collectedClasses.W4
+function J3(b9,kK,Sv,rk,YX,B6,VJ,Ai){this.b9=b9
+this.kK=kK
+this.Sv=Sv
+this.rk=rk
+this.YX=YX
+this.B6=B6
+this.VJ=VJ
+this.Ai=Ai}J3.builtin$cls="J3"
+if(!"name" in J3)J3.name="J3"
+$desc=$collectedClasses.J3
 if($desc instanceof Array)$desc=$desc[1]
-W4.prototype=$desc
-W4.prototype.gvH=function(receiver){return this.vH}
-W4.prototype.gos=function(){return this.os}
-W4.prototype.gNg=function(){return this.Ng}
-function zF(yZ,j9,MU,X7,vY,jH,Wd){this.yZ=yZ
-this.j9=j9
-this.MU=MU
-this.X7=X7
-this.vY=vY
-this.jH=jH
-this.Wd=Wd}zF.builtin$cls="zF"
-if(!"name" in zF)zF.name="zF"
-$desc=$collectedClasses.zF
+J3.prototype=$desc
+function E5(){}E5.builtin$cls="E5"
+if(!"name" in E5)E5.name="E5"
+$desc=$collectedClasses.E5
 if($desc instanceof Array)$desc=$desc[1]
-zF.prototype=$desc
-function Xa(a,b){this.a=a
-this.b=b}Xa.builtin$cls="Xa"
-if(!"name" in Xa)Xa.name="Xa"
-$desc=$collectedClasses.Xa
-if($desc instanceof Array)$desc=$desc[1]
-Xa.prototype=$desc
-function Mu(){}Mu.builtin$cls="Mu"
-if(!"name" in Mu)Mu.name="Mu"
-$desc=$collectedClasses.Mu
-if($desc instanceof Array)$desc=$desc[1]
-Mu.prototype=$desc
-function vl(){}vl.builtin$cls="vl"
-if(!"name" in vl)vl.name="vl"
-$desc=$collectedClasses.vl
-if($desc instanceof Array)$desc=$desc[1]
-vl.prototype=$desc
-function X6(a,b){this.a=a
-this.b=b}X6.builtin$cls="X6"
-if(!"name" in X6)X6.name="X6"
-$desc=$collectedClasses.X6
-if($desc instanceof Array)$desc=$desc[1]
-X6.prototype=$desc
-function xh(){}xh.builtin$cls="xh"
-if(!"name" in xh)xh.name="xh"
-$desc=$collectedClasses.xh
-if($desc instanceof Array)$desc=$desc[1]
-xh.prototype=$desc
-function Pc(lx,mf,jH,Wd){this.lx=lx
-this.mf=mf
-this.jH=jH
-this.Wd=Wd}Pc.builtin$cls="Pc"
-if(!"name" in Pc)Pc.name="Pc"
-$desc=$collectedClasses.Pc
-if($desc instanceof Array)$desc=$desc[1]
-Pc.prototype=$desc
-function uF(){}uF.builtin$cls="uF"
-if(!"name" in uF)uF.name="uF"
-$desc=$collectedClasses.uF
-if($desc instanceof Array)$desc=$desc[1]
-uF.prototype=$desc
-function HA(G3,jL,zZ,Lv,w5){this.G3=G3
-this.jL=jL
-this.zZ=zZ
-this.Lv=Lv
-this.w5=w5}HA.builtin$cls="HA"
-if(!"name" in HA)HA.name="HA"
-$desc=$collectedClasses.HA
-if($desc instanceof Array)$desc=$desc[1]
-HA.prototype=$desc
-HA.prototype.gG3=function(receiver){return this.G3}
-HA.prototype.gjL=function(receiver){return this.jL}
-HA.prototype.gzZ=function(receiver){return this.zZ}
-function br(oD,jH,Wd){this.oD=oD
-this.jH=jH
-this.Wd=Wd}br.builtin$cls="br"
-if(!"name" in br)br.name="br"
-$desc=$collectedClasses.br
-if($desc instanceof Array)$desc=$desc[1]
-br.prototype=$desc
-function zT(a){this.a=a}zT.builtin$cls="zT"
-if(!"name" in zT)zT.name="zT"
-$desc=$collectedClasses.zT
-if($desc instanceof Array)$desc=$desc[1]
-zT.prototype=$desc
-function WR(ay,TX,oL,MU,Hq,jH,Wd){this.ay=ay
-this.TX=TX
-this.oL=oL
-this.MU=MU
-this.Hq=Hq
-this.jH=jH
-this.Wd=Wd}WR.builtin$cls="WR"
-if(!"name" in WR)WR.name="WR"
-$desc=$collectedClasses.WR
-if($desc instanceof Array)$desc=$desc[1]
-WR.prototype=$desc
-WR.prototype.gay=function(receiver){return this.ay}
-function qL(){}qL.builtin$cls="qL"
-if(!"name" in qL)qL.name="qL"
-$desc=$collectedClasses.qL
-if($desc instanceof Array)$desc=$desc[1]
-qL.prototype=$desc
-function NG(a,b){this.a=a
-this.b=b}NG.builtin$cls="NG"
-if(!"name" in NG)NG.name="NG"
-$desc=$collectedClasses.NG
-if($desc instanceof Array)$desc=$desc[1]
-NG.prototype=$desc
-function C4(a,b,c){this.a=a
-this.b=b
-this.c=c}C4.builtin$cls="C4"
-if(!"name" in C4)C4.name="C4"
-$desc=$collectedClasses.C4
-if($desc instanceof Array)$desc=$desc[1]
-C4.prototype=$desc
-function Kt(){}Kt.builtin$cls="Kt"
-if(!"name" in Kt)Kt.name="Kt"
-$desc=$collectedClasses.Kt
-if($desc instanceof Array)$desc=$desc[1]
-Kt.prototype=$desc
-function hh(){}hh.builtin$cls="hh"
-if(!"name" in hh)hh.name="hh"
-$desc=$collectedClasses.hh
-if($desc instanceof Array)$desc=$desc[1]
-hh.prototype=$desc
-function Md(){}Md.builtin$cls="Md"
-if(!"name" in Md)Md.name="Md"
-$desc=$collectedClasses.Md
-if($desc instanceof Array)$desc=$desc[1]
-Md.prototype=$desc
-function km(a){this.a=a}km.builtin$cls="km"
-if(!"name" in km)km.name="km"
-$desc=$collectedClasses.km
-if($desc instanceof Array)$desc=$desc[1]
-km.prototype=$desc
+E5.prototype=$desc
 function o5(a){this.a=a}o5.builtin$cls="o5"
 if(!"name" in o5)o5.name="o5"
 $desc=$collectedClasses.o5
 if($desc instanceof Array)$desc=$desc[1]
 o5.prototype=$desc
-function jB(a){this.a=a}jB.builtin$cls="jB"
-if(!"name" in jB)jB.name="jB"
-$desc=$collectedClasses.jB
+function b5(a){this.a=a}b5.builtin$cls="b5"
+if(!"name" in b5)b5.name="b5"
+$desc=$collectedClasses.b5
 if($desc instanceof Array)$desc=$desc[1]
-jB.prototype=$desc
+b5.prototype=$desc
 function zI(b){this.b=b}zI.builtin$cls="zI"
 if(!"name" in zI)zI.name="zI"
 $desc=$collectedClasses.zI
@@ -25567,11 +25971,11 @@
 $desc=$collectedClasses.Zb
 if($desc instanceof Array)$desc=$desc[1]
 Zb.prototype=$desc
-function bF(g){this.g=g}bF.builtin$cls="bF"
-if(!"name" in bF)bF.name="bF"
-$desc=$collectedClasses.bF
+function id(g){this.g=g}id.builtin$cls="id"
+if(!"name" in id)id.name="id"
+$desc=$collectedClasses.id
 if($desc instanceof Array)$desc=$desc[1]
-bF.prototype=$desc
+id.prototype=$desc
 function iV(h,i,j,k){this.h=h
 this.i=i
 this.j=j
@@ -25580,29 +25984,144 @@
 $desc=$collectedClasses.iV
 if($desc instanceof Array)$desc=$desc[1]
 iV.prototype=$desc
+function W4(WA,Uj,Il,jr,dM){this.WA=WA
+this.Uj=Uj
+this.Il=Il
+this.jr=jr
+this.dM=dM}W4.builtin$cls="W4"
+if(!"name" in W4)W4.name="W4"
+$desc=$collectedClasses.W4
+if($desc instanceof Array)$desc=$desc[1]
+W4.prototype=$desc
+W4.prototype.gWA=function(){return this.WA}
+W4.prototype.gIl=function(){return this.Il}
+function Fa(){}Fa.builtin$cls="Fa"
+if(!"name" in Fa)Fa.name="Fa"
+$desc=$collectedClasses.Fa
+if($desc instanceof Array)$desc=$desc[1]
+Fa.prototype=$desc
+function ma(){}ma.builtin$cls="ma"
+if(!"name" in ma)ma.name="ma"
+$desc=$collectedClasses.ma
+if($desc instanceof Array)$desc=$desc[1]
+ma.prototype=$desc
+function d3(){}d3.builtin$cls="d3"
+if(!"name" in d3)d3.name="d3"
+$desc=$collectedClasses.d3
+if($desc instanceof Array)$desc=$desc[1]
+d3.prototype=$desc
+function X6(a,b){this.a=a
+this.b=b}X6.builtin$cls="X6"
+if(!"name" in X6)X6.name="X6"
+$desc=$collectedClasses.X6
+if($desc instanceof Array)$desc=$desc[1]
+X6.prototype=$desc
+function xh(){}xh.builtin$cls="xh"
+if(!"name" in xh)xh.name="xh"
+$desc=$collectedClasses.xh
+if($desc instanceof Array)$desc=$desc[1]
+xh.prototype=$desc
+function wn(b3,xg,h3,VJ,Ai){this.b3=b3
+this.xg=xg
+this.h3=h3
+this.VJ=VJ
+this.Ai=Ai}wn.builtin$cls="wn"
+if(!"name" in wn)wn.name="wn"
+$desc=$collectedClasses.wn
+if($desc instanceof Array)$desc=$desc[1]
+wn.prototype=$desc
+function uF(){}uF.builtin$cls="uF"
+if(!"name" in uF)uF.name="uF"
+$desc=$collectedClasses.uF
+if($desc instanceof Array)$desc=$desc[1]
+uF.prototype=$desc
+function cj(a){this.a=a}cj.builtin$cls="cj"
+if(!"name" in cj)cj.name="cj"
+$desc=$collectedClasses.cj
+if($desc instanceof Array)$desc=$desc[1]
+cj.prototype=$desc
+function HA(G3,jL,zZ,JD,dr){this.G3=G3
+this.jL=jL
+this.zZ=zZ
+this.JD=JD
+this.dr=dr}HA.builtin$cls="HA"
+if(!"name" in HA)HA.name="HA"
+$desc=$collectedClasses.HA
+if($desc instanceof Array)$desc=$desc[1]
+HA.prototype=$desc
+HA.prototype.gG3=function(receiver){return this.G3}
+HA.prototype.gjL=function(receiver){return this.jL}
+HA.prototype.gzZ=function(receiver){return this.zZ}
+function br(Zp,VJ,Ai){this.Zp=Zp
+this.VJ=VJ
+this.Ai=Ai}br.builtin$cls="br"
+if(!"name" in br)br.name="br"
+$desc=$collectedClasses.br
+if($desc instanceof Array)$desc=$desc[1]
+br.prototype=$desc
+function zT(a){this.a=a}zT.builtin$cls="zT"
+if(!"name" in zT)zT.name="zT"
+$desc=$collectedClasses.zT
+if($desc instanceof Array)$desc=$desc[1]
+zT.prototype=$desc
+function D7(Ii,YB,BK,kN,cs,cT,VJ,Ai){this.Ii=Ii
+this.YB=YB
+this.BK=BK
+this.kN=kN
+this.cs=cs
+this.cT=cT
+this.VJ=VJ
+this.Ai=Ai}D7.builtin$cls="D7"
+if(!"name" in D7)D7.name="D7"
+$desc=$collectedClasses.D7
+if($desc instanceof Array)$desc=$desc[1]
+D7.prototype=$desc
+D7.prototype.gIi=function(receiver){return this.Ii}
+function qL(){}qL.builtin$cls="qL"
+if(!"name" in qL)qL.name="qL"
+$desc=$collectedClasses.qL
+if($desc instanceof Array)$desc=$desc[1]
+qL.prototype=$desc
+function C4(a,b,c){this.a=a
+this.b=b
+this.c=c}C4.builtin$cls="C4"
+if(!"name" in C4)C4.name="C4"
+$desc=$collectedClasses.C4
+if($desc instanceof Array)$desc=$desc[1]
+C4.prototype=$desc
+function l9(d,e,f){this.d=d
+this.e=e
+this.f=f}l9.builtin$cls="l9"
+if(!"name" in l9)l9.name="l9"
+$desc=$collectedClasses.l9
+if($desc instanceof Array)$desc=$desc[1]
+l9.prototype=$desc
+function lP(){}lP.builtin$cls="lP"
+if(!"name" in lP)lP.name="lP"
+$desc=$collectedClasses.lP
+if($desc instanceof Array)$desc=$desc[1]
+lP.prototype=$desc
+function km(a){this.a=a}km.builtin$cls="km"
+if(!"name" in km)km.name="km"
+$desc=$collectedClasses.km
+if($desc instanceof Array)$desc=$desc[1]
+km.prototype=$desc
 function Qt(){}Qt.builtin$cls="Qt"
 if(!"name" in Qt)Qt.name="Qt"
 $desc=$collectedClasses.Qt
 if($desc instanceof Array)$desc=$desc[1]
 Qt.prototype=$desc
-function Dk(S,YK){this.S=S
-this.YK=YK}Dk.builtin$cls="Dk"
+function Dk(S,SF){this.S=S
+this.SF=SF}Dk.builtin$cls="Dk"
 if(!"name" in Dk)Dk.name="Dk"
 $desc=$collectedClasses.Dk
 if($desc instanceof Array)$desc=$desc[1]
 Dk.prototype=$desc
-function jY(nw,jm,EP,RA){this.nw=nw
-this.jm=jm
-this.EP=EP
-this.RA=RA}jY.builtin$cls="jY"
-$desc=$collectedClasses.jY
+function A0(){}A0.builtin$cls="A0"
+if(!"name" in A0)A0.name="A0"
+$desc=$collectedClasses.A0
 if($desc instanceof Array)$desc=$desc[1]
-jY.prototype=$desc
-function E5(){}E5.builtin$cls="E5"
-if(!"name" in E5)E5.name="E5"
-$desc=$collectedClasses.E5
-if($desc instanceof Array)$desc=$desc[1]
-E5.prototype=$desc
+A0.prototype=$desc
 function rm(){}rm.builtin$cls="rm"
 if(!"name" in rm)rm.name="rm"
 $desc=$collectedClasses.rm
@@ -25613,17 +26132,17 @@
 $desc=$collectedClasses.eY
 if($desc instanceof Array)$desc=$desc[1]
 eY.prototype=$desc
-function MM(TL){this.TL=TL}MM.builtin$cls="MM"
-if(!"name" in MM)MM.name="MM"
-$desc=$collectedClasses.MM
+function OO(TL){this.TL=TL}OO.builtin$cls="OO"
+if(!"name" in OO)OO.name="OO"
+$desc=$collectedClasses.OO
 if($desc instanceof Array)$desc=$desc[1]
-MM.prototype=$desc
-MM.prototype.gTL=function(){return this.TL}
-function BE(oc,mI,DF,nK,AV,TL){this.oc=oc
+OO.prototype=$desc
+OO.prototype.gTL=function(){return this.TL}
+function BE(oc,mI,DF,nK,Ew,TL){this.oc=oc
 this.mI=mI
 this.DF=DF
 this.nK=nK
-this.AV=AV
+this.Ew=Ew
 this.TL=TL}BE.builtin$cls="BE"
 if(!"name" in BE)BE.name="BE"
 $desc=$collectedClasses.BE
@@ -25633,12 +26152,12 @@
 BE.prototype.gmI=function(){return this.mI}
 BE.prototype.gDF=function(){return this.DF}
 BE.prototype.gnK=function(){return this.nK}
-BE.prototype.gAV=function(){return this.AV}
-function Qb(oc,mI,DF,nK,AV,TL){this.oc=oc
+BE.prototype.gEw=function(){return this.Ew}
+function Qb(oc,mI,DF,nK,Ew,TL){this.oc=oc
 this.mI=mI
 this.DF=DF
 this.nK=nK
-this.AV=AV
+this.Ew=Ew
 this.TL=TL}Qb.builtin$cls="Qb"
 if(!"name" in Qb)Qb.name="Qb"
 $desc=$collectedClasses.Qb
@@ -25648,14 +26167,14 @@
 Qb.prototype.gmI=function(){return this.mI}
 Qb.prototype.gDF=function(){return this.DF}
 Qb.prototype.gnK=function(){return this.nK}
-Qb.prototype.gAV=function(){return this.AV}
-function xI(oc,mI,DF,nK,AV,TL,I9){this.oc=oc
+Qb.prototype.gEw=function(){return this.Ew}
+function xI(oc,mI,DF,nK,Ew,TL,qW){this.oc=oc
 this.mI=mI
 this.DF=DF
 this.nK=nK
-this.AV=AV
+this.Ew=Ew
 this.TL=TL
-this.I9=I9}xI.builtin$cls="xI"
+this.qW=qW}xI.builtin$cls="xI"
 if(!"name" in xI)xI.name="xI"
 $desc=$collectedClasses.xI
 if($desc instanceof Array)$desc=$desc[1]
@@ -25664,29 +26183,29 @@
 xI.prototype.gmI=function(){return this.mI}
 xI.prototype.gDF=function(){return this.DF}
 xI.prototype.gnK=function(){return this.nK}
-xI.prototype.gAV=function(){return this.AV}
+xI.prototype.gEw=function(){return this.Ew}
 xI.prototype.gTL=function(){return this.TL}
-function ib(S,YK,aA,yO,Yj){this.S=S
-this.YK=YK
+function q1(S,SF,aA,dY,Yj){this.S=S
+this.SF=SF
 this.aA=aA
-this.yO=yO
-this.Yj=Yj}ib.builtin$cls="ib"
-if(!"name" in ib)ib.name="ib"
-$desc=$collectedClasses.ib
+this.dY=dY
+this.Yj=Yj}q1.builtin$cls="q1"
+if(!"name" in q1)q1.name="q1"
+$desc=$collectedClasses.q1
 if($desc instanceof Array)$desc=$desc[1]
-ib.prototype=$desc
+q1.prototype=$desc
 function Zj(){}Zj.builtin$cls="Zj"
 if(!"name" in Zj)Zj.name="Zj"
 $desc=$collectedClasses.Zj
 if($desc instanceof Array)$desc=$desc[1]
 Zj.prototype=$desc
-function XP(di,P0,ZD,S6,F7,Q0,Bg,n4,pc,SV,EX,mn){this.di=di
+function XP(di,P0,ZD,S6,Dg,Q0,Hs,n4,pc,SV,EX,mn){this.di=di
 this.P0=P0
 this.ZD=ZD
 this.S6=S6
-this.F7=F7
+this.Dg=Dg
 this.Q0=Q0
-this.Bg=Bg
+this.Hs=Hs
 this.n4=n4
 this.pc=pc
 this.SV=SV
@@ -25696,9 +26215,9 @@
 $desc=$collectedClasses.XP
 if($desc instanceof Array)$desc=$desc[1]
 XP.prototype=$desc
-XP.prototype.gF7=function(receiver){return receiver.F7}
+XP.prototype.gDg=function(receiver){return receiver.Dg}
 XP.prototype.gQ0=function(receiver){return receiver.Q0}
-XP.prototype.gBg=function(receiver){return receiver.Bg}
+XP.prototype.gHs=function(receiver){return receiver.Hs}
 XP.prototype.gn4=function(receiver){return receiver.n4}
 XP.prototype.gEX=function(receiver){return receiver.EX}
 function q6(){}q6.builtin$cls="q6"
@@ -25706,41 +26225,36 @@
 $desc=$collectedClasses.q6
 if($desc instanceof Array)$desc=$desc[1]
 q6.prototype=$desc
-function jd(){}jd.builtin$cls="jd"
-if(!"name" in jd)jd.name="jd"
-$desc=$collectedClasses.jd
+function CK(a){this.a=a}CK.builtin$cls="CK"
+if(!"name" in CK)CK.name="CK"
+$desc=$collectedClasses.CK
 if($desc instanceof Array)$desc=$desc[1]
-jd.prototype=$desc
-function HO(a){this.a=a}HO.builtin$cls="HO"
-if(!"name" in HO)HO.name="HO"
-$desc=$collectedClasses.HO
-if($desc instanceof Array)$desc=$desc[1]
-HO.prototype=$desc
+CK.prototype=$desc
 function BO(a){this.a=a}BO.builtin$cls="BO"
 if(!"name" in BO)BO.name="BO"
 $desc=$collectedClasses.BO
 if($desc instanceof Array)$desc=$desc[1]
 BO.prototype=$desc
-function oF(){}oF.builtin$cls="oF"
-if(!"name" in oF)oF.name="oF"
-$desc=$collectedClasses.oF
+function ZG(){}ZG.builtin$cls="ZG"
+if(!"name" in ZG)ZG.name="ZG"
+$desc=$collectedClasses.ZG
 if($desc instanceof Array)$desc=$desc[1]
-oF.prototype=$desc
+ZG.prototype=$desc
 function Oc(a){this.a=a}Oc.builtin$cls="Oc"
 if(!"name" in Oc)Oc.name="Oc"
 $desc=$collectedClasses.Oc
 if($desc instanceof Array)$desc=$desc[1]
 Oc.prototype=$desc
-function fh(a){this.a=a}fh.builtin$cls="fh"
-if(!"name" in fh)fh.name="fh"
-$desc=$collectedClasses.fh
+function MX(a){this.a=a}MX.builtin$cls="MX"
+if(!"name" in MX)MX.name="MX"
+$desc=$collectedClasses.MX
 if($desc instanceof Array)$desc=$desc[1]
-fh.prototype=$desc
-function w9(){}w9.builtin$cls="w9"
-if(!"name" in w9)w9.name="w9"
-$desc=$collectedClasses.w9
+MX.prototype=$desc
+function w12(){}w12.builtin$cls="w12"
+if(!"name" in w12)w12.name="w12"
+$desc=$collectedClasses.w12
 if($desc instanceof Array)$desc=$desc[1]
-w9.prototype=$desc
+w12.prototype=$desc
 function fTP(a){this.a=a}fTP.builtin$cls="fTP"
 if(!"name" in fTP)fTP.name="fTP"
 $desc=$collectedClasses.fTP
@@ -25758,6 +26272,13 @@
 dM.prototype=$desc
 dM.prototype.gKM=function(receiver){return receiver.KM}
 dM.prototype.gKM.$reflectable=1
+function Y7(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}Y7.builtin$cls="Y7"
+$desc=$collectedClasses.Y7
+if($desc instanceof Array)$desc=$desc[1]
+Y7.prototype=$desc
 function WC(a){this.a=a}WC.builtin$cls="WC"
 if(!"name" in WC)WC.name="WC"
 $desc=$collectedClasses.WC
@@ -25798,15 +26319,19 @@
 $desc=$collectedClasses.xf
 if($desc instanceof Array)$desc=$desc[1]
 xf.prototype=$desc
-function bo(a,b,c,d,e){this.a=a
-this.b=b
-this.c=c
-this.d=d
-this.e=e}bo.builtin$cls="bo"
-if(!"name" in bo)bo.name="bo"
-$desc=$collectedClasses.bo
+function L6(a,b){this.a=a
+this.b=b}L6.builtin$cls="L6"
+if(!"name" in L6)L6.name="L6"
+$desc=$collectedClasses.L6
 if($desc instanceof Array)$desc=$desc[1]
-bo.prototype=$desc
+L6.prototype=$desc
+function Rs(c,d,e){this.c=c
+this.d=d
+this.e=e}Rs.builtin$cls="Rs"
+if(!"name" in Rs)Rs.name="Rs"
+$desc=$collectedClasses.Rs
+if($desc instanceof Array)$desc=$desc[1]
+Rs.prototype=$desc
 function uJ(){}uJ.builtin$cls="uJ"
 if(!"name" in uJ)uJ.name="uJ"
 $desc=$collectedClasses.uJ
@@ -25822,22 +26347,22 @@
 $desc=$collectedClasses.Ji
 if($desc instanceof Array)$desc=$desc[1]
 Ji.prototype=$desc
-function Bf(K3,Zu,Po,Ha,N1,lr,ND,B5,eS,ay){this.K3=K3
+function Bf(K3,Zu,Po,Ha,LO,ZY,xS,PB,eS,Ii){this.K3=K3
 this.Zu=Zu
 this.Po=Po
 this.Ha=Ha
-this.N1=N1
-this.lr=lr
-this.ND=ND
-this.B5=B5
+this.LO=LO
+this.ZY=ZY
+this.xS=xS
+this.PB=PB
 this.eS=eS
-this.ay=ay}Bf.builtin$cls="Bf"
+this.Ii=Ii}Bf.builtin$cls="Bf"
 if(!"name" in Bf)Bf.name="Bf"
 $desc=$collectedClasses.Bf
 if($desc instanceof Array)$desc=$desc[1]
 Bf.prototype=$desc
-function ir(jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.jH=jH
-this.Wd=Wd
+function ir(VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -25850,11 +26375,11 @@
 $desc=$collectedClasses.ir
 if($desc instanceof Array)$desc=$desc[1]
 ir.prototype=$desc
-function Sa(KM){this.KM=KM}Sa.builtin$cls="Sa"
-if(!"name" in Sa)Sa.name="Sa"
-$desc=$collectedClasses.Sa
+function Tt(KM){this.KM=KM}Tt.builtin$cls="Tt"
+if(!"name" in Tt)Tt.name="Tt"
+$desc=$collectedClasses.Tt
 if($desc instanceof Array)$desc=$desc[1]
-Sa.prototype=$desc
+Tt.prototype=$desc
 dM.prototype.gKM=function(receiver){return receiver.KM}
 dM.prototype.gKM.$reflectable=1
 function GN(){}GN.builtin$cls="GN"
@@ -25897,16 +26422,16 @@
 $desc=$collectedClasses.pM
 if($desc instanceof Array)$desc=$desc[1]
 pM.prototype=$desc
-function i2(){}i2.builtin$cls="i2"
-if(!"name" in i2)i2.name="i2"
-$desc=$collectedClasses.i2
+function Mh(){}Mh.builtin$cls="Mh"
+if(!"name" in Mh)Mh.name="Mh"
+$desc=$collectedClasses.Mh
 if($desc instanceof Array)$desc=$desc[1]
-i2.prototype=$desc
-function W6(){}W6.builtin$cls="W6"
-if(!"name" in W6)W6.name="W6"
-$desc=$collectedClasses.W6
+Mh.prototype=$desc
+function Md(){}Md.builtin$cls="Md"
+if(!"name" in Md)Md.name="Md"
+$desc=$collectedClasses.Md
 if($desc instanceof Array)$desc=$desc[1]
-W6.prototype=$desc
+Md.prototype=$desc
 function Lf(){}Lf.builtin$cls="Lf"
 if(!"name" in Lf)Lf.name="Lf"
 $desc=$collectedClasses.Lf
@@ -25947,11 +26472,11 @@
 $desc=$collectedClasses.HK
 if($desc instanceof Array)$desc=$desc[1]
 HK.prototype=$desc
-function w10(){}w10.builtin$cls="w10"
-if(!"name" in w10)w10.name="w10"
-$desc=$collectedClasses.w10
+function w13(){}w13.builtin$cls="w13"
+if(!"name" in w13)w13.name="w13"
+$desc=$collectedClasses.w13
 if($desc instanceof Array)$desc=$desc[1]
-w10.prototype=$desc
+w13.prototype=$desc
 function o8(a){this.a=a}o8.builtin$cls="o8"
 if(!"name" in o8)o8.name="o8"
 $desc=$collectedClasses.o8
@@ -25962,17 +26487,36 @@
 $desc=$collectedClasses.GL
 if($desc instanceof Array)$desc=$desc[1]
 GL.prototype=$desc
-function G3(){}G3.builtin$cls="G3"
-if(!"name" in G3)G3.name="G3"
-$desc=$collectedClasses.G3
+function e9(){}e9.builtin$cls="e9"
+if(!"name" in e9)e9.name="e9"
+$desc=$collectedClasses.e9
 if($desc instanceof Array)$desc=$desc[1]
-G3.prototype=$desc
-function mY(qc,jf,Qi,uK,jH,Wd){this.qc=qc
+e9.prototype=$desc
+function Dw(wc,nn,lv,Pp){this.wc=wc
+this.nn=nn
+this.lv=lv
+this.Pp=Pp}Dw.builtin$cls="Dw"
+$desc=$collectedClasses.Dw
+if($desc instanceof Array)$desc=$desc[1]
+Dw.prototype=$desc
+function Xy(a,b,c){this.a=a
+this.b=b
+this.c=c}Xy.builtin$cls="Xy"
+if(!"name" in Xy)Xy.name="Xy"
+$desc=$collectedClasses.Xy
+if($desc instanceof Array)$desc=$desc[1]
+Xy.prototype=$desc
+function uK(a){this.a=a}uK.builtin$cls="uK"
+if(!"name" in uK)uK.name="uK"
+$desc=$collectedClasses.uK
+if($desc instanceof Array)$desc=$desc[1]
+uK.prototype=$desc
+function mY(qc,jf,Qi,uK,VJ,Ai){this.qc=qc
 this.jf=jf
 this.Qi=Qi
 this.uK=uK
-this.jH=jH
-this.Wd=Wd}mY.builtin$cls="mY"
+this.VJ=VJ
+this.Ai=Ai}mY.builtin$cls="mY"
 if(!"name" in mY)mY.name="mY"
 $desc=$collectedClasses.mY
 if($desc instanceof Array)$desc=$desc[1]
@@ -25988,10 +26532,10 @@
 $desc=$collectedClasses.mB
 if($desc instanceof Array)$desc=$desc[1]
 mB.prototype=$desc
-function XF(vq,X7,jH,Wd){this.vq=vq
-this.X7=X7
-this.jH=jH
-this.Wd=Wd}XF.builtin$cls="XF"
+function XF(vq,L1,VJ,Ai){this.vq=vq
+this.L1=L1
+this.VJ=VJ
+this.Ai=Ai}XF.builtin$cls="XF"
 if(!"name" in XF)XF.name="XF"
 $desc=$collectedClasses.XF
 if($desc instanceof Array)$desc=$desc[1]
@@ -26002,16 +26546,6 @@
 $desc=$collectedClasses.iH
 if($desc instanceof Array)$desc=$desc[1]
 iH.prototype=$desc
-function Uf(){}Uf.builtin$cls="Uf"
-if(!"name" in Uf)Uf.name="Uf"
-$desc=$collectedClasses.Uf
-if($desc instanceof Array)$desc=$desc[1]
-Uf.prototype=$desc
-function Ra(){}Ra.builtin$cls="Ra"
-if(!"name" in Ra)Ra.name="Ra"
-$desc=$collectedClasses.Ra
-if($desc instanceof Array)$desc=$desc[1]
-Ra.prototype=$desc
 function wJY(){}wJY.builtin$cls="wJY"
 if(!"name" in wJY)wJY.name="wJY"
 $desc=$collectedClasses.wJY
@@ -26062,16 +26596,6 @@
 $desc=$collectedClasses.w0
 if($desc instanceof Array)$desc=$desc[1]
 w0.prototype=$desc
-function w2(){}w2.builtin$cls="w2"
-if(!"name" in w2)w2.name="w2"
-$desc=$collectedClasses.w2
-if($desc instanceof Array)$desc=$desc[1]
-w2.prototype=$desc
-function w3(){}w3.builtin$cls="w3"
-if(!"name" in w3)w3.name="w3"
-$desc=$collectedClasses.w3
-if($desc instanceof Array)$desc=$desc[1]
-w3.prototype=$desc
 function w4(){}w4.builtin$cls="w4"
 if(!"name" in w4)w4.name="w4"
 $desc=$collectedClasses.w4
@@ -26082,28 +26606,48 @@
 $desc=$collectedClasses.w5
 if($desc instanceof Array)$desc=$desc[1]
 w5.prototype=$desc
+function w7(){}w7.builtin$cls="w7"
+if(!"name" in w7)w7.name="w7"
+$desc=$collectedClasses.w7
+if($desc instanceof Array)$desc=$desc[1]
+w7.prototype=$desc
+function w9(){}w9.builtin$cls="w9"
+if(!"name" in w9)w9.name="w9"
+$desc=$collectedClasses.w9
+if($desc instanceof Array)$desc=$desc[1]
+w9.prototype=$desc
+function w10(){}w10.builtin$cls="w10"
+if(!"name" in w10)w10.name="w10"
+$desc=$collectedClasses.w10
+if($desc instanceof Array)$desc=$desc[1]
+w10.prototype=$desc
+function w11(){}w11.builtin$cls="w11"
+if(!"name" in w11)w11.name="w11"
+$desc=$collectedClasses.w11
+if($desc instanceof Array)$desc=$desc[1]
+w11.prototype=$desc
 function c4(a){this.a=a}c4.builtin$cls="c4"
 if(!"name" in c4)c4.name="c4"
 $desc=$collectedClasses.c4
 if($desc instanceof Array)$desc=$desc[1]
 c4.prototype=$desc
-function z6(eT,k8,pC,AS){this.eT=eT
+function z6(eT,k8,bq,G9){this.eT=eT
 this.k8=k8
-this.pC=pC
-this.AS=AS}z6.builtin$cls="z6"
+this.bq=bq
+this.G9=G9}z6.builtin$cls="z6"
 if(!"name" in z6)z6.name="z6"
 $desc=$collectedClasses.z6
 if($desc instanceof Array)$desc=$desc[1]
 z6.prototype=$desc
 z6.prototype.geT=function(receiver){return this.eT}
-function Ay(qF,Do){this.qF=qF
-this.Do=Do}Ay.builtin$cls="Ay"
+function Ay(bO,Lv){this.bO=bO
+this.Lv=Lv}Ay.builtin$cls="Ay"
 if(!"name" in Ay)Ay.name="Ay"
 $desc=$collectedClasses.Ay
 if($desc instanceof Array)$desc=$desc[1]
 Ay.prototype=$desc
-Ay.prototype.sqF=function(v){return this.qF=v}
-Ay.prototype.gDo=function(){return this.Do}
+Ay.prototype.sbO=function(v){return this.bO=v}
+Ay.prototype.gLv=function(){return this.Lv}
 function Ed(Jd){this.Jd=Jd}Ed.builtin$cls="Ed"
 if(!"name" in Ed)Ed.name="Ed"
 $desc=$collectedClasses.Ed
@@ -26125,30 +26669,30 @@
 $desc=$collectedClasses.Dl
 if($desc instanceof Array)$desc=$desc[1]
 Dl.prototype=$desc
-function DK(t8,qF,Ni,Do,ax){this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}DK.builtin$cls="DK"
-if(!"name" in DK)DK.name="DK"
-$desc=$collectedClasses.DK
+function Wh(KL,bO,tj,Lv,k6){this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}Wh.builtin$cls="Wh"
+if(!"name" in Wh)Wh.name="Wh"
+$desc=$collectedClasses.Wh
 if($desc instanceof Array)$desc=$desc[1]
-DK.prototype=$desc
-function x5(t8,qF,Ni,Do,ax){this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}x5.builtin$cls="x5"
+Wh.prototype=$desc
+function x5(KL,bO,tj,Lv,k6){this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}x5.builtin$cls="x5"
 if(!"name" in x5)x5.name="x5"
 $desc=$collectedClasses.x5
 if($desc instanceof Array)$desc=$desc[1]
 x5.prototype=$desc
-function ev(Pu,t8,qF,Ni,Do,ax){this.Pu=Pu
-this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}ev.builtin$cls="ev"
+function ev(Pu,KL,bO,tj,Lv,k6){this.Pu=Pu
+this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}ev.builtin$cls="ev"
 if(!"name" in ev)ev.name="ev"
 $desc=$collectedClasses.ev
 if($desc instanceof Array)$desc=$desc[1]
@@ -26159,24 +26703,24 @@
 $desc=$collectedClasses.ID
 if($desc instanceof Array)$desc=$desc[1]
 ID.prototype=$desc
-function jV(G3,v4,t8,qF,Ni,Do,ax){this.G3=G3
+function jV(G3,v4,KL,bO,tj,Lv,k6){this.G3=G3
 this.v4=v4
-this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}jV.builtin$cls="jV"
+this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}jV.builtin$cls="jV"
 if(!"name" in jV)jV.name="jV"
 $desc=$collectedClasses.jV
 if($desc instanceof Array)$desc=$desc[1]
 jV.prototype=$desc
 jV.prototype.gG3=function(receiver){return this.G3}
 jV.prototype.gv4=function(){return this.v4}
-function ek(t8,qF,Ni,Do,ax){this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}ek.builtin$cls="ek"
+function ek(KL,bO,tj,Lv,k6){this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}ek.builtin$cls="ek"
 if(!"name" in ek)ek.name="ek"
 $desc=$collectedClasses.ek
 if($desc instanceof Array)$desc=$desc[1]
@@ -26188,42 +26732,42 @@
 $desc=$collectedClasses.OC
 if($desc instanceof Array)$desc=$desc[1]
 OC.prototype=$desc
-function IC(d){this.d=d}IC.builtin$cls="IC"
-if(!"name" in IC)IC.name="IC"
-$desc=$collectedClasses.IC
+function Xm(d){this.d=d}Xm.builtin$cls="Xm"
+if(!"name" in Xm)Xm.name="Xm"
+$desc=$collectedClasses.Xm
 if($desc instanceof Array)$desc=$desc[1]
-IC.prototype=$desc
-function Jy(wz,t8,qF,Ni,Do,ax){this.wz=wz
-this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}Jy.builtin$cls="Jy"
+Xm.prototype=$desc
+function Jy(wz,KL,bO,tj,Lv,k6){this.wz=wz
+this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}Jy.builtin$cls="Jy"
 if(!"name" in Jy)Jy.name="Jy"
 $desc=$collectedClasses.Jy
 if($desc instanceof Array)$desc=$desc[1]
 Jy.prototype=$desc
 Jy.prototype.gwz=function(){return this.wz}
-function ky(Bb,ip,t8,qF,Ni,Do,ax){this.Bb=Bb
-this.ip=ip
-this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}ky.builtin$cls="ky"
+function ky(Bb,T8,KL,bO,tj,Lv,k6){this.Bb=Bb
+this.T8=T8
+this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}ky.builtin$cls="ky"
 if(!"name" in ky)ky.name="ky"
 $desc=$collectedClasses.ky
 if($desc instanceof Array)$desc=$desc[1]
 ky.prototype=$desc
 ky.prototype.gBb=function(receiver){return this.Bb}
-ky.prototype.gip=function(receiver){return this.ip}
-function fa(hP,re,t8,qF,Ni,Do,ax){this.hP=hP
+ky.prototype.gT8=function(receiver){return this.T8}
+function fa(hP,re,KL,bO,tj,Lv,k6){this.hP=hP
 this.re=re
-this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}fa.builtin$cls="fa"
+this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}fa.builtin$cls="fa"
 if(!"name" in fa)fa.name="fa"
 $desc=$collectedClasses.fa
 if($desc instanceof Array)$desc=$desc[1]
@@ -26259,37 +26803,32 @@
 $desc=$collectedClasses.e3
 if($desc instanceof Array)$desc=$desc[1]
 e3.prototype=$desc
-function VA(Bb,ip,t8,qF,Ni,Do,ax){this.Bb=Bb
-this.ip=ip
-this.t8=t8
-this.qF=qF
-this.Ni=Ni
-this.Do=Do
-this.ax=ax}VA.builtin$cls="VA"
+function VA(Bb,T8,KL,bO,tj,Lv,k6){this.Bb=Bb
+this.T8=T8
+this.KL=KL
+this.bO=bO
+this.tj=tj
+this.Lv=Lv
+this.k6=k6}VA.builtin$cls="VA"
 if(!"name" in VA)VA.name="VA"
 $desc=$collectedClasses.VA
 if($desc instanceof Array)$desc=$desc[1]
 VA.prototype=$desc
 VA.prototype.gBb=function(receiver){return this.Bb}
-VA.prototype.gip=function(receiver){return this.ip}
+VA.prototype.gT8=function(receiver){return this.T8}
 function J1(a,b){this.a=a
 this.b=b}J1.builtin$cls="J1"
 if(!"name" in J1)J1.name="J1"
 $desc=$collectedClasses.J1
 if($desc instanceof Array)$desc=$desc[1]
 J1.prototype=$desc
-function JH(){}JH.builtin$cls="JH"
-if(!"name" in JH)JH.name="JH"
-$desc=$collectedClasses.JH
-if($desc instanceof Array)$desc=$desc[1]
-JH.prototype=$desc
-function fk(F5,bm){this.F5=F5
+function fk(kF,bm){this.kF=kF
 this.bm=bm}fk.builtin$cls="fk"
 if(!"name" in fk)fk.name="fk"
 $desc=$collectedClasses.fk
 if($desc instanceof Array)$desc=$desc[1]
 fk.prototype=$desc
-function wL(UR,ex){this.UR=UR
+function wL(lR,ex){this.lR=lR
 this.ex=ex}wL.builtin$cls="wL"
 if(!"name" in wL)wL.name="wL"
 $desc=$collectedClasses.wL
@@ -26306,11 +26845,11 @@
 $desc=$collectedClasses.Fq
 if($desc instanceof Array)$desc=$desc[1]
 Fq.prototype=$desc
-function Af(){}Af.builtin$cls="Af"
-if(!"name" in Af)Af.name="Af"
-$desc=$collectedClasses.Af
+function hw(){}hw.builtin$cls="hw"
+if(!"name" in hw)hw.name="hw"
+$desc=$collectedClasses.hw
 if($desc instanceof Array)$desc=$desc[1]
-Af.prototype=$desc
+hw.prototype=$desc
 function EZ(){}EZ.builtin$cls="EZ"
 if(!"name" in EZ)EZ.name="EZ"
 $desc=$collectedClasses.EZ
@@ -26328,20 +26867,19 @@
 if($desc instanceof Array)$desc=$desc[1]
 kB.prototype=$desc
 kB.prototype.gPu=function(receiver){return this.Pu}
-function dC(G3,v4){this.G3=G3
-this.v4=v4}dC.builtin$cls="dC"
-if(!"name" in dC)dC.name="dC"
-$desc=$collectedClasses.dC
+function ae(G3,v4){this.G3=G3
+this.v4=v4}ae.builtin$cls="ae"
+if(!"name" in ae)ae.name="ae"
+$desc=$collectedClasses.ae
 if($desc instanceof Array)$desc=$desc[1]
-dC.prototype=$desc
-dC.prototype.gG3=function(receiver){return this.G3}
-dC.prototype.gv4=function(){return this.v4}
+ae.prototype=$desc
+ae.prototype.gG3=function(receiver){return this.G3}
+ae.prototype.gv4=function(){return this.v4}
 function Iq(wz){this.wz=wz}Iq.builtin$cls="Iq"
 if(!"name" in Iq)Iq.name="Iq"
 $desc=$collectedClasses.Iq
 if($desc instanceof Array)$desc=$desc[1]
 Iq.prototype=$desc
-Iq.prototype.gwz=function(){return this.wz}
 function w6(P){this.P=P}w6.builtin$cls="w6"
 if(!"name" in w6)w6.name="w6"
 $desc=$collectedClasses.w6
@@ -26356,24 +26894,24 @@
 jK.prototype=$desc
 jK.prototype.gkp=function(receiver){return this.kp}
 jK.prototype.gwz=function(){return this.wz}
-function uk(kp,Bb,ip){this.kp=kp
+function uk(kp,Bb,T8){this.kp=kp
 this.Bb=Bb
-this.ip=ip}uk.builtin$cls="uk"
+this.T8=T8}uk.builtin$cls="uk"
 if(!"name" in uk)uk.name="uk"
 $desc=$collectedClasses.uk
 if($desc instanceof Array)$desc=$desc[1]
 uk.prototype=$desc
 uk.prototype.gkp=function(receiver){return this.kp}
 uk.prototype.gBb=function(receiver){return this.Bb}
-uk.prototype.gip=function(receiver){return this.ip}
-function K9(Bb,ip){this.Bb=Bb
-this.ip=ip}K9.builtin$cls="K9"
+uk.prototype.gT8=function(receiver){return this.T8}
+function K9(Bb,T8){this.Bb=Bb
+this.T8=T8}K9.builtin$cls="K9"
 if(!"name" in K9)K9.name="K9"
 $desc=$collectedClasses.K9
 if($desc instanceof Array)$desc=$desc[1]
 K9.prototype=$desc
 K9.prototype.gBb=function(receiver){return this.Bb}
-K9.prototype.gip=function(receiver){return this.ip}
+K9.prototype.gT8=function(receiver){return this.T8}
 function RW(hP,bP,re){this.hP=hP
 this.bP=bP
 this.re=re}RW.builtin$cls="RW"
@@ -26389,25 +26927,25 @@
 $desc=$collectedClasses.xs
 if($desc instanceof Array)$desc=$desc[1]
 xs.prototype=$desc
-function FX(rp,Yf,mV,V6,NA){this.rp=rp
-this.Yf=Yf
-this.mV=mV
-this.V6=V6
-this.NA=NA}FX.builtin$cls="FX"
+function FX(Sk,Ix,ku,fL,lQ){this.Sk=Sk
+this.Ix=Ix
+this.ku=ku
+this.fL=fL
+this.lQ=lQ}FX.builtin$cls="FX"
 if(!"name" in FX)FX.name="FX"
 $desc=$collectedClasses.FX
 if($desc instanceof Array)$desc=$desc[1]
 FX.prototype=$desc
-function O1(vH,P){this.vH=vH
-this.P=P}O1.builtin$cls="O1"
-if(!"name" in O1)O1.name="O1"
-$desc=$collectedClasses.O1
+function Ae(vH,P){this.vH=vH
+this.P=P}Ae.builtin$cls="Ae"
+if(!"name" in Ae)Ae.name="Ae"
+$desc=$collectedClasses.Ae
 if($desc instanceof Array)$desc=$desc[1]
-O1.prototype=$desc
-O1.prototype.gvH=function(receiver){return this.vH}
-O1.prototype.gvH.$reflectable=1
-O1.prototype.gP=function(receiver){return this.P}
-O1.prototype.gP.$reflectable=1
+Ae.prototype=$desc
+Ae.prototype.gvH=function(receiver){return this.vH}
+Ae.prototype.gvH.$reflectable=1
+Ae.prototype.gP=function(receiver){return this.P}
+Ae.prototype.gP.$reflectable=1
 function Bt(YR){this.YR=YR}Bt.builtin$cls="Bt"
 if(!"name" in Bt)Bt.name="Bt"
 $desc=$collectedClasses.Bt
@@ -26449,16 +26987,16 @@
 $desc=$collectedClasses.fr
 if($desc instanceof Array)$desc=$desc[1]
 fr.prototype=$desc
-function cfS(){}cfS.builtin$cls="cfS"
-if(!"name" in cfS)cfS.name="cfS"
-$desc=$collectedClasses.cfS
+function a0(){}a0.builtin$cls="a0"
+if(!"name" in a0)a0.name="a0"
+$desc=$collectedClasses.a0
 if($desc instanceof Array)$desc=$desc[1]
-cfS.prototype=$desc
-function M9(tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+a0.prototype=$desc
+function NQ(tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.tH=tH
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -26466,19 +27004,19 @@
 this.Vk=Vk
 this.Ye=Ye
 this.mT=mT
-this.KM=KM}M9.builtin$cls="M9"
-if(!"name" in M9)M9.name="M9"
-$desc=$collectedClasses.M9
+this.KM=KM}NQ.builtin$cls="NQ"
+if(!"name" in NQ)NQ.name="NQ"
+$desc=$collectedClasses.NQ
 if($desc instanceof Array)$desc=$desc[1]
-M9.prototype=$desc
-function uw(Qq,jH,Wd,tH,jH,Wd,jH,Wd,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Qq=Qq
-this.jH=jH
-this.Wd=Wd
+NQ.prototype=$desc
+function uw(Qq,VJ,Ai,tH,VJ,Ai,VJ,Ai,ZI,uN,z3,TQ,Vk,Ye,mT,KM){this.Qq=Qq
+this.VJ=VJ
+this.Ai=Ai
 this.tH=tH
-this.jH=jH
-this.Wd=Wd
-this.jH=jH
-this.Wd=Wd
+this.VJ=VJ
+this.Ai=Ai
+this.VJ=VJ
+this.Ai=Ai
 this.ZI=ZI
 this.uN=uN
 this.z3=z3
@@ -26500,45 +27038,45 @@
 $desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
 WZq.prototype=$desc
-function V2(N1,mD,Ck){this.N1=N1
-this.mD=mD
+function V2(N1,bn,Ck){this.N1=N1
+this.bn=bn
 this.Ck=Ck}V2.builtin$cls="V2"
 if(!"name" in V2)V2.name="V2"
 $desc=$collectedClasses.V2
 if($desc instanceof Array)$desc=$desc[1]
 V2.prototype=$desc
-function D8(Y0,N1,lr,ND,B5,eS,ay){this.Y0=Y0
-this.N1=N1
-this.lr=lr
-this.ND=ND
-this.B5=B5
+function D8(Y0,LO,ZY,xS,PB,eS,Ii){this.Y0=Y0
+this.LO=LO
+this.ZY=ZY
+this.xS=xS
+this.PB=PB
 this.eS=eS
-this.ay=ay}D8.builtin$cls="D8"
+this.Ii=Ii}D8.builtin$cls="D8"
 if(!"name" in D8)D8.name="D8"
 $desc=$collectedClasses.D8
 if($desc instanceof Array)$desc=$desc[1]
 D8.prototype=$desc
-function rP(Ca,N1,lr,ND,B5,eS,ay){this.Ca=Ca
-this.N1=N1
-this.lr=lr
-this.ND=ND
-this.B5=B5
+function jY(Ca,LO,ZY,xS,PB,eS,Ii){this.Ca=Ca
+this.LO=LO
+this.ZY=ZY
+this.xS=xS
+this.PB=PB
 this.eS=eS
-this.ay=ay}rP.builtin$cls="rP"
-if(!"name" in rP)rP.name="rP"
-$desc=$collectedClasses.rP
+this.Ii=Ii}jY.builtin$cls="jY"
+if(!"name" in jY)jY.name="jY"
+$desc=$collectedClasses.jY
 if($desc instanceof Array)$desc=$desc[1]
-rP.prototype=$desc
+jY.prototype=$desc
 function ll(){}ll.builtin$cls="ll"
 if(!"name" in ll)ll.name="ll"
 $desc=$collectedClasses.ll
 if($desc instanceof Array)$desc=$desc[1]
 ll.prototype=$desc
-function lP(){}lP.builtin$cls="lP"
-if(!"name" in lP)lP.name="lP"
-$desc=$collectedClasses.lP
+function Uf(){}Uf.builtin$cls="Uf"
+if(!"name" in Uf)Uf.name="Uf"
+$desc=$collectedClasses.Uf
 if($desc instanceof Array)$desc=$desc[1]
-lP.prototype=$desc
+Uf.prototype=$desc
 function ik(a){this.a=a}ik.builtin$cls="ik"
 if(!"name" in ik)ik.name="ik"
 $desc=$collectedClasses.ik
@@ -26549,24 +27087,24 @@
 $desc=$collectedClasses.LfS
 if($desc instanceof Array)$desc=$desc[1]
 LfS.prototype=$desc
-function NP(Ca,N1,lr,ND,B5,eS,ay){this.Ca=Ca
-this.N1=N1
-this.lr=lr
-this.ND=ND
-this.B5=B5
+function NP(Ca,LO,ZY,xS,PB,eS,Ii){this.Ca=Ca
+this.LO=LO
+this.ZY=ZY
+this.xS=xS
+this.PB=PB
 this.eS=eS
-this.ay=ay}NP.builtin$cls="NP"
+this.Ii=Ii}NP.builtin$cls="NP"
 if(!"name" in NP)NP.name="NP"
 $desc=$collectedClasses.NP
 if($desc instanceof Array)$desc=$desc[1]
 NP.prototype=$desc
-function Vh(Ca,N1,lr,ND,B5,eS,ay){this.Ca=Ca
-this.N1=N1
-this.lr=lr
-this.ND=ND
-this.B5=B5
+function Vh(Ca,LO,ZY,xS,PB,eS,Ii){this.Ca=Ca
+this.LO=LO
+this.ZY=ZY
+this.xS=xS
+this.PB=PB
 this.eS=eS
-this.ay=ay}Vh.builtin$cls="Vh"
+this.Ii=Ii}Vh.builtin$cls="Vh"
 if(!"name" in Vh)Vh.name="Vh"
 $desc=$collectedClasses.Vh
 if($desc instanceof Array)$desc=$desc[1]
@@ -26581,13 +27119,13 @@
 $desc=$collectedClasses.jz
 if($desc instanceof Array)$desc=$desc[1]
 jz.prototype=$desc
-function SA(Ca,N1,lr,ND,B5,eS,ay){this.Ca=Ca
-this.N1=N1
-this.lr=lr
-this.ND=ND
-this.B5=B5
+function SA(Ca,LO,ZY,xS,PB,eS,Ii){this.Ca=Ca
+this.LO=LO
+this.ZY=ZY
+this.xS=xS
+this.PB=PB
 this.eS=eS
-this.ay=ay}SA.builtin$cls="SA"
+this.Ii=Ii}SA.builtin$cls="SA"
 if(!"name" in SA)SA.name="SA"
 $desc=$collectedClasses.SA
 if($desc instanceof Array)$desc=$desc[1]
@@ -26604,22 +27142,30 @@
 $desc=$collectedClasses.nv
 if($desc instanceof Array)$desc=$desc[1]
 nv.prototype=$desc
-function ee(N1,mD,Ck){this.N1=N1
-this.mD=mD
+function ee(N1,bn,Ck){this.N1=N1
+this.bn=bn
 this.Ck=Ck}ee.builtin$cls="ee"
 if(!"name" in ee)ee.name="ee"
 $desc=$collectedClasses.ee
 if($desc instanceof Array)$desc=$desc[1]
 ee.prototype=$desc
-function hs(N1,mD,Ck){this.N1=N1
-this.mD=mD
+function XI(Cd,wd,N2,oA){this.Cd=Cd
+this.wd=wd
+this.N2=N2
+this.oA=oA}XI.builtin$cls="XI"
+if(!"name" in XI)XI.name="XI"
+$desc=$collectedClasses.XI
+if($desc instanceof Array)$desc=$desc[1]
+XI.prototype=$desc
+XI.prototype.gCd=function(receiver){return this.Cd}
+function hs(N1,bn,Ck){this.N1=N1
+this.bn=bn
 this.Ck=Ck}hs.builtin$cls="hs"
 if(!"name" in hs)hs.name="hs"
 $desc=$collectedClasses.hs
 if($desc instanceof Array)$desc=$desc[1]
 hs.prototype=$desc
 hs.prototype.gN1=function(){return this.N1}
-hs.prototype.gCk=function(){return this.Ck}
 hs.prototype.sCk=function(v){return this.Ck=v}
 function yp(KO,lC,k8){this.KO=KO
 this.lC=lC
@@ -26628,2212 +27174,187 @@
 $desc=$collectedClasses.yp
 if($desc instanceof Array)$desc=$desc[1]
 yp.prototype=$desc
-function T4(){}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
-if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
-function TR(N1,ay){this.N1=N1
-this.ay=ay}TR.builtin$cls="TR"
-if(!"name" in TR)TR.name="TR"
-$desc=$collectedClasses.TR
-if($desc instanceof Array)$desc=$desc[1]
-TR.prototype=$desc
-TR.prototype.gN1=function(){return this.N1}
-TR.prototype.gay=function(receiver){return this.ay}
-function ug(N1,mD,Ck){this.N1=N1
-this.mD=mD
+function ug(N1,bn,Ck){this.N1=N1
+this.bn=bn
 this.Ck=Ck}ug.builtin$cls="ug"
 if(!"name" in ug)ug.name="ug"
 $desc=$collectedClasses.ug
 if($desc instanceof Array)$desc=$desc[1]
 ug.prototype=$desc
-function DT(lr,xT,CF,Ds,QO,Me,mj,N1,mD,Ck){this.lr=lr
+function DT(lr,xT,kr,Ds,QO,jH,mj,zx,N1,bn,Ck){this.lr=lr
 this.xT=xT
-this.CF=CF
+this.kr=kr
 this.Ds=Ds
 this.QO=QO
-this.Me=Me
+this.jH=jH
 this.mj=mj
+this.zx=zx
 this.N1=N1
-this.mD=mD
+this.bn=bn
 this.Ck=Ck}DT.builtin$cls="DT"
 if(!"name" in DT)DT.name="DT"
 $desc=$collectedClasses.DT
 if($desc instanceof Array)$desc=$desc[1]
 DT.prototype=$desc
 DT.prototype.sxT=function(v){return this.xT=v}
-DT.prototype.gCF=function(){return this.CF}
-DT.prototype.sCF=function(v){return this.CF=v}
+DT.prototype.gkr=function(){return this.kr}
 DT.prototype.sQO=function(v){return this.QO=v}
-DT.prototype.sMe=function(v){return this.Me=v}
+DT.prototype.sjH=function(v){return this.jH=v}
 DT.prototype.smj=function(v){return this.mj=v}
+DT.prototype.gzx=function(){return this.zx}
+DT.prototype.szx=function(v){return this.zx=v}
 function OB(){}OB.builtin$cls="OB"
 if(!"name" in OB)OB.name="OB"
 $desc=$collectedClasses.OB
 if($desc instanceof Array)$desc=$desc[1]
 OB.prototype=$desc
-function w7(){}w7.builtin$cls="w7"
-if(!"name" in w7)w7.name="w7"
-$desc=$collectedClasses.w7
+function Ra(){}Ra.builtin$cls="Ra"
+if(!"name" in Ra)Ra.name="Ra"
+$desc=$collectedClasses.Ra
 if($desc instanceof Array)$desc=$desc[1]
-w7.prototype=$desc
-function N9(ud,N1,lr,ND,B5,eS,ay){this.ud=ud
-this.N1=N1
+Ra.prototype=$desc
+function N9(ud,lr,eS,Ii){this.ud=ud
 this.lr=lr
-this.ND=ND
-this.B5=B5
 this.eS=eS
-this.ay=ay}N9.builtin$cls="N9"
+this.Ii=Ii}N9.builtin$cls="N9"
 if(!"name" in N9)N9.name="N9"
 $desc=$collectedClasses.N9
 if($desc instanceof Array)$desc=$desc[1]
 N9.prototype=$desc
-function NW(a,b){this.a=a
-this.b=b}NW.builtin$cls="NW"
+N9.prototype.gIi=function(receiver){return this.Ii}
+function NW(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}NW.builtin$cls="NW"
 if(!"name" in NW)NW.name="NW"
 $desc=$collectedClasses.NW
 if($desc instanceof Array)$desc=$desc[1]
 NW.prototype=$desc
-function Hh(a){this.a=a}Hh.builtin$cls="Hh"
-if(!"name" in Hh)Hh.name="Hh"
-$desc=$collectedClasses.Hh
+function HS(EJ,bX){this.EJ=EJ
+this.bX=bX}HS.builtin$cls="HS"
+if(!"name" in HS)HS.name="HS"
+$desc=$collectedClasses.HS
 if($desc instanceof Array)$desc=$desc[1]
-Hh.prototype=$desc
-function TG(kU,YC,O4,xG,pq,zJ){this.kU=kU
+HS.prototype=$desc
+HS.prototype.gEJ=function(){return this.EJ}
+function TG(e9,YC,xG,pq,t9,A7,TU,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy){this.e9=e9
 this.YC=YC
-this.O4=O4
 this.xG=xG
 this.pq=pq
-this.zJ=zJ}TG.builtin$cls="TG"
+this.t9=t9
+this.A7=A7
+this.TU=TU
+this.Q3=Q3
+this.JM=JM
+this.d6=d6
+this.rV=rV
+this.yO=yO
+this.XV=XV
+this.eD=eD
+this.FS=FS
+this.IY=IY
+this.U9=U9
+this.DO=DO
+this.Fy=Fy}TG.builtin$cls="TG"
 if(!"name" in TG)TG.name="TG"
 $desc=$collectedClasses.TG
 if($desc instanceof Array)$desc=$desc[1]
 TG.prototype=$desc
-function lE(){}lE.builtin$cls="lE"
-if(!"name" in lE)lE.name="lE"
-$desc=$collectedClasses.lE
+function ts(){}ts.builtin$cls="ts"
+if(!"name" in ts)ts.name="ts"
+$desc=$collectedClasses.ts
 if($desc instanceof Array)$desc=$desc[1]
-lE.prototype=$desc
-function XT(N1,mD,Ck){this.N1=N1
-this.mD=mD
+ts.prototype=$desc
+function Kj(a){this.a=a}Kj.builtin$cls="Kj"
+if(!"name" in Kj)Kj.name="Kj"
+$desc=$collectedClasses.Kj
+if($desc instanceof Array)$desc=$desc[1]
+Kj.prototype=$desc
+function VU(b){this.b=b}VU.builtin$cls="VU"
+if(!"name" in VU)VU.name="VU"
+$desc=$collectedClasses.VU
+if($desc instanceof Array)$desc=$desc[1]
+VU.prototype=$desc
+function Ya(yT,kU){this.yT=yT
+this.kU=kU}Ya.builtin$cls="Ya"
+if(!"name" in Ya)Ya.name="Ya"
+$desc=$collectedClasses.Ya
+if($desc instanceof Array)$desc=$desc[1]
+Ya.prototype=$desc
+Ya.prototype.gyT=function(receiver){return this.yT}
+Ya.prototype.gkU=function(receiver){return this.kU}
+function XT(N1,bn,Ck){this.N1=N1
+this.bn=bn
 this.Ck=Ck}XT.builtin$cls="XT"
 if(!"name" in XT)XT.name="XT"
 $desc=$collectedClasses.XT
 if($desc instanceof Array)$desc=$desc[1]
 XT.prototype=$desc
-function ic(N1,lr,ND,B5,eS,ay){this.N1=N1
-this.lr=lr
-this.ND=ND
-this.B5=B5
+function ic(LO,ZY,xS,PB,eS,Ii){this.LO=LO
+this.ZY=ZY
+this.xS=xS
+this.PB=PB
 this.eS=eS
-this.ay=ay}ic.builtin$cls="ic"
+this.Ii=Ii}ic.builtin$cls="ic"
 if(!"name" in ic)ic.name="ic"
 $desc=$collectedClasses.ic
 if($desc instanceof Array)$desc=$desc[1]
 ic.prototype=$desc
-function VT(N1,mD,Ck){this.N1=N1
-this.mD=mD
+function VT(N1,bn,Ck){this.N1=N1
+this.bn=bn
 this.Ck=Ck}VT.builtin$cls="VT"
 if(!"name" in VT)VT.name="VT"
 $desc=$collectedClasses.VT
 if($desc instanceof Array)$desc=$desc[1]
 VT.prototype=$desc
-function y3(vH,Il,dM){this.vH=vH
-this.Il=Il
-this.dM=dM}y3.builtin$cls="y3"
-if(!"name" in y3)y3.name="y3"
-$desc=$collectedClasses.y3
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-y3.prototype=$desc
-y3.prototype.gvH=function(receiver){return this.vH}
-function Oh(QD){this.QD=QD}Oh.builtin$cls="Oh"
+T4.prototype=$desc
+function TR(LO,Ii){this.LO=LO
+this.Ii=Ii}TR.builtin$cls="TR"
+if(!"name" in TR)TR.name="TR"
+$desc=$collectedClasses.TR
+if($desc instanceof Array)$desc=$desc[1]
+TR.prototype=$desc
+TR.prototype.gLO=function(){return this.LO}
+TR.prototype.gIi=function(receiver){return this.Ii}
+function VD(a){this.a=a}VD.builtin$cls="VD"
+if(!"name" in VD)VD.name="VD"
+$desc=$collectedClasses.VD
+if($desc instanceof Array)$desc=$desc[1]
+VD.prototype=$desc
+function Oh(Mw){this.Mw=Mw}Oh.builtin$cls="Oh"
 if(!"name" in Oh)Oh.name="Oh"
 $desc=$collectedClasses.Oh
 if($desc instanceof Array)$desc=$desc[1]
 Oh.prototype=$desc
-function qE(){}qE.builtin$cls="qE"
-if(!"name" in qE)qE.name="qE"
-$desc=$collectedClasses.qE
+function zy(call$2,$name){this.call$2=call$2
+this.$name=$name}zy.builtin$cls="zy"
+$desc=$collectedClasses.zy
 if($desc instanceof Array)$desc=$desc[1]
-qE.prototype=$desc
-function vH(){}vH.builtin$cls="vH"
-if(!"name" in vH)vH.name="vH"
-$desc=$collectedClasses.vH
-if($desc instanceof Array)$desc=$desc[1]
-vH.prototype=$desc
-function Ps(){}Ps.builtin$cls="Ps"
-if(!"name" in Ps)Ps.name="Ps"
-$desc=$collectedClasses.Ps
-if($desc instanceof Array)$desc=$desc[1]
-Ps.prototype=$desc
-Ps.prototype.grk=function(receiver){return receiver.hash}
-Ps.prototype.srk=function(receiver,v){return receiver.hash=v}
-Ps.prototype.gJf=function(receiver){return receiver.host}
-Ps.prototype.gmH=function(receiver){return receiver.href}
-Ps.prototype.gGL=function(receiver){return receiver.port}
-Ps.prototype.gN=function(receiver){return receiver.target}
-Ps.prototype.gt5=function(receiver){return receiver.type}
-Ps.prototype.st5=function(receiver,v){return receiver.type=v}
-function NF(){}NF.builtin$cls="NF"
-if(!"name" in NF)NF.name="NF"
-$desc=$collectedClasses.NF
-if($desc instanceof Array)$desc=$desc[1]
-NF.prototype=$desc
-function fY(){}fY.builtin$cls="fY"
-if(!"name" in fY)fY.name="fY"
-$desc=$collectedClasses.fY
-if($desc instanceof Array)$desc=$desc[1]
-fY.prototype=$desc
-fY.prototype.grk=function(receiver){return receiver.hash}
-fY.prototype.gJf=function(receiver){return receiver.host}
-fY.prototype.gmH=function(receiver){return receiver.href}
-fY.prototype.gGL=function(receiver){return receiver.port}
-fY.prototype.gN=function(receiver){return receiver.target}
-function Mr(){}Mr.builtin$cls="Mr"
-if(!"name" in Mr)Mr.name="Mr"
-$desc=$collectedClasses.Mr
-if($desc instanceof Array)$desc=$desc[1]
-Mr.prototype=$desc
-function lJ(){}lJ.builtin$cls="lJ"
-if(!"name" in lJ)lJ.name="lJ"
-$desc=$collectedClasses.lJ
-if($desc instanceof Array)$desc=$desc[1]
-lJ.prototype=$desc
-function P2(){}P2.builtin$cls="P2"
-if(!"name" in P2)P2.name="P2"
-$desc=$collectedClasses.P2
-if($desc instanceof Array)$desc=$desc[1]
-P2.prototype=$desc
-function nB(){}nB.builtin$cls="nB"
-if(!"name" in nB)nB.name="nB"
-$desc=$collectedClasses.nB
-if($desc instanceof Array)$desc=$desc[1]
-nB.prototype=$desc
-nB.prototype.gmH=function(receiver){return receiver.href}
-nB.prototype.gN=function(receiver){return receiver.target}
-function i3(){}i3.builtin$cls="i3"
-if(!"name" in i3)i3.name="i3"
-$desc=$collectedClasses.i3
-if($desc instanceof Array)$desc=$desc[1]
-i3.prototype=$desc
-function it(){}it.builtin$cls="it"
-if(!"name" in it)it.name="it"
-$desc=$collectedClasses.it
-if($desc instanceof Array)$desc=$desc[1]
-it.prototype=$desc
-function Az(){}Az.builtin$cls="Az"
-if(!"name" in Az)Az.name="Az"
-$desc=$collectedClasses.Az
-if($desc instanceof Array)$desc=$desc[1]
-Az.prototype=$desc
-Az.prototype.gt5=function(receiver){return receiver.type}
-function QP(){}QP.builtin$cls="QP"
-if(!"name" in QP)QP.name="QP"
-$desc=$collectedClasses.QP
-if($desc instanceof Array)$desc=$desc[1]
-QP.prototype=$desc
-function uQ(){}uQ.builtin$cls="uQ"
-if(!"name" in uQ)uQ.name="uQ"
-$desc=$collectedClasses.uQ
-if($desc instanceof Array)$desc=$desc[1]
-uQ.prototype=$desc
-uQ.prototype.gMB=function(receiver){return receiver.form}
-uQ.prototype.goc=function(receiver){return receiver.name}
-uQ.prototype.soc=function(receiver,v){return receiver.name=v}
-uQ.prototype.gt5=function(receiver){return receiver.type}
-uQ.prototype.st5=function(receiver,v){return receiver.type=v}
-uQ.prototype.gP=function(receiver){return receiver.value}
-uQ.prototype.sP=function(receiver,v){return receiver.value=v}
-function n6(){}n6.builtin$cls="n6"
-if(!"name" in n6)n6.name="n6"
-$desc=$collectedClasses.n6
-if($desc instanceof Array)$desc=$desc[1]
-n6.prototype=$desc
-function mT(){}mT.builtin$cls="mT"
-if(!"name" in mT)mT.name="mT"
-$desc=$collectedClasses.mT
-if($desc instanceof Array)$desc=$desc[1]
-mT.prototype=$desc
-mT.prototype.gfg=function(receiver){return receiver.height}
-mT.prototype.gR=function(receiver){return receiver.width}
-function OM(){}OM.builtin$cls="OM"
-if(!"name" in OM)OM.name="OM"
-$desc=$collectedClasses.OM
-if($desc instanceof Array)$desc=$desc[1]
-OM.prototype=$desc
-OM.prototype.gB=function(receiver){return receiver.length}
-function Mb(){}Mb.builtin$cls="Mb"
-if(!"name" in Mb)Mb.name="Mb"
-$desc=$collectedClasses.Mb
-if($desc instanceof Array)$desc=$desc[1]
-Mb.prototype=$desc
-Mb.prototype.gtT=function(receiver){return receiver.code}
-function fW(){}fW.builtin$cls="fW"
-if(!"name" in fW)fW.name="fW"
-$desc=$collectedClasses.fW
-if($desc instanceof Array)$desc=$desc[1]
-fW.prototype=$desc
-function di(){}di.builtin$cls="di"
-if(!"name" in di)di.name="di"
-$desc=$collectedClasses.di
-if($desc instanceof Array)$desc=$desc[1]
-di.prototype=$desc
-function v7(){}v7.builtin$cls="v7"
-if(!"name" in v7)v7.name="v7"
-$desc=$collectedClasses.v7
-if($desc instanceof Array)$desc=$desc[1]
-v7.prototype=$desc
-function XQ(){}XQ.builtin$cls="XQ"
-if(!"name" in XQ)XQ.name="XQ"
-$desc=$collectedClasses.XQ
-if($desc instanceof Array)$desc=$desc[1]
-XQ.prototype=$desc
-function nS(){}nS.builtin$cls="nS"
-if(!"name" in nS)nS.name="nS"
-$desc=$collectedClasses.nS
-if($desc instanceof Array)$desc=$desc[1]
-nS.prototype=$desc
-function yJ(){}yJ.builtin$cls="yJ"
-if(!"name" in yJ)yJ.name="yJ"
-$desc=$collectedClasses.yJ
-if($desc instanceof Array)$desc=$desc[1]
-yJ.prototype=$desc
-function SR(){}SR.builtin$cls="SR"
-if(!"name" in SR)SR.name="SR"
-$desc=$collectedClasses.SR
-if($desc instanceof Array)$desc=$desc[1]
-SR.prototype=$desc
-function iZ(){}iZ.builtin$cls="iZ"
-if(!"name" in iZ)iZ.name="iZ"
-$desc=$collectedClasses.iZ
-if($desc instanceof Array)$desc=$desc[1]
-iZ.prototype=$desc
-function U1(){}U1.builtin$cls="U1"
-if(!"name" in U1)U1.name="U1"
-$desc=$collectedClasses.U1
-if($desc instanceof Array)$desc=$desc[1]
-U1.prototype=$desc
-U1.prototype.gmH=function(receiver){return receiver.href}
-function cV(){}cV.builtin$cls="cV"
-if(!"name" in cV)cV.name="cV"
-$desc=$collectedClasses.cV
-if($desc instanceof Array)$desc=$desc[1]
-cV.prototype=$desc
-function wN(){}wN.builtin$cls="wN"
-if(!"name" in wN)wN.name="wN"
-$desc=$collectedClasses.wN
-if($desc instanceof Array)$desc=$desc[1]
-wN.prototype=$desc
-wN.prototype.goc=function(receiver){return receiver.name}
-wN.prototype.soc=function(receiver,v){return receiver.name=v}
-function QJ(){}QJ.builtin$cls="QJ"
-if(!"name" in QJ)QJ.name="QJ"
-$desc=$collectedClasses.QJ
-if($desc instanceof Array)$desc=$desc[1]
-QJ.prototype=$desc
-function x1(){}x1.builtin$cls="x1"
-if(!"name" in x1)x1.name="x1"
-$desc=$collectedClasses.x1
-if($desc instanceof Array)$desc=$desc[1]
-x1.prototype=$desc
-function ty(){}ty.builtin$cls="ty"
-if(!"name" in ty)ty.name="ty"
-$desc=$collectedClasses.ty
-if($desc instanceof Array)$desc=$desc[1]
-ty.prototype=$desc
-function lw(){}lw.builtin$cls="lw"
-if(!"name" in lw)lw.name="lw"
-$desc=$collectedClasses.lw
-if($desc instanceof Array)$desc=$desc[1]
-lw.prototype=$desc
-lw.prototype.gt5=function(receiver){return receiver.type}
-function oJ(){}oJ.builtin$cls="oJ"
-if(!"name" in oJ)oJ.name="oJ"
-$desc=$collectedClasses.oJ
-if($desc instanceof Array)$desc=$desc[1]
-oJ.prototype=$desc
-oJ.prototype.gB=function(receiver){return receiver.length}
-function kh(){}kh.builtin$cls="kh"
-if(!"name" in kh)kh.name="kh"
-$desc=$collectedClasses.kh
-if($desc instanceof Array)$desc=$desc[1]
-kh.prototype=$desc
-function zC(){}zC.builtin$cls="zC"
-if(!"name" in zC)zC.name="zC"
-$desc=$collectedClasses.zC
-if($desc instanceof Array)$desc=$desc[1]
-zC.prototype=$desc
-function c0(){}c0.builtin$cls="c0"
-if(!"name" in c0)c0.name="c0"
-$desc=$collectedClasses.c0
-if($desc instanceof Array)$desc=$desc[1]
-c0.prototype=$desc
-function dO(){}dO.builtin$cls="dO"
-if(!"name" in dO)dO.name="dO"
-$desc=$collectedClasses.dO
-if($desc instanceof Array)$desc=$desc[1]
-dO.prototype=$desc
-function DG(){}DG.builtin$cls="DG"
-if(!"name" in DG)DG.name="DG"
-$desc=$collectedClasses.DG
-if($desc instanceof Array)$desc=$desc[1]
-DG.prototype=$desc
-function Ff(){}Ff.builtin$cls="Ff"
-if(!"name" in Ff)Ff.name="Ff"
-$desc=$collectedClasses.Ff
-if($desc instanceof Array)$desc=$desc[1]
-Ff.prototype=$desc
-function kO(){}kO.builtin$cls="kO"
-if(!"name" in kO)kO.name="kO"
-$desc=$collectedClasses.kO
-if($desc instanceof Array)$desc=$desc[1]
-kO.prototype=$desc
-function xm(){}xm.builtin$cls="xm"
-if(!"name" in xm)xm.name="xm"
-$desc=$collectedClasses.xm
-if($desc instanceof Array)$desc=$desc[1]
-xm.prototype=$desc
-function MY(){}MY.builtin$cls="MY"
-if(!"name" in MY)MY.name="MY"
-$desc=$collectedClasses.MY
-if($desc instanceof Array)$desc=$desc[1]
-MY.prototype=$desc
-function rD(){}rD.builtin$cls="rD"
-if(!"name" in rD)rD.name="rD"
-$desc=$collectedClasses.rD
-if($desc instanceof Array)$desc=$desc[1]
-rD.prototype=$desc
-function rV(){}rV.builtin$cls="rV"
-if(!"name" in rV)rV.name="rV"
-$desc=$collectedClasses.rV
-if($desc instanceof Array)$desc=$desc[1]
-rV.prototype=$desc
-function Wy(){}Wy.builtin$cls="Wy"
-if(!"name" in Wy)Wy.name="Wy"
-$desc=$collectedClasses.Wy
-if($desc instanceof Array)$desc=$desc[1]
-Wy.prototype=$desc
-function YN(){}YN.builtin$cls="YN"
-if(!"name" in YN)YN.name="YN"
-$desc=$collectedClasses.YN
-if($desc instanceof Array)$desc=$desc[1]
-YN.prototype=$desc
-function bA(){}bA.builtin$cls="bA"
-if(!"name" in bA)bA.name="bA"
-$desc=$collectedClasses.bA
-if($desc instanceof Array)$desc=$desc[1]
-bA.prototype=$desc
-function Wq(){}Wq.builtin$cls="Wq"
-if(!"name" in Wq)Wq.name="Wq"
-$desc=$collectedClasses.Wq
-if($desc instanceof Array)$desc=$desc[1]
-Wq.prototype=$desc
-function rz(){}rz.builtin$cls="rz"
-if(!"name" in rz)rz.name="rz"
-$desc=$collectedClasses.rz
-if($desc instanceof Array)$desc=$desc[1]
-rz.prototype=$desc
-rz.prototype.gG1=function(receiver){return receiver.message}
-rz.prototype.goc=function(receiver){return receiver.name}
-function cA(){}cA.builtin$cls="cA"
-if(!"name" in cA)cA.name="cA"
-$desc=$collectedClasses.cA
-if($desc instanceof Array)$desc=$desc[1]
-cA.prototype=$desc
-cA.prototype.gG1=function(receiver){return receiver.message}
-function ae(){}ae.builtin$cls="ae"
-if(!"name" in ae)ae.name="ae"
-$desc=$collectedClasses.ae
-if($desc instanceof Array)$desc=$desc[1]
-ae.prototype=$desc
-function u1(){}u1.builtin$cls="u1"
-if(!"name" in u1)u1.name="u1"
-$desc=$collectedClasses.u1
-if($desc instanceof Array)$desc=$desc[1]
-u1.prototype=$desc
-function cv(){}cv.builtin$cls="cv"
-if(!"name" in cv)cv.name="cv"
-$desc=$collectedClasses.cv
-if($desc instanceof Array)$desc=$desc[1]
-cv.prototype=$desc
-cv.prototype.gxr=function(receiver){return receiver.className}
-cv.prototype.sxr=function(receiver,v){return receiver.className=v}
-cv.prototype.gjO=function(receiver){return receiver.id}
-cv.prototype.sjO=function(receiver,v){return receiver.id=v}
-function Al(){}Al.builtin$cls="Al"
-if(!"name" in Al)Al.name="Al"
-$desc=$collectedClasses.Al
-if($desc instanceof Array)$desc=$desc[1]
-Al.prototype=$desc
-Al.prototype.gfg=function(receiver){return receiver.height}
-Al.prototype.goc=function(receiver){return receiver.name}
-Al.prototype.soc=function(receiver,v){return receiver.name=v}
-Al.prototype.gLA=function(receiver){return receiver.src}
-Al.prototype.gt5=function(receiver){return receiver.type}
-Al.prototype.st5=function(receiver,v){return receiver.type=v}
-Al.prototype.gR=function(receiver){return receiver.width}
-function SX(){}SX.builtin$cls="SX"
-if(!"name" in SX)SX.name="SX"
-$desc=$collectedClasses.SX
-if($desc instanceof Array)$desc=$desc[1]
-SX.prototype=$desc
-SX.prototype.gkc=function(receiver){return receiver.error}
-SX.prototype.gG1=function(receiver){return receiver.message}
-function ea(){}ea.builtin$cls="ea"
-if(!"name" in ea)ea.name="ea"
-$desc=$collectedClasses.ea
-if($desc instanceof Array)$desc=$desc[1]
-ea.prototype=$desc
-ea.prototype.sIt=function(receiver,v){return receiver._selector=v}
-ea.prototype.goM=function(receiver){return receiver.bubbles}
-ea.prototype.gay=function(receiver){return receiver.path}
-ea.prototype.gt5=function(receiver){return receiver.type}
-function D0(){}D0.builtin$cls="D0"
-if(!"name" in D0)D0.name="D0"
-$desc=$collectedClasses.D0
-if($desc instanceof Array)$desc=$desc[1]
-D0.prototype=$desc
-function as(){}as.builtin$cls="as"
-if(!"name" in as)as.name="as"
-$desc=$collectedClasses.as
-if($desc instanceof Array)$desc=$desc[1]
-as.prototype=$desc
-as.prototype.gMB=function(receiver){return receiver.form}
-as.prototype.goc=function(receiver){return receiver.name}
-as.prototype.soc=function(receiver,v){return receiver.name=v}
-as.prototype.gt5=function(receiver){return receiver.type}
-function T5(){}T5.builtin$cls="T5"
-if(!"name" in T5)T5.name="T5"
-$desc=$collectedClasses.T5
-if($desc instanceof Array)$desc=$desc[1]
-T5.prototype=$desc
-T5.prototype.goc=function(receiver){return receiver.name}
-function Aa(){}Aa.builtin$cls="Aa"
-if(!"name" in Aa)Aa.name="Aa"
-$desc=$collectedClasses.Aa
-if($desc instanceof Array)$desc=$desc[1]
-Aa.prototype=$desc
-Aa.prototype.gtT=function(receiver){return receiver.code}
-function XV(){}XV.builtin$cls="XV"
-if(!"name" in XV)XV.name="XV"
-$desc=$collectedClasses.XV
-if($desc instanceof Array)$desc=$desc[1]
-XV.prototype=$desc
-function cr(){}cr.builtin$cls="cr"
-if(!"name" in cr)cr.name="cr"
-$desc=$collectedClasses.cr
-if($desc instanceof Array)$desc=$desc[1]
-cr.prototype=$desc
-function Yu(){}Yu.builtin$cls="Yu"
-if(!"name" in Yu)Yu.name="Yu"
-$desc=$collectedClasses.Yu
-if($desc instanceof Array)$desc=$desc[1]
-Yu.prototype=$desc
-Yu.prototype.gB=function(receiver){return receiver.length}
-Yu.prototype.gbP=function(receiver){return receiver.method}
-Yu.prototype.goc=function(receiver){return receiver.name}
-Yu.prototype.soc=function(receiver,v){return receiver.name=v}
-Yu.prototype.gN=function(receiver){return receiver.target}
-function Io(){}Io.builtin$cls="Io"
-if(!"name" in Io)Io.name="Io"
-$desc=$collectedClasses.Io
-if($desc instanceof Array)$desc=$desc[1]
-Io.prototype=$desc
-Io.prototype.gjO=function(receiver){return receiver.id}
-Io.prototype.gvH=function(receiver){return receiver.index}
-function iG(){}iG.builtin$cls="iG"
-if(!"name" in iG)iG.name="iG"
-$desc=$collectedClasses.iG
-if($desc instanceof Array)$desc=$desc[1]
-iG.prototype=$desc
-function kF(){}kF.builtin$cls="kF"
-if(!"name" in kF)kF.name="kF"
-$desc=$collectedClasses.kF
-if($desc instanceof Array)$desc=$desc[1]
-kF.prototype=$desc
-function Ax(){}Ax.builtin$cls="Ax"
-if(!"name" in Ax)Ax.name="Ax"
-$desc=$collectedClasses.Ax
-if($desc instanceof Array)$desc=$desc[1]
-Ax.prototype=$desc
-function tA(){}tA.builtin$cls="tA"
-if(!"name" in tA)tA.name="tA"
-$desc=$collectedClasses.tA
-if($desc instanceof Array)$desc=$desc[1]
-tA.prototype=$desc
-function xn(){}xn.builtin$cls="xn"
-if(!"name" in xn)xn.name="xn"
-$desc=$collectedClasses.xn
-if($desc instanceof Array)$desc=$desc[1]
-xn.prototype=$desc
-function Vb(){}Vb.builtin$cls="Vb"
-if(!"name" in Vb)Vb.name="Vb"
-$desc=$collectedClasses.Vb
-if($desc instanceof Array)$desc=$desc[1]
-Vb.prototype=$desc
-function QH(){}QH.builtin$cls="QH"
-if(!"name" in QH)QH.name="QH"
-$desc=$collectedClasses.QH
-if($desc instanceof Array)$desc=$desc[1]
-QH.prototype=$desc
-function YP(){}YP.builtin$cls="YP"
-if(!"name" in YP)YP.name="YP"
-$desc=$collectedClasses.YP
-if($desc instanceof Array)$desc=$desc[1]
-YP.prototype=$desc
-function X2(){}X2.builtin$cls="X2"
-if(!"name" in X2)X2.name="X2"
-$desc=$collectedClasses.X2
-if($desc instanceof Array)$desc=$desc[1]
-X2.prototype=$desc
-function fJ(){}fJ.builtin$cls="fJ"
-if(!"name" in fJ)fJ.name="fJ"
-$desc=$collectedClasses.fJ
-if($desc instanceof Array)$desc=$desc[1]
-fJ.prototype=$desc
-fJ.prototype.giC=function(receiver){return receiver.responseText}
-fJ.prototype.gys=function(receiver){return receiver.status}
-fJ.prototype.gpo=function(receiver){return receiver.statusText}
-function EA(){}EA.builtin$cls="EA"
-if(!"name" in EA)EA.name="EA"
-$desc=$collectedClasses.EA
-if($desc instanceof Array)$desc=$desc[1]
-EA.prototype=$desc
-EA.prototype.gfg=function(receiver){return receiver.height}
-EA.prototype.goc=function(receiver){return receiver.name}
-EA.prototype.soc=function(receiver,v){return receiver.name=v}
-EA.prototype.gLA=function(receiver){return receiver.src}
-EA.prototype.gR=function(receiver){return receiver.width}
-function Sg(){}Sg.builtin$cls="Sg"
-if(!"name" in Sg)Sg.name="Sg"
-$desc=$collectedClasses.Sg
-if($desc instanceof Array)$desc=$desc[1]
-Sg.prototype=$desc
-Sg.prototype.gfg=function(receiver){return receiver.height}
-Sg.prototype.gR=function(receiver){return receiver.width}
-function pA(){}pA.builtin$cls="pA"
-if(!"name" in pA)pA.name="pA"
-$desc=$collectedClasses.pA
-if($desc instanceof Array)$desc=$desc[1]
-pA.prototype=$desc
-pA.prototype.gv6=function(receiver){return receiver.complete}
-pA.prototype.gfg=function(receiver){return receiver.height}
-pA.prototype.gLA=function(receiver){return receiver.src}
-pA.prototype.gR=function(receiver){return receiver.width}
-function Mi(){}Mi.builtin$cls="Mi"
-if(!"name" in Mi)Mi.name="Mi"
-$desc=$collectedClasses.Mi
-if($desc instanceof Array)$desc=$desc[1]
-Mi.prototype=$desc
-Mi.prototype.gd4=function(receiver){return receiver.checked}
-Mi.prototype.sd4=function(receiver,v){return receiver.checked=v}
-Mi.prototype.gMB=function(receiver){return receiver.form}
-Mi.prototype.gfg=function(receiver){return receiver.height}
-Mi.prototype.gqC=function(receiver){return receiver.list}
-Mi.prototype.goc=function(receiver){return receiver.name}
-Mi.prototype.soc=function(receiver,v){return receiver.name=v}
-Mi.prototype.gLA=function(receiver){return receiver.src}
-Mi.prototype.gt5=function(receiver){return receiver.type}
-Mi.prototype.st5=function(receiver,v){return receiver.type=v}
-Mi.prototype.gP=function(receiver){return receiver.value}
-Mi.prototype.sP=function(receiver,v){return receiver.value=v}
-Mi.prototype.gPu=function(receiver){return receiver.webkitEntries}
-Mi.prototype.gR=function(receiver){return receiver.width}
-function HN(){}HN.builtin$cls="HN"
-if(!"name" in HN)HN.name="HN"
-$desc=$collectedClasses.HN
-if($desc instanceof Array)$desc=$desc[1]
-HN.prototype=$desc
-HN.prototype.gmW=function(receiver){return receiver.location}
-function Xb(){}Xb.builtin$cls="Xb"
-if(!"name" in Xb)Xb.name="Xb"
-$desc=$collectedClasses.Xb
-if($desc instanceof Array)$desc=$desc[1]
-Xb.prototype=$desc
-Xb.prototype.gMB=function(receiver){return receiver.form}
-Xb.prototype.goc=function(receiver){return receiver.name}
-Xb.prototype.soc=function(receiver,v){return receiver.name=v}
-Xb.prototype.gt5=function(receiver){return receiver.type}
-function Gx(){}Gx.builtin$cls="Gx"
-if(!"name" in Gx)Gx.name="Gx"
-$desc=$collectedClasses.Gx
-if($desc instanceof Array)$desc=$desc[1]
-Gx.prototype=$desc
-Gx.prototype.gP=function(receiver){return receiver.value}
-Gx.prototype.sP=function(receiver,v){return receiver.value=v}
-function eP(){}eP.builtin$cls="eP"
-if(!"name" in eP)eP.name="eP"
-$desc=$collectedClasses.eP
-if($desc instanceof Array)$desc=$desc[1]
-eP.prototype=$desc
-eP.prototype.gMB=function(receiver){return receiver.form}
-function JP(){}JP.builtin$cls="JP"
-if(!"name" in JP)JP.name="JP"
-$desc=$collectedClasses.JP
-if($desc instanceof Array)$desc=$desc[1]
-JP.prototype=$desc
-JP.prototype.gMB=function(receiver){return receiver.form}
-function Og(){}Og.builtin$cls="Og"
-if(!"name" in Og)Og.name="Og"
-$desc=$collectedClasses.Og
-if($desc instanceof Array)$desc=$desc[1]
-Og.prototype=$desc
-Og.prototype.gmH=function(receiver){return receiver.href}
-Og.prototype.gt5=function(receiver){return receiver.type}
-Og.prototype.st5=function(receiver,v){return receiver.type=v}
-function cS(){}cS.builtin$cls="cS"
-if(!"name" in cS)cS.name="cS"
-$desc=$collectedClasses.cS
-if($desc instanceof Array)$desc=$desc[1]
-cS.prototype=$desc
-cS.prototype.grk=function(receiver){return receiver.hash}
-cS.prototype.srk=function(receiver,v){return receiver.hash=v}
-cS.prototype.gJf=function(receiver){return receiver.host}
-cS.prototype.gmH=function(receiver){return receiver.href}
-cS.prototype.gGL=function(receiver){return receiver.port}
-function M6O(){}M6O.builtin$cls="M6O"
-if(!"name" in M6O)M6O.name="M6O"
-$desc=$collectedClasses.M6O
-if($desc instanceof Array)$desc=$desc[1]
-M6O.prototype=$desc
-M6O.prototype.goc=function(receiver){return receiver.name}
-M6O.prototype.soc=function(receiver,v){return receiver.name=v}
-function El(){}El.builtin$cls="El"
-if(!"name" in El)El.name="El"
-$desc=$collectedClasses.El
-if($desc instanceof Array)$desc=$desc[1]
-El.prototype=$desc
-El.prototype.gkc=function(receiver){return receiver.error}
-El.prototype.gLA=function(receiver){return receiver.src}
-function zm(){}zm.builtin$cls="zm"
-if(!"name" in zm)zm.name="zm"
-$desc=$collectedClasses.zm
-if($desc instanceof Array)$desc=$desc[1]
-zm.prototype=$desc
-zm.prototype.gtT=function(receiver){return receiver.code}
-function Y7(){}Y7.builtin$cls="Y7"
-if(!"name" in Y7)Y7.name="Y7"
-$desc=$collectedClasses.Y7
-if($desc instanceof Array)$desc=$desc[1]
-Y7.prototype=$desc
-Y7.prototype.gtT=function(receiver){return receiver.code}
-function o9(){}o9.builtin$cls="o9"
-if(!"name" in o9)o9.name="o9"
-$desc=$collectedClasses.o9
-if($desc instanceof Array)$desc=$desc[1]
-o9.prototype=$desc
-o9.prototype.gG1=function(receiver){return receiver.message}
-function ku(){}ku.builtin$cls="ku"
-if(!"name" in ku)ku.name="ku"
-$desc=$collectedClasses.ku
-if($desc instanceof Array)$desc=$desc[1]
-ku.prototype=$desc
-ku.prototype.gG1=function(receiver){return receiver.message}
-function Ih(){}Ih.builtin$cls="Ih"
-if(!"name" in Ih)Ih.name="Ih"
-$desc=$collectedClasses.Ih
-if($desc instanceof Array)$desc=$desc[1]
-Ih.prototype=$desc
-function lx(){}lx.builtin$cls="lx"
-if(!"name" in lx)lx.name="lx"
-$desc=$collectedClasses.lx
-if($desc instanceof Array)$desc=$desc[1]
-lx.prototype=$desc
-lx.prototype.gjO=function(receiver){return receiver.id}
-function uB(){}uB.builtin$cls="uB"
-if(!"name" in uB)uB.name="uB"
-$desc=$collectedClasses.uB
-if($desc instanceof Array)$desc=$desc[1]
-uB.prototype=$desc
-function qm(){}qm.builtin$cls="qm"
-if(!"name" in qm)qm.name="qm"
-$desc=$collectedClasses.qm
-if($desc instanceof Array)$desc=$desc[1]
-qm.prototype=$desc
-function ZY(){}ZY.builtin$cls="ZY"
-if(!"name" in ZY)ZY.name="ZY"
-$desc=$collectedClasses.ZY
-if($desc instanceof Array)$desc=$desc[1]
-ZY.prototype=$desc
-function cx(){}cx.builtin$cls="cx"
-if(!"name" in cx)cx.name="cx"
-$desc=$collectedClasses.cx
-if($desc instanceof Array)$desc=$desc[1]
-cx.prototype=$desc
-function la(){}la.builtin$cls="la"
-if(!"name" in la)la.name="la"
-$desc=$collectedClasses.la
-if($desc instanceof Array)$desc=$desc[1]
-la.prototype=$desc
-la.prototype.gjb=function(receiver){return receiver.content}
-la.prototype.goc=function(receiver){return receiver.name}
-la.prototype.soc=function(receiver,v){return receiver.name=v}
-function Vn(){}Vn.builtin$cls="Vn"
-if(!"name" in Vn)Vn.name="Vn"
-$desc=$collectedClasses.Vn
-if($desc instanceof Array)$desc=$desc[1]
-Vn.prototype=$desc
-Vn.prototype.gP=function(receiver){return receiver.value}
-Vn.prototype.sP=function(receiver,v){return receiver.value=v}
-function PG(){}PG.builtin$cls="PG"
-if(!"name" in PG)PG.name="PG"
-$desc=$collectedClasses.PG
-if($desc instanceof Array)$desc=$desc[1]
-PG.prototype=$desc
-PG.prototype.gGL=function(receiver){return receiver.port}
-function xe(){}xe.builtin$cls="xe"
-if(!"name" in xe)xe.name="xe"
-$desc=$collectedClasses.xe
-if($desc instanceof Array)$desc=$desc[1]
-xe.prototype=$desc
-function Hw(){}Hw.builtin$cls="Hw"
-if(!"name" in Hw)Hw.name="Hw"
-$desc=$collectedClasses.Hw
-if($desc instanceof Array)$desc=$desc[1]
-Hw.prototype=$desc
-function QT(){}QT.builtin$cls="QT"
-if(!"name" in QT)QT.name="QT"
-$desc=$collectedClasses.QT
-if($desc instanceof Array)$desc=$desc[1]
-QT.prototype=$desc
-function tH(){}tH.builtin$cls="tH"
-if(!"name" in tH)tH.name="tH"
-$desc=$collectedClasses.tH
-if($desc instanceof Array)$desc=$desc[1]
-tH.prototype=$desc
-tH.prototype.gjO=function(receiver){return receiver.id}
-tH.prototype.goc=function(receiver){return receiver.name}
-tH.prototype.gt5=function(receiver){return receiver.type}
-function AW(){}AW.builtin$cls="AW"
-if(!"name" in AW)AW.name="AW"
-$desc=$collectedClasses.AW
-if($desc instanceof Array)$desc=$desc[1]
-AW.prototype=$desc
-AW.prototype.gt5=function(receiver){return receiver.type}
-function ql(){}ql.builtin$cls="ql"
-if(!"name" in ql)ql.name="ql"
-$desc=$collectedClasses.ql
-if($desc instanceof Array)$desc=$desc[1]
-ql.prototype=$desc
-function OK(){}OK.builtin$cls="OK"
-if(!"name" in OK)OK.name="OK"
-$desc=$collectedClasses.OK
-if($desc instanceof Array)$desc=$desc[1]
-OK.prototype=$desc
-function Aj(){}Aj.builtin$cls="Aj"
-if(!"name" in Aj)Aj.name="Aj"
-$desc=$collectedClasses.Aj
-if($desc instanceof Array)$desc=$desc[1]
-Aj.prototype=$desc
-function oU(){}oU.builtin$cls="oU"
-if(!"name" in oU)oU.name="oU"
-$desc=$collectedClasses.oU
-if($desc instanceof Array)$desc=$desc[1]
-oU.prototype=$desc
-function qT(){}qT.builtin$cls="qT"
-if(!"name" in qT)qT.name="qT"
-$desc=$collectedClasses.qT
-if($desc instanceof Array)$desc=$desc[1]
-qT.prototype=$desc
-qT.prototype.gG1=function(receiver){return receiver.message}
-qT.prototype.goc=function(receiver){return receiver.name}
-function KV(){}KV.builtin$cls="KV"
-if(!"name" in KV)KV.name="KV"
-$desc=$collectedClasses.KV
-if($desc instanceof Array)$desc=$desc[1]
-KV.prototype=$desc
-KV.prototype.gq6=function(receiver){return receiver.firstChild}
-KV.prototype.gzW=function(receiver){return receiver.nextSibling}
-KV.prototype.gM0=function(receiver){return receiver.ownerDocument}
-KV.prototype.geT=function(receiver){return receiver.parentElement}
-KV.prototype.gKV=function(receiver){return receiver.parentNode}
-KV.prototype.sa4=function(receiver,v){return receiver.textContent=v}
-function BH(){}BH.builtin$cls="BH"
-if(!"name" in BH)BH.name="BH"
-$desc=$collectedClasses.BH
-if($desc instanceof Array)$desc=$desc[1]
-BH.prototype=$desc
-function mh(){}mh.builtin$cls="mh"
-if(!"name" in mh)mh.name="mh"
-$desc=$collectedClasses.mh
-if($desc instanceof Array)$desc=$desc[1]
-mh.prototype=$desc
-mh.prototype.gt5=function(receiver){return receiver.type}
-mh.prototype.st5=function(receiver,v){return receiver.type=v}
-function G7(){}G7.builtin$cls="G7"
-if(!"name" in G7)G7.name="G7"
-$desc=$collectedClasses.G7
-if($desc instanceof Array)$desc=$desc[1]
-G7.prototype=$desc
-G7.prototype.gMB=function(receiver){return receiver.form}
-G7.prototype.gfg=function(receiver){return receiver.height}
-G7.prototype.goc=function(receiver){return receiver.name}
-G7.prototype.soc=function(receiver,v){return receiver.name=v}
-G7.prototype.gt5=function(receiver){return receiver.type}
-G7.prototype.st5=function(receiver,v){return receiver.type=v}
-G7.prototype.gR=function(receiver){return receiver.width}
-function l9(){}l9.builtin$cls="l9"
-if(!"name" in l9)l9.name="l9"
-$desc=$collectedClasses.l9
-if($desc instanceof Array)$desc=$desc[1]
-l9.prototype=$desc
-function Ql(){}Ql.builtin$cls="Ql"
-if(!"name" in Ql)Ql.name="Ql"
-$desc=$collectedClasses.Ql
-if($desc instanceof Array)$desc=$desc[1]
-Ql.prototype=$desc
-Ql.prototype.gMB=function(receiver){return receiver.form}
-Ql.prototype.gvH=function(receiver){return receiver.index}
-Ql.prototype.gP=function(receiver){return receiver.value}
-Ql.prototype.sP=function(receiver,v){return receiver.value=v}
-function Xp(){}Xp.builtin$cls="Xp"
-if(!"name" in Xp)Xp.name="Xp"
-$desc=$collectedClasses.Xp
-if($desc instanceof Array)$desc=$desc[1]
-Xp.prototype=$desc
-Xp.prototype.gMB=function(receiver){return receiver.form}
-Xp.prototype.goc=function(receiver){return receiver.name}
-Xp.prototype.soc=function(receiver,v){return receiver.name=v}
-Xp.prototype.gt5=function(receiver){return receiver.type}
-Xp.prototype.gP=function(receiver){return receiver.value}
-Xp.prototype.sP=function(receiver,v){return receiver.value=v}
-function bP(){}bP.builtin$cls="bP"
-if(!"name" in bP)bP.name="bP"
-$desc=$collectedClasses.bP
-if($desc instanceof Array)$desc=$desc[1]
-bP.prototype=$desc
-function FH(){}FH.builtin$cls="FH"
-if(!"name" in FH)FH.name="FH"
-$desc=$collectedClasses.FH
-if($desc instanceof Array)$desc=$desc[1]
-FH.prototype=$desc
-function iL(){}iL.builtin$cls="iL"
-if(!"name" in iL)iL.name="iL"
-$desc=$collectedClasses.iL
-if($desc instanceof Array)$desc=$desc[1]
-iL.prototype=$desc
-function me(){}me.builtin$cls="me"
-if(!"name" in me)me.name="me"
-$desc=$collectedClasses.me
-if($desc instanceof Array)$desc=$desc[1]
-me.prototype=$desc
-me.prototype.goc=function(receiver){return receiver.name}
-me.prototype.soc=function(receiver,v){return receiver.name=v}
-me.prototype.gP=function(receiver){return receiver.value}
-me.prototype.sP=function(receiver,v){return receiver.value=v}
-function qp(){}qp.builtin$cls="qp"
-if(!"name" in qp)qp.name="qp"
-$desc=$collectedClasses.qp
-if($desc instanceof Array)$desc=$desc[1]
-qp.prototype=$desc
-qp.prototype.gB=function(receiver){return receiver.length}
-qp.prototype.goc=function(receiver){return receiver.name}
-function Ev(){}Ev.builtin$cls="Ev"
-if(!"name" in Ev)Ev.name="Ev"
-$desc=$collectedClasses.Ev
-if($desc instanceof Array)$desc=$desc[1]
-Ev.prototype=$desc
-function ni(){}ni.builtin$cls="ni"
-if(!"name" in ni)ni.name="ni"
-$desc=$collectedClasses.ni
-if($desc instanceof Array)$desc=$desc[1]
-ni.prototype=$desc
-function p3(){}p3.builtin$cls="p3"
-if(!"name" in p3)p3.name="p3"
-$desc=$collectedClasses.p3
-if($desc instanceof Array)$desc=$desc[1]
-p3.prototype=$desc
-p3.prototype.gtT=function(receiver){return receiver.code}
-p3.prototype.gG1=function(receiver){return receiver.message}
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
-if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
-function qW(){}qW.builtin$cls="qW"
-if(!"name" in qW)qW.name="qW"
-$desc=$collectedClasses.qW
-if($desc instanceof Array)$desc=$desc[1]
-qW.prototype=$desc
-qW.prototype.gN=function(receiver){return receiver.target}
-function KR(){}KR.builtin$cls="KR"
-if(!"name" in KR)KR.name="KR"
-$desc=$collectedClasses.KR
-if($desc instanceof Array)$desc=$desc[1]
-KR.prototype=$desc
-KR.prototype.gP=function(receiver){return receiver.value}
-KR.prototype.sP=function(receiver,v){return receiver.value=v}
-function kQ(){}kQ.builtin$cls="kQ"
-if(!"name" in kQ)kQ.name="kQ"
-$desc=$collectedClasses.kQ
-if($desc instanceof Array)$desc=$desc[1]
-kQ.prototype=$desc
-function fs(){}fs.builtin$cls="fs"
-if(!"name" in fs)fs.name="fs"
-$desc=$collectedClasses.fs
-if($desc instanceof Array)$desc=$desc[1]
-fs.prototype=$desc
-function bT(){}bT.builtin$cls="bT"
-if(!"name" in bT)bT.name="bT"
-$desc=$collectedClasses.bT
-if($desc instanceof Array)$desc=$desc[1]
-bT.prototype=$desc
-function UL(){}UL.builtin$cls="UL"
-if(!"name" in UL)UL.name="UL"
-$desc=$collectedClasses.UL
-if($desc instanceof Array)$desc=$desc[1]
-UL.prototype=$desc
-function MC(){}MC.builtin$cls="MC"
-if(!"name" in MC)MC.name="MC"
-$desc=$collectedClasses.MC
-if($desc instanceof Array)$desc=$desc[1]
-MC.prototype=$desc
-function wh(){}wh.builtin$cls="wh"
-if(!"name" in wh)wh.name="wh"
-$desc=$collectedClasses.wh
-if($desc instanceof Array)$desc=$desc[1]
-wh.prototype=$desc
-function j2(){}j2.builtin$cls="j2"
-if(!"name" in j2)j2.name="j2"
-$desc=$collectedClasses.j2
-if($desc instanceof Array)$desc=$desc[1]
-j2.prototype=$desc
-j2.prototype.gLA=function(receiver){return receiver.src}
-j2.prototype.gt5=function(receiver){return receiver.type}
-j2.prototype.st5=function(receiver,v){return receiver.type=v}
-function Eag(){}Eag.builtin$cls="Eag"
-if(!"name" in Eag)Eag.name="Eag"
-$desc=$collectedClasses.Eag
-if($desc instanceof Array)$desc=$desc[1]
-Eag.prototype=$desc
-function lp(){}lp.builtin$cls="lp"
-if(!"name" in lp)lp.name="lp"
-$desc=$collectedClasses.lp
-if($desc instanceof Array)$desc=$desc[1]
-lp.prototype=$desc
-lp.prototype.gMB=function(receiver){return receiver.form}
-lp.prototype.gB=function(receiver){return receiver.length}
-lp.prototype.sB=function(receiver,v){return receiver.length=v}
-lp.prototype.goc=function(receiver){return receiver.name}
-lp.prototype.soc=function(receiver,v){return receiver.name=v}
-lp.prototype.gig=function(receiver){return receiver.selectedIndex}
-lp.prototype.sig=function(receiver,v){return receiver.selectedIndex=v}
-lp.prototype.gt5=function(receiver){return receiver.type}
-lp.prototype.gP=function(receiver){return receiver.value}
-lp.prototype.sP=function(receiver,v){return receiver.value=v}
-function pD(){}pD.builtin$cls="pD"
-if(!"name" in pD)pD.name="pD"
-$desc=$collectedClasses.pD
-if($desc instanceof Array)$desc=$desc[1]
-pD.prototype=$desc
-function I0(){}I0.builtin$cls="I0"
-if(!"name" in I0)I0.name="I0"
-$desc=$collectedClasses.I0
-if($desc instanceof Array)$desc=$desc[1]
-I0.prototype=$desc
-I0.prototype.gpQ=function(receiver){return receiver.applyAuthorStyles}
-function x8(){}x8.builtin$cls="x8"
-if(!"name" in x8)x8.name="x8"
-$desc=$collectedClasses.x8
-if($desc instanceof Array)$desc=$desc[1]
-x8.prototype=$desc
-function Mkk(){}Mkk.builtin$cls="Mkk"
-if(!"name" in Mkk)Mkk.name="Mkk"
-$desc=$collectedClasses.Mkk
-if($desc instanceof Array)$desc=$desc[1]
-Mkk.prototype=$desc
-function QR(){}QR.builtin$cls="QR"
-if(!"name" in QR)QR.name="QR"
-$desc=$collectedClasses.QR
-if($desc instanceof Array)$desc=$desc[1]
-QR.prototype=$desc
-QR.prototype.gLA=function(receiver){return receiver.src}
-QR.prototype.gt5=function(receiver){return receiver.type}
-QR.prototype.st5=function(receiver,v){return receiver.type=v}
-function Cp(){}Cp.builtin$cls="Cp"
-if(!"name" in Cp)Cp.name="Cp"
-$desc=$collectedClasses.Cp
-if($desc instanceof Array)$desc=$desc[1]
-Cp.prototype=$desc
-function KI(){}KI.builtin$cls="KI"
-if(!"name" in KI)KI.name="KI"
-$desc=$collectedClasses.KI
-if($desc instanceof Array)$desc=$desc[1]
-KI.prototype=$desc
-KI.prototype.gLA=function(receiver){return receiver.src}
-function AM(){}AM.builtin$cls="AM"
-if(!"name" in AM)AM.name="AM"
-$desc=$collectedClasses.AM
-if($desc instanceof Array)$desc=$desc[1]
-AM.prototype=$desc
-function ua(){}ua.builtin$cls="ua"
-if(!"name" in ua)ua.name="ua"
-$desc=$collectedClasses.ua
-if($desc instanceof Array)$desc=$desc[1]
-ua.prototype=$desc
-function dZ(){}dZ.builtin$cls="dZ"
-if(!"name" in dZ)dZ.name="dZ"
-$desc=$collectedClasses.dZ
-if($desc instanceof Array)$desc=$desc[1]
-dZ.prototype=$desc
-function tr(){}tr.builtin$cls="tr"
-if(!"name" in tr)tr.name="tr"
-$desc=$collectedClasses.tr
-if($desc instanceof Array)$desc=$desc[1]
-tr.prototype=$desc
-function mG(){}mG.builtin$cls="mG"
-if(!"name" in mG)mG.name="mG"
-$desc=$collectedClasses.mG
-if($desc instanceof Array)$desc=$desc[1]
-mG.prototype=$desc
-mG.prototype.gkc=function(receiver){return receiver.error}
-mG.prototype.gG1=function(receiver){return receiver.message}
-function Ul(){}Ul.builtin$cls="Ul"
-if(!"name" in Ul)Ul.name="Ul"
-$desc=$collectedClasses.Ul
-if($desc instanceof Array)$desc=$desc[1]
-Ul.prototype=$desc
-function l8(){}l8.builtin$cls="l8"
-if(!"name" in l8)l8.name="l8"
-$desc=$collectedClasses.l8
-if($desc instanceof Array)$desc=$desc[1]
-l8.prototype=$desc
-l8.prototype.gV5=function(receiver){return receiver.isFinal}
-l8.prototype.gB=function(receiver){return receiver.length}
-function G0(){}G0.builtin$cls="G0"
-if(!"name" in G0)G0.name="G0"
-$desc=$collectedClasses.G0
-if($desc instanceof Array)$desc=$desc[1]
-G0.prototype=$desc
-G0.prototype.goc=function(receiver){return receiver.name}
-function ii(){}ii.builtin$cls="ii"
-if(!"name" in ii)ii.name="ii"
-$desc=$collectedClasses.ii
-if($desc instanceof Array)$desc=$desc[1]
-ii.prototype=$desc
-ii.prototype.gG3=function(receiver){return receiver.key}
-ii.prototype.gzZ=function(receiver){return receiver.newValue}
-ii.prototype.gjL=function(receiver){return receiver.oldValue}
-function fq(){}fq.builtin$cls="fq"
-if(!"name" in fq)fq.name="fq"
-$desc=$collectedClasses.fq
-if($desc instanceof Array)$desc=$desc[1]
-fq.prototype=$desc
-fq.prototype.gt5=function(receiver){return receiver.type}
-fq.prototype.st5=function(receiver,v){return receiver.type=v}
-function xr(){}xr.builtin$cls="xr"
-if(!"name" in xr)xr.name="xr"
-$desc=$collectedClasses.xr
-if($desc instanceof Array)$desc=$desc[1]
-xr.prototype=$desc
-xr.prototype.gmH=function(receiver){return receiver.href}
-xr.prototype.gt5=function(receiver){return receiver.type}
-function h4(){}h4.builtin$cls="h4"
-if(!"name" in h4)h4.name="h4"
-$desc=$collectedClasses.h4
-if($desc instanceof Array)$desc=$desc[1]
-h4.prototype=$desc
-function qk(){}qk.builtin$cls="qk"
-if(!"name" in qk)qk.name="qk"
-$desc=$collectedClasses.qk
-if($desc instanceof Array)$desc=$desc[1]
-qk.prototype=$desc
-function GI(){}GI.builtin$cls="GI"
-if(!"name" in GI)GI.name="GI"
-$desc=$collectedClasses.GI
-if($desc instanceof Array)$desc=$desc[1]
-GI.prototype=$desc
-function Tb(){}Tb.builtin$cls="Tb"
-if(!"name" in Tb)Tb.name="Tb"
-$desc=$collectedClasses.Tb
-if($desc instanceof Array)$desc=$desc[1]
-Tb.prototype=$desc
-function tV(){}tV.builtin$cls="tV"
-if(!"name" in tV)tV.name="tV"
-$desc=$collectedClasses.tV
-if($desc instanceof Array)$desc=$desc[1]
-tV.prototype=$desc
-function BT(){}BT.builtin$cls="BT"
-if(!"name" in BT)BT.name="BT"
-$desc=$collectedClasses.BT
-if($desc instanceof Array)$desc=$desc[1]
-BT.prototype=$desc
-function yY(){}yY.builtin$cls="yY"
-if(!"name" in yY)yY.name="yY"
-$desc=$collectedClasses.yY
-if($desc instanceof Array)$desc=$desc[1]
-yY.prototype=$desc
-yY.prototype.gjb=function(receiver){return receiver.content}
-function kJ(){}kJ.builtin$cls="kJ"
-if(!"name" in kJ)kJ.name="kJ"
-$desc=$collectedClasses.kJ
-if($desc instanceof Array)$desc=$desc[1]
-kJ.prototype=$desc
-function AE(){}AE.builtin$cls="AE"
-if(!"name" in AE)AE.name="AE"
-$desc=$collectedClasses.AE
-if($desc instanceof Array)$desc=$desc[1]
-AE.prototype=$desc
-AE.prototype.gMB=function(receiver){return receiver.form}
-AE.prototype.goc=function(receiver){return receiver.name}
-AE.prototype.soc=function(receiver,v){return receiver.name=v}
-AE.prototype.gt5=function(receiver){return receiver.type}
-AE.prototype.gP=function(receiver){return receiver.value}
-AE.prototype.sP=function(receiver,v){return receiver.value=v}
-function xV(){}xV.builtin$cls="xV"
-if(!"name" in xV)xV.name="xV"
-$desc=$collectedClasses.xV
-if($desc instanceof Array)$desc=$desc[1]
-xV.prototype=$desc
-function A1(){}A1.builtin$cls="A1"
-if(!"name" in A1)A1.name="A1"
-$desc=$collectedClasses.A1
-if($desc instanceof Array)$desc=$desc[1]
-A1.prototype=$desc
-A1.prototype.gfY=function(receiver){return receiver.kind}
-function MN(){}MN.builtin$cls="MN"
-if(!"name" in MN)MN.name="MN"
-$desc=$collectedClasses.MN
-if($desc instanceof Array)$desc=$desc[1]
-MN.prototype=$desc
-MN.prototype.gjO=function(receiver){return receiver.id}
-MN.prototype.sjO=function(receiver,v){return receiver.id=v}
-MN.prototype.sa4=function(receiver,v){return receiver.text=v}
-function X0(){}X0.builtin$cls="X0"
-if(!"name" in X0)X0.name="X0"
-$desc=$collectedClasses.X0
-if($desc instanceof Array)$desc=$desc[1]
-X0.prototype=$desc
-function u4(){}u4.builtin$cls="u4"
-if(!"name" in u4)u4.name="u4"
-$desc=$collectedClasses.u4
-if($desc instanceof Array)$desc=$desc[1]
-u4.prototype=$desc
-function tL(){}tL.builtin$cls="tL"
-if(!"name" in tL)tL.name="tL"
-$desc=$collectedClasses.tL
-if($desc instanceof Array)$desc=$desc[1]
-tL.prototype=$desc
-function a3(){}a3.builtin$cls="a3"
-if(!"name" in a3)a3.name="a3"
-$desc=$collectedClasses.a3
-if($desc instanceof Array)$desc=$desc[1]
-a3.prototype=$desc
-function y6(){}y6.builtin$cls="y6"
-if(!"name" in y6)y6.name="y6"
-$desc=$collectedClasses.y6
-if($desc instanceof Array)$desc=$desc[1]
-y6.prototype=$desc
-function bj(){}bj.builtin$cls="bj"
-if(!"name" in bj)bj.name="bj"
-$desc=$collectedClasses.bj
-if($desc instanceof Array)$desc=$desc[1]
-bj.prototype=$desc
-function RH(){}RH.builtin$cls="RH"
-if(!"name" in RH)RH.name="RH"
-$desc=$collectedClasses.RH
-if($desc instanceof Array)$desc=$desc[1]
-RH.prototype=$desc
-RH.prototype.gfY=function(receiver){return receiver.kind}
-RH.prototype.gLA=function(receiver){return receiver.src}
-function pU(){}pU.builtin$cls="pU"
-if(!"name" in pU)pU.name="pU"
-$desc=$collectedClasses.pU
-if($desc instanceof Array)$desc=$desc[1]
-pU.prototype=$desc
-function Lq(){}Lq.builtin$cls="Lq"
-if(!"name" in Lq)Lq.name="Lq"
-$desc=$collectedClasses.Lq
-if($desc instanceof Array)$desc=$desc[1]
-Lq.prototype=$desc
-function Mf(){}Mf.builtin$cls="Mf"
-if(!"name" in Mf)Mf.name="Mf"
-$desc=$collectedClasses.Mf
-if($desc instanceof Array)$desc=$desc[1]
-Mf.prototype=$desc
-Mf.prototype.gey=function(receiver){return receiver.detail}
-function dp(){}dp.builtin$cls="dp"
-if(!"name" in dp)dp.name="dp"
-$desc=$collectedClasses.dp
-if($desc instanceof Array)$desc=$desc[1]
-dp.prototype=$desc
-function vw(){}vw.builtin$cls="vw"
-if(!"name" in vw)vw.name="vw"
-$desc=$collectedClasses.vw
-if($desc instanceof Array)$desc=$desc[1]
-vw.prototype=$desc
-function aG(){}aG.builtin$cls="aG"
-if(!"name" in aG)aG.name="aG"
-$desc=$collectedClasses.aG
-if($desc instanceof Array)$desc=$desc[1]
-aG.prototype=$desc
-aG.prototype.gfg=function(receiver){return receiver.height}
-aG.prototype.gR=function(receiver){return receiver.width}
-function J6(){}J6.builtin$cls="J6"
-if(!"name" in J6)J6.name="J6"
-$desc=$collectedClasses.J6
-if($desc instanceof Array)$desc=$desc[1]
-J6.prototype=$desc
-function Oi(){}Oi.builtin$cls="Oi"
-if(!"name" in Oi)Oi.name="Oi"
-$desc=$collectedClasses.Oi
-if($desc instanceof Array)$desc=$desc[1]
-Oi.prototype=$desc
-Oi.prototype.goc=function(receiver){return receiver.name}
-Oi.prototype.soc=function(receiver,v){return receiver.name=v}
-Oi.prototype.gys=function(receiver){return receiver.status}
-function Nn(){}Nn.builtin$cls="Nn"
-if(!"name" in Nn)Nn.name="Nn"
-$desc=$collectedClasses.Nn
-if($desc instanceof Array)$desc=$desc[1]
-Nn.prototype=$desc
-function UM(){}UM.builtin$cls="UM"
-if(!"name" in UM)UM.name="UM"
-$desc=$collectedClasses.UM
-if($desc instanceof Array)$desc=$desc[1]
-UM.prototype=$desc
-UM.prototype.goc=function(receiver){return receiver.name}
-UM.prototype.gP=function(receiver){return receiver.value}
-UM.prototype.sP=function(receiver,v){return receiver.value=v}
-function cF(){}cF.builtin$cls="cF"
-if(!"name" in cF)cF.name="cF"
-$desc=$collectedClasses.cF
-if($desc instanceof Array)$desc=$desc[1]
-cF.prototype=$desc
-function fe(){}fe.builtin$cls="fe"
-if(!"name" in fe)fe.name="fe"
-$desc=$collectedClasses.fe
-if($desc instanceof Array)$desc=$desc[1]
-fe.prototype=$desc
-function ba(){}ba.builtin$cls="ba"
-if(!"name" in ba)ba.name="ba"
-$desc=$collectedClasses.ba
-if($desc instanceof Array)$desc=$desc[1]
-ba.prototype=$desc
-function FR(){}FR.builtin$cls="FR"
-if(!"name" in FR)FR.name="FR"
-$desc=$collectedClasses.FR
-if($desc instanceof Array)$desc=$desc[1]
-FR.prototype=$desc
-FR.prototype.gfg=function(receiver){return receiver.height}
-FR.prototype.gBb=function(receiver){return receiver.left}
-FR.prototype.gip=function(receiver){return receiver.right}
-FR.prototype.gG6=function(receiver){return receiver.top}
-FR.prototype.gR=function(receiver){return receiver.width}
-function S3(){}S3.builtin$cls="S3"
-if(!"name" in S3)S3.name="S3"
-$desc=$collectedClasses.S3
-if($desc instanceof Array)$desc=$desc[1]
-S3.prototype=$desc
-function PR(){}PR.builtin$cls="PR"
-if(!"name" in PR)PR.name="PR"
-$desc=$collectedClasses.PR
-if($desc instanceof Array)$desc=$desc[1]
-PR.prototype=$desc
-function VE(){}VE.builtin$cls="VE"
-if(!"name" in VE)VE.name="VE"
-$desc=$collectedClasses.VE
-if($desc instanceof Array)$desc=$desc[1]
-VE.prototype=$desc
-function SC(){}SC.builtin$cls="SC"
-if(!"name" in SC)SC.name="SC"
-$desc=$collectedClasses.SC
-if($desc instanceof Array)$desc=$desc[1]
-SC.prototype=$desc
-function F2(){}F2.builtin$cls="F2"
-if(!"name" in F2)F2.name="F2"
-$desc=$collectedClasses.F2
-if($desc instanceof Array)$desc=$desc[1]
-F2.prototype=$desc
-function tZ(){}tZ.builtin$cls="tZ"
-if(!"name" in tZ)tZ.name="tZ"
-$desc=$collectedClasses.tZ
-if($desc instanceof Array)$desc=$desc[1]
-tZ.prototype=$desc
-function nK(){}nK.builtin$cls="nK"
-if(!"name" in nK)nK.name="nK"
-$desc=$collectedClasses.nK
-if($desc instanceof Array)$desc=$desc[1]
-nK.prototype=$desc
-function eq(){}eq.builtin$cls="eq"
-if(!"name" in eq)eq.name="eq"
-$desc=$collectedClasses.eq
-if($desc instanceof Array)$desc=$desc[1]
-eq.prototype=$desc
-function c1m(){}c1m.builtin$cls="c1m"
-if(!"name" in c1m)c1m.name="c1m"
-$desc=$collectedClasses.c1m
-if($desc instanceof Array)$desc=$desc[1]
-c1m.prototype=$desc
-function wf(){}wf.builtin$cls="wf"
-if(!"name" in wf)wf.name="wf"
-$desc=$collectedClasses.wf
-if($desc instanceof Array)$desc=$desc[1]
-wf.prototype=$desc
-function Nf(){}Nf.builtin$cls="Nf"
-if(!"name" in Nf)Nf.name="Nf"
-$desc=$collectedClasses.Nf
-if($desc instanceof Array)$desc=$desc[1]
-Nf.prototype=$desc
-function Nc(){}Nc.builtin$cls="Nc"
-if(!"name" in Nc)Nc.name="Nc"
-$desc=$collectedClasses.Nc
-if($desc instanceof Array)$desc=$desc[1]
-Nc.prototype=$desc
-function rj(){}rj.builtin$cls="rj"
-if(!"name" in rj)rj.name="rj"
-$desc=$collectedClasses.rj
-if($desc instanceof Array)$desc=$desc[1]
-rj.prototype=$desc
-function rh(){}rh.builtin$cls="rh"
-if(!"name" in rh)rh.name="rh"
-$desc=$collectedClasses.rh
-if($desc instanceof Array)$desc=$desc[1]
-rh.prototype=$desc
-function q0(){}q0.builtin$cls="q0"
-if(!"name" in q0)q0.name="q0"
-$desc=$collectedClasses.q0
-if($desc instanceof Array)$desc=$desc[1]
-q0.prototype=$desc
-function c5(){}c5.builtin$cls="c5"
-if(!"name" in c5)c5.name="c5"
-$desc=$collectedClasses.c5
-if($desc instanceof Array)$desc=$desc[1]
-c5.prototype=$desc
-function LO(){}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
-if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
-function pz(){}pz.builtin$cls="pz"
-if(!"name" in pz)pz.name="pz"
-$desc=$collectedClasses.pz
-if($desc instanceof Array)$desc=$desc[1]
-pz.prototype=$desc
-function Bo(){}Bo.builtin$cls="Bo"
-if(!"name" in Bo)Bo.name="Bo"
-$desc=$collectedClasses.Bo
-if($desc instanceof Array)$desc=$desc[1]
-Bo.prototype=$desc
-function uI(){}uI.builtin$cls="uI"
-if(!"name" in uI)uI.name="uI"
-$desc=$collectedClasses.uI
-if($desc instanceof Array)$desc=$desc[1]
-uI.prototype=$desc
-function ZO(){}ZO.builtin$cls="ZO"
-if(!"name" in ZO)ZO.name="ZO"
-$desc=$collectedClasses.ZO
-if($desc instanceof Array)$desc=$desc[1]
-ZO.prototype=$desc
-function Q7(){}Q7.builtin$cls="Q7"
-if(!"name" in Q7)Q7.name="Q7"
-$desc=$collectedClasses.Q7
-if($desc instanceof Array)$desc=$desc[1]
-Q7.prototype=$desc
-function hF(){}hF.builtin$cls="hF"
-if(!"name" in hF)hF.name="hF"
-$desc=$collectedClasses.hF
-if($desc instanceof Array)$desc=$desc[1]
-hF.prototype=$desc
-function yK(){}yK.builtin$cls="yK"
-if(!"name" in yK)yK.name="yK"
-$desc=$collectedClasses.yK
-if($desc instanceof Array)$desc=$desc[1]
-yK.prototype=$desc
-function Y0(){}Y0.builtin$cls="Y0"
-if(!"name" in Y0)Y0.name="Y0"
-$desc=$collectedClasses.Y0
-if($desc instanceof Array)$desc=$desc[1]
-Y0.prototype=$desc
-Y0.prototype.gN=function(receiver){return receiver.target}
-Y0.prototype.gmH=function(receiver){return receiver.href}
-function hf(){}hf.builtin$cls="hf"
-if(!"name" in hf)hf.name="hf"
-$desc=$collectedClasses.hf
-if($desc instanceof Array)$desc=$desc[1]
-hf.prototype=$desc
-hf.prototype.gmH=function(receiver){return receiver.href}
-function mU(){}mU.builtin$cls="mU"
-if(!"name" in mU)mU.name="mU"
-$desc=$collectedClasses.mU
-if($desc instanceof Array)$desc=$desc[1]
-mU.prototype=$desc
-function Ns(){}Ns.builtin$cls="Ns"
-if(!"name" in Ns)Ns.name="Ns"
-$desc=$collectedClasses.Ns
-if($desc instanceof Array)$desc=$desc[1]
-Ns.prototype=$desc
-function Ak(){}Ak.builtin$cls="Ak"
-if(!"name" in Ak)Ak.name="Ak"
-$desc=$collectedClasses.Ak
-if($desc instanceof Array)$desc=$desc[1]
-Ak.prototype=$desc
-function y5(){}y5.builtin$cls="y5"
-if(!"name" in y5)y5.name="y5"
-$desc=$collectedClasses.y5
-if($desc instanceof Array)$desc=$desc[1]
-y5.prototype=$desc
-function OS(){}OS.builtin$cls="OS"
-if(!"name" in OS)OS.name="OS"
-$desc=$collectedClasses.OS
-if($desc instanceof Array)$desc=$desc[1]
-OS.prototype=$desc
-function nV(){}nV.builtin$cls="nV"
-if(!"name" in nV)nV.name="nV"
-$desc=$collectedClasses.nV
-if($desc instanceof Array)$desc=$desc[1]
-nV.prototype=$desc
-function Zc(){}Zc.builtin$cls="Zc"
-if(!"name" in Zc)Zc.name="Zc"
-$desc=$collectedClasses.Zc
-if($desc instanceof Array)$desc=$desc[1]
-Zc.prototype=$desc
-function ui(){}ui.builtin$cls="ui"
-if(!"name" in ui)ui.name="ui"
-$desc=$collectedClasses.ui
-if($desc instanceof Array)$desc=$desc[1]
-ui.prototype=$desc
-function D6(){}D6.builtin$cls="D6"
-if(!"name" in D6)D6.name="D6"
-$desc=$collectedClasses.D6
-if($desc instanceof Array)$desc=$desc[1]
-D6.prototype=$desc
-function DQ(){}DQ.builtin$cls="DQ"
-if(!"name" in DQ)DQ.name="DQ"
-$desc=$collectedClasses.DQ
-if($desc instanceof Array)$desc=$desc[1]
-DQ.prototype=$desc
-function Sm(){}Sm.builtin$cls="Sm"
-if(!"name" in Sm)Sm.name="Sm"
-$desc=$collectedClasses.Sm
-if($desc instanceof Array)$desc=$desc[1]
-Sm.prototype=$desc
-function dT(){}dT.builtin$cls="dT"
-if(!"name" in dT)dT.name="dT"
-$desc=$collectedClasses.dT
-if($desc instanceof Array)$desc=$desc[1]
-dT.prototype=$desc
-function D5(){}D5.builtin$cls="D5"
-if(!"name" in D5)D5.name="D5"
-$desc=$collectedClasses.D5
-if($desc instanceof Array)$desc=$desc[1]
-D5.prototype=$desc
-D5.prototype.gq6=function(receiver){return receiver.firstChild}
-D5.prototype.gKV=function(receiver){return receiver.parentNode}
-function bL(){}bL.builtin$cls="bL"
-if(!"name" in bL)bL.name="bL"
-$desc=$collectedClasses.bL
-if($desc instanceof Array)$desc=$desc[1]
-bL.prototype=$desc
-function eG(){}eG.builtin$cls="eG"
-if(!"name" in eG)eG.name="eG"
-$desc=$collectedClasses.eG
-if($desc instanceof Array)$desc=$desc[1]
-eG.prototype=$desc
-eG.prototype.gfg=function(receiver){return receiver.height}
-eG.prototype.gR=function(receiver){return receiver.width}
-function lv(){}lv.builtin$cls="lv"
-if(!"name" in lv)lv.name="lv"
-$desc=$collectedClasses.lv
-if($desc instanceof Array)$desc=$desc[1]
-lv.prototype=$desc
-lv.prototype.gt5=function(receiver){return receiver.type}
-lv.prototype.gUQ=function(receiver){return receiver.values}
-lv.prototype.gfg=function(receiver){return receiver.height}
-lv.prototype.gR=function(receiver){return receiver.width}
-function pf(){}pf.builtin$cls="pf"
-if(!"name" in pf)pf.name="pf"
-$desc=$collectedClasses.pf
-if($desc instanceof Array)$desc=$desc[1]
-pf.prototype=$desc
-pf.prototype.gfg=function(receiver){return receiver.height}
-pf.prototype.gR=function(receiver){return receiver.width}
-function NV(){}NV.builtin$cls="NV"
-if(!"name" in NV)NV.name="NV"
-$desc=$collectedClasses.NV
-if($desc instanceof Array)$desc=$desc[1]
-NV.prototype=$desc
-NV.prototype.gkp=function(receiver){return receiver.operator}
-NV.prototype.gfg=function(receiver){return receiver.height}
-NV.prototype.gR=function(receiver){return receiver.width}
-function Kq(){}Kq.builtin$cls="Kq"
-if(!"name" in Kq)Kq.name="Kq"
-$desc=$collectedClasses.Kq
-if($desc instanceof Array)$desc=$desc[1]
-Kq.prototype=$desc
-Kq.prototype.gfg=function(receiver){return receiver.height}
-Kq.prototype.gR=function(receiver){return receiver.width}
-function zo(){}zo.builtin$cls="zo"
-if(!"name" in zo)zo.name="zo"
-$desc=$collectedClasses.zo
-if($desc instanceof Array)$desc=$desc[1]
-zo.prototype=$desc
-zo.prototype.gfg=function(receiver){return receiver.height}
-zo.prototype.gR=function(receiver){return receiver.width}
-function kK(){}kK.builtin$cls="kK"
-if(!"name" in kK)kK.name="kK"
-$desc=$collectedClasses.kK
-if($desc instanceof Array)$desc=$desc[1]
-kK.prototype=$desc
-kK.prototype.gfg=function(receiver){return receiver.height}
-kK.prototype.gR=function(receiver){return receiver.width}
-function TU(){}TU.builtin$cls="TU"
-if(!"name" in TU)TU.name="TU"
-$desc=$collectedClasses.TU
-if($desc instanceof Array)$desc=$desc[1]
-TU.prototype=$desc
-function bb(){}bb.builtin$cls="bb"
-if(!"name" in bb)bb.name="bb"
-$desc=$collectedClasses.bb
-if($desc instanceof Array)$desc=$desc[1]
-bb.prototype=$desc
-bb.prototype.gfg=function(receiver){return receiver.height}
-bb.prototype.gR=function(receiver){return receiver.width}
-function on(){}on.builtin$cls="on"
-if(!"name" in on)on.name="on"
-$desc=$collectedClasses.on
-if($desc instanceof Array)$desc=$desc[1]
-on.prototype=$desc
-function lc(){}lc.builtin$cls="lc"
-if(!"name" in lc)lc.name="lc"
-$desc=$collectedClasses.lc
-if($desc instanceof Array)$desc=$desc[1]
-lc.prototype=$desc
-function Xu(){}Xu.builtin$cls="Xu"
-if(!"name" in Xu)Xu.name="Xu"
-$desc=$collectedClasses.Xu
-if($desc instanceof Array)$desc=$desc[1]
-Xu.prototype=$desc
-function qM(){}qM.builtin$cls="qM"
-if(!"name" in qM)qM.name="qM"
-$desc=$collectedClasses.qM
-if($desc instanceof Array)$desc=$desc[1]
-qM.prototype=$desc
-function tk(){}tk.builtin$cls="tk"
-if(!"name" in tk)tk.name="tk"
-$desc=$collectedClasses.tk
-if($desc instanceof Array)$desc=$desc[1]
-tk.prototype=$desc
-tk.prototype.gfg=function(receiver){return receiver.height}
-tk.prototype.gR=function(receiver){return receiver.width}
-function Cf(){}Cf.builtin$cls="Cf"
-if(!"name" in Cf)Cf.name="Cf"
-$desc=$collectedClasses.Cf
-if($desc instanceof Array)$desc=$desc[1]
-Cf.prototype=$desc
-Cf.prototype.gfg=function(receiver){return receiver.height}
-Cf.prototype.gR=function(receiver){return receiver.width}
-Cf.prototype.gmH=function(receiver){return receiver.href}
-function qN(){}qN.builtin$cls="qN"
-if(!"name" in qN)qN.name="qN"
-$desc=$collectedClasses.qN
-if($desc instanceof Array)$desc=$desc[1]
-qN.prototype=$desc
-qN.prototype.gfg=function(receiver){return receiver.height}
-qN.prototype.gR=function(receiver){return receiver.width}
-function NY(){}NY.builtin$cls="NY"
-if(!"name" in NY)NY.name="NY"
-$desc=$collectedClasses.NY
-if($desc instanceof Array)$desc=$desc[1]
-NY.prototype=$desc
-function d4(){}d4.builtin$cls="d4"
-if(!"name" in d4)d4.name="d4"
-$desc=$collectedClasses.d4
-if($desc instanceof Array)$desc=$desc[1]
-d4.prototype=$desc
-d4.prototype.gkp=function(receiver){return receiver.operator}
-d4.prototype.gfg=function(receiver){return receiver.height}
-d4.prototype.gR=function(receiver){return receiver.width}
-function MI(){}MI.builtin$cls="MI"
-if(!"name" in MI)MI.name="MI"
-$desc=$collectedClasses.MI
-if($desc instanceof Array)$desc=$desc[1]
-MI.prototype=$desc
-MI.prototype.gfg=function(receiver){return receiver.height}
-MI.prototype.gR=function(receiver){return receiver.width}
-function ca(){}ca.builtin$cls="ca"
-if(!"name" in ca)ca.name="ca"
-$desc=$collectedClasses.ca
-if($desc instanceof Array)$desc=$desc[1]
-ca.prototype=$desc
-function xX(){}xX.builtin$cls="xX"
-if(!"name" in xX)xX.name="xX"
-$desc=$collectedClasses.xX
-if($desc instanceof Array)$desc=$desc[1]
-xX.prototype=$desc
-xX.prototype.gfg=function(receiver){return receiver.height}
-xX.prototype.gR=function(receiver){return receiver.width}
-function eW(){}eW.builtin$cls="eW"
-if(!"name" in eW)eW.name="eW"
-$desc=$collectedClasses.eW
-if($desc instanceof Array)$desc=$desc[1]
-eW.prototype=$desc
-function um(){}um.builtin$cls="um"
-if(!"name" in um)um.name="um"
-$desc=$collectedClasses.um
-if($desc instanceof Array)$desc=$desc[1]
-um.prototype=$desc
-um.prototype.gfg=function(receiver){return receiver.height}
-um.prototype.gR=function(receiver){return receiver.width}
-function tM(){}tM.builtin$cls="tM"
-if(!"name" in tM)tM.name="tM"
-$desc=$collectedClasses.tM
-if($desc instanceof Array)$desc=$desc[1]
-tM.prototype=$desc
-tM.prototype.gt5=function(receiver){return receiver.type}
-tM.prototype.gfg=function(receiver){return receiver.height}
-tM.prototype.gR=function(receiver){return receiver.width}
-function OE(){}OE.builtin$cls="OE"
-if(!"name" in OE)OE.name="OE"
-$desc=$collectedClasses.OE
-if($desc instanceof Array)$desc=$desc[1]
-OE.prototype=$desc
-OE.prototype.gfg=function(receiver){return receiver.height}
-OE.prototype.gR=function(receiver){return receiver.width}
-OE.prototype.gmH=function(receiver){return receiver.href}
-function l6(){}l6.builtin$cls="l6"
-if(!"name" in l6)l6.name="l6"
-$desc=$collectedClasses.l6
-if($desc instanceof Array)$desc=$desc[1]
-l6.prototype=$desc
-l6.prototype.gfg=function(receiver){return receiver.height}
-l6.prototype.gR=function(receiver){return receiver.width}
-function BA(){}BA.builtin$cls="BA"
-if(!"name" in BA)BA.name="BA"
-$desc=$collectedClasses.BA
-if($desc instanceof Array)$desc=$desc[1]
-BA.prototype=$desc
-function zp(){}zp.builtin$cls="zp"
-if(!"name" in zp)zp.name="zp"
-$desc=$collectedClasses.zp
-if($desc instanceof Array)$desc=$desc[1]
-zp.prototype=$desc
-function rE(){}rE.builtin$cls="rE"
-if(!"name" in rE)rE.name="rE"
-$desc=$collectedClasses.rE
-if($desc instanceof Array)$desc=$desc[1]
-rE.prototype=$desc
-rE.prototype.gfg=function(receiver){return receiver.height}
-rE.prototype.gR=function(receiver){return receiver.width}
-rE.prototype.gmH=function(receiver){return receiver.href}
-function Xk(){}Xk.builtin$cls="Xk"
-if(!"name" in Xk)Xk.name="Xk"
-$desc=$collectedClasses.Xk
-if($desc instanceof Array)$desc=$desc[1]
-Xk.prototype=$desc
-Xk.prototype.gP=function(receiver){return receiver.value}
-Xk.prototype.sP=function(receiver,v){return receiver.value=v}
-function NR(){}NR.builtin$cls="NR"
-if(!"name" in NR)NR.name="NR"
-$desc=$collectedClasses.NR
-if($desc instanceof Array)$desc=$desc[1]
-NR.prototype=$desc
-function zw(){}zw.builtin$cls="zw"
-if(!"name" in zw)zw.name="zw"
-$desc=$collectedClasses.zw
-if($desc instanceof Array)$desc=$desc[1]
-zw.prototype=$desc
-function PQ(){}PQ.builtin$cls="PQ"
-if(!"name" in PQ)PQ.name="PQ"
-$desc=$collectedClasses.PQ
-if($desc instanceof Array)$desc=$desc[1]
-PQ.prototype=$desc
-function uz(){}uz.builtin$cls="uz"
-if(!"name" in uz)uz.name="uz"
-$desc=$collectedClasses.uz
-if($desc instanceof Array)$desc=$desc[1]
-uz.prototype=$desc
-function NBZ(){}NBZ.builtin$cls="NBZ"
-if(!"name" in NBZ)NBZ.name="NBZ"
-$desc=$collectedClasses.NBZ
-if($desc instanceof Array)$desc=$desc[1]
-NBZ.prototype=$desc
-NBZ.prototype.gfg=function(receiver){return receiver.height}
-NBZ.prototype.gR=function(receiver){return receiver.width}
-function U0(){}U0.builtin$cls="U0"
-if(!"name" in U0)U0.name="U0"
-$desc=$collectedClasses.U0
-if($desc instanceof Array)$desc=$desc[1]
-U0.prototype=$desc
-function c7(){}c7.builtin$cls="c7"
-if(!"name" in c7)c7.name="c7"
-$desc=$collectedClasses.c7
-if($desc instanceof Array)$desc=$desc[1]
-c7.prototype=$desc
-c7.prototype.gP=function(receiver){return receiver.value}
-c7.prototype.sP=function(receiver,v){return receiver.value=v}
-function LZ(){}LZ.builtin$cls="LZ"
-if(!"name" in LZ)LZ.name="LZ"
-$desc=$collectedClasses.LZ
-if($desc instanceof Array)$desc=$desc[1]
-LZ.prototype=$desc
-function lZ(){}lZ.builtin$cls="lZ"
-if(!"name" in lZ)lZ.name="lZ"
-$desc=$collectedClasses.lZ
-if($desc instanceof Array)$desc=$desc[1]
-lZ.prototype=$desc
-function Dd(){}Dd.builtin$cls="Dd"
-if(!"name" in Dd)Dd.name="Dd"
-$desc=$collectedClasses.Dd
-if($desc instanceof Array)$desc=$desc[1]
-Dd.prototype=$desc
-function wy(){}wy.builtin$cls="wy"
-if(!"name" in wy)wy.name="wy"
-$desc=$collectedClasses.wy
-if($desc instanceof Array)$desc=$desc[1]
-wy.prototype=$desc
-function bH(){}bH.builtin$cls="bH"
-if(!"name" in bH)bH.name="bH"
-$desc=$collectedClasses.bH
-if($desc instanceof Array)$desc=$desc[1]
-bH.prototype=$desc
-function Er(){}Er.builtin$cls="Er"
-if(!"name" in Er)Er.name="Er"
-$desc=$collectedClasses.Er
-if($desc instanceof Array)$desc=$desc[1]
-Er.prototype=$desc
-function pd(){}pd.builtin$cls="pd"
-if(!"name" in pd)pd.name="pd"
-$desc=$collectedClasses.pd
-if($desc instanceof Array)$desc=$desc[1]
-pd.prototype=$desc
-function Vq(){}Vq.builtin$cls="Vq"
-if(!"name" in Vq)Vq.name="Vq"
-$desc=$collectedClasses.Vq
-if($desc instanceof Array)$desc=$desc[1]
-Vq.prototype=$desc
-function AV(){}AV.builtin$cls="AV"
-if(!"name" in AV)AV.name="AV"
-$desc=$collectedClasses.AV
-if($desc instanceof Array)$desc=$desc[1]
-AV.prototype=$desc
-function lX(){}lX.builtin$cls="lX"
-if(!"name" in lX)lX.name="lX"
-$desc=$collectedClasses.lX
-if($desc instanceof Array)$desc=$desc[1]
-lX.prototype=$desc
-function Rt(){}Rt.builtin$cls="Rt"
-if(!"name" in Rt)Rt.name="Rt"
-$desc=$collectedClasses.Rt
-if($desc instanceof Array)$desc=$desc[1]
-Rt.prototype=$desc
-function Gr(){}Gr.builtin$cls="Gr"
-if(!"name" in Gr)Gr.name="Gr"
-$desc=$collectedClasses.Gr
-if($desc instanceof Array)$desc=$desc[1]
-Gr.prototype=$desc
-function zG(){}zG.builtin$cls="zG"
-if(!"name" in zG)zG.name="zG"
-$desc=$collectedClasses.zG
-if($desc instanceof Array)$desc=$desc[1]
-zG.prototype=$desc
-function UF(){}UF.builtin$cls="UF"
-if(!"name" in UF)UF.name="UF"
-$desc=$collectedClasses.UF
-if($desc instanceof Array)$desc=$desc[1]
-UF.prototype=$desc
-function bE(){}bE.builtin$cls="bE"
-if(!"name" in bE)bE.name="bE"
-$desc=$collectedClasses.bE
-if($desc instanceof Array)$desc=$desc[1]
-bE.prototype=$desc
-function ES(){}ES.builtin$cls="ES"
-if(!"name" in ES)ES.name="ES"
-$desc=$collectedClasses.ES
-if($desc instanceof Array)$desc=$desc[1]
-ES.prototype=$desc
-function td(){}td.builtin$cls="td"
-if(!"name" in td)td.name="td"
-$desc=$collectedClasses.td
-if($desc instanceof Array)$desc=$desc[1]
-td.prototype=$desc
-function mo(){}mo.builtin$cls="mo"
-if(!"name" in mo)mo.name="mo"
-$desc=$collectedClasses.mo
-if($desc instanceof Array)$desc=$desc[1]
-mo.prototype=$desc
-function EF(){}EF.builtin$cls="EF"
-if(!"name" in EF)EF.name="EF"
-$desc=$collectedClasses.EF
-if($desc instanceof Array)$desc=$desc[1]
-EF.prototype=$desc
-function oQ(){}oQ.builtin$cls="oQ"
-if(!"name" in oQ)oQ.name="oQ"
-$desc=$collectedClasses.oQ
-if($desc instanceof Array)$desc=$desc[1]
-oQ.prototype=$desc
-function Sv(){}Sv.builtin$cls="Sv"
-if(!"name" in Sv)Sv.name="Sv"
-$desc=$collectedClasses.Sv
-if($desc instanceof Array)$desc=$desc[1]
-Sv.prototype=$desc
-function Dj(){}Dj.builtin$cls="Dj"
-if(!"name" in Dj)Dj.name="Dj"
-$desc=$collectedClasses.Dj
-if($desc instanceof Array)$desc=$desc[1]
-Dj.prototype=$desc
-function Zq(){}Zq.builtin$cls="Zq"
-if(!"name" in Zq)Zq.name="Zq"
-$desc=$collectedClasses.Zq
-if($desc instanceof Array)$desc=$desc[1]
-Zq.prototype=$desc
-function Ac(){}Ac.builtin$cls="Ac"
-if(!"name" in Ac)Ac.name="Ac"
-$desc=$collectedClasses.Ac
-if($desc instanceof Array)$desc=$desc[1]
-Ac.prototype=$desc
-Ac.prototype.gfg=function(receiver){return receiver.height}
-Ac.prototype.gR=function(receiver){return receiver.width}
-Ac.prototype.gmH=function(receiver){return receiver.href}
-function tc(){}tc.builtin$cls="tc"
-if(!"name" in tc)tc.name="tc"
-$desc=$collectedClasses.tc
-if($desc instanceof Array)$desc=$desc[1]
-tc.prototype=$desc
-function GH(){}GH.builtin$cls="GH"
-if(!"name" in GH)GH.name="GH"
-$desc=$collectedClasses.GH
-if($desc instanceof Array)$desc=$desc[1]
-GH.prototype=$desc
-function lo(){}lo.builtin$cls="lo"
-if(!"name" in lo)lo.name="lo"
-$desc=$collectedClasses.lo
-if($desc instanceof Array)$desc=$desc[1]
-lo.prototype=$desc
-function NJ(){}NJ.builtin$cls="NJ"
-if(!"name" in NJ)NJ.name="NJ"
-$desc=$collectedClasses.NJ
-if($desc instanceof Array)$desc=$desc[1]
-NJ.prototype=$desc
-NJ.prototype.gfg=function(receiver){return receiver.height}
-NJ.prototype.gR=function(receiver){return receiver.width}
-function j24(){}j24.builtin$cls="j24"
-if(!"name" in j24)j24.name="j24"
-$desc=$collectedClasses.j24
-if($desc instanceof Array)$desc=$desc[1]
-j24.prototype=$desc
-j24.prototype.gt5=function(receiver){return receiver.type}
-j24.prototype.st5=function(receiver,v){return receiver.type=v}
-j24.prototype.gmH=function(receiver){return receiver.href}
-function vt(){}vt.builtin$cls="vt"
-if(!"name" in vt)vt.name="vt"
-$desc=$collectedClasses.vt
-if($desc instanceof Array)$desc=$desc[1]
-vt.prototype=$desc
-function rQ(){}rQ.builtin$cls="rQ"
-if(!"name" in rQ)rQ.name="rQ"
-$desc=$collectedClasses.rQ
-if($desc instanceof Array)$desc=$desc[1]
-rQ.prototype=$desc
-function Mc(){}Mc.builtin$cls="Mc"
-if(!"name" in Mc)Mc.name="Mc"
-$desc=$collectedClasses.Mc
-if($desc instanceof Array)$desc=$desc[1]
-Mc.prototype=$desc
-function EU(){}EU.builtin$cls="EU"
-if(!"name" in EU)EU.name="EU"
-$desc=$collectedClasses.EU
-if($desc instanceof Array)$desc=$desc[1]
-EU.prototype=$desc
-EU.prototype.gt5=function(receiver){return receiver.type}
-EU.prototype.st5=function(receiver,v){return receiver.type=v}
-function LR(){}LR.builtin$cls="LR"
-if(!"name" in LR)LR.name="LR"
-$desc=$collectedClasses.LR
-if($desc instanceof Array)$desc=$desc[1]
-LR.prototype=$desc
-function MB(){}MB.builtin$cls="MB"
-if(!"name" in MB)MB.name="MB"
-$desc=$collectedClasses.MB
-if($desc instanceof Array)$desc=$desc[1]
-MB.prototype=$desc
-function hy(){}hy.builtin$cls="hy"
-if(!"name" in hy)hy.name="hy"
-$desc=$collectedClasses.hy
-if($desc instanceof Array)$desc=$desc[1]
-hy.prototype=$desc
-hy.prototype.gfg=function(receiver){return receiver.height}
-hy.prototype.gR=function(receiver){return receiver.width}
-function r8(){}r8.builtin$cls="r8"
-if(!"name" in r8)r8.name="r8"
-$desc=$collectedClasses.r8
-if($desc instanceof Array)$desc=$desc[1]
-r8.prototype=$desc
-function aS(){}aS.builtin$cls="aS"
-if(!"name" in aS)aS.name="aS"
-$desc=$collectedClasses.aS
-if($desc instanceof Array)$desc=$desc[1]
-aS.prototype=$desc
-function CG(){}CG.builtin$cls="CG"
-if(!"name" in CG)CG.name="CG"
-$desc=$collectedClasses.CG
-if($desc instanceof Array)$desc=$desc[1]
-CG.prototype=$desc
-function qF(){}qF.builtin$cls="qF"
-if(!"name" in qF)qF.name="qF"
-$desc=$collectedClasses.qF
-if($desc instanceof Array)$desc=$desc[1]
-qF.prototype=$desc
-function mD(){}mD.builtin$cls="mD"
-if(!"name" in mD)mD.name="mD"
-$desc=$collectedClasses.mD
-if($desc instanceof Array)$desc=$desc[1]
-mD.prototype=$desc
-function xN(){}xN.builtin$cls="xN"
-if(!"name" in xN)xN.name="xN"
-$desc=$collectedClasses.xN
-if($desc instanceof Array)$desc=$desc[1]
-xN.prototype=$desc
-xN.prototype.gbP=function(receiver){return receiver.method}
-xN.prototype.gmH=function(receiver){return receiver.href}
-function Eo(){}Eo.builtin$cls="Eo"
-if(!"name" in Eo)Eo.name="Eo"
-$desc=$collectedClasses.Eo
-if($desc instanceof Array)$desc=$desc[1]
-Eo.prototype=$desc
-function pa(){}pa.builtin$cls="pa"
-if(!"name" in pa)pa.name="pa"
-$desc=$collectedClasses.pa
-if($desc instanceof Array)$desc=$desc[1]
-pa.prototype=$desc
-function zY(){}zY.builtin$cls="zY"
-if(!"name" in zY)zY.name="zY"
-$desc=$collectedClasses.zY
-if($desc instanceof Array)$desc=$desc[1]
-zY.prototype=$desc
-zY.prototype.gt5=function(receiver){return receiver.type}
-function NC(){}NC.builtin$cls="NC"
-if(!"name" in NC)NC.name="NC"
-$desc=$collectedClasses.NC
-if($desc instanceof Array)$desc=$desc[1]
-NC.prototype=$desc
-function ox(){}ox.builtin$cls="ox"
-if(!"name" in ox)ox.name="ox"
-$desc=$collectedClasses.ox
-if($desc instanceof Array)$desc=$desc[1]
-ox.prototype=$desc
-ox.prototype.gfg=function(receiver){return receiver.height}
-ox.prototype.gR=function(receiver){return receiver.width}
-ox.prototype.gmH=function(receiver){return receiver.href}
-function ZD(){}ZD.builtin$cls="ZD"
-if(!"name" in ZD)ZD.name="ZD"
-$desc=$collectedClasses.ZD
-if($desc instanceof Array)$desc=$desc[1]
-ZD.prototype=$desc
-function NE(){}NE.builtin$cls="NE"
-if(!"name" in NE)NE.name="NE"
-$desc=$collectedClasses.NE
-if($desc instanceof Array)$desc=$desc[1]
-NE.prototype=$desc
-function YY(){}YY.builtin$cls="YY"
-if(!"name" in YY)YY.name="YY"
-$desc=$collectedClasses.YY
-if($desc instanceof Array)$desc=$desc[1]
-YY.prototype=$desc
-function wD(){}wD.builtin$cls="wD"
-if(!"name" in wD)wD.name="wD"
-$desc=$collectedClasses.wD
-if($desc instanceof Array)$desc=$desc[1]
-wD.prototype=$desc
-wD.prototype.gmH=function(receiver){return receiver.href}
-function BD(){}BD.builtin$cls="BD"
-if(!"name" in BD)BD.name="BD"
-$desc=$collectedClasses.BD
-if($desc instanceof Array)$desc=$desc[1]
-BD.prototype=$desc
-function Me(){}Me.builtin$cls="Me"
-if(!"name" in Me)Me.name="Me"
-$desc=$collectedClasses.Me
-if($desc instanceof Array)$desc=$desc[1]
-Me.prototype=$desc
-function Fi(){}Fi.builtin$cls="Fi"
-if(!"name" in Fi)Fi.name="Fi"
-$desc=$collectedClasses.Fi
-if($desc instanceof Array)$desc=$desc[1]
-Fi.prototype=$desc
-function Qr(){}Qr.builtin$cls="Qr"
-if(!"name" in Qr)Qr.name="Qr"
-$desc=$collectedClasses.Qr
-if($desc instanceof Array)$desc=$desc[1]
-Qr.prototype=$desc
-function We(){}We.builtin$cls="We"
-if(!"name" in We)We.name="We"
-$desc=$collectedClasses.We
-if($desc instanceof Array)$desc=$desc[1]
-We.prototype=$desc
-function hW(){}hW.builtin$cls="hW"
-if(!"name" in hW)hW.name="hW"
-$desc=$collectedClasses.hW
-if($desc instanceof Array)$desc=$desc[1]
-hW.prototype=$desc
-function uY(){}uY.builtin$cls="uY"
-if(!"name" in uY)uY.name="uY"
-$desc=$collectedClasses.uY
-if($desc instanceof Array)$desc=$desc[1]
-uY.prototype=$desc
-function j9(){}j9.builtin$cls="j9"
-if(!"name" in j9)j9.name="j9"
-$desc=$collectedClasses.j9
-if($desc instanceof Array)$desc=$desc[1]
-j9.prototype=$desc
-function HP(){}HP.builtin$cls="HP"
-if(!"name" in HP)HP.name="HP"
-$desc=$collectedClasses.HP
-if($desc instanceof Array)$desc=$desc[1]
-HP.prototype=$desc
-function xJ(){}xJ.builtin$cls="xJ"
-if(!"name" in xJ)xJ.name="xJ"
-$desc=$collectedClasses.xJ
-if($desc instanceof Array)$desc=$desc[1]
-xJ.prototype=$desc
-function l4(){}l4.builtin$cls="l4"
-if(!"name" in l4)l4.name="l4"
-$desc=$collectedClasses.l4
-if($desc instanceof Array)$desc=$desc[1]
-l4.prototype=$desc
-function Il(){}Il.builtin$cls="Il"
-if(!"name" in Il)Il.name="Il"
-$desc=$collectedClasses.Il
-if($desc instanceof Array)$desc=$desc[1]
-Il.prototype=$desc
-function np(){}np.builtin$cls="np"
-if(!"name" in np)np.name="np"
-$desc=$collectedClasses.np
-if($desc instanceof Array)$desc=$desc[1]
-np.prototype=$desc
-function jI(){}jI.builtin$cls="jI"
-if(!"name" in jI)jI.name="jI"
-$desc=$collectedClasses.jI
-if($desc instanceof Array)$desc=$desc[1]
-jI.prototype=$desc
-function Zn(){}Zn.builtin$cls="Zn"
-if(!"name" in Zn)Zn.name="Zn"
-$desc=$collectedClasses.Zn
-if($desc instanceof Array)$desc=$desc[1]
-Zn.prototype=$desc
-function zu(){}zu.builtin$cls="zu"
-if(!"name" in zu)zu.name="zu"
-$desc=$collectedClasses.zu
-if($desc instanceof Array)$desc=$desc[1]
-zu.prototype=$desc
-function tG(){}tG.builtin$cls="tG"
-if(!"name" in tG)tG.name="tG"
-$desc=$collectedClasses.tG
-if($desc instanceof Array)$desc=$desc[1]
-tG.prototype=$desc
-function Ia(){}Ia.builtin$cls="Ia"
-if(!"name" in Ia)Ia.name="Ia"
-$desc=$collectedClasses.Ia
-if($desc instanceof Array)$desc=$desc[1]
-Ia.prototype=$desc
-function xl(){}xl.builtin$cls="xl"
-if(!"name" in xl)xl.name="xl"
-$desc=$collectedClasses.xl
-if($desc instanceof Array)$desc=$desc[1]
-xl.prototype=$desc
-function Rx(){}Rx.builtin$cls="Rx"
-if(!"name" in Rx)Rx.name="Rx"
-$desc=$collectedClasses.Rx
-if($desc instanceof Array)$desc=$desc[1]
-Rx.prototype=$desc
-function je(){}je.builtin$cls="je"
-if(!"name" in je)je.name="je"
-$desc=$collectedClasses.je
-if($desc instanceof Array)$desc=$desc[1]
-je.prototype=$desc
-function Hj(){}Hj.builtin$cls="Hj"
-if(!"name" in Hj)Hj.name="Hj"
-$desc=$collectedClasses.Hj
-if($desc instanceof Array)$desc=$desc[1]
-Hj.prototype=$desc
-Hj.prototype.gtT=function(receiver){return receiver.code}
-Hj.prototype.gG1=function(receiver){return receiver.message}
-function Pk(){}Pk.builtin$cls="Pk"
-if(!"name" in Pk)Pk.name="Pk"
-$desc=$collectedClasses.Pk
-if($desc instanceof Array)$desc=$desc[1]
-Pk.prototype=$desc
-function AS(){}AS.builtin$cls="AS"
-if(!"name" in AS)AS.name="AS"
-$desc=$collectedClasses.AS
-if($desc instanceof Array)$desc=$desc[1]
-AS.prototype=$desc
-function OP(){}OP.builtin$cls="OP"
-if(!"name" in OP)OP.name="OP"
-$desc=$collectedClasses.OP
-if($desc instanceof Array)$desc=$desc[1]
-OP.prototype=$desc
-function oI(){}oI.builtin$cls="oI"
-if(!"name" in oI)oI.name="oI"
-$desc=$collectedClasses.oI
-if($desc instanceof Array)$desc=$desc[1]
-oI.prototype=$desc
-function mJ(){}mJ.builtin$cls="mJ"
-if(!"name" in mJ)mJ.name="mJ"
-$desc=$collectedClasses.mJ
-if($desc instanceof Array)$desc=$desc[1]
-mJ.prototype=$desc
-function rF(){}rF.builtin$cls="rF"
-if(!"name" in rF)rF.name="rF"
-$desc=$collectedClasses.rF
-if($desc instanceof Array)$desc=$desc[1]
-rF.prototype=$desc
-function Sb(){}Sb.builtin$cls="Sb"
-if(!"name" in Sb)Sb.name="Sb"
-$desc=$collectedClasses.Sb
-if($desc instanceof Array)$desc=$desc[1]
-Sb.prototype=$desc
-function ZX(){}ZX.builtin$cls="ZX"
-if(!"name" in ZX)ZX.name="ZX"
-$desc=$collectedClasses.ZX
-if($desc instanceof Array)$desc=$desc[1]
-ZX.prototype=$desc
-function HS(){}HS.builtin$cls="HS"
-if(!"name" in HS)HS.name="HS"
-$desc=$collectedClasses.HS
-if($desc instanceof Array)$desc=$desc[1]
-HS.prototype=$desc
-function Aw(){}Aw.builtin$cls="Aw"
-if(!"name" in Aw)Aw.name="Aw"
-$desc=$collectedClasses.Aw
-if($desc instanceof Array)$desc=$desc[1]
-Aw.prototype=$desc
-function zt(){}zt.builtin$cls="zt"
-if(!"name" in zt)zt.name="zt"
-$desc=$collectedClasses.zt
-if($desc instanceof Array)$desc=$desc[1]
-zt.prototype=$desc
-function F0(){}F0.builtin$cls="F0"
-if(!"name" in F0)F0.name="F0"
-$desc=$collectedClasses.F0
-if($desc instanceof Array)$desc=$desc[1]
-F0.prototype=$desc
-function Wv(call$2,$name){this.call$2=call$2
-this.$name=$name}Wv.builtin$cls="Wv"
-$desc=$collectedClasses.Wv
-if($desc instanceof Array)$desc=$desc[1]
-Wv.prototype=$desc
+zy.prototype=$desc
 function Nb(call$1,$name){this.call$1=call$1
 this.$name=$name}Nb.builtin$cls="Nb"
 $desc=$collectedClasses.Nb
 if($desc instanceof Array)$desc=$desc[1]
 Nb.prototype=$desc
-function Fy(call$0,$name){this.call$0=call$0
-this.$name=$name}Fy.builtin$cls="Fy"
-$desc=$collectedClasses.Fy
+function HB(call$0,$name){this.call$0=call$0
+this.$name=$name}HB.builtin$cls="HB"
+$desc=$collectedClasses.HB
 if($desc instanceof Array)$desc=$desc[1]
-Fy.prototype=$desc
+HB.prototype=$desc
 function eU(call$7,$name){this.call$7=call$7
 this.$name=$name}eU.builtin$cls="eU"
 $desc=$collectedClasses.eU
 if($desc instanceof Array)$desc=$desc[1]
 eU.prototype=$desc
-function WvQ(call$2,$name){this.call$2=call$2
-this.$name=$name}WvQ.builtin$cls="WvQ"
-$desc=$collectedClasses.WvQ
+function ADW(call$2,$name){this.call$2=call$2
+this.$name=$name}ADW.builtin$cls="ADW"
+$desc=$collectedClasses.ADW
 if($desc instanceof Array)$desc=$desc[1]
-WvQ.prototype=$desc
+ADW.prototype=$desc
 function Ri(call$5,$name){this.call$5=call$5
 this.$name=$name}Ri.builtin$cls="Ri"
 $desc=$collectedClasses.Ri
@@ -28854,4 +27375,4 @@
 $desc=$collectedClasses.PW
 if($desc instanceof Array)$desc=$desc[1]
 PW.prototype=$desc
-return[Lt,vB,yE,PE,QI,Tm,kd,Q,C7,jx,y4,Jt,P,im,Pp,O,PK,JO,O2,aX,cC,Ip,RA,IY,In,jl,BR,JM,Ua,JG,ns,wd,TA,MT,yc,I9,Bj,NO,II,fP,X1,HU,Pm,oo,OW,jP,AP,yH,FA,Av,oH,LP,QS,WT,p8,XR,LI,A2,F3,u8,Gi,t2,Zr,W0,az,vV,Hk,XO,dr,TL,KX,uZ,OQ,Tp,v,Z3,D2,GT,Pe,Eq,cu,Lm,Vs,VR,EK,KW,Pb,tQ,aC,Vf,Be,Vc,i6,WZ,wJ,aL,bX,wi,i1,xy,MH,A8,U5,SO,zs,rR,Fu,SU,Ja,XC,iK,GD,Sn,nI,jU,Lj,mb,am,cw,EE,Uz,Xd,Kv,BI,y1,U2,iu,mg,zE,bl,Ef,Oo,Tc,Wf,Rk,Gt,J0,Ld,Sz,Zk,fu,ng,Ar,ye,Gj,Zz,Xh,Ca,Ik,JI,WV,CQ,dz,tK,OR,Bg,DL,b8,j7,oV,TP,P0,Zf,vs,da,xw,dm,rH,ZL,mi,jb,wB,Gv,qh,Lp,Rv,QC,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,xp,UH,Z5,Om,Sq,KU,Yd,qC,j5,MO,ms,UO,Bc,vp,of,q1,rK,ly,QW,O9,yU,nP,KA,Vo,qB,ez,fI,LV,DS,yR,B3,CR,ny,v1,uR,QX,YR,eO,Dw,fB,nO,t3,dX,aY,yQ,e4,JB,Id,cP,SV,fZ,TF,K5,Cg,Hs,uo,bq,pK,eM,Ue,W5,MA,k6,oi,ce,o2,jG,fG,nm,YB,iX,ou,S9,ey,xd,v6,db,Tz,N6,jg,YO,oz,b6,ef,zQ,Yp,u3,mk,mW,n0,ar,lD,ZQ,Sw,o0,a1,jp,Xt,Ba,An,LD,pi,OG,ro,DN,ZM,Iy,CM,f1,Uk,wI,ob,Ud,K8,by,ct,Mx,Sh,IH,u5,Vx,Rw,GY,jZ,h0,CL,uA,a2,fR,iP,MF,Rq,Hn,Zl,pl,a6,P7,DW,Ge,LK,AT,bJ,mp,ub,ds,lj,UV,VS,t7,HG,aE,kM,EH,cX,Yl,Z0,c8,a,Od,mE,WU,Rn,wv,uq,iD,hb,XX,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,ud,hQ,Nw,kZ,JT,d9,rI,QZ,BV,id,yo,ec,wz,Lc,M5,Jn,DM,zL,Gb,xt,ecX,Kx,hH,bU,nj,w1p,e7,RAp,kEI,nNL,x5e,KS,bD,yoo,HRa,zLC,t7i,t8,an,dxW,rrb,hmZ,rla,xth,Gba,hw,ST,Ocb,maa,nja,e0,qba,e5,R2,e6,R3,e8,cf,E9,nF,FK,Si,vf,Fc,hD,I4,RO,eu,ie,Ea,pu,iN,TX,qO,RX,Ov,I2,bO,Gm,W9,vZ,dW,PA,H2,R7,e9,R9,e10,R10,e11,R11,e12,O7,R12,e13,R13,e14,R14,e15,HI,E4,ZG,r7,DV,Hp,U7,vr,HD,tn,QF,VL,D4,Ms,RS,RY,Ys,WS,xG,Vj,VW,RK,DH,ZK,KB,nb,Rb,Vju,xGn,RKu,VWk,TkQ,DHb,ZKG,Hna,w6W,G8,UZ,Fv,pv,Ir,wa,Gk,Vfx,Ds,Dsd,CA,YL,KC,xL,As,GE,u7,St,tuj,vj,Vct,CX,D13,TJ,aO,Ng,HV,Nh,fA,tz,bW,PO,oB,ih,mL,bv,pt,Zd,dY,vY,zZ,dS,yV,OH,Nu,pF,Ha,tb,F1,uL,Xf,Pi,yj,qI,W4,zF,Xa,Mu,vl,X6,xh,Pc,uF,HA,br,zT,WR,qL,NG,C4,Kt,hh,Md,km,o5,jB,zI,Zb,bF,iV,Qt,Dk,jY,E5,rm,eY,MM,BE,Qb,xI,ib,Zj,XP,q6,jd,HO,BO,oF,Oc,fh,w9,fTP,yL,dM,WC,Xi,TV,Mq,Oa,n1,xf,bo,uJ,hm,Ji,Bf,ir,Sa,GN,k8,HJ,S0,V3,Bl,pM,i2,W6,Lf,fT,pp,Nq,nl,mf,ej,HK,w10,o8,GL,G3,mY,fE,mB,XF,iH,Uf,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w2,w3,w4,w5,c4,z6,Ay,Ed,G1,Os,Dl,DK,x5,ev,ID,jV,ek,OC,IC,Jy,ky,fa,WW,vQ,a9,jh,e3,VA,J1,JH,fk,wL,B0,Fq,Af,EZ,no,kB,dC,Iq,w6,jK,uk,K9,RW,xs,FX,O1,Bt,vR,Pn,hc,hA,fr,cfS,M9,uw,WZq,V2,D8,rP,ll,lP,ik,LfS,NP,Vh,r0,jz,SA,zV,nv,ee,hs,yp,T4,TR,ug,DT,OB,w7,N9,NW,Hh,TG,lE,XT,ic,VT,y3,Oh,qE,vH,Ps,NF,fY,Mr,lJ,P2,nB,i3,it,Az,QP,uQ,n6,mT,OM,Mb,fW,di,v7,XQ,nS,yJ,SR,iZ,U1,cV,wN,QJ,x1,ty,lw,oJ,kh,zC,c0,dO,DG,Ff,kO,xm,MY,rD,rV,Wy,YN,bA,Wq,rz,cA,ae,u1,cv,Al,SX,ea,D0,as,T5,Aa,XV,cr,Yu,Io,iG,kF,Ax,tA,xn,Vb,QH,YP,X2,fJ,EA,Sg,pA,Mi,HN,Xb,Gx,eP,JP,Og,cS,M6O,El,zm,Y7,o9,ku,Ih,lx,uB,qm,ZY,cx,la,Vn,PG,xe,Hw,QT,tH,AW,ql,OK,Aj,oU,qT,KV,BH,mh,G7,l9,Ql,Xp,bP,FH,iL,me,qp,Ev,ni,p3,qj,qW,KR,kQ,fs,bT,UL,MC,wh,j2,Eag,lp,pD,I0,x8,Mkk,QR,Cp,KI,AM,ua,dZ,tr,mG,Ul,l8,G0,ii,fq,xr,h4,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,A1,MN,X0,u4,tL,a3,y6,bj,RH,pU,Lq,Mf,dp,vw,aG,J6,Oi,Nn,UM,cF,fe,ba,FR,S3,PR,VE,SC,F2,tZ,nK,eq,c1m,wf,Nf,Nc,rj,rh,q0,c5,LO,pz,Bo,uI,ZO,Q7,hF,yK,Y0,hf,mU,Ns,Ak,y5,OS,nV,Zc,ui,D6,DQ,Sm,dT,D5,bL,eG,lv,pf,NV,Kq,zo,kK,TU,bb,on,lc,Xu,qM,tk,Cf,qN,NY,d4,MI,ca,xX,eW,um,tM,OE,l6,BA,zp,rE,Xk,NR,zw,PQ,uz,NBZ,U0,c7,LZ,lZ,Dd,wy,bH,Er,pd,Vq,AV,lX,Rt,Gr,zG,UF,bE,ES,td,mo,EF,oQ,Sv,Dj,Zq,Ac,tc,GH,lo,NJ,j24,vt,rQ,Mc,EU,LR,MB,hy,r8,aS,CG,qF,mD,xN,Eo,pa,zY,NC,ox,ZD,NE,YY,wD,BD,Me,Fi,Qr,We,hW,uY,j9,HP,xJ,l4,Il,np,jI,Zn,zu,tG,Ia,xl,Rx,je,Hj,Pk,AS,OP,oI,mJ,rF,Sb,ZX,HS,Aw,zt,F0,Wv,Nb,Fy,eU,WvQ,Ri,kq,Ag,PW]}
\ No newline at end of file
+return[qE,Yy,Ps,rK,fY,Mr,zx,ct,nB,i3,it,Az,QP,QW,n6,Ny,OM,QQ,MA,y4,d7,Rb,oJ,DG,mN,vH,hh,Em,Sb,rV,Wy,YN,bA,Wq,rz,BK,wj,cv,Fs,SX,ea,D0,as,T5,Aa,u5,Yu,iG,jP,U2,tA,xn,Vb,QH,ST,X2,fJ,Vi,tX,Sg,pA,Mi,Gt,In,Gx,eP,AL,Og,cS,M6,El,zm,SV,aB,ku,Ih,cW,DK,qm,ZY,cx,la,Vn,PG,xe,Hw,bn,Im,oB,Aj,oU,qT,KV,BH,mh,G7,wq,Ql,Xp,bP,mX,SN,HD,ni,p3,qj,qW,KR,ew,fs,bX,BL,MC,Mx,j2,yz,lp,kd,I0,QR,Cp,ua,zD,Ul,G0,wb,fq,h4,qk,GI,Tb,Iv,BT,yY,kJ,AE,xV,FH,y6,RH,pU,Lq,Mf,BR,r4,aG,J6,K5,UM,WS,rq,nK,kc,ij,ty,Nf,Nc,rj,rh,Zv,Q7,hF,yK,Y0,ZJ,mU,eZ,Ak,y5,nV,Zc,ui,D6,DQ,Sm,dx,es,eG,lv,pf,NV,W1,zo,wf,TU,bb,VE,zp,Xu,lu,tk,me,qN,NY,d4,MI,ca,kK,eW,um,Fu,OE,l6,BA,tp,rE,CC,PQ,uz,Yd,U0,AD,Gr,tc,GH,lo,NJ,nd,vt,rQ,EU,LR,MB,hy,r8,aS,CG,qF,MT,Rk,Eo,Dn,ox,ZD,NE,wD,BD,vRT,Fi,Qr,mj,cB,uY,yR,AX,xJ,l4,Et,NC,nb,By,xt,tG,P0,Jq,Xr,qD,Cf,AS,Kq,oI,mJ,rF,vi,ZX,hn,nE,zt,F0,Lt,Gv,kn,PE,QI,Tm,is,Q,jx,ZC,Jt,P,im,Pp,O,PK,JO,O2,aX,cC,RA,IY,JH,jl,Iy,JM,Ua,JG,ns,wd,TA,YP,yc,I9,Bj,NO,II,aJ,X1,HU,Pm,oo,OW,Dd,AP,yH,FA,Av,oH,LP,c2,WT,p8,XR,LI,A2,F3,u8,Gi,t2,Zr,ZQ,az,vV,Hk,XO,dr,TL,KX,uZ,OQ,Tp,v,Z3,D2,GT,Pe,Eq,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,aC,Vf,Be,tu,i6,Vc,zO,aL,nH,a7,i1,xy,MH,A8,U5,SO,zs,rR,AM,d5,U1,SJ,SU,Tv,XC,iK,GD,Sn,nI,jU,Lj,mb,am,cw,EE,Uz,uh,Kv,oP,YX,BI,y1,M2,iu,mg,zE,bl,Ef,Oo,Tc,Ax,Wf,Un,Ei,U7,t0,Ld,Sz,Zk,fu,ng,Ar,jB,ye,Gj,Zz,Xh,Ca,Ik,JI,Ip,WV,C7,CQ,dz,tK,OR,Bg,DL,b8,j7,oV,TP,Zf,vs,da,xw,dm,rH,ZL,mi,jb,wB,Pu,qh,QC,Yl,Rv,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,xp,UH,Z5,ii,ib,MO,ms,UO,Bc,vp,lk,Gh,XB,ly,cK,O9,yU,nP,KA,Vo,qB,ez,fI,LV,DS,dp,B3,CR,ny,dR,uR,QX,YR,fB,eO,nO,t3,dq,dX,aY,wJ,e4,JB,Id,fZ,TF,Xz,Cg,Hs,uo,pK,eM,Ue,W5,R8,k6,oi,ce,o2,jG,fG,EQ,YB,iX,ou,S9,ey,xd,v6,db,Cm,N6,jg,YO,oz,b6,ef,zQ,Yp,u3,mW,ar,lD,W0,Sw,o0,a1,jp,Xt,Ba,An,LD,YI,OG,ro,DN,ZM,HW,JC,f1,Uk,wI,ob,by,QM,z0,Vx,Rw,h0,CL,K8,a2,fR,iP,MF,Rq,Hn,Zl,pl,a6,P7,DW,Ge,LK,AT,bJ,mp,ub,ds,lj,UV,VS,t7,HG,aE,kM,EH,cX,Fl,L8,c8,a,Od,mE,WU,Rn,wv,uq,iD,hb,XX,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,hQ,Nw,kZ,JT,d9,rI,QZ,BV,E1,wz,B1,M5,Jn,DM,zL,ec,Kx,iO,bU,e7,nj,rl,RAp,Gb,cf,E9,nF,FK,Si,vf,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,kG,Gm,W9,vZ,dW,PA,H2,O7,HI,E4,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,QF,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,vg,xG,Vj,VW,RK,DH,ZK,Th,Vju,KB,RKu,na,TkQ,xGn,ZKG,VWk,w6W,DHb,z9g,G8,UZ,Fv,WZ,I3,pv,Gk,Vfx,Ds,Dsd,CA,YL,KC,xL,As,GE,u7,St,tuj,vj,Vct,CX,D13,TJ,dG,Ng,HV,Nh,fA,tz,jR,PO,c5,ih,mL,bv,pt,Zd,dY,vY,dS,ZW,dZ,Qe,Nu,pF,Ha,jI,F1,uL,Xf,Pi,yj,qI,J3,E5,o5,b5,zI,Zb,id,iV,W4,Fa,ma,d3,X6,xh,wn,uF,cj,HA,br,zT,D7,qL,C4,l9,lP,km,Qt,Dk,A0,rm,eY,OO,BE,Qb,xI,q1,Zj,XP,q6,CK,BO,ZG,Oc,MX,w12,fTP,yL,dM,Y7,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Tt,GN,k8,HJ,S0,V3,Bl,pM,Mh,Md,Lf,fT,pp,Nq,nl,mf,ej,HK,w13,o8,GL,e9,Dw,Xy,uK,mY,fE,mB,XF,iH,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w9,w10,w11,c4,z6,Ay,Ed,G1,Os,Dl,Wh,x5,ev,ID,jV,ek,OC,Xm,Jy,ky,fa,WW,vQ,a9,jh,e3,VA,J1,fk,wL,B0,Fq,hw,EZ,no,kB,ae,Iq,w6,jK,uk,K9,RW,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,a0,NQ,uw,WZq,V2,D8,jY,ll,Uf,ik,LfS,NP,Vh,r0,jz,SA,zV,nv,ee,XI,hs,yp,ug,DT,OB,Ra,N9,NW,HS,TG,ts,Kj,VU,Ya,XT,ic,VT,T4,TR,VD,Oh,zy,Nb,HB,eU,ADW,Ri,kq,Ag,PW]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.html b/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.html
index be39f31..525035f 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/observatory_elements/class_view.html
@@ -1,5 +1,6 @@
 <head>
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="error_view.html">
 </head>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
@@ -38,36 +39,41 @@
               </tr>
             </tbody>
           </table>
-          <blockquote><strong>Fields</strong></blockquote>
-          <table class="table table-hover">
-            <thead>
-              <tr>
-                <th>User Name</th>
-                <th>VM Name</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr template repeat="{{ field in cls['fields'] }}">
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['user_name'] }}</a></td>
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['name'] }}</a></td>
-              </tr>
-            </tbody>
-          </table>
-          <blockquote><strong>Functions</strong></blockquote>
-          <table class="table table-hover">
-            <thead>
-              <tr>
-                <th>User Name</th>
-                <th>VM Name</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr template repeat="{{ function in cls['functions'] }}">
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['user_name'] }}</a></td>
-                <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['name'] }}</a></td>
-              </tr>
-            </tbody>
-          </table>
+          <template if="{{ cls['error'] == null }}">
+            <blockquote><strong>Fields</strong></blockquote>
+            <table class="table table-hover">
+              <thead>
+                <tr>
+                  <th>User Name</th>
+                  <th>VM Name</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr template repeat="{{ field in cls['fields'] }}">
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['user_name'] }}</a></td>
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">{{ field['name'] }}</a></td>
+                </tr>
+              </tbody>
+            </table>
+            <blockquote><strong>Functions</strong></blockquote>
+            <table class="table table-hover">
+              <thead>
+                <tr>
+                  <th>User Name</th>
+                  <th>VM Name</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr template repeat="{{ function in cls['functions'] }}">
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['user_name'] }}</a></td>
+                  <td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['name'] }}</a></td>
+                </tr>
+              </tbody>
+            </table>
+          </template>
+          <template if="{{ cls['error'] != null }}">
+            <error-view error_obj="{{ cls['error'] }}"></error-view>
+          </template>
         </div>
       </div>
     </div>
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.dart b/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.dart
index 256a21d..787dba1 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.dart
@@ -11,6 +11,7 @@
 @CustomTag('error-view')
 class ErrorViewElement extends ObservatoryElement {
   @published String error = '';
+  @published error_obj;
 
   ErrorViewElement.created() : super.created();
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.html b/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.html
index 70153f2..db52e40 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/observatory_elements/error_view.html
@@ -8,7 +8,12 @@
       <div class="panel panel-danger">
         <div class="panel-heading">Error</div>
         <div class="panel-body">
-          <p>{{ error }}</p>
+          <template if="{{ (error_obj == null) || (error_obj['type'] != 'LanguageError') }}">
+            <p>{{ error }}</p>
+          </template>
+          <template if="{{ (error_obj != null) && (error_obj['type'] == 'LanguageError') }}">
+            <pre>{{ error_obj['error_msg'] }}</pre>
+          </template>
         </div>
       </div>
     </div>
diff --git a/runtime/bin/vmservice/client/precommit.sh b/runtime/bin/vmservice/client/precommit.sh
index 4949ada..3ce83cd 100755
--- a/runtime/bin/vmservice/client/precommit.sh
+++ b/runtime/bin/vmservice/client/precommit.sh
@@ -17,13 +17,15 @@
 
 # Base directory
 BASE="out/web"
+DEPLOYED="deployed/web"
 
 INPUT="$BASE/$SHADOW_DOM"
 INPUT="$INPUT $BASE/$CUSTOM_ELEMENTS"
 INPUT="$INPUT $BASE/$INTEROP"
 INPUT="$INPUT $BASE/$OBSERVATORY"
 
-OUTPUT="$BASE/index.html_bootstrap.dart.js"
+OUTPUT="$DEPLOYED/index.html_bootstrap.dart.js"
 
 # Rolling
 cat $INPUT > $OUTPUT
+cp $BASE/index.html $DEPLOYED/index.html
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 36130fa..24f6f7a 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -47,7 +47,7 @@
 static const char* kVMServiceLibraryName =
     kLibraryResourceNamePrefix "/vmservice.dart";
 
-#define kClientResourceNamePrefix "/vmservice/client/out/web"
+#define kClientResourceNamePrefix "/vmservice/client/deployed/web"
 
 Dart_Isolate VmService::isolate_ = NULL;
 Dart_Port VmService::port_ = ILLEGAL_PORT;
diff --git a/runtime/dart-runtime.gyp b/runtime/dart-runtime.gyp
index f89950a..bca674f 100644
--- a/runtime/dart-runtime.gyp
+++ b/runtime/dart-runtime.gyp
@@ -111,11 +111,53 @@
         'vm/libdart_dependency_helper.cc',
       ],
     },
+    # Targets coming from dart/dart.gyp.
     {
-      'target_name': 'runtime_packages',
+      'target_name': 'runtime_all',
       'type': 'none',
       'dependencies': [
         '../pkg/pkg.gyp:pkg_packages',
+        'sample_extension',
+      ],
+    },
+    {
+      'target_name': 'sample_extension',
+      'type': 'shared_library',
+      'dependencies': [
+        'dart',
+      ],
+      'include_dirs': [
+        '.',
+      ],
+      'sources': [
+        '../samples/sample_extension/sample_extension.cc',
+        '../samples/sample_extension/sample_extension_dllmain_win.cc',
+      ],
+      'defines': [
+        'DART_SHARED_LIB',
+      ],
+      'conditions': [
+        ['OS=="win"', {
+          'msvs_settings': {
+            'VCLinkerTool': {
+              'AdditionalDependencies': [ 'dart.lib' ],
+              'AdditionalLibraryDirectories': [ '<(PRODUCT_DIR)' ],
+            },
+          },
+        }],
+        ['OS=="mac"', {
+          'xcode_settings': {
+            'OTHER_LDFLAGS': [
+              '-undefined',
+              'dynamic_lookup',
+            ],
+          },
+        }],
+        ['OS=="linux"', {
+          'cflags': [
+            '-fPIC',
+          ],
+        }],
       ],
     },
   ],
diff --git a/runtime/include/dart_debugger_api.h b/runtime/include/dart_debugger_api.h
index 0c9c404..00d9d70 100755
--- a/runtime/include/dart_debugger_api.h
+++ b/runtime/include/dart_debugger_api.h
@@ -352,17 +352,28 @@
 DART_EXPORT Dart_ExceptionPauseInfo Dart_GetExceptionPauseInfo();
 
 /**
- * Returns in \trace the the current stack trace, or NULL if the
+ * Returns in \trace the current stack trace, or NULL if the
  * VM is not paused.
  *
  * Requires there to be a current isolate.
  *
- * \return A handle to the True object if no error occurs.
+ * \return A valid handle if no error occurs during the operation.
  */
 DART_EXPORT Dart_Handle Dart_GetStackTrace(Dart_StackTrace* trace);
 
 
 /**
+ * Returns in \trace the stack trace associated with the error given in \handle.
+ *
+ * Requires there to be a current isolate.
+ *
+ * \return A valid handle if no error occurs during the operation.
+ */
+DART_EXPORT Dart_Handle Dart_GetStackTraceFromError(Dart_Handle error,
+                                                    Dart_StackTrace* trace);
+
+
+/**
  * Returns in \length the number of activation frames in the given
  * stack trace.
  *
@@ -390,29 +401,27 @@
 
 
 /**
- * DEPRECATED -- Use Dart_ActivationFrameGetLocation instead.
- *
  * Returns information about the given activation frame.
  * \function_name receives a string handle with the qualified
  *    function name.
  * \script_url receives a string handle with the url of the
  *    source script that contains the frame's function.
  * \line_number receives the line number in the script.
- * \library_id receives the id of the library in which the
- *    function in this frame is defined.
+ * \col_number receives the column number in the script, or -1 if column
+ *    information is not available
  *
  * Any or all of the out parameters above may be NULL.
  *
  * Requires there to be a current isolate.
  *
- * \return A handle to the True object if no error occurs.
+ * \return A valid handle if no error occurs during the operation.
  */
 DART_EXPORT Dart_Handle Dart_ActivationFrameInfo(
                             Dart_ActivationFrame activation_frame,
                             Dart_Handle* function_name,
                             Dart_Handle* script_url,
                             intptr_t* line_number,
-                            intptr_t* library_id);
+                            intptr_t* column_number);
 
 
 /**
@@ -559,6 +568,27 @@
                                           Dart_Handle* static_fields);
 
 
+/** Returns info about the given closure \closure.
+ *
+ * \param name receives handle to closure name (string).
+ *        Receives a null handle if the closure is anonymous.
+ * \param signature receives handle to closure signature (string).
+ * \param location.script_url receives a string handle with the url of
+ *        the source script that contains the closure.
+ *        Receives a null handle if there is no textual location
+ *        that corresponds to the fucntion.
+ * \param location.library_id receives the id of the library in which the
+ *        function in this frame is defined.
+ * \param location.token_pos receives the token position in the script.
+ *
+ * \return A handle to the value true if no error occurs.
+ */
+DART_EXPORT Dart_Handle Dart_GetClosureInfo(Dart_Handle closure,
+                                            Dart_Handle* name,
+                                            Dart_Handle* signature,
+                                            Dart_CodeLocation* location);
+
+
 /**
  * Returns an array containing all instance field names and values of
  * the given \object.
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index ffadba8..0a8038e 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -185,10 +185,4 @@
  */
 DART_EXPORT Dart_Handle Dart_CompileAll();
 
-/**
- * Check that all function fingerprints are OK.
- *
- */
-DART_EXPORT Dart_Handle Dart_CheckFunctionFingerprints();
-
 #endif  /* INCLUDE_DART_NATIVE_API_H_ */  /* NOLINT */
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 3e9137d..aa613cc 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -68,11 +68,11 @@
   const String& dst_type_name =
       String::CheckedHandle(arguments->NativeArgAt(2));
   const String& dst_name = String::CheckedHandle(arguments->NativeArgAt(3));
-  const String& type_error = String::CheckedHandle(arguments->NativeArgAt(4));
+  const String& error_msg = String::CheckedHandle(arguments->NativeArgAt(4));
   const String& src_type_name =
       String::Handle(Type::Handle(src_value.GetType()).UserVisibleName());
   Exceptions::CreateAndThrowTypeError(location, src_type_name,
-                                      dst_type_name, dst_name, type_error);
+                                      dst_type_name, dst_name, error_msg);
   UNREACHABLE();
   return Object::null();
 }
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 730e799..6bb2572 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -44,7 +44,7 @@
                    Object src_value,
                    String dst_type_name,
                    String dst_name,
-                   String bound_error)
+                   String error_msg)
       native "TypeError_throwNew";
 
   String toString() {
@@ -53,7 +53,7 @@
       str = "${str}type '$_srcType' is not a subtype of "
             "type '$_dstType' of '$_dstName'.";
     } else {
-      str = "${str}malformed type used.";
+      str = "${str}type error.";
     }
     return str;
   }
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index cc9a9fc..7f7fc90 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -275,8 +275,8 @@
 
     while (val > 0) {
       int digit = val % 10;
-      reversed[index++] = (digit + 0x30);
       val = val ~/ 10;
+      reversed[index++] = (digit + 0x30);
     }
     if (negative) reversed[index++] = 0x2D;  // '-'.
 
@@ -289,7 +289,7 @@
 }
 
 // Reusable buffer used by smi.toString.
-List _toStringBuffer = new Uint8List(20);
+final List _toStringBuffer = new Uint8List(20);
 
 // Represents integers that cannot be represented by Smi but fit into 64bits.
 class _Mint extends _IntegerImplementation implements int {
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index f900083..0f7da54 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -95,18 +95,17 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 3) {
+DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, send_id, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, reply_id, arguments->NativeArgAt(1));
   // TODO(iposva): Allow for arbitrary messages to be sent.
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(2));
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
 
   uint8_t* data = NULL;
   MessageWriter writer(&data, &allocator);
   writer.WriteMessage(obj);
 
   // TODO(turnidge): Throw an exception when the return value is false?
-  PortMap::PostMessage(new Message(send_id.Value(), reply_id.Value(),
+  PortMap::PostMessage(new Message(send_id.Value(), Message::kIllegalPort,
                                    data, writer.BytesWritten(),
                                    Message::kNormalPriority));
   return Object::null();
@@ -216,30 +215,22 @@
 
 DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0));
-  bool throw_exception = false;
-  Function& func = Function::Handle();
   if (closure.IsClosure()) {
+    Function& func = Function::Handle();
     func = Closure::function(closure);
-    const Class& cls = Class::Handle(func.Owner());
-    if (!func.IsClosureFunction() || !func.is_static() || !cls.IsTopLevel()) {
-      throw_exception = true;
-    }
-  } else {
-    throw_exception = true;
-  }
-  if (throw_exception) {
-    const String& msg = String::Handle(String::New(
-        "Isolate.spawn expects to be passed a top-level function"));
-    Exceptions::ThrowArgumentError(msg);
-  }
-
+    if (func.IsImplicitClosureFunction() && func.is_static()) {
 #if defined(DEBUG)
-  Context& ctx = Context::Handle();
-  ctx = Closure::context(closure);
-  ASSERT(ctx.num_variables() == 0);
+      Context& ctx = Context::Handle();
+      ctx = Closure::context(closure);
+      ASSERT(ctx.num_variables() == 0);
 #endif
-
-  return Spawn(arguments, new IsolateSpawnState(func));
+      return Spawn(arguments, new IsolateSpawnState(func));
+    }
+  }
+  const String& msg = String::Handle(String::New(
+      "Isolate.spawn expects to be passed a static or top-level function"));
+  Exceptions::ThrowArgumentError(msg);
+  return Object::null();
 }
 
 
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 99d0d69..46e4f40 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "dart:collection" show HashMap;
+
 patch class ReceivePort {
   /* patch */ factory ReceivePort() = _ReceivePortImpl;
 
@@ -111,7 +113,7 @@
 class _SendPortImpl implements SendPort {
   /*--- public interface ---*/
   void send(var message) {
-    _sendInternal(_id, 0, message);
+    _sendInternal(_id, message);
   }
 
   bool operator==(var other) {
@@ -140,8 +142,7 @@
 
   // Forward the implementation of sending messages to the VM. Only port ids
   // are being handed to the VM.
-  // TODO(14731): Remove replyId argument.
-  static _sendInternal(int sendId, int replyId, var message)
+  static _sendInternal(int sendId, var message)
       native "SendPortImpl_sendInternal_";
 
   final int _id;
@@ -214,7 +215,7 @@
         completer.complete(new Isolate._fromControlPort(controlPort));
       };
     } catch(e, st) {
-      // TODO(floitsch): we want errors to go into the returned future.
+      // TODO(14718): we want errors to go into the returned future.
       rethrow;
     };
     return completer.future;
@@ -234,7 +235,7 @@
         completer.complete(new Isolate._fromControlPort(controlPort));
       };
     } catch(e, st) {
-      // TODO(floitsch): we want errors to go into the returned future.
+      // TODO(14718): we want errors to go into the returned future.
       rethrow;
     };
     return completer.future;
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 483f5c6..405c129 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -202,7 +202,7 @@
     args.SetAt(6, is_final);
     args.SetAt(7, default_value);
     args.SetAt(8, metadata);
-    param ^= CreateMirror(Symbols::_LocalParameterMirrorImpl(), args);
+    param ^= CreateMirror(Symbols::_LocalParameterMirror(), args);
     results.SetAt(i, param);
   }
   results.MakeImmutable();
@@ -216,7 +216,7 @@
   args.SetAt(0, param);
   args.SetAt(1, String::Handle(param.name()));
   args.SetAt(2, owner_mirror);
-  return CreateMirror(Symbols::_LocalTypeVariableMirrorImpl(), args);
+  return CreateMirror(Symbols::_LocalTypeVariableMirror(), args);
 }
 
 
@@ -254,7 +254,7 @@
   args.SetAt(3, Bool::Get(cls.NumTypeParameters() != 0));
   args.SetAt(4, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration);
   args.SetAt(5, owner_mirror);
-  return CreateMirror(Symbols::_LocalTypedefMirrorImpl(), args);
+  return CreateMirror(Symbols::_LocalTypedefMirror(), args);
 }
 
 
@@ -263,7 +263,7 @@
   const Array& args = Array::Handle(Array::New(2));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
   args.SetAt(1, type);
-  return CreateMirror(Symbols::_LocalFunctionTypeMirrorImpl(), args);
+  return CreateMirror(Symbols::_LocalFunctionTypeMirror(), args);
 }
 
 
@@ -289,7 +289,7 @@
   args.SetAt(10, Bool::Get(isConstructor && func.is_redirecting()));
   args.SetAt(11, Bool::Get(isConstructor && func.IsFactory()));
 
-  return CreateMirror(Symbols::_LocalMethodMirrorImpl(), args);
+  return CreateMirror(Symbols::_LocalMethodMirror(), args);
 }
 
 
@@ -300,15 +300,16 @@
 
   const String& name = String::Handle(field.name());
 
-  const Array& args = Array::Handle(Array::New(6));
+  const Array& args = Array::Handle(Array::New(7));
   args.SetAt(0, field_ref);
   args.SetAt(1, name);
   args.SetAt(2, owner_mirror);
   args.SetAt(3, Object::null_instance());  // Null for type.
   args.SetAt(4, Bool::Get(field.is_static()));
   args.SetAt(5, Bool::Get(field.is_final()));
+  args.SetAt(6, Bool::Get(field.is_const()));
 
-  return CreateMirror(Symbols::_LocalVariableMirrorImpl(), args);
+  return CreateMirror(Symbols::_LocalVariableMirror(), args);
 }
 
 static RawFunction* CallMethod(const Class& cls) {
@@ -347,9 +348,9 @@
   }
 
   const Bool& is_generic = Bool::Get(cls.NumTypeParameters() != 0);
-  const Bool& is_mixin_typedef = Bool::Get(cls.is_mixin_typedef());
+  const Bool& is_mixin_app_alias = Bool::Get(cls.is_mixin_app_alias());
 
-  const Array& args = Array::Handle(Array::New(6));
+  const Array& args = Array::Handle(Array::New(7));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
   args.SetAt(1, type);
   // We do not set the names of anonymous mixin applications because the mirrors
@@ -358,10 +359,11 @@
   if (!cls.IsAnonymousMixinApplication()) {
     args.SetAt(2, String::Handle(cls.Name()));
   }
-  args.SetAt(3, is_generic);
-  args.SetAt(4, is_mixin_typedef);
-  args.SetAt(5, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration);
-  return CreateMirror(Symbols::_LocalClassMirrorImpl(), args);
+  args.SetAt(3, owner_mirror);
+  args.SetAt(4, is_generic);
+  args.SetAt(5, is_mixin_app_alias);
+  args.SetAt(6, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration);
+  return CreateMirror(Symbols::_LocalClassMirror(), args);
 }
 
 
@@ -373,7 +375,7 @@
   args.SetAt(1, str);
   str = lib.url();
   args.SetAt(2, str);
-  return CreateMirror(Symbols::_LocalLibraryMirrorImpl(), args);
+  return CreateMirror(Symbols::_LocalLibraryMirror(), args);
 }
 
 
@@ -387,12 +389,12 @@
       Array& args = Array::Handle(Array::New(1));
       args.SetAt(0, Symbols::Void());
       // TODO(mlippautz): Create once in the VM isolate and retrieve from there.
-      return CreateMirror(Symbols::_SpecialTypeMirrorImpl(), args);
+      return CreateMirror(Symbols::_SpecialTypeMirror(), args);
     } else if (cls.IsDynamicClass()) {
       Array& args = Array::Handle(Array::New(1));
       args.SetAt(0, Symbols::Dynamic());
       // TODO(mlippautz): Create once in the VM isolate and retrieve from there.
-      return CreateMirror(Symbols::_SpecialTypeMirrorImpl(), args);
+      return CreateMirror(Symbols::_SpecialTypeMirror(), args);
     }
     return CreateClassMirror(cls, type, Bool::False(), Object::null_instance());
   } else if (type.IsTypeParameter()) {
@@ -419,7 +421,7 @@
   const Array& args = Array::Handle(Array::New(2));
   args.SetAt(0, debug_name);
   args.SetAt(1, root_library_mirror);
-  return CreateMirror(Symbols::_LocalIsolateMirrorImpl(), args);
+  return CreateMirror(Symbols::_LocalIsolateMirror(), args);
 }
 
 
@@ -444,7 +446,7 @@
   const Array& args = Array::Handle(Array::New(2));
   args.SetAt(0, library_mirrors);
   args.SetAt(1, isolate_mirror);
-  return CreateMirror(Symbols::_LocalMirrorSystemImpl(), args);
+  return CreateMirror(Symbols::_LocalMirrorSystem(), args);
 }
 
 
@@ -841,14 +843,16 @@
 static RawAbstractType* InstantiateType(const AbstractType& type,
                                         const AbstractType& instantiator) {
   ASSERT(type.IsFinalized());
-  ASSERT(instantiator.IsFinalized());
   ASSERT(!type.IsMalformed());
-  ASSERT(!instantiator.IsMalformed());
 
   if (type.IsInstantiated()) {
     return type.Canonicalize();
   }
 
+  ASSERT(!instantiator.IsNull());
+  ASSERT(instantiator.IsFinalized());
+  ASSERT(!instantiator.IsMalformed());
+
   const AbstractTypeArguments& type_args =
       AbstractTypeArguments::Handle(instantiator.arguments());
   Error& bound_error = Error::Handle();
@@ -893,6 +897,7 @@
   return CreateTypeMirror(type);
 }
 
+
 DEFINE_NATIVE_ENTRY(Mirrors_mangleName, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
@@ -900,18 +905,6 @@
   return lib.IsPrivate(name) ? lib.PrivateName(name) : name.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Mirrors_unmangleName, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
-  // It would be nice to unconditionally use IdentifierPrettyName, alas it
-  // cannot cope with the symbols for the names of anonymous mixin applications.
-  if (Library::IsPrivate(name) ||
-      Field::IsGetterName(name) ||
-      Field::IsSetterName(name)) {
-    return String::IdentifierPrettyName(name);
-  }
-  return name.raw();
-}
-
 
 DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0));
@@ -982,12 +975,16 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 1) {
+DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(AbstractType,
+                               instantiator,
+                               arguments->NativeArgAt(1));
   const Class& cls = Class::Handle(ref.GetClassReferent());
   const Function& func = Function::Handle(CallMethod(cls));
   ASSERT(!func.IsNull());
-  return func.result_type();
+  AbstractType& type = AbstractType::Handle(func.result_type());
+  return InstantiateType(type, instantiator);
 }
 
 
@@ -1301,25 +1298,6 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(TypeVariableMirror_instantiate_from, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Type, instantiator, arguments->NativeArgAt(1));
-  ASSERT(param.parameterized_class() == instantiator.type_class());
-  return InstantiateType(param, instantiator);
-}
-
-
-DEFINE_NATIVE_ENTRY(TypedefMirror_instantiate_from, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Type, instantiator, arguments->NativeArgAt(1));
-  const Class& cls = Class::Handle(type.type_class());
-  // We represent typedefs as non-canonical signature classes.
-  ASSERT(cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass());
-  return InstantiateType(type, instantiator);
-}
-
-
-
 DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0));
   const Class& cls = Class::Handle(type.type_class());
@@ -1681,11 +1659,11 @@
     if (!redirect_type.IsInstantiated()) {
       // The type arguments of the redirection type are instantiated from the
       // type arguments of the type reflected by the class mirror.
-      Error& malformed_error = Error::Handle();
+      Error& bound_error = Error::Handle();
       redirect_type ^= redirect_type.InstantiateFrom(type_arguments,
-                                                     &malformed_error);
-      if (!malformed_error.IsNull()) {
-        ThrowInvokeError(malformed_error);
+                                                     &bound_error);
+      if (!bound_error.IsNull()) {
+        ThrowInvokeError(bound_error);
         UNREACHABLE();
       }
     }
@@ -1901,12 +1879,14 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) {
+DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
+  GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1));
   // We handle constructors in Dart code.
   ASSERT(!func.IsConstructor());
-  return func.result_type();
+  const AbstractType& type = AbstractType::Handle(func.result_type());
+  return InstantiateType(type, instantiator);
 }
 
 
@@ -1952,18 +1932,23 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(ParameterMirror_type, 2) {
+DEFINE_NATIVE_ENTRY(ParameterMirror_type, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1));
+  GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(2));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
-  return func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value());
+  const AbstractType& type = AbstractType::Handle(
+      func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value()));
+  return InstantiateType(type, instantiator);
 }
 
 
-DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) {
+DEFINE_NATIVE_ENTRY(VariableMirror_type, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Field& field = Field::Handle(ref.GetFieldReferent());
-  return field.type();
+  GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1));
+  const AbstractType& type = AbstractType::Handle(field.type());
+  return InstantiateType(type, instantiator);
 }
 
 }  // namespace dart
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index a2ab082..8476c15 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -9,11 +9,10 @@
 final emptyList = new UnmodifiableListView([]);
 final emptyMap = new _UnmodifiableMapView({});
 
-// Copied from js_mirrors, in turn copied from the package
-// "unmodifiable_collection".
 // TODO(14314): Move to dart:collection.
 class _UnmodifiableMapView<K, V> implements Map<K, V> {
-   Map<K, V> _source;
+  final Map<K, V> _source;
+
   _UnmodifiableMapView(Map<K, V> source) : _source = source;
 
  static void _throw() {
@@ -21,38 +20,25 @@
   }
 
   int get length => _source.length;
-
   bool get isEmpty => _source.isEmpty;
-
   bool get isNotEmpty => _source.isNotEmpty;
-
   V operator [](K key) => _source[key];
-
   bool containsKey(K key) => _source.containsKey(key);
-
   bool containsValue(V value) => _source.containsValue(value);
-
   void forEach(void f(K key, V value)) => _source.forEach(f);
-
   Iterable<K> get keys => _source.keys;
-
   Iterable<V> get values => _source.values;
-
   void operator []=(K key, V value) => _throw();
-
   V putIfAbsent(K key, V ifAbsent()) { _throw(); }
-
   void addAll(Map<K, V> other) => _throw();
-
   V remove(K key) { _throw(); }
-
   void clear() => _throw();
 }
 
 class _InternalMirrorError {
+  final String _msg;
   const _InternalMirrorError(String this._msg);
   String toString() => _msg;
-  final String _msg;
 }
 
 Map _filterMap(Map<Symbol, dynamic> old_map, bool filter(Symbol key, value)) {
@@ -120,21 +106,20 @@
 }
 
 List _metadata(reflectee)
-  native 'DeclarationMirror_metadata';
+    native 'DeclarationMirror_metadata';
 
-class _LocalMirrorSystemImpl extends MirrorSystem {
-  // Change parameter back to "this.libraries" when native code is changed.
-  _LocalMirrorSystemImpl(List<LibraryMirror> libraries, this.isolate)
-      : this.libraries = new Map<Uri, LibraryMirror>.fromIterable(
-            libraries, key: (e) => e.uri);
-
+class _LocalMirrorSystem extends MirrorSystem {
   final Map<Uri, LibraryMirror> libraries;
   final IsolateMirror isolate;
 
+  _LocalMirrorSystem(List<LibraryMirror> libraries, this.isolate)
+      : this.libraries = new Map<Uri, LibraryMirror>.fromIterable(
+            libraries, key: (e) => e.uri);
+
   TypeMirror _dynamicType = null;
   TypeMirror get dynamicType {
     if (_dynamicType == null) {
-      _dynamicType = new _SpecialTypeMirrorImpl('dynamic');
+      _dynamicType = new _SpecialTypeMirror('dynamic');
     }
     return _dynamicType;
   }
@@ -142,7 +127,7 @@
   TypeMirror _voidType = null;
   TypeMirror get voidType {
     if (_voidType == null) {
-      _voidType = new _SpecialTypeMirrorImpl('void');
+      _voidType = new _SpecialTypeMirror('void');
     }
     return _voidType;
   }
@@ -150,22 +135,22 @@
   String toString() => "MirrorSystem for isolate '${isolate.debugName}'";
 }
 
-abstract class _LocalMirrorImpl implements Mirror {}
+abstract class _LocalMirror implements Mirror {}
 
-class _LocalIsolateMirrorImpl extends _LocalMirrorImpl
-    implements IsolateMirror {
-  _LocalIsolateMirrorImpl(this.debugName, this.rootLibrary);
-
+class _LocalIsolateMirror extends _LocalMirror implements IsolateMirror {
   final String debugName;
-  final bool isCurrent = true;
   final LibraryMirror rootLibrary;
 
+  _LocalIsolateMirror(this.debugName, this.rootLibrary);
+
+  bool get isCurrent => true;
+
   String toString() => "IsolateMirror on '$debugName'";
 }
 
 class _InvocationTrampoline implements Function {
-  ObjectMirror _receiver;
-  Symbol _selector;
+  final ObjectMirror _receiver;
+  final Symbol _selector;
   _InvocationTrampoline(this._receiver, this._selector);
   noSuchMethod(Invocation msg) {
     if (msg.memberName != #call) return super.noSuchMethod(msg);
@@ -175,16 +160,14 @@
   }
 }
 
-abstract class _LocalObjectMirrorImpl extends _LocalMirrorImpl
-    implements ObjectMirror {
-  _LocalObjectMirrorImpl(this._reflectee);
-
+abstract class _LocalObjectMirror extends _LocalMirror implements ObjectMirror {
   final _reflectee; // May be a MirrorReference or an ordinary object.
 
+  _LocalObjectMirror(this._reflectee);
+
   InstanceMirror invoke(Symbol memberName,
                         List positionalArguments,
                         [Map<Symbol, dynamic> namedArguments]) {
-
     int numPositionalArguments = positionalArguments.length;
     int numNamedArguments = namedArguments != null ? namedArguments.length : 0;
     int numArguments = numPositionalArguments + numNamedArguments;
@@ -200,31 +183,25 @@
       });
     }
 
-    return reflect(this._invoke(_reflectee,
-                                _n(memberName),
-                                arguments,
-                                names));
+    return reflect(this._invoke(_reflectee, _n(memberName), arguments, names));
   }
 
   InstanceMirror getField(Symbol memberName) {
-    return reflect(this._invokeGetter(_reflectee,
-                                      _n(memberName)));
+    return reflect(this._invokeGetter(_reflectee, _n(memberName)));
   }
 
   InstanceMirror setField(Symbol memberName, Object value) {
-    this._invokeSetter(_reflectee,
-                       _n(memberName),
-                       value);
+    this._invokeSetter(_reflectee, _n(memberName), value);
     return reflect(value);
   }
 }
 
-class _LocalInstanceMirrorImpl extends _LocalObjectMirrorImpl
+class _LocalInstanceMirror extends _LocalObjectMirror
     implements InstanceMirror {
   // TODO(ahe): This is a hack, see delegate below.
   static Function _invokeOnClosure;
 
-  _LocalInstanceMirrorImpl(reflectee) : super(reflectee);
+  _LocalInstanceMirror(reflectee) : super(reflectee);
 
   ClassMirror _type;
   ClassMirror get type {
@@ -247,11 +224,10 @@
       // system to access a private field in a different library.  For
       // some reason, that works.  On the other hand, calling a
       // private method does not work.
-
-      _LocalInstanceMirrorImpl mirror =
-          reflect(invocation);
-      _invokeOnClosure = reflectClass(invocation.runtimeType)
-          .getField(MirrorSystem.getSymbol('_invokeOnClosure', mirror.type.owner)).reflectee;
+      ClassMirror invocationImplClass = reflect(invocation).type;
+      Symbol fieldName = MirrorSystem.getSymbol('_invokeOnClosure',
+                                                invocationImplClass.owner);
+      _invokeOnClosure = invocationImplClass.getField(fieldName).reflectee;
     }
     return _invokeOnClosure(reflectee, invocation);
   }
@@ -259,7 +235,7 @@
   String toString() => 'InstanceMirror on ${Error.safeToString(_reflectee)}';
 
   bool operator ==(other) {
-    return other is _LocalInstanceMirrorImpl &&
+    return other is _LocalInstanceMirror &&
            identical(_reflectee, other._reflectee);
   }
 
@@ -306,10 +282,7 @@
       });
     }
 
-    return reflect(this._invoke(_reflectee,
-                                _n(memberName),
-                                arguments,
-                                names));
+    return reflect(this._invoke(_reflectee, _n(memberName), arguments, names));
   }
 
   _invoke(reflectee, functionName, arguments, argumentNames)
@@ -325,9 +298,9 @@
       native 'InstanceMirror_computeType';
 }
 
-class _LocalClosureMirrorImpl extends _LocalInstanceMirrorImpl
+class _LocalClosureMirror extends _LocalInstanceMirror
     implements ClosureMirror {
-  _LocalClosureMirrorImpl(reflectee) : super(reflectee);
+  _LocalClosureMirror(reflectee) : super(reflectee);
 
   MethodMirror _function;
   MethodMirror get function {
@@ -400,26 +373,28 @@
       native 'ClosureMirror_find_in_context';
 }
 
-class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl
+class _LocalClassMirror extends _LocalObjectMirror
     implements ClassMirror {
-  _LocalClassMirrorImpl(reflectee,
-                        reflectedType,
-                        String simpleName,
-                        this._isGeneric,
-                        this._isMixinTypedef,
-                        this._isGenericDeclaration)
+  final Type _reflectedType;
+  Symbol _simpleName;
+  DeclarationMirror _owner;
+  final bool _isGeneric;
+  final bool _isMixinAlias;
+  final bool _isGenericDeclaration;
+  Type _instantiator;
+
+  _LocalClassMirror(reflectee,
+                    reflectedType,
+                    String simpleName,
+                    this._owner,
+                    this._isGeneric,
+                    this._isMixinAlias,
+                    this._isGenericDeclaration)
       : this._simpleName = _s(simpleName),
         this._reflectedType = reflectedType,
         this._instantiator = reflectedType,
         super(reflectee);
 
-  final Type _reflectedType;
-  final bool _isGeneric;
-  final bool _isMixinTypedef;
-  final bool _isGenericDeclaration;
-  Type _instantiator;
-
-  TypeMirror _instantiateInContextOf(declaration) => this;
 
   bool get hasReflectedType => !_isGenericDeclaration;
   Type get reflectedType {
@@ -430,7 +405,6 @@
     return _reflectedType;
   }
 
-  Symbol _simpleName;
   Symbol get simpleName {
     // All but anonymous mixin applications have their name set at construction.
     if(_simpleName == null) {
@@ -447,7 +421,6 @@
     return _qualifiedName;
   }
 
-  var _owner;
   DeclarationMirror get owner {
     if (_owner == null) {
       _owner = _library(_reflectee);
@@ -479,7 +452,7 @@
     return _trueSuperclassField;
   }
   ClassMirror get superclass {
-    return _isMixinTypedef ? _trueSuperclass._trueSuperclass : _trueSuperclass;
+    return _isMixinAlias ? _trueSuperclass._trueSuperclass : _trueSuperclass;
   }
 
   var _superinterfaces;
@@ -510,7 +483,7 @@
   var _mixin;
   ClassMirror get mixin {
     if (_mixin == null) {
-      if (_isMixinTypedef) {
+      if (_isMixinAlias) {
         Type mixinType = _nativeMixinInstantiated(_trueSuperclass._reflectedType,
                                                   _instantiator);
         _mixin = reflectType(mixinType);
@@ -541,7 +514,7 @@
   Map<Symbol, Mirror> _members;
   Map<Symbol, Mirror> get members {
     if (_members == null) {
-      var whoseMembers = _isMixinTypedef ? _trueSuperclass : this;
+      var whoseMembers = _isMixinAlias ? _trueSuperclass : this;
       _members = _makeMemberMap(mixin._computeMembers(whoseMembers._reflectee));
     }
     return _members;
@@ -599,7 +572,7 @@
   }
 
   bool get _isAnonymousMixinApplication {
-    if (_isMixinTypedef) return false;  // Named mixin application.
+    if (_isMixinAlias) return false;  // Named mixin application.
     if (mixin == this) return false;  // Not a mixin application.
     return true;
   }
@@ -614,7 +587,7 @@
       ClassMirror owner = originalDeclaration;
       var mirror;
       for (var i = 0; i < params.length; i += 2) {
-        mirror = new _LocalTypeVariableMirrorImpl(
+        mirror = new _LocalTypeVariableMirror(
             params[i + 1], params[i], owner);
         _typeVariables.add(mirror);
       }
@@ -756,10 +729,10 @@
       native "ClassMirror_type_arguments";
 }
 
-class _LocalFunctionTypeMirrorImpl extends _LocalClassMirrorImpl
+class _LocalFunctionTypeMirror extends _LocalClassMirror
     implements FunctionTypeMirror {
-  _LocalFunctionTypeMirrorImpl(reflectee, reflectedType)
-      : super(reflectee, reflectedType, null, false, false, false);
+  _LocalFunctionTypeMirror(reflectee, reflectedType)
+      : super(reflectee, reflectedType, null, null, false, false, false);
 
   bool get _isAnonymousMixinApplication => false;
 
@@ -783,8 +756,8 @@
   TypeMirror _returnType = null;
   TypeMirror get returnType {
     if (_returnType == null) {
-      _returnType = reflectType(_FunctionTypeMirror_return_type(_reflectee));
-      _returnType = _returnType._instantiateInContextOf(reflectType(_instantiator));
+      _returnType = reflectType(
+          _FunctionTypeMirror_return_type(_reflectee, _instantiator));
     }
     return _returnType;
   }
@@ -793,9 +766,6 @@
   List<ParameterMirror> get parameters {
     if (_parameters == null) {
       _parameters = _FunctionTypeMirror_parameters(_reflectee);
-      _parameters.forEach((p) {
-        p._type = p.type._instantiateInContextOf(reflectType(_instantiator));
-      });
       _parameters = new UnmodifiableListView(_parameters);
     }
     return _parameters;
@@ -814,20 +784,20 @@
   MethodMirror _FunctionTypeMirror_call_method(reflectee)
       native "FunctionTypeMirror_call_method";
 
-  static Type _FunctionTypeMirror_return_type(reflectee)
+  static Type _FunctionTypeMirror_return_type(reflectee, instantiator)
       native "FunctionTypeMirror_return_type";
 
   List<ParameterMirror> _FunctionTypeMirror_parameters(reflectee)
       native "FunctionTypeMirror_parameters";
 }
 
-abstract class _LocalDeclarationMirrorImpl extends _LocalMirrorImpl
+abstract class _LocalDeclarationMirror extends _LocalMirror
     implements DeclarationMirror {
-  _LocalDeclarationMirrorImpl(this._reflectee, this._simpleName);
-
   final _reflectee;
-
   Symbol _simpleName;
+
+  _LocalDeclarationMirror(this._reflectee, this._simpleName);
+
   Symbol get simpleName => _simpleName;
 
   Symbol _qualifiedName = null;
@@ -852,11 +822,11 @@
   int get hashCode => simpleName.hashCode;
 }
 
-class _LocalTypeVariableMirrorImpl extends _LocalDeclarationMirrorImpl
+class _LocalTypeVariableMirror extends _LocalDeclarationMirror
     implements TypeVariableMirror {
-  _LocalTypeVariableMirrorImpl(reflectee,
-                               String simpleName,
-                               this._owner)
+  _LocalTypeVariableMirror(reflectee,
+                           String simpleName,
+                           this._owner)
       : super(reflectee, _s(simpleName));
 
   DeclarationMirror _owner;
@@ -869,8 +839,7 @@
 
   bool get isPrivate => false;
   bool get isStatic => false;
-
-  final bool isTopLevel = false;
+  bool get isTopLevel => false;
 
   SourceLocation get location {
     throw new UnimplementedError(
@@ -908,46 +877,30 @@
 
   static Type _TypeVariableMirror_upper_bound(reflectee)
       native "TypeVariableMirror_upper_bound";
-
-  static Type _TypeVariableMirror_instantiate_from(reflectee, instantiator)
-      native "TypeVariableMirror_instantiate_from";
-
-  TypeMirror _instantiateInContextOf(declaration) {
-    var instantiator = declaration;
-    while (instantiator is MethodMirror) instantiator = instantiator.owner;
-    if (instantiator is LibraryMirror) return this;
-    if (!(instantiator is ClassMirror || instantiator is TypedefMirror))
-      throw "UNREACHABLE";
-    if (instantiator.isOriginalDeclaration) return this;
-
-    return reflectType(
-        _TypeVariableMirror_instantiate_from(_reflectee,
-                                             instantiator._reflectedType));
-  }
 }
 
 
-class _LocalTypedefMirrorImpl extends _LocalDeclarationMirrorImpl
+class _LocalTypedefMirror extends _LocalDeclarationMirror
     implements TypedefMirror {
-  _LocalTypedefMirrorImpl(reflectee,
-                          this._reflectedType,
-                          String simpleName,
-                          this._isGeneric,
-                          this._isGenericDeclaration,
-                          this._owner)
-      : super(reflectee, _s(simpleName));
-
   final Type _reflectedType;
   final bool _isGeneric;
   final bool _isGenericDeclaration;
 
+  _LocalTypedefMirror(reflectee,
+                      this._reflectedType,
+                      String simpleName,
+                      this._isGeneric,
+                      this._isGenericDeclaration,
+                      this._owner)
+      : super(reflectee, _s(simpleName));
+
   bool get isTopLevel => true;
   bool get isPrivate => false;
 
   DeclarationMirror _owner;
   DeclarationMirror get owner {
     if (_owner == null) {
-      _owner = _LocalClassMirrorImpl._library(_reflectee);
+      _owner = _LocalClassMirror._library(_reflectee);
     }
     return _owner;
   }
@@ -979,11 +932,11 @@
   List<TypeVariableMirror> get typeVariables {
     if (_typeVariables == null) {
       _typeVariables = new List<TypeVariableMirror>();
-      List params = _LocalClassMirrorImpl._ClassMirror_type_variables(_reflectee);
+      List params = _LocalClassMirror._ClassMirror_type_variables(_reflectee);
       TypedefMirror owner = originalDeclaration;
       var mirror;
       for (var i = 0; i < params.length; i += 2) {
-        mirror = new _LocalTypeVariableMirrorImpl(
+        mirror = new _LocalTypeVariableMirror(
             params[i + 1], params[i], owner);
         _typeVariables.add(mirror);
       }
@@ -998,64 +951,47 @@
         _typeArguments = emptyList;
       } else {
         _typeArguments = new UnmodifiableListView(
-            _LocalClassMirrorImpl._computeTypeArguments(_reflectedType));
+            _LocalClassMirror._computeTypeArguments(_reflectedType));
       }
     }
     return _typeArguments;
   }
 
-  TypeMirror _instantiateInContextOf(declaration) {
-    var instantiator = declaration;
-    while (instantiator is MethodMirror) instantiator = instantiator.owner;
-    if (instantiator is LibraryMirror) return this;
-    if (!(instantiator is ClassMirror || instantiator is TypedefMirror))
-      throw "UNREACHABLE";
-
-    return reflectType(
-        _nativeInstatniateFrom(_reflectedType, instantiator._reflectedType));
-  }
-
   String toString() => "TypedefMirror on '${_n(simpleName)}'";
 
   static _nativeReferent(reflectedType)
       native "TypedefMirror_referent";
 
-  static _nativeInstatniateFrom(reflectedType, instantiator)
-      native "TypedefMirror_instantiate_from";
-
   static _nativeDeclaration(reflectedType)
       native "TypedefMirror_declaration";
 }
 
-class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl
+class _LocalLibraryMirror extends _LocalObjectMirror
     implements LibraryMirror {
-  _LocalLibraryMirrorImpl(reflectee,
-                          String simpleName,
-                          String url)
+  final Symbol simpleName;
+  final Uri uri;
+
+  _LocalLibraryMirror(reflectee,
+                      String simpleName,
+                      String url)
       : this.simpleName = _s(simpleName),
         this.uri = Uri.parse(url),
         super(reflectee);
 
-  final Symbol simpleName;
-
   // The simple name and the qualified name are the same for a library.
   Symbol get qualifiedName => simpleName;
 
-  // Always null for libraries.
-  final DeclarationMirror owner = null;
+  DeclarationMirror get owner => null;
 
-  // Always false for libraries.
-  final bool isPrivate = false;
+  bool get isPrivate => false;
+  bool get isTopLevel => false;
 
-  // Always false for libraries.
-  final bool isTopLevel = false;
+  Type get _instantiator => null;
 
   SourceLocation get location {
     throw new UnimplementedError('LibraryMirror.location is not implemented');
   }
 
-  final Uri uri;
-
   Map<Symbol, DeclarationMirror> _declarations;
   Map<Symbol, DeclarationMirror> get declarations {
     if (_declarations != null) return _declarations;
@@ -1158,26 +1094,8 @@
       native "LibraryMirror_members";
 }
 
-class _LocalMethodMirrorImpl extends _LocalDeclarationMirrorImpl
+class _LocalMethodMirror extends _LocalDeclarationMirror
     implements MethodMirror {
-  _LocalMethodMirrorImpl(reflectee,
-                         String simpleName,
-                         this._owner,
-                         this.isStatic,
-                         this.isAbstract,
-                         this.isGetter,
-                         this.isSetter,
-                         this.isConstructor,
-                         this.isConstConstructor,
-                         this.isGenerativeConstructor,
-                         this.isRedirectingConstructor,
-                         this.isFactoryConstructor)
-      : this.isOperator = _operators.contains(simpleName),
-        super(reflectee, _s(simpleName));
-
-  static const _operators = const ["%", "&", "*", "+", "-", "/", "<", "<<",
-      "<=", "==", ">", ">=", ">>", "[]", "[]=", "^", "|", "~", "unary-", "~/"];
-
   final bool isStatic;
   final bool isAbstract;
   final bool isGetter;
@@ -1189,6 +1107,24 @@
   final bool isFactoryConstructor;
   final bool isOperator;
 
+  static const _operators = const ["%", "&", "*", "+", "-", "/", "<", "<<",
+      "<=", "==", ">", ">=", ">>", "[]", "[]=", "^", "|", "~", "unary-", "~/"];
+
+  _LocalMethodMirror(reflectee,
+                     String simpleName,
+                     this._owner,
+                     this.isStatic,
+                     this.isAbstract,
+                     this.isGetter,
+                     this.isSetter,
+                     this.isConstructor,
+                     this.isConstConstructor,
+                     this.isGenerativeConstructor,
+                     this.isRedirectingConstructor,
+                     this.isFactoryConstructor)
+      : this.isOperator = _operators.contains(simpleName),
+        super(reflectee, _s(simpleName));
+
   DeclarationMirror _owner;
   DeclarationMirror get owner {
     // For nested closures it is possible, that the mirror for the owner has not
@@ -1202,21 +1138,27 @@
   bool get isPrivate => _n(simpleName).startsWith('_') ||
                         _n(constructorName).startsWith('_');
 
-  bool get isTopLevel =>  owner is LibraryMirror;
+  bool get isTopLevel => owner is LibraryMirror;
 
   SourceLocation get location {
     throw new UnimplementedError('MethodMirror.location is not implemented');
   }
 
+  Type get _instantiator {
+    var o = owner;
+    while (o is MethodMirror) o = o.owner;
+    return o._instantiator;
+  }
+
   TypeMirror _returnType = null;
   TypeMirror get returnType {
     if (_returnType == null) {
       if (isConstructor) {
         _returnType = owner;
       } else {
-        _returnType = reflectType(_MethodMirror_return_type(_reflectee));
+        _returnType = reflectType(
+            _MethodMirror_return_type(_reflectee, _instantiator));
       }
-      _returnType = _returnType._instantiateInContextOf(owner);
     }
     return _returnType;
   }
@@ -1244,7 +1186,8 @@
               'Internal error in MethodMirror.constructorName: '
               'malformed name <$simpleName>');
         } else if (parts.length == 2) {
-          _constructorName = _s(parts[1]);
+          LibraryMirror definingLibrary = owner.owner;
+          _constructorName = MirrorSystem.getSymbol(parts[1], definingLibrary);
         } else {
           _constructorName = _s('');
         }
@@ -1276,7 +1219,7 @@
   static dynamic _MethodMirror_owner(reflectee)
       native "MethodMirror_owner";
 
-  static dynamic _MethodMirror_return_type(reflectee)
+  static dynamic _MethodMirror_return_type(reflectee, instantiator)
       native "MethodMirror_return_type";
 
   List<ParameterMirror> _MethodMirror_parameters(reflectee)
@@ -1286,19 +1229,21 @@
       native "MethodMirror_source";
 }
 
-class _LocalVariableMirrorImpl extends _LocalDeclarationMirrorImpl
+class _LocalVariableMirror extends _LocalDeclarationMirror
     implements VariableMirror {
-  _LocalVariableMirrorImpl(reflectee,
-                           String simpleName,
-                           this.owner,
-                           this._type,
-                           this.isStatic,
-                           this.isFinal)
-      : super(reflectee, _s(simpleName));
-
   final DeclarationMirror owner;
   final bool isStatic;
   final bool isFinal;
+  final bool isConst;
+
+  _LocalVariableMirror(reflectee,
+                       String simpleName,
+                       this.owner,
+                       this._type,
+                       this.isStatic,
+                       this.isFinal,
+                       this.isConst)
+      : super(reflectee, _s(simpleName));
 
   bool get isPrivate => _n(simpleName).startsWith('_');
 
@@ -1308,43 +1253,48 @@
     throw new UnimplementedError('VariableMirror.location is not implemented');
   }
 
+  Type get _instantiator {
+    return owner._instantiator;
+  }
+
   TypeMirror _type;
   TypeMirror get type {
     if (_type == null) {
-       _type = reflectType(_VariableMirror_type(_reflectee));
-       _type = _type._instantiateInContextOf(owner);
+       _type = reflectType(_VariableMirror_type(_reflectee, _instantiator));
     }
     return _type;
   }
 
   String toString() => "VariableMirror on '${MirrorSystem.getName(simpleName)}'";
 
-  static _VariableMirror_type(reflectee)
+  static _VariableMirror_type(reflectee, instantiator)
       native "VariableMirror_type";
 }
 
-class _LocalParameterMirrorImpl extends _LocalVariableMirrorImpl
+class _LocalParameterMirror extends _LocalVariableMirror
     implements ParameterMirror {
-  _LocalParameterMirrorImpl(reflectee,
-                            String simpleName,
-                            DeclarationMirror owner,
-                            this._position,
-                            this.isOptional,
-                            this.isNamed,
-                            bool isFinal,
-                            this._defaultValueReflectee,
-                            this._unmirroredMetadata)
+  final int _position;
+  final bool isOptional;
+  final bool isNamed;
+  final List _unmirroredMetadata;
+
+  _LocalParameterMirror(reflectee,
+                        String simpleName,
+                        DeclarationMirror owner,
+                        this._position,
+                        this.isOptional,
+                        this.isNamed,
+                        bool isFinal,
+                        this._defaultValueReflectee,
+                        this._unmirroredMetadata)
       : super(reflectee,
               simpleName,
               owner,
               null,  // We override the type.
               false, // isStatic does not apply.
-              isFinal);
-
-  final int _position;
-  final bool isOptional;
-  final bool isNamed;
-  final List _unmirroredMetadata;
+              isFinal,
+              false  // Not const.
+              );
 
   Object _defaultValueReflectee;
   InstanceMirror _defaultValue;
@@ -1361,34 +1311,43 @@
   bool get hasDefaultValue => _defaultValueReflectee != null;
 
   List<InstanceMirror> get metadata {
-    if ( _unmirroredMetadata == null) return emptyList;
+    if (_unmirroredMetadata == null) return emptyList;
     return new UnmodifiableListView(_unmirroredMetadata.map(reflect));
   }
 
+  Type get _instantiator {
+    var o = owner;
+    while (o is MethodMirror) o = o.owner;
+    return o._instantiator;
+  }
+
   TypeMirror _type = null;
   TypeMirror get type {
     if (_type == null) {
-      _type = reflectType(_ParameterMirror_type(_reflectee, _position));
-      _type = _type._instantiateInContextOf(owner);
+      _type = reflectType(
+          _ParameterMirror_type(_reflectee, _position, _instantiator));
     }
     return _type;
   }
 
   String toString() => "ParameterMirror on '${_n(simpleName)}'";
 
-  static Type _ParameterMirror_type(_reflectee, _position)
+  static Type _ParameterMirror_type(_reflectee, _position, instantiator)
       native "ParameterMirror_type";
 }
 
-class _SpecialTypeMirrorImpl extends _LocalMirrorImpl
+class _SpecialTypeMirror extends _LocalMirror
     implements TypeMirror, DeclarationMirror {
-  _SpecialTypeMirrorImpl(String name) : simpleName = _s(name);
-
-  final bool isPrivate = false;
-  final DeclarationMirror owner = null;
   final Symbol simpleName;
-  final bool isTopLevel = true;
-  final List<InstanceMirror> metadata = emptyList;
+
+  _SpecialTypeMirror(String name) : simpleName = _s(name);
+
+  bool get isPrivate => false;
+  bool get isTopLevel => true;
+
+  DeclarationMirror get owner => null;
+
+  List<InstanceMirror> get metadata => emptyList;
 
   List<TypeVariableMirror> get typeVariables => emptyList;
   List<TypeMirror> get typeArguments => emptyList;
@@ -1405,7 +1364,7 @@
   // TODO(11955): Remove once dynamicType and voidType are canonical objects in
   // the object store.
   bool operator ==(other) {
-    if (other is! _SpecialTypeMirrorImpl) {
+    if (other is! _SpecialTypeMirror) {
       return false;
     }
     return this.simpleName == other.simpleName;
@@ -1414,8 +1373,6 @@
   int get hashCode => simpleName.hashCode;
 
   String toString() => "TypeMirror on '${_n(simpleName)}'";
-
-  TypeMirror _instantiateInContextOf(declaration) => this;
 }
 
 class _Mirrors {
@@ -1439,8 +1396,8 @@
   // Creates a new local mirror for some Object.
   static InstanceMirror reflect(Object reflectee) {
     return reflectee is Function
-        ? new _LocalClosureMirrorImpl(reflectee)
-        : new _LocalInstanceMirrorImpl(reflectee);
+        ? new _LocalClosureMirror(reflectee)
+        : new _LocalInstanceMirror(reflectee);
   }
 
   static ClassMirror makeLocalClassMirror(Type key)
diff --git a/runtime/lib/mirrors_patch.dart b/runtime/lib/mirrors_patch.dart
index 200b1b0..6f3c436 100644
--- a/runtime/lib/mirrors_patch.dart
+++ b/runtime/lib/mirrors_patch.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:nativewrappers";
 // TODO(ahe): Move _symbol_dev.Symbol to its own "private" library?
 import "dart:_collection-dev" as _symbol_dev;
 
@@ -40,20 +39,52 @@
 patch class MirrorSystem {
   /* patch */ static String getName(Symbol symbol) {
     String string = _symbol_dev.Symbol.getName(symbol);
-    if (string.contains(' with ')) return string;
-    return _unmangleName(string);
+
+    // get:foo -> foo
+    // set:foo -> foo=
+    // get:_foo@xxx -> _foo
+    // set:_foo@xxx -> _foo=
+    // Class._constructor@xxx -> Class._constructor
+    // _Class@xxx._constructor@xxx -> _Class._constructor
+    // lib._S@xxx with lib._M1@xxx, lib._M2@xxx -> lib._S with lib._M1, lib._M2
+    StringBuffer result = new StringBuffer();
+    bool add_setter_suffix = false;
+    var pos = 0;
+    if (string.length >= 4 && string[3] == ':') {
+      // Drop 'get:' or 'set:' prefix.
+      pos = 4;
+      if (string[0] == 's') {
+        add_setter_suffix;
+      }
+    }
+    // Skip everything between AT and PERIOD, SPACE, COMMA or END
+    bool skip = false;
+    for (; pos < string.length; pos++) {
+      var char = string[pos];
+      if (char == '@') {
+        skip = true;
+      } else if (char == '.' || char == ' ' || char == ',') {
+        skip = false;
+      }
+      if (!skip) {
+        result.write(char);
+      }
+    }
+    if (add_setter_suffix) {
+      result.write('=');
+    }
+    return result.toString();
   }
+
   /* patch */ static Symbol getSymbol(String name, [LibraryMirror library]) {
-    if (library is! LibraryMirror ||
-        ((name[0] == '_') && (library == null))) {
+    if ((library != null && library is! _LocalLibraryMirror) ||
+        ((name.length > 0) && (name[0] == '_') && (library == null))) {
       throw new ArgumentError(library);
     }
     if (library != null) name = _mangleName(name, library._reflectee);
     return new _symbol_dev.Symbol.unvalidated(name);
   }
 
-  static _unmangleName(String name)
-      native "Mirrors_unmangleName";
   static _mangleName(String name, _MirrorReference lib)
       native "Mirrors_mangleName";
 }
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 493a523..3774913 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -18,6 +18,13 @@
 DECLARE_FLAG(bool, trace_type_checks);
 
 
+DEFINE_NATIVE_ENTRY(Object_equals, 1) {
+  // Implemented in the flow graph builder.
+  UNREACHABLE();
+  return Object::null();
+}
+
+
 DEFINE_NATIVE_ENTRY(Object_cid, 1) {
   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
   return Smi::New(instance.GetClassId());
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index 6bba2c7..96688cc 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -4,6 +4,9 @@
 
 patch class Object {
 
+  // The VM has it's own implemention of equals.
+  bool operator ==(other) native "Object_equals";
+
   // Helpers used to implement hashCode. If a hashCode is used, we remember it
   // in a weak table in the VM. A new hashCode value is calculated using a
   // number generator.
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index ea67ae2..4a66276 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -152,6 +152,57 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(OneByteString_allocateFromOneByteList, 1) {
+  Instance& list = Instance::CheckedHandle(arguments->NativeArgAt(0));
+  uint8_t* data = NULL;
+  intptr_t length = 0;
+  if (list.IsTypedData()) {
+    const TypedData& array = TypedData::Cast(list);
+    length = array.LengthInBytes();
+    data = reinterpret_cast<uint8_t*>(array.DataAddr(0));
+  } else if (list.IsExternalTypedData()) {
+    const ExternalTypedData& array = ExternalTypedData::Cast(list);
+    length = array.LengthInBytes();
+    data = reinterpret_cast<uint8_t*>(array.DataAddr(0));
+  } else if (RawObject::IsTypedDataViewClassId(list.GetClassId())) {
+    const Instance& view = Instance::Cast(list);
+    length = Smi::Value(TypedDataView::Length(view));
+    const Instance& data_obj = Instance::Handle(TypedDataView::Data(view));
+    intptr_t data_offset = Smi::Value(TypedDataView::OffsetInBytes(view));
+    if (data_obj.IsTypedData()) {
+      const TypedData& array = TypedData::Cast(data_obj);
+      data = reinterpret_cast<uint8_t*>(array.DataAddr(data_offset));
+    } else if (data_obj.IsExternalTypedData()) {
+      const ExternalTypedData& array = ExternalTypedData::Cast(data_obj);
+      data = reinterpret_cast<uint8_t*>(array.DataAddr(data_offset));
+    } else {
+      UNREACHABLE();
+    }
+  } else if (list.IsArray()) {
+    const Array& array = Array::Cast(list);
+    intptr_t length = array.Length();
+    String& string = String::Handle(OneByteString::New(length, Heap::kNew));
+    for (int i = 0; i < length; i++) {
+      intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(array.At(i)));
+      OneByteString::SetCharAt(string, i, value);
+    }
+    return string.raw();
+  } else if (list.IsGrowableObjectArray()) {
+    const GrowableObjectArray& array = GrowableObjectArray::Cast(list);
+    intptr_t length = array.Length();
+    String& string = String::Handle(OneByteString::New(length, Heap::kNew));
+    for (int i = 0; i < length; i++) {
+      intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(array.At(i)));
+      OneByteString::SetCharAt(string, i, value);
+    }
+    return string.raw();
+  } else {
+    UNREACHABLE();
+  }
+  return OneByteString::New(data, length, Heap::kNew);
+}
+
+
 DEFINE_NATIVE_ENTRY(OneByteString_setAt, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, receiver, arguments->NativeArgAt(0));
   ASSERT(receiver.IsOneByteString());
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 9d5111b..2604cb8 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -34,31 +34,39 @@
    */
   static String createFromCharCodes(Iterable<int> charCodes) {
     if (charCodes != null) {
-      // TODO(srdjan): Also skip copying of typed arrays.
+      // TODO(srdjan): Also skip copying of wide typed arrays.
       final ccid = charCodes._cid;
+      bool isOneByteString = false;
       if ((ccid != _List._classId) &&
           (ccid != _GrowableList._classId) &&
           (ccid != _ImmutableList._classId)) {
-        charCodes = new List<int>.from(charCodes, growable: false);
-      }
-
-      bool isOneByteString = true;
-      for (int i = 0; i < charCodes.length; i++) {
-        int e = charCodes[i];
-        if (e is! _Smi) throw new ArgumentError(e);
-        // Is e Latin1?
-        if ((e < 0) || (e > 0xFF)) {
-          isOneByteString = false;
-          break;
+        if ((charCodes is Uint8List) || (charCodes is Int8List)) {
+          isOneByteString = true;
+        } else {
+          charCodes = new List<int>.from(charCodes, growable: false);
         }
       }
-      if (isOneByteString) {
-        var s = _OneByteString._allocate(charCodes.length);
-        for (int i = 0; i < charCodes.length; i++) {
-          s._setAt(i, charCodes[i]);
+      final len = charCodes.length;
+      if (!isOneByteString) {
+        for (int i = 0; i < len; i++) {
+          int e = charCodes[i];
+          if (e is! _Smi) throw new ArgumentError(e);
+          // Is e Latin1?
+          if ((e < 0) || (e > 0xFF)) {
+            return _createFromCodePoints(charCodes);
+          }
         }
-        return s;
       }
+      // Allocate a one byte string. When the list is 128 entries or longer,
+      // it's faster to perform a runtime-call.
+      if (len >= 128) {
+        return _OneByteString._allocateFromOneByteList(charCodes);
+      }
+      var s = _OneByteString._allocate(len);
+      for (int i = 0; i < len; i++) {
+        s._setAt(i, charCodes[i]);
+      }
+      return s;
     }
     return _createFromCodePoints(charCodes);
   }
@@ -628,6 +636,10 @@
   // set using _setAt.
   static _OneByteString _allocate(int length) native "OneByteString_allocate";
 
+
+  static _OneByteString _allocateFromOneByteList(List<int> list)
+      native "OneByteString_allocateFromOneByteList";
+
   // This is internal helper method. Code point value must be a valid
   // Latin1 value (0..0xFF), index must be valid.
   void _setAt(int index, int codePoint) native "OneByteString_setAt";
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index d97e4fe..fb3d65f 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -3000,6 +3000,10 @@
     return _offset;
   }
 
+  int get elementSizeInBytes {
+    return 1;
+  }
+
   // Method(s) implementing ByteData interface.
 
   int getInt8(int byteOffset) {
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index 73193ba..264787e 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -295,6 +295,12 @@
 
 
 #if defined(TESTING)
+
+// EXPECT and FAIL are equivalent to ASSERT and FATAL except that they do not
+// cause early termination of the unit test. This allows testing to proceed
+// further to be able to report other failures before reporting the overall
+// unit tests as failing.
+
 #define EXPECT(condition)                                                      \
   if (!(condition)) {                                                          \
     dart::Expect(__FILE__, __LINE__).Fail("expected: %s", #condition);         \
@@ -332,20 +338,16 @@
 
 #define EXPECT_NOTNULL(ptr)                                                    \
   dart::Expect(__FILE__, __LINE__).NotNull((ptr))
-#endif
 
-// TODO(iposva): provide a better way to get extra info on an EXPECT
-// fail - you suggested EXPECT_EQ(expected, actual, msg_format,
-// parameters_for_msg...), I quite like the google3 method
-// EXPECT_EQ(a, b) << "more stuff here...". (benl).
-
-#define WARN(error)                                                           \
+#define FAIL(error)                                                            \
   dart::Expect(__FILE__, __LINE__).Fail("%s", error)
 
-#define WARN1(format, p1)                                                     \
+#define FAIL1(format, p1)                                                      \
   dart::Expect(__FILE__, __LINE__).Fail(format, (p1))
 
-#define WARN2(format, p1, p2)                                                 \
+#define FAIL2(format, p1, p2)                                                  \
   dart::Expect(__FILE__, __LINE__).Fail(format, (p1), (p2))
 
+#endif  // defined(TESTING)
+
 #endif  // PLATFORM_ASSERT_H_
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 7ee14fb..5fc7f00 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -255,6 +255,11 @@
 typedef intptr_t word;
 typedef uintptr_t uword;
 
+#if defined(TARGET_OS_WINDOWS) || defined(TARGET_OS_MACOS)
+// off64_t is not defined on Windows or Mac OS.
+typedef int64_t off64_t;
+#endif
+
 // Byte sizes.
 const int kWordSize = sizeof(word);
 const int kDoubleSize = sizeof(double);  // NOLINT
@@ -281,6 +286,24 @@
 const intptr_t GB = MB * KB;
 const intptr_t GBLog2 = MBLog2 + KBLog2;
 
+const intptr_t KBInWords = KB >> kWordSizeLog2;
+const intptr_t KBInWordsLog2 = KBLog2 - kWordSizeLog2;
+const intptr_t MBInWords = KB * KBInWords;
+const intptr_t MBInWordsLog2 = KBLog2 + KBInWordsLog2;
+const intptr_t GBInWords = MB * KBInWords;
+const intptr_t GBInWordsLog2 = MBLog2 + KBInWordsLog2;
+
+// Helpers to round memory sizes to human readable values.
+inline intptr_t RoundWordsToKB(intptr_t size_in_words) {
+  return (size_in_words + (KBInWords >> 1)) >> KBInWordsLog2;
+}
+inline intptr_t RoundWordsToMB(intptr_t size_in_words) {
+  return (size_in_words + (MBInWords >> 1)) >> MBInWordsLog2;
+}
+inline intptr_t RoundWordsToGB(intptr_t size_in_words) {
+  return (size_in_words + (GBInWords >> 1)) >> GBInWordsLog2;
+}
+
 const intptr_t kIntptrOne = 1;
 const intptr_t kIntptrMin = (kIntptrOne << (kBitsPerWord - 1));
 const intptr_t kIntptrMax = ~kIntptrMin;
@@ -296,6 +319,16 @@
 const int kNanosecondsPerSecond = (kNanosecondsPerMicrosecond *
                                    kMicrosecondsPerSecond);
 
+// Helpers to round micro second times to human understandable values.
+inline double RoundMicrosecondsToSeconds(int64_t micros) {
+  const int k1M = 1000000;  // Converting us to secs.
+  return static_cast<double>(micros + (k1M >> 1)) / k1M;
+}
+inline double RoundMicrosecondsToMilliseconds(int64_t micros) {
+  const int k1K = 1000;  // Conversting us to ms.
+  return static_cast<double>(micros + (k1K >> 1)) / k1K;
+}
+
 // A macro to disallow the copy constructor and operator= functions.
 // This should be used in the private: declarations for a class.
 #define DISALLOW_COPY_AND_ASSIGN(TypeName)                                     \
diff --git a/runtime/platform/json.cc b/runtime/platform/json.cc
index 6f731f8..31ad418 100644
--- a/runtime/platform/json.cc
+++ b/runtime/platform/json.cc
@@ -255,12 +255,21 @@
   }
 }
 
+
+#if defined (DEBUG)
 #define CHECK_TOKEN(token)                                                     \
   if (scanner_.CurrentToken() != token) {                                      \
     OS::Print("Malformed JSON: expected %s but got '%s'\n",                    \
               #token, scanner_.TokenChars());                                  \
-  }                                                                            \
-  ASSERT(scanner_.CurrentToken() == token);
+    intptr_t offset = scanner_.TokenChars() - this->json_object_;              \
+    OS::Print("Malformed JSON: expected %s at offset %" Pd "of buffer:\n%s\n", \
+              #token, offset, this->json_object_);                             \
+    ASSERT(scanner_.CurrentToken() == token);                                  \
+  }
+#else
+#define CHECK_TOKEN(token)
+#endif
+
 
 void JSONReader::CheckArray() {
   CHECK_TOKEN(JSONScanner::TokenLBrack);
diff --git a/runtime/platform/thread.h b/runtime/platform/thread.h
index 4b19f8b..02ad51e 100644
--- a/runtime/platform/thread.h
+++ b/runtime/platform/thread.h
@@ -40,6 +40,8 @@
   }
   static void SetThreadLocal(ThreadLocalKey key, uword value);
   static intptr_t GetMaxStackSize();
+  static ThreadId GetCurrentThreadId();
+  static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage);
 };
 
 
@@ -76,6 +78,7 @@
 
   // Wait for notification or timeout.
   WaitResult Wait(int64_t millis);
+  WaitResult WaitMicros(int64_t micros);
 
   // Notify waiting threads.
   void Notify();
@@ -87,6 +90,59 @@
   DISALLOW_COPY_AND_ASSIGN(Monitor);
 };
 
+
+class ScopedMutex {
+ public:
+  explicit ScopedMutex(Mutex* mutex) : mutex_(mutex) {
+    ASSERT(mutex_ != NULL);
+    mutex_->Lock();
+  }
+
+  ~ScopedMutex() {
+    mutex_->Unlock();
+  }
+
+ private:
+  Mutex* const mutex_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedMutex);
+};
+
+
+class ScopedMonitor {
+ public:
+  explicit ScopedMonitor(Monitor* monitor) : monitor_(monitor) {
+    ASSERT(monitor_ != NULL);
+    monitor_->Enter();
+  }
+
+  ~ScopedMonitor() {
+    monitor_->Exit();
+  }
+
+  Monitor::WaitResult Wait(int64_t millis = dart::Monitor::kNoTimeout) {
+    return monitor_->Wait(millis);
+  }
+
+  Monitor::WaitResult WaitMicros(int64_t micros = dart::Monitor::kNoTimeout) {
+    return monitor_->WaitMicros(micros);
+  }
+
+  void Notify() {
+    monitor_->Notify();
+  }
+
+  void NotifyAll() {
+    monitor_->NotifyAll();
+  }
+
+ private:
+  Monitor* const monitor_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedMonitor);
+};
+
+
 }  // namespace dart
 
 
diff --git a/runtime/platform/thread_android.cc b/runtime/platform/thread_android.cc
index 20e0e9e..f29ffdb 100644
--- a/runtime/platform/thread_android.cc
+++ b/runtime/platform/thread_android.cc
@@ -39,10 +39,10 @@
 #endif
 
 
-static void ComputeTimeSpec(struct timespec* ts, int64_t millis) {
-  int64_t secs = millis / kMillisecondsPerSecond;
+static void ComputeTimeSpecMicros(struct timespec* ts, int64_t micros) {
+  int64_t secs = micros / kMicrosecondsPerSecond;
   int64_t nanos =
-      (millis - (secs * kMillisecondsPerSecond)) * kNanosecondsPerMillisecond;
+      (micros - (secs * kMicrosecondsPerSecond)) * kNanosecondsPerMicrosecond;
   int result = clock_gettime(CLOCK_MONOTONIC, ts);
   ASSERT(result == 0);
   ts->tv_sec += secs;
@@ -144,6 +144,22 @@
 }
 
 
+ThreadId Thread::GetCurrentThreadId() {
+  return pthread_self();
+}
+
+
+void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+  ASSERT(thread_id == GetCurrentThreadId());
+  ASSERT(cpu_usage != NULL);
+  struct timespec ts;
+  int r = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
+  ASSERT(r == 0);
+  *cpu_usage = (ts.tv_sec * kNanosecondsPerSecond + ts.tv_nsec) /
+               kNanosecondsPerMicrosecond;
+}
+
+
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
@@ -252,17 +268,21 @@
 
 
 Monitor::WaitResult Monitor::Wait(int64_t millis) {
+  return WaitMicros(millis * kMicrosecondsPerMillisecond);
+}
+
+
+Monitor::WaitResult Monitor::WaitMicros(int64_t micros) {
   // TODO(iposva): Do we need to track lock owners?
   Monitor::WaitResult retval = kNotified;
-  if (millis == 0) {
+  if (micros == kNoTimeout) {
     // Wait forever.
     int result = pthread_cond_wait(data_.cond(), data_.mutex());
     VALIDATE_PTHREAD_RESULT(result);
   } else {
     struct timespec ts;
-    ComputeTimeSpec(&ts, millis);
-    int result = pthread_cond_timedwait_monotonic(
-        data_.cond(), data_.mutex(), &ts);
+    ComputeTimeSpecMicros(&ts, micros);
+    int result = pthread_cond_timedwait(data_.cond(), data_.mutex(), &ts);
     ASSERT((result == 0) || (result == ETIMEDOUT));
     if (result == ETIMEDOUT) {
       retval = kTimedOut;
diff --git a/runtime/platform/thread_android.h b/runtime/platform/thread_android.h
index e7ca78e..efab2f7 100644
--- a/runtime/platform/thread_android.h
+++ b/runtime/platform/thread_android.h
@@ -17,6 +17,7 @@
 namespace dart {
 
 typedef pthread_key_t ThreadLocalKey;
+typedef pthread_t ThreadId;
 
 class ThreadInlineImpl {
  private:
diff --git a/runtime/platform/thread_linux.cc b/runtime/platform/thread_linux.cc
index acb78c7..36bcfe4 100644
--- a/runtime/platform/thread_linux.cc
+++ b/runtime/platform/thread_linux.cc
@@ -8,6 +8,7 @@
 #include "platform/thread.h"
 
 #include <errno.h>  // NOLINT
+#include <sys/resource.h>  // NOLINT
 #include <sys/time.h>  // NOLINT
 
 #include "platform/assert.h"
@@ -39,10 +40,10 @@
 #endif
 
 
-static void ComputeTimeSpec(struct timespec* ts, int64_t millis) {
-  int64_t secs = millis / kMillisecondsPerSecond;
+static void ComputeTimeSpecMicros(struct timespec* ts, int64_t micros) {
+  int64_t secs = micros / kMicrosecondsPerSecond;
   int64_t nanos =
-      (millis - (secs * kMillisecondsPerSecond)) * kNanosecondsPerMillisecond;
+      (micros - (secs * kMicrosecondsPerSecond)) * kNanosecondsPerMicrosecond;
   int result = clock_gettime(CLOCK_MONOTONIC, ts);
   ASSERT(result == 0);
   ts->tv_sec += secs;
@@ -144,6 +145,22 @@
 }
 
 
+ThreadId Thread::GetCurrentThreadId() {
+  return pthread_self();
+}
+
+
+void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+  ASSERT(thread_id == GetCurrentThreadId());
+  ASSERT(cpu_usage != NULL);
+  struct timespec ts;
+  int r = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
+  ASSERT(r == 0);
+  *cpu_usage = (ts.tv_sec * kNanosecondsPerSecond + ts.tv_nsec) /
+               kNanosecondsPerMicrosecond;
+}
+
+
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
@@ -255,15 +272,20 @@
 
 
 Monitor::WaitResult Monitor::Wait(int64_t millis) {
+  return WaitMicros(millis * kMicrosecondsPerMillisecond);
+}
+
+
+Monitor::WaitResult Monitor::WaitMicros(int64_t micros) {
   // TODO(iposva): Do we need to track lock owners?
   Monitor::WaitResult retval = kNotified;
-  if (millis == 0) {
+  if (micros == kNoTimeout) {
     // Wait forever.
     int result = pthread_cond_wait(data_.cond(), data_.mutex());
     VALIDATE_PTHREAD_RESULT(result);
   } else {
     struct timespec ts;
-    ComputeTimeSpec(&ts, millis);
+    ComputeTimeSpecMicros(&ts, micros);
     int result = pthread_cond_timedwait(data_.cond(), data_.mutex(), &ts);
     ASSERT((result == 0) || (result == ETIMEDOUT));
     if (result == ETIMEDOUT) {
diff --git a/runtime/platform/thread_linux.h b/runtime/platform/thread_linux.h
index 4b8c7d5..581d525 100644
--- a/runtime/platform/thread_linux.h
+++ b/runtime/platform/thread_linux.h
@@ -17,6 +17,7 @@
 namespace dart {
 
 typedef pthread_key_t ThreadLocalKey;
+typedef pthread_t ThreadId;
 
 class ThreadInlineImpl {
  private:
diff --git a/runtime/platform/thread_macos.cc b/runtime/platform/thread_macos.cc
index e9c6dfc..c4167d4 100644
--- a/runtime/platform/thread_macos.cc
+++ b/runtime/platform/thread_macos.cc
@@ -8,6 +8,15 @@
 #include "platform/thread.h"
 
 #include <sys/errno.h>  // NOLINT
+#include <sys/types.h>  // NOLINT
+#include <sys/sysctl.h>  // NOLINT
+#include <mach/mach_init.h>  // NOLINT
+#include <mach/mach_host.h>  // NOLINT
+#include <mach/mach_port.h>  // NOLINT
+#include <mach/mach_traps.h>  // NOLINT
+#include <mach/task_info.h>  // NOLINT
+#include <mach/thread_info.h>  // NOLINT
+#include <mach/thread_act.h>  // NOLINT
 
 #include "platform/assert.h"
 
@@ -128,6 +137,35 @@
 }
 
 
+ThreadId Thread::GetCurrentThreadId() {
+  return pthread_self();
+}
+
+
+void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+  ASSERT(thread_id == GetCurrentThreadId());
+  ASSERT(cpu_usage != NULL);
+  // TODO(johnmccutchan): Enable this after fixing issue with macos directory
+  // watcher.
+  const bool get_cpu_usage = false;
+  if (get_cpu_usage) {
+    mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT;
+    thread_basic_info_data_t info_data;
+    thread_basic_info_t info = &info_data;
+    mach_port_t thread_port = mach_thread_self();
+    kern_return_t r = thread_info(thread_port, THREAD_BASIC_INFO,
+                                  (thread_info_t)info, &count);
+    mach_port_deallocate(mach_task_self(), thread_port);
+    if (r == KERN_SUCCESS) {
+      *cpu_usage = (info->user_time.seconds * kMicrosecondsPerSecond) +
+                   info->user_time.microseconds;
+      return;
+    }
+  }
+  *cpu_usage = 0;
+}
+
+
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
@@ -229,17 +267,22 @@
 
 
 Monitor::WaitResult Monitor::Wait(int64_t millis) {
+  return WaitMicros(millis * kMicrosecondsPerMillisecond);
+}
+
+
+Monitor::WaitResult Monitor::WaitMicros(int64_t micros) {
   // TODO(iposva): Do we need to track lock owners?
   Monitor::WaitResult retval = kNotified;
-  if (millis == 0) {
+  if (micros == kNoTimeout) {
     // Wait forever.
     int result = pthread_cond_wait(data_.cond(), data_.mutex());
     VALIDATE_PTHREAD_RESULT(result);
   } else {
     struct timespec ts;
-    int64_t secs = millis / kMillisecondsPerSecond;
-    int64_t nanos = (millis - (secs * kMillisecondsPerSecond)) *
-        kNanosecondsPerMillisecond;
+    int64_t secs = micros / kMicrosecondsPerSecond;
+    int64_t nanos =
+        (micros - (secs * kMicrosecondsPerSecond)) * kNanosecondsPerMicrosecond;
     ts.tv_sec = secs;
     ts.tv_nsec = nanos;
     int result = pthread_cond_timedwait_relative_np(data_.cond(),
diff --git a/runtime/platform/thread_macos.h b/runtime/platform/thread_macos.h
index bded36e..4d856dd 100644
--- a/runtime/platform/thread_macos.h
+++ b/runtime/platform/thread_macos.h
@@ -17,6 +17,7 @@
 namespace dart {
 
 typedef pthread_key_t ThreadLocalKey;
+typedef pthread_t ThreadId;
 
 class ThreadInlineImpl {
  private:
diff --git a/runtime/platform/thread_win.cc b/runtime/platform/thread_win.cc
index e8be678..d3712d2 100644
--- a/runtime/platform/thread_win.cc
+++ b/runtime/platform/thread_win.cc
@@ -39,12 +39,24 @@
   uword parameter = data->parameter();
   delete data;
 
+  ASSERT(ThreadInlineImpl::thread_id_key != Thread::kUnsetThreadLocalKey);
+
+  ThreadId thread_id = ThreadInlineImpl::CreateThreadId();
+  // Set thread ID in TLS.
+  Thread::SetThreadLocal(ThreadInlineImpl::thread_id_key,
+                         reinterpret_cast<DWORD>(thread_id));
+  MonitorData::GetMonitorWaitDataForThread();
+
   // Call the supplied thread start function handing it its parameters.
   function(parameter);
 
   // Clean up the monitor wait data for this thread.
   MonitorWaitData::ThreadExit();
 
+  // Clear thread ID in TLS.
+  Thread::SetThreadLocal(ThreadInlineImpl::thread_id_key, NULL);
+  ThreadInlineImpl::DestroyThreadId(thread_id);
+
   return 0;
 }
 
@@ -65,6 +77,27 @@
 }
 
 
+ThreadId ThreadInlineImpl::CreateThreadId() {
+  // Create an ID for this thread that can be shared with other threads.
+  HANDLE thread_id = OpenThread(THREAD_GET_CONTEXT |
+                                THREAD_SUSPEND_RESUME |
+                                THREAD_QUERY_INFORMATION,
+                                false,
+                                GetCurrentThreadId());
+  ASSERT(thread_id != NULL);
+  return thread_id;
+}
+
+
+void ThreadInlineImpl::DestroyThreadId(ThreadId thread_id) {
+  ASSERT(thread_id != NULL);
+  // Destroy thread ID.
+  CloseHandle(thread_id);
+}
+
+
+ThreadLocalKey ThreadInlineImpl::thread_id_key = Thread::kUnsetThreadLocalKey;
+
 ThreadLocalKey Thread::kUnsetThreadLocalKey = TLS_OUT_OF_INDEXES;
 
 
@@ -92,6 +125,44 @@
 }
 
 
+ThreadId Thread::GetCurrentThreadId() {
+  ThreadId id = reinterpret_cast<ThreadId>(
+      Thread::GetThreadLocal(ThreadInlineImpl::thread_id_key));
+  ASSERT(id != NULL);
+  return id;
+}
+
+
+void Thread::GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage) {
+  static const int64_t kTimeEpoc = 116444736000000000LL;
+  static const int64_t kTimeScaler = 10;  // 100 ns to us.
+  // Although win32 uses 64-bit integers for representing timestamps,
+  // these are packed into a FILETIME structure. The FILETIME
+  // structure is just a struct representing a 64-bit integer. The
+  // TimeStamp union allows access to both a FILETIME and an integer
+  // representation of the timestamp. The Windows timestamp is in
+  // 100-nanosecond intervals since January 1, 1601.
+  union TimeStamp {
+    FILETIME ft_;
+    int64_t t_;
+  };
+  ASSERT(cpu_usage != NULL);
+  TimeStamp created;
+  TimeStamp exited;
+  TimeStamp kernel;
+  TimeStamp user;
+  BOOL result = GetThreadTimes(thread_id,
+                               &created.ft_,
+                               &exited.ft_,
+                               &kernel.ft_,
+                               &user.ft_);
+  if (!result) {
+    FATAL1("GetThreadCpuUsage failed %d\n", GetLastError());
+  }
+  *cpu_usage = (user.t_ - kTimeEpoc) / kTimeScaler;
+}
+
+
 void Thread::SetThreadLocal(ThreadLocalKey key, uword value) {
   ASSERT(key != kUnsetThreadLocalKey);
   BOOL result = TlsSetValue(key, reinterpret_cast<void*>(value));
@@ -241,6 +312,8 @@
     } else {
       waiters_head_ = waiters_head_->next_;
     }
+    // Clear next.
+    first->next_ = NULL;
     // Signal event.
     BOOL result = SetEvent(first->event_);
     if (result == 0) {
@@ -259,11 +332,16 @@
   waiters_head_ = waiters_tail_ = NULL;
   // Iterate and signal all events.
   while (current != NULL) {
+    // Copy next.
+    MonitorWaitData* next = current->next_;
+    // Clear next.
+    current->next_ = NULL;
+    // Signal event.
     BOOL result = SetEvent(current->event_);
     if (result == 0) {
       FATAL1("Failed to set event for NotifyAll %d", GetLastError());
     }
-    current = current->next_;
+    current = next;
   }
   LeaveCriticalSection(&waiters_cs_);
 }
@@ -272,11 +350,8 @@
 MonitorWaitData* MonitorData::GetMonitorWaitDataForThread() {
   // Ensure that the thread local key for monitor wait data objects is
   // initialized.
-  EnterCriticalSection(&waiters_cs_);
-  if (MonitorWaitData::monitor_wait_data_key_ == Thread::kUnsetThreadLocalKey) {
-    MonitorWaitData::monitor_wait_data_key_ = Thread::CreateThreadLocal();
-  }
-  LeaveCriticalSection(&waiters_cs_);
+  ASSERT(MonitorWaitData::monitor_wait_data_key_ !=
+         Thread::kUnsetThreadLocalKey);
 
   // Get the MonitorWaitData object containing the event for this
   // thread from thread local storage. Create it if it does not exist.
@@ -300,7 +375,7 @@
   Monitor::WaitResult retval = kNotified;
 
   // Get the wait data object containing the event to wait for.
-  MonitorWaitData* wait_data = data_.GetMonitorWaitDataForThread();
+  MonitorWaitData* wait_data = MonitorData::GetMonitorWaitDataForThread();
 
   // Start waiting by adding the MonitorWaitData to the list of
   // waiters.
@@ -338,6 +413,19 @@
 }
 
 
+Monitor::WaitResult Monitor::WaitMicros(int64_t micros) {
+  // TODO(johnmccutchan): Investigate sub-millisecond sleep times on Windows.
+  int64_t millis = micros / kMicrosecondsPerMillisecond;
+  if ((millis * kMicrosecondsPerMillisecond) < micros) {
+    // We've been asked to sleep for a fraction of a millisecond,
+    // this isn't supported on Windows. Bumps milliseconds up by one
+    // so that we never return too early. We likely return late though.
+    millis += 1;
+  }
+  return Wait(millis);
+}
+
+
 void Monitor::Notify() {
   data_.SignalAndRemoveFirstWaiter();
 }
diff --git a/runtime/platform/thread_win.h b/runtime/platform/thread_win.h
index b67b254..40e5a11 100644
--- a/runtime/platform/thread_win.h
+++ b/runtime/platform/thread_win.h
@@ -15,12 +15,17 @@
 namespace dart {
 
 typedef DWORD ThreadLocalKey;
+typedef HANDLE ThreadId;
+
 
 class ThreadInlineImpl {
  private:
   ThreadInlineImpl() {}
   ~ThreadInlineImpl() {}
 
+  static ThreadLocalKey thread_id_key;
+  static ThreadId CreateThreadId();
+  static void DestroyThreadId(ThreadId);
   static uword GetThreadLocal(ThreadLocalKey key) {
     static ThreadLocalKey kUnsetThreadLocalKey = TLS_OUT_OF_INDEXES;
     ASSERT(key != kUnsetThreadLocalKey);
@@ -28,6 +33,8 @@
   }
 
   friend class Thread;
+  friend class OS;
+  friend unsigned int __stdcall ThreadEntry(void* data_ptr);
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl);
@@ -70,6 +77,8 @@
 
   friend class Monitor;
   friend class MonitorData;
+  friend class OS;
+
 
   DISALLOW_COPY_AND_ASSIGN(MonitorWaitData);
 };
@@ -86,7 +95,7 @@
   void RemoveWaiter(MonitorWaitData* wait_data);
   void SignalAndRemoveFirstWaiter();
   void SignalAndRemoveAllWaiters();
-  MonitorWaitData* GetMonitorWaitDataForThread();
+  static MonitorWaitData* GetMonitorWaitDataForThread();
 
   // The external critical section for the monitor.
   CRITICAL_SECTION cs_;
@@ -104,6 +113,8 @@
   MonitorWaitData* waiters_tail_;
 
   friend class Monitor;
+  friend class OS;
+  friend unsigned int __stdcall ThreadEntry(void* data_ptr);
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(MonitorData);
diff --git a/runtime/tests/vm/dart/mirrored_compilation_error_test.dart b/runtime/tests/vm/dart/mirrored_compilation_error_test.dart
index b661afe..7be51d3 100644
--- a/runtime/tests/vm/dart/mirrored_compilation_error_test.dart
+++ b/runtime/tests/vm/dart/mirrored_compilation_error_test.dart
@@ -64,9 +64,9 @@
 
   raises(() => reflectClass(Class).metadata);
   raises(() => reflectClass(Class).typeVariables.single.metadata);
-  raises(() => reflectClass(Class).variables[#field].metadata);
-  raises(() => reflectClass(Class).methods[#method].metadata);
-  raises(() => reflectClass(Class).methods[#method].parameters.single.metadata);
+  raises(() => reflectClass(Class).declarations[#field].metadata);
+  raises(() => reflectClass(Class).declarations[#method].metadata);
+  raises(() => reflectClass(Class).declarations[#method].parameters.single.metadata);
   raises(() => reflectClass(Class).owner.metadata);
 
 
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index f42e26d..663baaf 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -2418,6 +2418,18 @@
 }
 
 
+void Assembler::AndImmediate(Register rd, Register rs, int32_t imm,
+                             Condition cond) {
+  ShifterOperand op;
+  if (ShifterOperand::CanHold(imm, &op)) {
+    and_(rd, rs, ShifterOperand(op), cond);
+  } else {
+    LoadImmediate(TMP, imm, cond);
+    and_(rd, rs, ShifterOperand(TMP), cond);
+  }
+}
+
+
 void Assembler::CompareImmediate(Register rn, int32_t value, Condition cond) {
   ShifterOperand shifter_op;
   if (ShifterOperand::CanHold(value, &shifter_op)) {
@@ -2430,6 +2442,16 @@
 }
 
 
+void Assembler::TestImmediate(Register rn, int32_t imm, Condition cond) {
+  ShifterOperand shifter_op;
+  if (ShifterOperand::CanHold(imm, &shifter_op)) {
+    tst(rn, shifter_op, cond);
+  } else {
+    LoadImmediate(IP, imm);
+    tst(rn, ShifterOperand(IP), cond);
+  }
+}
+
 void Assembler::IntegerDivide(Register result, Register left, Register right,
                               DRegister tmpl, DRegister tmpr) {
   ASSERT(tmpl != tmpr);
@@ -2599,28 +2621,21 @@
 }
 
 
-void Assembler::EnterStubFrame(bool uses_pp) {
+void Assembler::EnterStubFrame(bool load_pp) {
   // Push 0 as saved PC for stub frames.
   mov(IP, ShifterOperand(LR));
   mov(LR, ShifterOperand(0));
-  RegList regs = (1 << FP) | (1 << IP) | (1 << LR);
-  if (uses_pp) {
-    regs |= (1 << PP);
-  }
+  RegList regs = (1 << PP) | (1 << FP) | (1 << IP) | (1 << LR);
   EnterFrame(regs, 0);
-  if (uses_pp) {
+  if (load_pp) {
     // Setup pool pointer for this stub.
     LoadPoolPointer();
   }
 }
 
 
-void Assembler::LeaveStubFrame(bool uses_pp) {
-  RegList regs = (1 << FP) | (1 << LR);
-  if (uses_pp) {
-    regs |= (1 << PP);
-  }
-  LeaveFrame(regs);
+void Assembler::LeaveStubFrame() {
+  LeaveFrame((1 << PP) | (1 << FP) | (1 << LR));
   // Adjust SP for null PC pushed in EnterStubFrame.
   AddImmediate(SP, kWordSize);
 }
@@ -2746,4 +2761,3 @@
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
-
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 0ba7df7..c5971e5 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -583,9 +583,15 @@
   void AddImmediateWithCarry(Register rd, Register rn, int32_t value,
                              Condition cond = AL);
 
+  void AndImmediate(Register rd, Register rs, int32_t imm, Condition cond = AL);
+
+  // Test rn and immediate. May clobber IP.
+  void TestImmediate(Register rn, int32_t imm, Condition cond = AL);
+
   // Compare rn with signed immediate value. May clobber IP.
   void CompareImmediate(Register rn, int32_t value, Condition cond = AL);
 
+
   // Signed integer division of left by right. Checks to see if integer
   // division is supported. If not, uses the FPU for division with
   // temporary registers tmpl and tmpr. tmpl and tmpr must be different
@@ -715,8 +721,8 @@
 
   // Set up a stub frame so that the stack traversal code can easily identify
   // a stub frame.
-  void EnterStubFrame(bool uses_pp = false);
-  void LeaveStubFrame(bool uses_pp = false);
+  void EnterStubFrame(bool load_pp = false);
+  void LeaveStubFrame();
 
   // Instruction pattern from entrypoint is used in Dart frame prologs
   // to set up the frame and save a PC which can be used to figure out the
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 8134b84..61469da 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -367,14 +367,14 @@
 void Assembler::AdduDetectOverflow(Register rd, Register rs, Register rt,
                                    Register ro, Register scratch) {
   ASSERT(rd != ro);
-  ASSERT(rd != TMP1);
-  ASSERT(ro != TMP1);
+  ASSERT(rd != TMP);
+  ASSERT(ro != TMP);
   ASSERT(ro != rs);
   ASSERT(ro != rt);
 
   if ((rs == rt) && (rd == rs)) {
     ASSERT(scratch != kNoRegister);
-    ASSERT(scratch != TMP1);
+    ASSERT(scratch != TMP);
     ASSERT(rd != scratch);
     ASSERT(ro != scratch);
     ASSERT(rs != scratch);
@@ -384,22 +384,22 @@
   }
 
   if (rd == rs) {
-    mov(TMP1, rs);  // Preserve rs.
+    mov(TMP, rs);  // Preserve rs.
     addu(rd, rs, rt);  // rs is overwritten.
-    xor_(TMP1, rd, TMP1);  // Original rs.
+    xor_(TMP, rd, TMP);  // Original rs.
     xor_(ro, rd, rt);
-    and_(ro, ro, TMP1);
+    and_(ro, ro, TMP);
   } else if (rd == rt) {
-    mov(TMP1, rt);  // Preserve rt.
+    mov(TMP, rt);  // Preserve rt.
     addu(rd, rs, rt);  // rt is overwritten.
-    xor_(TMP1, rd, TMP1);  // Original rt.
+    xor_(TMP, rd, TMP);  // Original rt.
     xor_(ro, rd, rs);
-    and_(ro, ro, TMP1);
+    and_(ro, ro, TMP);
   } else {
     addu(rd, rs, rt);
     xor_(ro, rd, rs);
-    xor_(TMP1, rd, rt);
-    and_(ro, TMP1, ro);
+    xor_(TMP, rd, rt);
+    and_(ro, TMP, ro);
   }
 }
 
@@ -407,12 +407,12 @@
 void Assembler::SubuDetectOverflow(Register rd, Register rs, Register rt,
                                    Register ro) {
   ASSERT(rd != ro);
-  ASSERT(rd != TMP1);
-  ASSERT(ro != TMP1);
+  ASSERT(rd != TMP);
+  ASSERT(ro != TMP);
   ASSERT(ro != rs);
   ASSERT(ro != rt);
-  ASSERT(rs != TMP1);
-  ASSERT(rt != TMP1);
+  ASSERT(rs != TMP);
+  ASSERT(rt != TMP);
 
   // This happens with some crankshaft code. Since Subu works fine if
   // left == right, let's not make that restriction here.
@@ -423,22 +423,22 @@
   }
 
   if (rd == rs) {
-    mov(TMP1, rs);  // Preserve left.
+    mov(TMP, rs);  // Preserve left.
     subu(rd, rs, rt);  // Left is overwritten.
-    xor_(ro, rd, TMP1);  // scratch is original left.
-    xor_(TMP1, TMP1, rs);  // scratch is original left.
-    and_(ro, TMP1, ro);
+    xor_(ro, rd, TMP);  // scratch is original left.
+    xor_(TMP, TMP, rs);  // scratch is original left.
+    and_(ro, TMP, ro);
   } else if (rd == rt) {
-    mov(TMP1, rt);  // Preserve right.
+    mov(TMP, rt);  // Preserve right.
     subu(rd, rs, rt);  // Right is overwritten.
     xor_(ro, rd, rs);
-    xor_(TMP1, rs, TMP1);  // Original right.
-    and_(ro, TMP1, ro);
+    xor_(TMP, rs, TMP);  // Original right.
+    and_(ro, TMP, ro);
   } else {
     subu(rd, rs, rt);
     xor_(ro, rd, rs);
-    xor_(TMP1, rs, rt);
-    and_(ro, TMP1, ro);
+    xor_(TMP, rs, rt);
+    and_(ro, TMP, ro);
   }
 }
 
@@ -483,19 +483,19 @@
 
 
 void Assembler::PushObject(const Object& object) {
-  LoadObject(TMP1, object);
-  Push(TMP1);
+  LoadObject(TMP, object);
+  Push(TMP);
 }
 
 
 void Assembler::CompareObject(Register rd1, Register rd2,
                               Register rn, const Object& object) {
-  ASSERT(rn != TMP1);
-  ASSERT(rd1 != TMP1);
+  ASSERT(rn != TMP);
+  ASSERT(rd1 != TMP);
   ASSERT(rd1 != rd2);
-  LoadObject(TMP1, object);
-  slt(rd1, rn, TMP1);
-  slt(rd2, TMP1, rn);
+  LoadObject(TMP, object);
+  slt(rd1, rn, TMP);
+  slt(rd2, TMP, rn);
 }
 
 
@@ -510,9 +510,9 @@
   // the object is in the old space (has bit cleared).
   // To check that, we compute value & ~object and skip the write barrier
   // if the bit is not set. We can't destroy the object.
-  nor(TMP1, ZR, object);
-  and_(TMP1, value, TMP1);
-  andi(CMPRES1, TMP1, Immediate(kNewObjectAlignmentOffset));
+  nor(TMP, ZR, object);
+  and_(TMP, value, TMP);
+  andi(CMPRES1, TMP, Immediate(kNewObjectAlignmentOffset));
   beq(CMPRES1, ZR, no_update);
 }
 
@@ -523,12 +523,12 @@
                                       Label* no_update) {
   // For the value we are only interested in the new/old bit and the tag bit.
   // And the new bit with the tag bit. The resulting bit will be 0 for a Smi.
-  sll(TMP1, value, kObjectAlignmentLog2 - 1);
-  and_(TMP1, value, TMP1);
+  sll(TMP, value, kObjectAlignmentLog2 - 1);
+  and_(TMP, value, TMP);
   // And the result with the negated space bit of the object.
   nor(CMPRES1, ZR, object);
-  and_(TMP1, TMP1, CMPRES1);
-  andi(CMPRES1, TMP1, Immediate(kNewObjectAlignmentOffset));
+  and_(TMP, TMP, CMPRES1);
+  andi(CMPRES1, TMP, Immediate(kNewObjectAlignmentOffset));
   beq(CMPRES1, ZR, no_update);
 }
 
@@ -590,8 +590,8 @@
   ASSERT(value.IsSmi() || value.InVMHeap() ||
          (value.IsOld() && value.IsNotTemporaryScopedHandle()));
   // No store buffer update.
-  LoadObject(TMP1, value);
-  sw(TMP1, dest);
+  LoadObject(TMP, value);
+  sw(TMP, dest);
 }
 
 
@@ -610,85 +610,74 @@
   const intptr_t table_offset_in_isolate =
       Isolate::class_table_offset() + ClassTable::table_offset();
   lw(result, Address(result, table_offset_in_isolate));
-  sll(TMP1, class_id, 2);
-  addu(result, result, TMP1);
+  sll(TMP, class_id, 2);
+  addu(result, result, TMP);
   lw(result, Address(result));
 }
 
 
 void Assembler::LoadClass(Register result, Register object) {
-  ASSERT(TMP1 != result);
-  LoadClassId(TMP1, object);
+  ASSERT(TMP != result);
+  LoadClassId(TMP, object);
 
   lw(result, FieldAddress(CTX, Context::isolate_offset()));
   const intptr_t table_offset_in_isolate =
       Isolate::class_table_offset() + ClassTable::table_offset();
   lw(result, Address(result, table_offset_in_isolate));
-  sll(TMP1, TMP1, 2);
-  addu(result, result, TMP1);
+  sll(TMP, TMP, 2);
+  addu(result, result, TMP);
   lw(result, Address(result));
 }
 
 
-void Assembler::EnterStubFrame(bool uses_pp) {
+void Assembler::EnterFrame() {
+  addiu(SP, SP, Immediate(-2 * kWordSize));
+  sw(RA, Address(SP, 1 * kWordSize));
+  sw(FP, Address(SP, 0 * kWordSize));
+  mov(FP, SP);
+}
+
+
+void Assembler::LeaveFrameAndReturn() {
+  mov(SP, FP);
+  lw(RA, Address(SP, 1 * kWordSize));
+  lw(FP, Address(SP, 0 * kWordSize));
+  Ret();
+  delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
+}
+
+
+void Assembler::EnterStubFrame(bool load_pp) {
   SetPrologueOffset();
-  if (uses_pp) {
-    addiu(SP, SP, Immediate(-4 * kWordSize));
-    sw(ZR, Address(SP, 3 * kWordSize));  // PC marker is 0 in stubs.
-    sw(RA, Address(SP, 2 * kWordSize));
-    sw(FP, Address(SP, 1 * kWordSize));
-    sw(PP, Address(SP, 0 * kWordSize));
-    addiu(FP, SP, Immediate(1 * kWordSize));
+  addiu(SP, SP, Immediate(-4 * kWordSize));
+  sw(ZR, Address(SP, 3 * kWordSize));  // PC marker is 0 in stubs.
+  sw(RA, Address(SP, 2 * kWordSize));
+  sw(FP, Address(SP, 1 * kWordSize));
+  sw(PP, Address(SP, 0 * kWordSize));
+  addiu(FP, SP, Immediate(1 * kWordSize));
+  if (load_pp) {
     // Setup pool pointer for this stub.
-
-    GetNextPC(TMP1);  // TMP1 gets the address of the next instruction.
-
-    const intptr_t object_pool_pc_dist =
-        Instructions::HeaderSize() - Instructions::object_pool_offset() +
-        CodeSize();
-
-    lw(PP, Address(TMP1, -object_pool_pc_dist));
-  } else {
-    addiu(SP, SP, Immediate(-3 * kWordSize));
-    sw(ZR, Address(SP, 2 * kWordSize));  // PC marker is 0 in stubs.
-    sw(RA, Address(SP, 1 * kWordSize));
-    sw(FP, Address(SP, 0 * kWordSize));
-    mov(FP, SP);
+    LoadPoolPointer();
   }
 }
 
 
-void Assembler::LeaveStubFrame(bool uses_pp) {
-  if (uses_pp) {
-    addiu(SP, FP, Immediate(-1 * kWordSize));
-    lw(RA, Address(SP, 2 * kWordSize));
-    lw(FP, Address(SP, 1 * kWordSize));
-    lw(PP, Address(SP, 0 * kWordSize));
-    addiu(SP, SP, Immediate(4 * kWordSize));
-  } else {
-    mov(SP, FP);
-    lw(RA, Address(SP, 1 * kWordSize));
-    lw(FP, Address(SP, 0 * kWordSize));
-    addiu(SP, SP, Immediate(3 * kWordSize));
-  }
+void Assembler::LeaveStubFrame() {
+  addiu(SP, FP, Immediate(-1 * kWordSize));
+  lw(RA, Address(SP, 2 * kWordSize));
+  lw(FP, Address(SP, 1 * kWordSize));
+  lw(PP, Address(SP, 0 * kWordSize));
+  addiu(SP, SP, Immediate(4 * kWordSize));
 }
 
 
-void Assembler::LeaveStubFrameAndReturn(Register ra, bool uses_pp) {
-  if (uses_pp) {
-    addiu(SP, FP, Immediate(-1 * kWordSize));
-    lw(RA, Address(SP, 2 * kWordSize));
-    lw(FP, Address(SP, 1 * kWordSize));
-    lw(PP, Address(SP, 0 * kWordSize));
-    jr(ra);
-    delay_slot()->addiu(SP, SP, Immediate(4 * kWordSize));
-  } else {
-    mov(SP, FP);
-    lw(RA, Address(SP, 1 * kWordSize));
-    lw(FP, Address(SP, 0 * kWordSize));
-    jr(ra);
-    delay_slot()->addiu(SP, SP, Immediate(3 * kWordSize));
-  }
+void Assembler::LeaveStubFrameAndReturn(Register ra) {
+  addiu(SP, FP, Immediate(-1 * kWordSize));
+  lw(RA, Address(SP, 2 * kWordSize));
+  lw(FP, Address(SP, 1 * kWordSize));
+  lw(PP, Address(SP, 0 * kWordSize));
+  jr(ra);
+  delay_slot()->addiu(SP, SP, Immediate(4 * kWordSize));
 }
 
 
@@ -745,7 +734,7 @@
   sw(FP, Address(SP, 1 * kWordSize));
   sw(PP, Address(SP, 0 * kWordSize));
 
-  GetNextPC(TMP1);  // TMP1 gets the address of the next instruction.
+  GetNextPC(TMP);  // TMP gets the address of the next instruction.
 
   // Calculate the offset of the pool pointer from the PC.
   const intptr_t object_pool_pc_dist =
@@ -753,14 +742,14 @@
       CodeSize();
 
   // Save PC in frame for fast identification of corresponding code.
-  AddImmediate(TMP1, -offset);
-  sw(TMP1, Address(SP, 3 * kWordSize));
+  AddImmediate(TMP, -offset);
+  sw(TMP, Address(SP, 3 * kWordSize));
 
   // Set FP to the saved previous FP.
   addiu(FP, SP, Immediate(kWordSize));
 
-  // Load the pool pointer. offset has already been subtracted from TMP1.
-  lw(PP, Address(TMP1, -object_pool_pc_dist + offset));
+  // Load the pool pointer. offset has already been subtracted from TMP.
+  lw(PP, Address(TMP, -object_pool_pc_dist + offset));
 
   // Reserve space for locals.
   AddImmediate(SP, -frame_size);
@@ -831,8 +820,8 @@
   // the C++ world.
   AddImmediate(SP, -frame_space);
   if (OS::ActivationFrameAlignment() > 1) {
-    LoadImmediate(TMP1, ~(OS::ActivationFrameAlignment() - 1));
-    and_(SP, SP, TMP1);
+    LoadImmediate(TMP, ~(OS::ActivationFrameAlignment() - 1));
+    and_(SP, SP, TMP);
   }
 }
 
@@ -984,4 +973,3 @@
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
-
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 250dc17..d17f05d 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -175,13 +175,16 @@
     return FLAG_use_far_branches || use_far_branches_;
   }
 
+  void EnterFrame();
+  void LeaveFrameAndReturn();
+
   // Set up a stub frame so that the stack traversal code can easily identify
   // a stub frame.
-  void EnterStubFrame(bool uses_pp = false);
-  void LeaveStubFrame(bool uses_pp = false);
+  void EnterStubFrame(bool load_pp = false);
+  void LeaveStubFrame();
   // A separate macro for when a Ret immediately follows, so that we can use
   // the branch delay slot.
-  void LeaveStubFrameAndReturn(Register ra = RA, bool uses_pp = false);
+  void LeaveStubFrameAndReturn(Register ra = RA);
 
   // Instruction pattern from entrypoint is used in dart frame prologs
   // to set up the frame and save a PC which can be used to figure out the
@@ -738,7 +741,7 @@
 
   // Addition of rs and rt with the result placed in rd.
   // After, ro < 0 if there was signed overflow, ro >= 0 otherwise.
-  // rd and ro must not be TMP1.
+  // rd and ro must not be TMP.
   // ro must be different from all the other registers.
   // If rd, rs, and rt are the same register, then a scratch register different
   // from the other registers is needed.
@@ -746,7 +749,7 @@
                           Register scratch = kNoRegister);
 
   // ro must be different from rd and rs.
-  // rd and ro must not be TMP1.
+  // rd and ro must not be TMP.
   // If rd and rs are the same, a scratch register different from the other
   // registers is needed.
   void AddImmediateDetectOverflow(Register rd, Register rs, int32_t imm,
@@ -757,12 +760,12 @@
 
   // Subtraction of rt from rs (rs - rt) with the result placed in rd.
   // After, ro < 0 if there was signed overflow, ro >= 0 otherwise.
-  // None of rd, rs, rt, or ro may be TMP1.
+  // None of rd, rs, rt, or ro may be TMP.
   // ro must be different from the other registers.
   void SubuDetectOverflow(Register rd, Register rs, Register rt, Register ro);
 
   // ro must be different from rd and rs.
-  // None of rd, rs, rt, or ro may be TMP1.
+  // None of rd, rs, rt, or ro may be TMP.
   void SubImmediateDetectOverflow(Register rd, Register rs, int32_t imm,
                                   Register ro) {
     LoadImmediate(rd, imm);
@@ -770,29 +773,29 @@
   }
 
   void Branch(const ExternalLabel* label) {
-    LoadImmediate(TMP1, label->address());
-    jr(TMP1);
+    LoadImmediate(TMP, label->address());
+    jr(TMP);
   }
 
   void BranchPatchable(const ExternalLabel* label) {
     const uint16_t low = Utils::Low16Bits(label->address());
     const uint16_t high = Utils::High16Bits(label->address());
-    lui(TMP1, Immediate(high));
-    ori(TMP1, TMP1, Immediate(low));
-    jr(TMP1);
+    lui(TMP, Immediate(high));
+    ori(TMP, TMP, Immediate(low));
+    jr(TMP);
     delay_slot_available_ = false;  // CodePatcher expects a nop.
   }
 
   void BranchLink(const ExternalLabel* label) {
-    LoadImmediate(TMP1, label->address());
-    jalr(TMP1);
+    LoadImmediate(TMP, label->address());
+    jalr(TMP);
   }
 
   void BranchLinkPatchable(const ExternalLabel* label) {
     const int32_t offset =
         Array::data_offset() + 4*AddExternalLabel(label) - kHeapObjectTag;
-    LoadWordFromPoolOffset(TMP1, offset);
-    jalr(TMP1);
+    LoadWordFromPoolOffset(TMP, offset);
+    jalr(TMP);
     delay_slot_available_ = false;  // CodePatcher expects a nop.
   }
 
@@ -803,6 +806,14 @@
     }
   }
 
+  void LoadPoolPointer() {
+    GetNextPC(TMP);  // TMP gets the address of the next instruction.
+    const intptr_t object_pool_pc_dist =
+        Instructions::HeaderSize() - Instructions::object_pool_offset() +
+        CodeSize();
+    lw(PP, Address(TMP, -object_pool_pc_dist));
+  }
+
   void LoadImmediate(Register rd, int32_t value) {
     if (Utils::IsInt(kImmBits, value)) {
       addiu(rd, ZR, Immediate(value));
@@ -820,15 +831,15 @@
     const int32_t low = Utils::Low32Bits(ival);
     const int32_t high = Utils::High32Bits(ival);
     if (low != 0) {
-      LoadImmediate(TMP1, low);
-      mtc1(TMP1, frd);
+      LoadImmediate(TMP, low);
+      mtc1(TMP, frd);
     } else {
       mtc1(ZR, frd);
     }
 
     if (high != 0) {
-      LoadImmediate(TMP1, high);
-      mtc1(TMP1, static_cast<FRegister>(frd + 1));
+      LoadImmediate(TMP, high);
+      mtc1(TMP, static_cast<FRegister>(frd + 1));
     } else {
       mtc1(ZR, static_cast<FRegister>(frd + 1));
     }
@@ -839,8 +850,8 @@
     if (ival == 0) {
       mtc1(ZR, rd);
     } else {
-      LoadImmediate(TMP1, ival);
-      mtc1(TMP1, rd);
+      LoadImmediate(TMP, ival);
+      mtc1(TMP, rd);
     }
   }
 
@@ -850,8 +861,8 @@
     if (Utils::IsInt(kImmBits, value)) {
       addiu(rd, rs, Immediate(value));
     } else {
-      LoadImmediate(TMP1, value);
-      addu(rd, rs, TMP1);
+      LoadImmediate(TMP, value);
+      addu(rd, rs, TMP);
     }
   }
 
@@ -859,6 +870,20 @@
     AddImmediate(rd, rd, value);
   }
 
+  void AndImmediate(Register rd, Register rs, int32_t imm) {
+    if (imm == 0) {
+      mov(rd, ZR);
+      return;
+    }
+
+    if (Utils::IsUint(kImmBits, imm)) {
+      andi(rd, rs, Immediate(imm));
+    } else {
+      LoadImmediate(TMP, imm);
+      and_(rd, rs, TMP);
+    }
+  }
+
   void BranchEqual(Register rd, int32_t value, Label* l) {
     if (value == 0) {
       beq(rd, ZR, l);
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 1425d0b..5ad77f2 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -1458,6 +1458,17 @@
 }
 
 
+void Assembler::TestImmediate(Register dst, const Immediate& imm, Register pp) {
+  if (CanLoadImmediateFromPool(imm, pp)) {
+    ASSERT(dst != TMP);
+    LoadImmediate(TMP, imm, pp);
+    testq(dst, TMP);
+  } else {
+    testq(dst, imm);
+  }
+}
+
+
 void Assembler::andl(Register dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   Operand operand(src);
@@ -2656,17 +2667,11 @@
 }
 
 
-void Assembler::LeaveFrameWithPP() {
-  movq(PP, Address(RBP, -2 * kWordSize));
-  LeaveFrame();
-}
-
-
 void Assembler::ReturnPatchable() {
   // This sequence must have a fixed size so that it can be patched by the
   // debugger.
   intptr_t start = buffer_.GetPosition();
-  LeaveFrameWithPP();
+  LeaveDartFrame();
   ret();
   nop(4);
   ASSERT((buffer_.GetPosition() - start) == 13);
@@ -2814,6 +2819,13 @@
 }
 
 
+void Assembler::LeaveDartFrame() {
+  // Restore caller's PP register that was pushed in EnterDartFrame.
+  movq(PP, Address(RBP, (kSavedCallerPpSlotFromFp * kWordSize)));
+  LeaveFrame();
+}
+
+
 // On entry to a function compiled for OSR, the caller's frame pointer, the
 // stack locals, and any copied parameters are already in place.  The frame
 // pointer is already set up.  The PC marker is not correct for the
@@ -2851,17 +2863,20 @@
 }
 
 
-void Assembler::EnterStubFrame() {
-  EnterFrame(0);
-  pushq(Immediate(0));  // Push 0 in the saved PC area for stub frames.
-}
-
-
-void Assembler::EnterStubFrameWithPP() {
+void Assembler::EnterStubFrame(bool load_pp) {
   EnterFrame(0);
   pushq(Immediate(0));  // Push 0 in the saved PC area for stub frames.
   pushq(PP);  // Save caller's pool pointer
-  LoadPoolPointer(PP);
+  if (load_pp) {
+    LoadPoolPointer(PP);
+  }
+}
+
+
+void Assembler::LeaveStubFrame() {
+  // Restore caller's PP register that was pushed in EnterStubFrame.
+  movq(PP, Address(RBP, (kSavedCallerPpSlotFromFp * kWordSize)));
+  LeaveFrame();
 }
 
 
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index f8c1307..9daaf6c 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -500,6 +500,7 @@
 
   void testq(Register reg1, Register reg2);
   void testq(Register reg, const Immediate& imm);
+  void TestImmediate(Register dst, const Immediate& imm, Register pp);
 
   void andl(Register dst, Register src);
   void andl(Register dst, const Immediate& imm);
@@ -715,7 +716,6 @@
 
   void EnterFrame(intptr_t frame_space);
   void LeaveFrame();
-  void LeaveFrameWithPP();
   void ReturnPatchable();
   void ReserveAlignedFrameSpace(intptr_t frame_space);
 
@@ -775,11 +775,11 @@
   // to this frame.
   // The dart frame layout is as follows:
   //   ....
-  //   ret PC
-  //   saved RBP     <=== RBP
-  //   pc (used to derive the RawInstruction Object of the dart code)
-  //   saved PP
   //   locals space  <=== RSP
+  //   saved PP
+  //   pc (used to derive the RawInstruction Object of the dart code)
+  //   saved RBP     <=== RBP
+  //   ret PC
   //   .....
   // This code sets this up with the sequence:
   //   pushq rbp
@@ -792,6 +792,7 @@
   void EnterDartFrame(intptr_t frame_size);
   void EnterDartFrameWithInfo(intptr_t frame_size,
                               Register new_pp, Register new_pc);
+  void LeaveDartFrame();
 
   // Set up a Dart frame for a function compiled for on-stack replacement.
   // The frame layout is a normal Dart frame, but the frame is partially set
@@ -801,18 +802,18 @@
   // Set up a stub frame so that the stack traversal code can easily identify
   // a stub frame.
   // The stub frame layout is as follows:
-  //   ....
-  //   ret PC
-  //   saved RBP
+  //   ....       <=== RSP
   //   pc (used to derive the RawInstruction Object of the stub)
+  //   saved RBP  <=== RBP
+  //   ret PC
   //   .....
   // This code sets this up with the sequence:
   //   pushq rbp
   //   movq rbp, rsp
   //   pushq immediate(0)
   //   .....
-  void EnterStubFrame();
-  void EnterStubFrameWithPP();
+  void EnterStubFrame(bool load_pp = false);
+  void LeaveStubFrame();
 
   // Instruction pattern from entrypoint is used in dart frame prologues
   // to set up the frame and save a PC which can be used to figure out the
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index fd68d8e..9de4210 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -1625,13 +1625,14 @@
 
 
 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) {
-  __ EnterDartFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
   __ movd(XMM0, RAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
   __ negateps(XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xAA));  // Copy third lane into all 4 lanes.
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
 }
 
@@ -1644,13 +1645,14 @@
 
 
 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) {
-  __ EnterDartFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f)));
   __ movd(XMM0, RAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
   __ absps(XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xAA));  // Copy third lane into all 4 lanes.
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
 }
 
@@ -1663,11 +1665,12 @@
 
 
 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) {
-  __ EnterDartFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
   __ zerowps(XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xFF));  // Copy the W lane which is now 0.0.
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
 }
 
@@ -1784,7 +1787,8 @@
     uint32_t d;
   } constant1 =
       { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
-  __ EnterDartFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ LoadImmediate(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)), PP);
   __ movups(XMM9, Address(RAX, 0));
   __ notps(XMM9);
@@ -1792,7 +1796,7 @@
   __ pushq(RAX);
   __ movss(Address(RSP, 0), XMM0);
   __ popq(RAX);
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
 }
 
@@ -2189,7 +2193,9 @@
   ObjectStore* object_store = Isolate::Current()->object_store();
   const Object& obj = Object::ZoneHandle(object_store->smi_class());
   Label fail;
-  __ EnterDartFrame(0);
+  __ EnterFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ LoadObject(RAX, obj, PP);
   __ CompareObject(RAX, obj, PP);
   __ j(NOT_EQUAL, &fail);
@@ -2211,11 +2217,13 @@
   __ CompareObject(RCX, smi, PP);
   __ j(NOT_EQUAL, &fail);
   __ movl(RAX, Immediate(1));  // OK
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
+  __ LeaveFrame();
   __ ret();
   __ Bind(&fail);
   __ movl(RAX, Immediate(0));  // Fail.
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
+  __ LeaveFrame();
   __ ret();
 }
 
@@ -2426,14 +2434,15 @@
 
 // Called from assembler_test.cc.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
-  __ EnterDartFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ pushq(CTX);
   __ movq(CTX, RDI);
   __ StoreIntoObject(RDX,
                      FieldAddress(RDX, GrowableObjectArray::data_offset()),
                      RSI);
   __ popq(CTX);
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
 }
 
@@ -2547,9 +2556,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) {
-  __ EnterDartFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ DoubleAbs(XMM0);
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
 }
 
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 31aae22..d9f4e91 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -377,8 +377,7 @@
   const char* TypeName() const;
 
   virtual const Instance* EvalConstExpr() const {
-    // TODO(regis): What if the type is malbounded?
-    if (!type_.IsInstantiated() || type_.IsMalformed()) {
+    if (!type_.IsInstantiated() || type_.IsMalformedOrMalbounded()) {
       return NULL;
     }
     return &type();
@@ -833,7 +832,7 @@
   }
 
   SourceLabel* label() const { return label_; }
-  AstNode* body() const { return body_; }
+  SequenceNode* body() const { return body_; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     body()->Visit(visitor);
@@ -843,7 +842,7 @@
 
  private:
   SourceLabel* label_;
-  AstNode* body_;
+  SequenceNode* body_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(SwitchNode);
 };
@@ -979,9 +978,6 @@
       inlined_finally_list_() {
     ASSERT(label_ != NULL);
     ASSERT(kind_ == Token::kBREAK || kind_ == Token::kCONTINUE);
-    if (kind_ == Token::kCONTINUE) {
-      label_->set_is_continue_target(true);
-    }
   }
 
   SourceLabel* label() const { return label_; }
@@ -1672,14 +1668,12 @@
  public:
   TryCatchNode(intptr_t token_pos,
                SequenceNode* try_block,
-               SourceLabel* end_catch_label,
                const LocalVariable* context_var,
                CatchClauseNode* catch_block,
                SequenceNode* finally_block,
                intptr_t try_index)
       : AstNode(token_pos),
         try_block_(try_block),
-        end_catch_label_(end_catch_label),
         context_var_(*context_var),
         catch_block_(catch_block),
         finally_block_(finally_block),
@@ -1687,11 +1681,9 @@
     ASSERT(try_block_ != NULL);
     ASSERT(context_var != NULL);
     ASSERT(catch_block_ != NULL || finally_block_ != NULL);
-    ASSERT(end_catch_label_ != NULL);
   }
 
   SequenceNode* try_block() const { return try_block_; }
-  SourceLabel* end_catch_label() const { return end_catch_label_; }
   CatchClauseNode* catch_block() const { return catch_block_; }
   SequenceNode* finally_block() const { return finally_block_; }
   const LocalVariable& context_var() const { return context_var_; }
@@ -1711,7 +1703,6 @@
 
  private:
   SequenceNode* try_block_;
-  SourceLabel* end_catch_label_;
   const LocalVariable& context_var_;
   CatchClauseNode* catch_block_;
   SequenceNode* finally_block_;
diff --git a/runtime/vm/bigint_operations_test.cc b/runtime/vm/bigint_operations_test.cc
index 46867fe..4a04126 100644
--- a/runtime/vm/bigint_operations_test.cc
+++ b/runtime/vm/bigint_operations_test.cc
@@ -978,7 +978,7 @@
   const char* str_shifted = BigintOperations::ToHexCString(shifted,
                                                            &ZoneAllocator);
   if (strcmp(result, str_shifted)) {
-    WARN2("%s >> %d", a, amount);
+    FAIL2("%s >> %d", a, amount);
   }
   EXPECT_STREQ(result, str_shifted);
 }
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 95f39c4..02729d4 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -13,6 +13,7 @@
 
 // List of bootstrap native entry points used in the core dart library.
 #define BOOTSTRAP_NATIVE_LIST(V)                                               \
+  V(Object_equals, 2)                                                          \
   V(Object_getHash, 1)                                                         \
   V(Object_setHash, 2)                                                         \
   V(Object_toString, 1)                                                        \
@@ -43,7 +44,7 @@
   V(Bool_fromEnvironment, 3)                                                   \
   V(RawReceivePortImpl_factory, 1)                                             \
   V(RawReceivePortImpl_closeInternal, 1)                                       \
-  V(SendPortImpl_sendInternal_, 3)                                             \
+  V(SendPortImpl_sendInternal_, 2)                                             \
   V(Smi_shlFromInt, 2)                                                         \
   V(Smi_shrFromInt, 2)                                                         \
   V(Smi_bitNegate, 1)                                                          \
@@ -95,6 +96,7 @@
   V(OneByteString_substringUnchecked, 3)                                       \
   V(OneByteString_splitWithCharCode, 2)                                        \
   V(OneByteString_allocate, 1)                                                 \
+  V(OneByteString_allocateFromOneByteList, 1)                                  \
   V(OneByteString_setAt, 3)                                                    \
   V(ExternalOneByteString_getCid, 0)                                           \
   V(String_getHashCode, 1)                                                     \
@@ -262,7 +264,6 @@
   V(Mirrors_makeLocalTypeMirror, 1)                                            \
   V(Mirrors_makeLocalMirrorSystem, 0)                                          \
   V(Mirrors_mangleName, 2)                                                     \
-  V(Mirrors_unmangleName, 1)                                                   \
   V(MirrorReference_equals, 2)                                                 \
   V(InstanceMirror_invoke, 5)                                                  \
   V(InstanceMirror_invokeGetter, 3)                                            \
@@ -292,20 +293,18 @@
   V(LibraryMirror_invokeSetter, 4)                                             \
   V(TypeVariableMirror_owner, 1)                                               \
   V(TypeVariableMirror_upper_bound, 1)                                         \
-  V(TypeVariableMirror_instantiate_from, 2)                                    \
   V(DeclarationMirror_metadata, 1)                                             \
   V(FunctionTypeMirror_call_method, 2)                                         \
   V(FunctionTypeMirror_parameters, 2)                                          \
-  V(FunctionTypeMirror_return_type, 1)                                         \
+  V(FunctionTypeMirror_return_type, 2)                                         \
   V(MethodMirror_owner, 1)                                                     \
   V(MethodMirror_parameters, 2)                                                \
-  V(MethodMirror_return_type, 1)                                               \
+  V(MethodMirror_return_type, 2)                                               \
   V(MethodMirror_source, 1)                                                    \
-  V(ParameterMirror_type, 2)                                                   \
+  V(ParameterMirror_type, 3)                                                   \
   V(TypedefMirror_referent, 1)                                                 \
-  V(TypedefMirror_instantiate_from, 2)                                         \
   V(TypedefMirror_declaration, 1)                                              \
-  V(VariableMirror_type, 1)                                                    \
+  V(VariableMirror_type, 2)                                                    \
   V(GrowableList_allocate, 2)                                                  \
   V(GrowableList_getIndexed, 2)                                                \
   V(GrowableList_setIndexed, 3)                                                \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 170f508..5eab085 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -286,8 +286,8 @@
     }
     if (factory.is_const()) {
       type = factory.RedirectionType();
-      if (type.IsMalformed()) {
-        ReportError(Error::Handle(type.malformed_error()));
+      if (type.IsMalformedOrMalbounded()) {
+        ReportError(Error::Handle(type.error()));
       }
     }
   }
@@ -316,8 +316,8 @@
   // Check if target is already resolved.
   Type& type = Type::Handle(factory.RedirectionType());
   Function& target = Function::Handle(factory.RedirectionTarget());
-  if (type.IsMalformed()) {
-    // Already resolved to a malformed type. Will throw on usage.
+  if (type.IsMalformedOrMalbounded()) {
+    // Already resolved to a malformed or malbounded type. Will throw on usage.
     ASSERT(target.IsNull());
     return;
   }
@@ -334,7 +334,7 @@
   ResolveType(cls, type, kCanonicalize);
   type ^= FinalizeType(cls, type, kCanonicalize);
   factory.SetRedirectionType(type);
-  if (type.IsMalformed()) {
+  if (type.IsMalformedOrMalbounded()) {
     ASSERT(factory.RedirectionTarget() == Function::null());
     return;
   }
@@ -430,13 +430,14 @@
     if (!target_type.IsInstantiated()) {
       const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle(
           type.arguments());
-      Error& malformed_error = Error::Handle();
-      target_type ^= target_type.InstantiateFrom(type_args, &malformed_error);
-      if (malformed_error.IsNull()) {
+      Error& bound_error = Error::Handle();
+      target_type ^= target_type.InstantiateFrom(type_args, &bound_error);
+      if (bound_error.IsNull()) {
         target_type ^= FinalizeType(cls, target_type, kCanonicalize);
       } else {
+        ASSERT(target_type.IsInstantiated() && type_args.IsInstantiated());
         const Script& script = Script::Handle(target_class.script());
-        FinalizeMalformedType(malformed_error, script, target_type,
+        FinalizeMalformedType(bound_error, script, target_type,
                               "cannot resolve redirecting factory");
         target_target = Function::null();
       }
@@ -596,14 +597,16 @@
       if (!super_type_args.IsNull()) {
         super_type_arg = super_type_args.TypeAt(super_offset + i);
         if (!super_type_arg.IsInstantiated()) {
-          Error& malformed_error = Error::Handle();
-          super_type_arg = super_type_arg.InstantiateFrom(arguments,
-                                                          &malformed_error);
-          if (!malformed_error.IsNull()) {
-            if (!super_type_arg.IsInstantiated()) {
-              // CheckTypeArgumentBounds will insert a BoundedType.
-            } else if (bound_error->IsNull()) {
-              *bound_error = malformed_error.raw();
+          Error& error = Error::Handle();
+          super_type_arg = super_type_arg.InstantiateFrom(arguments, &error);
+          if (!error.IsNull()) {
+            // InstantiateFrom does not report an error if the type is still
+            // uninstantiated. Instead, it will return a new BoundedType so that
+            // the check is postponed to run time.
+            ASSERT(super_type_arg.IsInstantiated());
+            // Keep only the first bound error.
+            if (bound_error->IsNull()) {
+              *bound_error = error.raw();
             }
           }
         }
@@ -665,14 +668,13 @@
         type_param.set_bound(declared_bound);
       }
       ASSERT(declared_bound.IsFinalized() || declared_bound.IsBeingFinalized());
-      Error& malformed_error = Error::Handle();
+      Error& error = Error::Handle();
       // Note that the bound may be malformed, in which case the bound check
       // will return an error and the bound check will be postponed to run time.
       if (declared_bound.IsInstantiated()) {
         instantiated_bound = declared_bound.raw();
       } else {
-        instantiated_bound =
-            declared_bound.InstantiateFrom(arguments, &malformed_error);
+        instantiated_bound = declared_bound.InstantiateFrom(arguments, &error);
       }
       if (!instantiated_bound.IsFinalized()) {
         // The bound refers to type parameters, creating a cycle; postpone
@@ -684,35 +686,21 @@
         arguments.SetTypeAt(offset + i, type_arg);
         continue;
       }
-      // TODO(regis): We could simplify this code if we could differentiate
-      // between a failed bound check and a bound check that is undecidable at
-      // compile time.
       // Shortcut the special case where we check a type parameter against its
       // declared upper bound.
-      bool below_bound = true;
-      if (malformed_error.IsNull() &&
-          (!type_arg.Equals(type_param) ||
-           !instantiated_bound.Equals(declared_bound))) {
-        // Pass NULL to prevent expensive and unnecessary error formatting in
-        // the case the bound check is postponed to run time.
-        below_bound = type_param.CheckBound(type_arg, instantiated_bound, NULL);
-      }
-      if (!malformed_error.IsNull() || !below_bound) {
-        if (!type_arg.IsInstantiated() ||
-            !instantiated_bound.IsInstantiated()) {
+      if (error.IsNull() &&
+          !(type_arg.Equals(type_param) &&
+            instantiated_bound.Equals(declared_bound))) {
+        if (!type_param.CheckBound(type_arg, instantiated_bound, &error) &&
+            error.IsNull()) {
+          // The bound cannot be checked at compile time; postpone to run time.
           type_arg = BoundedType::New(type_arg, instantiated_bound, type_param);
           arguments.SetTypeAt(offset + i, type_arg);
-        } else if (bound_error->IsNull()) {
-          if (malformed_error.IsNull()) {
-            // Call CheckBound again to format error message.
-            type_param.CheckBound(type_arg,
-                                  instantiated_bound,
-                                  &malformed_error);
-          }
-          ASSERT(!malformed_error.IsNull());
-          *bound_error = malformed_error.raw();
         }
       }
+      if (!error.IsNull() && bound_error->IsNull()) {
+        *bound_error = error.raw();
+      }
     }
   }
   AbstractType& super_type = AbstractType::Handle(cls.super_type());
@@ -822,7 +810,7 @@
   // Specifying no type arguments indicates a raw type, which is not an error.
   // However, type parameter bounds are checked below, even for a raw type.
   if (!arguments.IsNull() && (arguments.Length() != num_type_parameters)) {
-    // Wrong number of type arguments. The type is malformed.
+    // Wrong number of type arguments. The type is mapped to the raw type.
     if (FLAG_error_on_bad_type) {
       const Script& script = Script::Handle(cls.script());
       const String& type_class_name = String::Handle(type_class.Name());
@@ -895,7 +883,7 @@
         }
         CheckTypeArgumentBounds(type_class, full_arguments, &bound_error);
       }
-      if (full_arguments.IsRaw(num_type_arguments)) {
+      if (full_arguments.IsRaw(0, num_type_arguments)) {
         // The parameterized_type is raw. Set its argument vector to null, which
         // is more efficient in type tests.
         full_arguments = TypeArguments::null();
@@ -903,6 +891,7 @@
         // FinalizeTypeArguments can modify 'full_arguments',
         // canonicalize afterwards.
         full_arguments ^= full_arguments.Canonicalize();
+        ASSERT(full_arguments.Length() == num_type_arguments);
       }
       parameterized_type.set_arguments(full_arguments);
     } else {
@@ -927,18 +916,17 @@
     FinalizeTypesInClass(type_class);
   }
 
-  // If a bound error occurred, return a BoundedType with a malformed bound.
-  // The malformed bound will be ignored in production mode.
+  // If a bound error occurred, mark the type as malbounded.
+  // The bound error will be ignored in production mode.
   if (!bound_error.IsNull()) {
     // No compile-time error during finalization.
     const String& parameterized_type_name = String::Handle(
         parameterized_type.UserVisibleName());
-    const Type& malformed_bound = Type::Handle(
-        NewFinalizedMalformedType(bound_error,
-                                  Script::Handle(cls.script()),
-                                  parameterized_type.token_pos(),
-                                  "type '%s' has an out of bound type argument",
-                                  parameterized_type_name.ToCString()));
+    FinalizeMalboundedType(bound_error,
+                           Script::Handle(cls.script()),
+                           parameterized_type,
+                           "type '%s' has an out of bound type argument",
+                           parameterized_type_name.ToCString());
 
     if (FLAG_trace_type_finalization) {
       OS::Print("Done finalizing malbounded type '%s' with bound error: %s\n",
@@ -946,9 +934,7 @@
                 bound_error.ToCString());
     }
 
-    return BoundedType::New(parameterized_type,
-                            malformed_bound,
-                            TypeParameter::Handle());
+    return parameterized_type.raw();;
   }
 
   if (FLAG_trace_type_finalization) {
@@ -1171,18 +1157,18 @@
         (field.value() != Object::sentinel().raw())) {
       // The parser does not preset the value if the type is a type parameter or
       // is parameterized unless the value is null.
-      Error& malformed_error = Error::Handle();
-      if (type.IsMalformed()) {
-        malformed_error = type.malformed_error();
+      Error& error = Error::Handle();
+      if (type.IsMalformedOrMalbounded()) {
+        error = type.error();
       } else {
         ASSERT(type.IsInstantiated());
       }
       const Instance& const_value = Instance::Handle(field.value());
-      if (!malformed_error.IsNull() ||
+      if (!error.IsNull() ||
           (!type.IsDynamicType() &&
            !const_value.IsInstanceOf(type,
                                      AbstractTypeArguments::Handle(),
-                                     &malformed_error))) {
+                                     &error))) {
         if (FLAG_error_on_bad_type) {
           const AbstractType& const_value_type = AbstractType::Handle(
               const_value.GetType());
@@ -1190,7 +1176,7 @@
               const_value_type.UserVisibleName());
           const String& type_name = String::Handle(type.UserVisibleName());
           const Script& script = Script::Handle(cls.script());
-          ReportError(malformed_error, script, field.token_pos(),
+          ReportError(error, script, field.token_pos(),
                       "error initializing static %s field '%s': "
                       "type '%s' is not a subtype of type '%s'",
                       field.is_const() ? "const" : "final",
@@ -1494,17 +1480,17 @@
     }
     mixin_app_class.set_type_parameters(cloned_type_params);
   }
-  // If the mixin class is a mixin application typedef class, we insert a new
+  // If the mixin class is a mixin application alias class, we insert a new
   // synthesized mixin application class in the super chain of this mixin
   // application class. The new class will have the aliased mixin as actual
   // mixin.
-  if (mixin_class.is_mixin_typedef()) {
-    ApplyMixinTypedef(mixin_app_class);
+  if (mixin_class.is_mixin_app_alias()) {
+    ApplyMixinAppAlias(mixin_app_class);
   }
 }
 
 
-/* Support for mixin typedef.
+/* Support for mixin alias.
 Consider the following example:
 
 class I<T> { }
@@ -1514,7 +1500,7 @@
 class A<U, V> = Object with M<Map<U, V>> implements I<V>;
 class C<T, K> = S<T> with A<T, List<K>> implements J<K>;
 
-Before the call to ApplyMixinTypedef, the VM has already synthesized 2 mixin
+Before the call to ApplyMixinAppAlias, the VM has already synthesized 2 mixin
 application classes Object&M and S&A:
 
 Object&M<T> extends Object implements M<T> { ... members of M applied here ... }
@@ -1527,19 +1513,19 @@
 In practice, the additional class provides a hook for implemented interfaces
 (e.g. I<V>) and for type argument substitution via the super type relation (e.g.
 type parameter T of Object&M is substituted with Map<U, V>, U and V being the
-type parameters of the typedef A).
+type parameters of the alias A).
 
 Similarly, class C should be an alias of S&A instead of extending it.
 
 Since A is used as a mixin, it must extend Object. The fact that it extends
 Object&M must be hidden so that no error is wrongly reported.
 
-Now, A does not have any members to be mixed into S&A, because A is a typedef.
+Now, A does not have any members to be mixed into S&A, because A is an alias.
 The members to be mixed in are actually those of M, and they should appear in a
 scope where the type parameter T is visible. The class S&A declares the type
 parameters of A, i.e. U and V, but not T.
 
-Therefore, the call to ApplyMixinTypedef inserts another synthesized class S&A`
+Therefore, the call to ApplyMixinAppAlias inserts another synthesized class S&A`
 as the superclass of S&A. The class S&A` declares a type argument T:
 
 Instead of
@@ -1560,15 +1546,14 @@
 The offset of the first type parameter U of S&A must be at the finalized index
 of type parameter U of A.
 */
-// TODO(regis): The syntax does not use 'typedef' anymore. Rename to 'alias'?
-void ClassFinalizer::ApplyMixinTypedef(const Class& mixin_app_class) {
-  // If this mixin typedef is aliasing another mixin typedef, another class
+void ClassFinalizer::ApplyMixinAppAlias(const Class& mixin_app_class) {
+  // If this mixin alias is aliasing another mixin alias, another class
   // will be inserted via recursion. No need to check here.
   // The mixin type may or may not be finalized yet.
   AbstractType& super_type = AbstractType::Handle(mixin_app_class.super_type());
   const Type& mixin_type = Type::Handle(mixin_app_class.mixin());
   const Class& mixin_class = Class::Handle(mixin_type.type_class());
-  ASSERT(mixin_class.is_mixin_typedef());
+  ASSERT(mixin_class.is_mixin_app_alias());
   const Class& aliased_mixin_app_class = Class::Handle(
       mixin_class.SuperClass());
   const Type& aliased_mixin_type = Type::Handle(
@@ -1590,7 +1575,7 @@
     library.AddClass(inserted_class);
 
     if (FLAG_trace_class_finalization) {
-      OS::Print("Creating mixin typedef application %s\n",
+      OS::Print("Creating mixin application alias %s\n",
                 inserted_class.ToCString());
     }
 
@@ -1623,9 +1608,9 @@
   // old super type arguments (propagating type arguments to the super class)
   // with new type arguments providing type arguments to the mixin.
   // The appended type arguments are those of the super type of the mixin
-  // typedef that are forwarding to the aliased mixin type, except
+  // application alias that are forwarding to the aliased mixin type, except
   // that they must refer to the type parameters of the mixin application
-  // class rather than to those of the mixin typedef class.
+  // class rather than to those of the mixin application alias class.
   // This type parameter substitution is performed by an instantiation step.
   // It is important that the type parameters of the mixin application class
   // are not finalized yet, because new type parameters may have been added
@@ -1700,12 +1685,12 @@
                          new_super_type_args,
                          mixin_app_class.token_pos());
   mixin_app_class.set_super_type(super_type);
-  // Mark this mixin application class as being a typedef.
-  mixin_app_class.set_is_mixin_typedef();
+  // Mark this mixin application class as being an alias.
+  mixin_app_class.set_is_mixin_app_alias();
   ASSERT(!mixin_app_class.is_type_finalized());
   ASSERT(!mixin_app_class.is_mixin_type_applied());
   if (FLAG_trace_class_finalization) {
-    OS::Print("Inserting class %s to mixin typedef application %s "
+    OS::Print("Inserting class %s to mixin application alias %s "
               "with super type '%s'\n",
               inserted_class.ToCString(),
               mixin_app_class.ToCString(),
@@ -1744,10 +1729,10 @@
 
   // Check that the super class of the mixin class is class Object.
   Class& mixin_super_class = Class::Handle(mixin_class.SuperClass());
-  // Skip over mixin application typedef classes, which are aliases (but are
-  // implemented as subclasses) of the mixin application classes they name.
-  if (!mixin_super_class.IsNull() && mixin_class.is_mixin_typedef()) {
-    while (mixin_super_class.is_mixin_typedef()) {
+  // Skip over mixin application alias classes, which are implemented as
+  // subclasses of the mixin application classes they name.
+  if (!mixin_super_class.IsNull() && mixin_class.is_mixin_app_alias()) {
+    while (mixin_super_class.is_mixin_app_alias()) {
       mixin_super_class = mixin_super_class.SuperClass();
     }
     mixin_super_class = mixin_super_class.SuperClass();
@@ -1781,7 +1766,7 @@
   // to avoid cycles while finalizing its mixin type.
   mixin_app_class.set_is_mixin_type_applied();
   // Finalize the mixin type, which may have been changed in case
-  // mixin_app_class is a typedef.
+  // mixin_app_class is an alias.
   mixin_type = mixin_app_class.mixin();
   ASSERT(!mixin_type.IsBeingFinalized());
   mixin_type ^=
@@ -1856,14 +1841,14 @@
   ASSERT(mixin_type.HasResolvedTypeClass());
   const Class& mixin_cls = Class::Handle(isolate, mixin_type.type_class());
   mixin_cls.EnsureIsFinalized(isolate);
-  // If the mixin is a mixin application typedef class, there are no members to
+  // If the mixin is a mixin application alias class, there are no members to
   // apply here. A new synthesized class representing the aliased mixin
   // application class was inserted in the super chain of this mixin application
   // class. Members of the actual mixin class will be applied when visiting
   // the mixin application class referring to the actual mixin.
-  ASSERT(!mixin_cls.is_mixin_typedef() ||
+  ASSERT(!mixin_cls.is_mixin_app_alias() ||
          Class::Handle(isolate, cls.SuperClass()).IsMixinApplication());
-  // A default constructor will be created for the typedef class.
+  // A default constructor will be created for the mixin app alias class.
 
   if (FLAG_trace_class_finalization) {
     OS::Print("Applying mixin members of %s to %s at pos %" Pd "\n",
@@ -2077,8 +2062,8 @@
   }
   // Mark as parsed and finalized.
   cls.Finalize();
-  // Mixin typedef classes may still lack their forwarding constructor.
-  if (cls.is_mixin_typedef() &&
+  // Mixin app alias classes may still lack their forwarding constructor.
+  if (cls.is_mixin_app_alias() &&
       (cls.functions() == Object::empty_array().raw())) {
     const GrowableObjectArray& cloned_funcs =
         GrowableObjectArray::Handle(GrowableObjectArray::New());
@@ -2419,8 +2404,8 @@
 
   // Resolve super type. Failures lead to a longjmp.
   ResolveType(cls, super_type, kCanonicalizeWellFormed);
-  if (super_type.IsMalformed()) {
-    ReportError(Error::Handle(super_type.malformed_error()));
+  if (super_type.IsMalformedOrMalbounded()) {
+    ReportError(Error::Handle(super_type.error()));
   }
   if (super_type.IsDynamicType()) {
     const Script& script = Script::Handle(cls.script());
@@ -2497,8 +2482,9 @@
     interface ^= super_interfaces.At(i);
     ResolveType(cls, interface, kCanonicalizeWellFormed);
     ASSERT(!interface.IsTypeParameter());  // Should be detected by parser.
+    // A malbounded interface is only reported when involved in a type test.
     if (interface.IsMalformed()) {
-      ReportError(Error::Handle(interface.malformed_error()));
+      ReportError(Error::Handle(interface.error()));
     }
     if (interface.IsDynamicType()) {
       const Script& script = Script::Handle(cls.script());
@@ -2631,7 +2617,7 @@
   if (FLAG_error_on_bad_type) {
     ReportError(error);
   }
-  type.set_malformed_error(error);
+  type.set_error(error);
   // Make the type raw, since it may not be possible to
   // properly finalize its type arguments.
   type.set_type_class(Class::Handle(Object::dynamic_class()));
@@ -2678,6 +2664,29 @@
 }
 
 
+void ClassFinalizer::FinalizeMalboundedType(const Error& prev_error,
+                                            const Script& script,
+                                            const Type& type,
+                                            const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  LanguageError& error = LanguageError::Handle(
+      LanguageError::NewFormattedV(
+          prev_error, script, type.token_pos(),
+          LanguageError::kMalboundedType, Heap::kOld,
+          format, args));
+  va_end(args);
+  if (FLAG_error_on_bad_type) {
+    ReportError(error);
+  }
+  type.set_error(error);
+  if (!type.IsFinalized()) {
+    type.SetIsFinalized();
+    // Do not canonicalize malbounded types.
+  }
+}
+
+
 void ClassFinalizer::ReportError(const Error& error) {
   Isolate::Current()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 197e1d6..a61ba36 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -57,8 +57,7 @@
                                             const char* format, ...)
        PRINTF_ATTRIBUTE(4, 5);
 
-  // Depending on the given type, finalization mode, and execution mode, mark
-  // the given type as malformed or report a compile time error.
+  // Mark the given type as malformed.
   // If not null, prepend prev_error to the error message built from the format
   // string and its arguments.
   static void FinalizeMalformedType(const Error& prev_error,
@@ -67,6 +66,15 @@
                                     const char* format, ...)
        PRINTF_ATTRIBUTE(4, 5);
 
+  // Mark the given type as malbounded.
+  // If not null, prepend prev_error to the error message built from the format
+  // string and its arguments.
+  static void FinalizeMalboundedType(const Error& prev_error,
+                                     const Script& script,
+                                     const Type& type,
+                                     const char* format, ...)
+       PRINTF_ATTRIBUTE(4, 5);
+
   // Return false if we still have classes pending to be finalized.
   static bool AllClassesFinalized();
 
@@ -113,7 +121,7 @@
       const Function& factory,
       const GrowableObjectArray& visited_factories);
   static void CloneMixinAppTypeParameters(const Class& mixin_app_class);
-  static void ApplyMixinTypedef(const Class& mixin_app_class);
+  static void ApplyMixinAppAlias(const Class& mixin_app_class);
   static void ApplyMixinMembers(const Class& cls);
   static void CreateForwardingConstructors(
       const Class& mixin_app,
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 5de912a..5ecb9c5 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -658,9 +658,7 @@
 }
 
 
-// TODO(regis): Is this entry still used for malformed types or just malbounded
-// types? Revisit.
-// Report that the type of the type check is malformed.
+// Report that the type of the type check is malformed or malbounded.
 // Arg0: src value.
 // Arg1: name of destination being assigned to.
 // Arg2: type of destination being assigned to.
@@ -675,14 +673,13 @@
   const String& src_type_name = String::Handle(src_type.UserVisibleName());
 
   String& dst_type_name = String::Handle();
-  Error& error = Error::Handle();
-  if (dst_type.IsMalformed()) {
-    error = dst_type.malformed_error();
+  LanguageError& error = LanguageError::Handle(dst_type.error());
+  ASSERT(!error.IsNull());
+  if (error.kind() == LanguageError::kMalformedType) {
     dst_type_name = Symbols::Malformed().raw();
   } else {
-    const bool is_malbounded = dst_type.IsMalboundedWithError(&error);
+    ASSERT(error.kind() == LanguageError::kMalboundedType);
     dst_type_name = Symbols::Malbounded().raw();
-    ASSERT(is_malbounded);
   }
   const String& error_message = String::ZoneHandle(
       Symbols::New(error.ToErrorCString()));
@@ -1343,6 +1340,7 @@
   if (FLAG_use_osr && (interrupt_bits == 0)) {
     DartFrameIterator iterator;
     StackFrame* frame = iterator.NextFrame();
+    ASSERT(frame != NULL);
     const Function& function = Function::Handle(frame->LookupDartFunction());
     ASSERT(!function.IsNull());
     if (!CanOptimizeFunction(function, isolate)) return;
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 6e61697..87e85db 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -155,8 +155,18 @@
   if (cls.is_marked_for_parsing()) {
     return Error::null();
   }
-  // Parse the class and all the interfaces it implements and super classes.
+
   Isolate* isolate = Isolate::Current();
+  // We remember all the classes that are being compiled in these lists. This
+  // also allows us to reset the marked_for_parsing state in case we see an
+  // error.
+  Class& parse_class = Class::Handle();
+  const GrowableObjectArray& parse_list =
+      GrowableObjectArray::Handle(GrowableObjectArray::New(4));
+  const GrowableObjectArray& patch_list =
+      GrowableObjectArray::Handle(GrowableObjectArray::New(4));
+
+  // Parse the class and all the interfaces it implements and super classes.
   StackZone zone(isolate);
   LongJump* base = isolate->long_jump_base();
   LongJump jump;
@@ -166,12 +176,6 @@
       OS::Print("Compiling Class %s '%s'\n", "", cls.ToCString());
     }
 
-    Class& parse_class = Class::Handle();
-    const GrowableObjectArray& parse_list =
-        GrowableObjectArray::Handle(GrowableObjectArray::New(4));
-    const GrowableObjectArray& patch_list =
-        GrowableObjectArray::Handle(GrowableObjectArray::New(4));
-
     // Add the primary class which needs to be parsed to the parse list.
     // Mark the class as parsed so that we don't recursively add the same
     // class back into the list.
@@ -214,6 +218,20 @@
     isolate->set_long_jump_base(base);
     return Error::null();
   } else {
+    // Reset the marked for parsing flags.
+    for (intptr_t i = 0; i < parse_list.Length(); i++) {
+      parse_class ^= parse_list.At(i);
+      if (parse_class.is_marked_for_parsing()) {
+        parse_class.reset_is_marked_for_parsing();
+      }
+    }
+    for (intptr_t i = 0; i < patch_list.Length(); i++) {
+      parse_class ^= patch_list.At(i);
+      if (parse_class.is_marked_for_parsing()) {
+        parse_class.reset_is_marked_for_parsing();
+      }
+    }
+
     Error& error = Error::Handle();
     error = isolate->object_store()->sticky_error();
     isolate->object_store()->clear_sticky_error();
@@ -336,11 +354,11 @@
         optimizer.ApplyICData();
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
-        // Optimize (a << b) & c patterns. Must occur before
+        // Optimize (a << b) & c patterns, merge operations. Must occur before
         // 'SelectRepresentations' which inserts conversion nodes.
         // TODO(srdjan): Moved before inlining until environment use list can
         // be used to detect when shift-left is outside the scope of bit-and.
-        optimizer.TryOptimizeLeftShiftWithBitAndPattern();
+        optimizer.TryOptimizePatterns();
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         // Inlining (mutates the flow graph)
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index fcee41e..08e2285 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -50,7 +50,8 @@
   Function& function_foo =
       Function::Handle(cls.LookupStaticFunction(function_foo_name));
   EXPECT(!function_foo.IsNull());
-
+  String& function_source = String::Handle(function_foo.GetSource());
+  EXPECT_STREQ("static foo() { return 42; }\n  ", function_source.ToCString());
   EXPECT(CompilerTest::TestCompileFunction(function_foo));
   EXPECT(function_foo.HasCode());
 
@@ -61,6 +62,9 @@
 
   EXPECT(CompilerTest::TestCompileFunction(function_moo));
   EXPECT(function_moo.HasCode());
+  function_source = function_moo.GetSource();
+  EXPECT_STREQ("static moo() {\n    // A.foo();\n  }\n",
+               function_source.ToCString());
 }
 
 
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index eb17c1f..9aafaa4 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -175,9 +175,7 @@
 
 
 // Register aliases.
-const Register TMP1 = AT;  // Used as scratch register by assembler.
-const Register TMP = TMP1;  // Arch independent flow graph compiler needs a
-                            // Register called TMP.
+const Register TMP = AT;  // Used as scratch register by assembler.
 const Register CTX = S6;  // Caches current context in generated code.
 const Register PP = S7;  // Caches object pool pointer in generated code.
 const Register SPREG = SP;  // Stack pointer register.
@@ -190,7 +188,6 @@
 // since TMP is clobbered by a far branch.
 const Register CMPRES1 = T8;
 const Register CMPRES2 = T9;
-const Register CMPRES = CMPRES1;
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 92bba64..7503dd0 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -16,6 +16,8 @@
 #include "vm/object_store.h"
 #include "vm/object_id_ring.h"
 #include "vm/port.h"
+#include "vm/profiler.h"
+#include "vm/signal_handler.h"
 #include "vm/simulator.h"
 #include "vm/snapshot.h"
 #include "vm/stub_code.h"
@@ -96,6 +98,7 @@
   FreeListElement::InitOnce();
   Api::InitOnce();
   CodeObservers::InitOnce();
+  ProfilerManager::InitOnce();
 #if defined(USING_SIMULATOR)
   Simulator::InitOnce();
 #endif
@@ -116,8 +119,8 @@
     Object::InitOnce();
     ArgumentsDescriptor::InitOnce();
     StubCode::InitOnce();
-    Scanner::InitOnce();
     Symbols::InitOnce(vm_isolate_);
+    Scanner::InitOnce();
     Object::CreateInternalMetaData();
     CPUFeatures::InitOnce();
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
@@ -170,6 +173,8 @@
   vm_isolate_ = NULL;
 #endif
 
+  ScopedSignalBlocker ssb;
+  ProfilerManager::Shutdown();
   CodeObservers::DeleteAll();
 
   return NULL;
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 5e9a5f3..0435718 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -38,6 +38,8 @@
 
 DECLARE_FLAG(bool, print_class_table);
 DECLARE_FLAG(bool, verify_handles);
+DEFINE_FLAG(bool, check_function_fingerprints, false,
+            "Check function fingerprints");
 DEFINE_FLAG(bool, trace_api, false,
             "Trace invocation of API calls (debug mode only)");
 
@@ -820,6 +822,9 @@
         Error::Handle(isolate,
                       Dart::InitializeIsolate(snapshot, callback_data));
     if (error_obj.IsNull()) {
+      if (FLAG_check_function_fingerprints) {
+        Library::CheckFunctionFingerprints();
+      }
       START_TIMER(time_total_runtime);
       return reinterpret_cast<Dart_Isolate>(isolate);
     }
@@ -2869,17 +2874,17 @@
     constructor = constructor.RedirectionTarget();
     if (constructor.IsNull()) {
       ASSERT(redirect_type.IsMalformed());
-      return Api::NewHandle(isolate, redirect_type.malformed_error());
+      return Api::NewHandle(isolate, redirect_type.error());
     }
 
     if (!redirect_type.IsInstantiated()) {
       // The type arguments of the redirection type are instantiated from the
       // type arguments of the type argument.
-      Error& malformed_error = Error::Handle();
+      Error& bound_error = Error::Handle();
       redirect_type ^= redirect_type.InstantiateFrom(type_arguments,
-                                                     &malformed_error);
-      if (!malformed_error.IsNull()) {
-        return Api::NewHandle(isolate, malformed_error.raw());
+                                                     &bound_error);
+      if (!bound_error.IsNull()) {
+        return Api::NewHandle(isolate, bound_error.raw());
       }
     }
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index a177a48..cb7e97c 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -62,6 +62,336 @@
 }
 
 
+TEST_CASE(StacktraceInfo) {
+  const char* kScriptChars =
+      "bar() => throw new Error();\n"
+      "foo() => bar();\n"
+      "testMain() => foo();\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+  EXPECT(Dart_IsError(error));
+
+  Dart_StackTrace stacktrace;
+  Dart_Handle result = Dart_GetStackTraceFromError(error, &stacktrace);
+  EXPECT_VALID(result);
+
+  intptr_t frame_count = 0;
+  result = Dart_StackTraceLength(stacktrace, &frame_count);
+  EXPECT_VALID(result);
+  EXPECT_EQ(3, frame_count);
+
+  Dart_Handle function_name;
+  Dart_Handle script_url;
+  intptr_t line_number = 0;
+  intptr_t column_number = 0;
+  const char* cstr = "";
+
+  Dart_ActivationFrame frame;
+  result = Dart_GetActivationFrame(stacktrace, 0, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("bar", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(1, line_number);
+  EXPECT_EQ(10, column_number);
+
+  result = Dart_GetActivationFrame(stacktrace, 1, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("foo", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(2, line_number);
+  EXPECT_EQ(13, column_number);
+
+  result = Dart_GetActivationFrame(stacktrace, 2, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("testMain", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(3, line_number);
+  EXPECT_EQ(18, column_number);
+
+  // Out-of-bounds frames.
+  result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
+  EXPECT(Dart_IsError(result));
+  result = Dart_GetActivationFrame(stacktrace, -1, &frame);
+  EXPECT(Dart_IsError(result));
+}
+
+
+TEST_CASE(DeepStacktraceInfo) {
+  const char* kScriptChars =
+      "foo(n) => n == 1 ? throw new Error() : foo(n-1);\n"
+      "testMain() => foo(50);\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+  EXPECT(Dart_IsError(error));
+
+  Dart_StackTrace stacktrace;
+  Dart_Handle result = Dart_GetStackTraceFromError(error, &stacktrace);
+  EXPECT_VALID(result);
+
+  intptr_t frame_count = 0;
+  result = Dart_StackTraceLength(stacktrace, &frame_count);
+  EXPECT_VALID(result);
+  EXPECT_EQ(51, frame_count);
+  // Test something bigger than the preallocated size to verify nothing was
+  // truncated.
+  EXPECT(51 > Stacktrace::kPreallocatedStackdepth);
+
+  Dart_Handle function_name;
+  Dart_Handle script_url;
+  intptr_t line_number = 0;
+  intptr_t column_number = 0;
+  const char* cstr = "";
+
+  // Top frame at positioned at throw.
+  Dart_ActivationFrame frame;
+  result = Dart_GetActivationFrame(stacktrace, 0, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("foo", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(1, line_number);
+  EXPECT_EQ(20, column_number);
+
+  // Middle frames positioned at the recursive call.
+  for (intptr_t frame_index = 1;
+       frame_index < (frame_count - 1);
+       frame_index++) {
+    result = Dart_GetActivationFrame(stacktrace, frame_index, &frame);
+    EXPECT_VALID(result);
+    result = Dart_ActivationFrameInfo(
+        frame, &function_name, &script_url, &line_number, &column_number);
+    EXPECT_VALID(result);
+    Dart_StringToCString(function_name, &cstr);
+    EXPECT_STREQ("foo", cstr);
+    Dart_StringToCString(script_url, &cstr);
+    EXPECT_STREQ("dart:test-lib", cstr);
+    EXPECT_EQ(1, line_number);
+    EXPECT_EQ(43, column_number);
+  }
+
+  // Bottom frame positioned at testMain().
+  result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("testMain", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(2, line_number);
+  EXPECT_EQ(18, column_number);
+
+  // Out-of-bounds frames.
+  result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
+  EXPECT(Dart_IsError(result));
+  result = Dart_GetActivationFrame(stacktrace, -1, &frame);
+  EXPECT(Dart_IsError(result));
+}
+
+
+TEST_CASE(StackOverflowStacktraceInfo) {
+  const char* kScriptChars =
+      "class C {\n"
+      "  static foo() => foo();\n"
+      "}\n"
+      "testMain() => C.foo();\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+  EXPECT(Dart_IsError(error));
+
+  Dart_StackTrace stacktrace;
+  Dart_Handle result = Dart_GetStackTraceFromError(error, &stacktrace);
+  EXPECT_VALID(result);
+
+  intptr_t frame_count = 0;
+  result = Dart_StackTraceLength(stacktrace, &frame_count);
+  EXPECT_VALID(result);
+  EXPECT_EQ(Stacktrace::kPreallocatedStackdepth - 1, frame_count);
+
+  Dart_Handle function_name;
+  Dart_Handle script_url;
+  intptr_t line_number = 0;
+  intptr_t column_number = 0;
+  const char* cstr = "";
+
+  // Top frame at recursive call.
+  Dart_ActivationFrame frame;
+  result = Dart_GetActivationFrame(stacktrace, 0, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("C.foo", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(2, line_number);
+  EXPECT_EQ(3, column_number);
+
+  // Out-of-bounds frames.
+  result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
+  EXPECT(Dart_IsError(result));
+  result = Dart_GetActivationFrame(stacktrace, -1, &frame);
+  EXPECT(Dart_IsError(result));
+}
+
+
+TEST_CASE(OutOfMemoryStacktraceInfo) {
+  const char* kScriptChars =
+      "var number_of_ints = 134000000;\n"
+      "testMain() {\n"
+      "  new List<int>(number_of_ints)\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+
+  EXPECT(Dart_IsError(error));
+
+  Dart_StackTrace stacktrace;
+  Dart_Handle result = Dart_GetStackTraceFromError(error, &stacktrace);
+  EXPECT(Dart_IsError(result));  // No Stacktrace for OutOfMemory.
+}
+
+
+void CurrentStackTraceNative(Dart_NativeArguments args) {
+  Dart_EnterScope();
+
+  Dart_StackTrace stacktrace;
+  Dart_Handle result = Dart_GetStackTrace(&stacktrace);
+  EXPECT_VALID(result);
+
+  intptr_t frame_count = 0;
+  result = Dart_StackTraceLength(stacktrace, &frame_count);
+  EXPECT_VALID(result);
+  EXPECT_EQ(52, frame_count);
+  // Test something bigger than the preallocated size to verify nothing was
+  // truncated.
+  EXPECT(52 > Stacktrace::kPreallocatedStackdepth);
+
+  Dart_Handle function_name;
+  Dart_Handle script_url;
+  intptr_t line_number = 0;
+  intptr_t column_number = 0;
+  const char* cstr = "";
+
+  // Top frame is inspectStack().
+  Dart_ActivationFrame frame;
+  result = Dart_GetActivationFrame(stacktrace, 0, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("inspectStack", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(1, line_number);
+  EXPECT_EQ(47, column_number);
+
+  // Second frame is foo() positioned at call to inspectStack().
+  result = Dart_GetActivationFrame(stacktrace, 1, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("foo", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(2, line_number);
+  EXPECT_EQ(32, column_number);
+
+  // Middle frames positioned at the recursive call.
+  for (intptr_t frame_index = 2;
+       frame_index < (frame_count - 1);
+       frame_index++) {
+    result = Dart_GetActivationFrame(stacktrace, frame_index, &frame);
+    EXPECT_VALID(result);
+    result = Dart_ActivationFrameInfo(
+        frame, &function_name, &script_url, &line_number, &column_number);
+    EXPECT_VALID(result);
+    Dart_StringToCString(function_name, &cstr);
+    EXPECT_STREQ("foo", cstr);
+    Dart_StringToCString(script_url, &cstr);
+    EXPECT_STREQ("dart:test-lib", cstr);
+    EXPECT_EQ(2, line_number);
+    EXPECT_EQ(40, column_number);
+  }
+
+  // Bottom frame positioned at testMain().
+  result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame);
+  EXPECT_VALID(result);
+  result = Dart_ActivationFrameInfo(
+      frame, &function_name, &script_url, &line_number, &column_number);
+  EXPECT_VALID(result);
+  Dart_StringToCString(function_name, &cstr);
+  EXPECT_STREQ("testMain", cstr);
+  Dart_StringToCString(script_url, &cstr);
+  EXPECT_STREQ("dart:test-lib", cstr);
+  EXPECT_EQ(3, line_number);
+  EXPECT_EQ(18, column_number);
+
+  // Out-of-bounds frames.
+  result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
+  EXPECT(Dart_IsError(result));
+  result = Dart_GetActivationFrame(stacktrace, -1, &frame);
+  EXPECT(Dart_IsError(result));
+
+  Dart_SetReturnValue(args, Dart_NewInteger(42));
+  Dart_ExitScope();
+}
+
+
+static Dart_NativeFunction CurrentStackTraceNativeLookup(
+    Dart_Handle name, int argument_count) {
+  return reinterpret_cast<Dart_NativeFunction>(&CurrentStackTraceNative);
+}
+
+
+TEST_CASE(CurrentStacktraceInfo) {
+  const char* kScriptChars =
+      "inspectStack() native 'CurrentStackTraceNatve';\n"
+      "foo(n) => n == 1 ? inspectStack() : foo(n-1);\n"
+      "testMain() => foo(50);\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars,
+                                             &CurrentStackTraceNativeLookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+  EXPECT_VALID(result);
+  EXPECT(Dart_IsInteger(result));
+  int64_t value = 0;
+  EXPECT_VALID(Dart_IntegerToInt64(result, &value));
+  EXPECT_EQ(42, value);
+}
+
+
 TEST_CASE(ErrorHandleTypes) {
   Isolate* isolate = Isolate::Current();
   const String& compile_message = String::Handle(String::New("CompileError"));
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 884706e..60b8df6 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -140,6 +140,7 @@
       token_pos_(-1),
       pc_desc_index_(-1),
       line_number_(-1),
+      column_number_(-1),
       context_level_(-1),
       deopt_frame_(Array::ZoneHandle(deopt_frame.raw())),
       deopt_frame_offset_(deopt_frame_offset),
@@ -295,6 +296,20 @@
 }
 
 
+intptr_t ActivationFrame::ColumnNumber() {
+  // Compute column number lazily since it causes scanning of the script.
+  if ((column_number_ < 0) && (TokenPos() >= 0)) {
+    const Script& script = Script::Handle(SourceScript());
+    if (script.HasSource()) {
+      script.GetTokenLocation(TokenPos(), &line_number_, &column_number_);
+    } else {
+      column_number_ = -1;
+    }
+  }
+  return column_number_;
+}
+
+
 void ActivationFrame::GetVarDescriptors() {
   if (var_descriptors_.IsNull()) {
     var_descriptors_ = code().var_descriptors();
@@ -414,9 +429,9 @@
   AbstractType& type = Type::Handle();
   const TypeArguments& no_instantiator = TypeArguments::Handle();
   for (intptr_t frame_index = 0;
-       frame_index < UnfilteredLength();
+       frame_index < Length();
        frame_index++) {
-    ActivationFrame* frame = UnfilteredFrameAt(frame_index);
+    ActivationFrame* frame = FrameAt(frame_index);
     intptr_t try_index = frame->TryIndex();
     if (try_index < 0) continue;
     handlers = frame->code().exception_handlers();
@@ -662,9 +677,8 @@
 
 
 void DebuggerStackTrace::AddActivation(ActivationFrame* frame) {
-  trace_.Add(frame);
-  if (frame->IsDebuggable()) {
-    user_trace_.Add(frame);
+  if (frame->function().is_visible()) {
+    trace_.Add(frame);
   }
 }
 
@@ -949,18 +963,43 @@
   const ClassTable& class_table = *isolate_->class_table();
   Class& cls = Class::Handle();
   Array& functions = Array::Handle();
+  GrowableObjectArray& closures = GrowableObjectArray::Handle();
   Function& function = Function::Handle();
   intptr_t num_classes = class_table.NumCids();
   for (intptr_t i = 1; i < num_classes; i++) {
     if (class_table.HasValidClassAt(i)) {
       cls = class_table.At(i);
+
+      // Disable optimized functions.
       functions = cls.functions();
-      intptr_t num_functions = functions.IsNull() ? 0 : functions.Length();
-      for (intptr_t f = 0; f < num_functions; f++) {
-        function ^= functions.At(f);
-        ASSERT(!function.IsNull());
-        if (function.HasOptimizedCode()) {
-          function.SwitchToUnoptimizedCode();
+      if (!functions.IsNull()) {
+        intptr_t num_functions = functions.Length();
+        for (intptr_t pos = 0; pos < num_functions; pos++) {
+          function ^= functions.At(pos);
+          ASSERT(!function.IsNull());
+          if (function.HasOptimizedCode()) {
+            function.SwitchToUnoptimizedCode();
+          }
+          // Also disable any optimized implicit closure functions.
+          if (function.HasImplicitClosureFunction()) {
+            function = function.ImplicitClosureFunction();
+            if (function.HasOptimizedCode()) {
+              function.SwitchToUnoptimizedCode();
+            }
+          }
+        }
+      }
+
+      // Disable other optimized closure functions.
+      closures = cls.closures();
+      if (!closures.IsNull()) {
+        intptr_t num_closures = closures.Length();
+        for (intptr_t pos = 0; pos < num_closures; pos++) {
+          function ^= closures.At(pos);
+          ASSERT(!function.IsNull());
+          if (function.HasOptimizedCode()) {
+            function.SwitchToUnoptimizedCode();
+          }
         }
       }
     }
@@ -1245,6 +1284,56 @@
   return (stack_trace_ != NULL) ? stack_trace_ : CollectStackTrace();
 }
 
+DebuggerStackTrace* Debugger::CurrentStackTrace() {
+  return CollectStackTraceNew();
+}
+
+DebuggerStackTrace* Debugger::StackTraceFrom(const Stacktrace& ex_trace) {
+  DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
+  Function& function = Function::Handle();
+  Code& code = Code::Handle();
+
+  const uword fp = 0;
+  const uword sp = 0;
+  const Array& deopt_frame = Array::Handle();
+  const intptr_t deopt_frame_offset = -1;
+
+  for (intptr_t i = 0; i < ex_trace.Length(); i++) {
+    function = ex_trace.FunctionAtFrame(i);
+    // Pre-allocated Stacktraces may include empty slots, either (a) to indicate
+    // where frames were omitted in the case a stack has more frames than the
+    // pre-allocated trace (such as a stack overflow) or (b) because a stack has
+    // fewer frames that the pre-allocated trace (such as memory exhaustion with
+    // a shallow stack).
+    if (!function.IsNull() && function.is_visible()) {
+      code = ex_trace.CodeAtFrame(i);
+      ASSERT(function.raw() == code.function());
+      uword pc = code.EntryPoint() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
+      if (code.is_optimized() && ex_trace.expand_inlined()) {
+        // Traverse inlined frames.
+        for (InlinedFunctionsIterator it(code, pc); !it.Done(); it.Advance()) {
+          function = it.function();
+          code = it.code();
+          ASSERT(function.raw() == code.function());
+          uword pc = it.pc();
+          ASSERT(pc != 0);
+          ASSERT(code.EntryPoint() <= pc);
+          ASSERT(pc < (code.EntryPoint() + code.Size()));
+
+          ActivationFrame* activation = new ActivationFrame(
+            pc, fp, sp, code, deopt_frame, deopt_frame_offset);
+          stack_trace->AddActivation(activation);
+        }
+      } else {
+        ActivationFrame* activation = new ActivationFrame(
+          pc, fp, sp, code, deopt_frame, deopt_frame_offset);
+        stack_trace->AddActivation(activation);
+      }
+    }
+  }
+  return stack_trace;
+}
+
 
 void Debugger::SetExceptionPauseInfo(Dart_ExceptionPauseInfo pause_info) {
   ASSERT((pause_info == kNoPauseOnExceptions) ||
@@ -1863,8 +1952,8 @@
     return;
   }
   DebuggerStackTrace* stack_trace = CollectStackTrace();
-  ASSERT(stack_trace->UnfilteredLength() > 0);
-  ActivationFrame* top_frame = stack_trace->UnfilteredFrameAt(0);
+  ASSERT(stack_trace->Length() > 0);
+  ActivationFrame* top_frame = stack_trace->FrameAt(0);
   ASSERT(top_frame != NULL);
   CodeBreakpoint* bpt = GetCodeBreakpoint(top_frame->pc());
   ASSERT(bpt != NULL);
@@ -1936,6 +2025,29 @@
 }
 
 
+static RawFunction* GetOriginalFunction(const Function& func) {
+  const Class& origin_class = Class::Handle(func.origin());
+  if (origin_class.is_patch()) {
+    // Patched functions from patch classes are removed from the
+    // function array of the patch class, so we will not find an
+    // original function object.
+    return func.raw();
+  }
+  const Array& functions = Array::Handle(origin_class.functions());
+  Object& orig_func = Object::Handle();
+  for (intptr_t i = 0; i < functions.Length(); i++) {
+    orig_func = functions.At(i);
+    // Function names are symbols, so we can compare the raw pointers.
+    if (func.name() == Function::Cast(orig_func).name()) {
+      return Function::Cast(orig_func).raw();
+    }
+  }
+  // Uncommon case: not a mixin function.
+  ASSERT(!Class::Handle(func.Owner()).IsMixinApplication());
+  return func.raw();
+}
+
+
 void Debugger::NotifyCompilation(const Function& func) {
   if (src_breakpoints_ == NULL) {
     // Return with minimal overhead if there are no breakpoints.
@@ -1951,6 +2063,12 @@
     lookup_function = func.parent_function();
     ASSERT(!lookup_function.IsNull());
   }
+  if (lookup_function.Owner() != lookup_function.origin()) {
+    // This is a cloned function from a mixin class. If a breakpoint
+    // was set in this function, it is registered using the function
+    // of the origin class.
+    lookup_function = GetOriginalFunction(lookup_function);
+  }
   SourceBreakpoint* bpt = src_breakpoints_;
   while (bpt != NULL) {
     if (lookup_function.raw() == bpt->function()) {
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 8586626..f68c023 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -144,6 +144,7 @@
   RawLibrary* Library();
   intptr_t TokenPos();
   intptr_t LineNumber();
+  intptr_t ColumnNumber();
   void SetContext(const Context& ctx) { ctx_ = ctx.raw(); }
 
   // Returns true if this frame is for a function that is visible
@@ -196,6 +197,7 @@
   intptr_t token_pos_;
   intptr_t pc_desc_index_;
   intptr_t line_number_;
+  intptr_t column_number_;
   intptr_t context_level_;
 
   // Some frames are deoptimized into a side array in order to inspect them.
@@ -217,27 +219,19 @@
 class DebuggerStackTrace : public ZoneAllocated {
  public:
   explicit DebuggerStackTrace(int capacity)
-      : trace_(capacity),
-        user_trace_(capacity) { }
+      : trace_(capacity) { }
 
-  intptr_t Length() const { return user_trace_.length(); }
+  intptr_t Length() const { return trace_.length(); }
 
   ActivationFrame* FrameAt(int i) const {
-    return user_trace_[i];
+    return trace_[i];
   }
 
   ActivationFrame* GetHandlerFrame(const Instance& exc_obj) const;
 
  private:
-  intptr_t UnfilteredLength() const { return trace_.length(); }
-
-  ActivationFrame* UnfilteredFrameAt(int i) const {
-    return trace_[i];
-  }
-
   void AddActivation(ActivationFrame* frame);
   ZoneGrowableArray<ActivationFrame*> trace_;
-  ZoneGrowableArray<ActivationFrame*> user_trace_;
 
   friend class Debugger;
   DISALLOW_COPY_AND_ASSIGN(DebuggerStackTrace);
@@ -308,7 +302,17 @@
   // Checks for both user-defined and internal temporary breakpoints.
   bool HasBreakpoint(const Function& func);
 
+  // Returns a stack trace with frames corresponding to invisible functions
+  // omitted. CurrentStackTrace always returns a new trace on the current stack.
+  // The trace returned by StackTrace may have been cached; it is suitable for
+  // use when stepping, but otherwise may be out of sync with the current stack.
   DebuggerStackTrace* StackTrace();
+  DebuggerStackTrace* CurrentStackTrace();
+
+  // Returns a debugger stack trace corresponding to a dart.core.Stacktrace.
+  // Frames corresponding to invisible functions are omitted. It is not valid
+  // to query local variables in the returned stack.
+  DebuggerStackTrace* StackTraceFrom(const Stacktrace& dart_stacktrace);
 
   RawArray* GetInstanceFields(const Instance& obj);
   RawArray* GetStaticFields(const Class& cls);
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index c20bf67..dcee7a7 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -221,17 +221,42 @@
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   CHECK_NOT_NULL(trace);
-  *trace = reinterpret_cast<Dart_StackTrace>(isolate->debugger()->StackTrace());
+  *trace = reinterpret_cast<Dart_StackTrace>(
+      isolate->debugger()->CurrentStackTrace());
   return Api::Success();
 }
 
 
+DART_EXPORT Dart_Handle Dart_GetStackTraceFromError(Dart_Handle handle,
+                                                    Dart_StackTrace* trace) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_NOT_NULL(trace);
+  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
+  if (obj.IsUnhandledException()) {
+    const UnhandledException& error = UnhandledException::Cast(obj);
+    Stacktrace& dart_stacktrace = Stacktrace::Handle(isolate);
+    dart_stacktrace ^= error.stacktrace();
+    if (dart_stacktrace.IsNull()) {
+      *trace = NULL;
+    } else {
+      *trace = reinterpret_cast<Dart_StackTrace>(
+        isolate->debugger()->StackTraceFrom(dart_stacktrace));
+    }
+    return Api::Success();
+  } else {
+    return Api::NewError("Can only get stacktraces from error handles or "
+                         "instances of Error.");
+  }
+}
+
+
 DART_EXPORT Dart_Handle Dart_ActivationFrameInfo(
                             Dart_ActivationFrame activation_frame,
                             Dart_Handle* function_name,
                             Dart_Handle* script_url,
                             intptr_t* line_number,
-                            intptr_t* library_id) {
+                            intptr_t* column_number) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   CHECK_AND_CAST(ActivationFrame, frame, activation_frame);
@@ -244,9 +269,8 @@
   if (line_number != NULL) {
     *line_number = frame->LineNumber();
   }
-  if (library_id != NULL) {
-    const Library& lib = Library::Handle(frame->Library());
-    *library_id = lib.index();
+  if (column_number != NULL) {
+    *column_number = frame->ColumnNumber();
   }
   return Api::Success();
 }
@@ -599,6 +623,49 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_GetClosureInfo(
+                            Dart_Handle closure,
+                            Dart_Handle* name,
+                            Dart_Handle* signature,
+                            Dart_CodeLocation* location) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  UNWRAP_AND_CHECK_PARAM(Instance, instance, closure);
+  CHECK_NOT_NULL(location);
+
+  if (!instance.IsClosure()) {
+    return Api::NewError("%s: parameter 0 is not a closure", CURRENT_FUNC);
+  }
+  const Function& func = Function::Handle(Closure::function(instance));
+  ASSERT(!func.IsNull());
+  if (name != NULL) {
+    *name = Api::NewHandle(isolate, func.QualifiedUserVisibleName());
+  }
+  if (signature != NULL) {
+    *signature = Api::NewHandle(isolate, func.UserVisibleSignature());
+  }
+
+  if (location != NULL) {
+    if (func.token_pos() >= 0) {
+      const Class& cls = Class::Handle(func.origin());
+      ASSERT(!cls.IsNull());
+      const Library& lib = Library::Handle(isolate, cls.library());
+      ASSERT(!lib.IsNull());
+      const Script& script = Script::Handle(cls.script());
+      ASSERT(!script.IsNull());
+      location->script_url = Api::NewHandle(isolate, script.url());
+      location->library_id = lib.index();
+      location->token_pos = func.token_pos();
+    } else {
+      location->script_url = Api::NewHandle(isolate, String::null());
+      location->library_id = -1;
+      location->token_pos = -1;
+    }
+  }
+  return Api::True();
+}
+
+
 DART_EXPORT Dart_Handle Dart_GetClassInfo(
                             intptr_t cls_id,
                             Dart_Handle* class_name,
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index f5fe685..18771f0 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -190,7 +190,7 @@
       return value_handle;
     }
   }
-  EXPECT(!"local variable not found");
+  FAIL("local variable not found");
   return Dart_Null();
 }
 
@@ -1875,6 +1875,38 @@
 }
 
 
+TEST_CASE(Debug_GetClosureInfo) {
+  const char* kScriptChars =
+      "void foo() { return 43; } \n"
+      "                          \n"
+      "main() {                  \n"
+      "  return foo;             \n"
+      "}                         \n";
+
+  LoadScript(kScriptChars);
+  Dart_Handle clo = Invoke("main");
+  EXPECT_VALID(clo);
+  EXPECT(Dart_IsClosure(clo));
+  Dart_Handle name, sig;
+  Dart_CodeLocation loc;
+  loc.script_url = Dart_Null();
+  loc.library_id = -1;
+  loc.token_pos = -1;
+  Dart_Handle res = Dart_GetClosureInfo(clo, &name, &sig, &loc);
+  EXPECT_VALID(res);
+  EXPECT_TRUE(res);
+  EXPECT_VALID(name);
+  EXPECT(Dart_IsString(name));
+  EXPECT_STREQ("foo", ToCString(name));
+  EXPECT(Dart_IsString(sig));
+  EXPECT_STREQ("() => void", ToCString(sig));
+  EXPECT(Dart_IsString(loc.script_url));
+  EXPECT_STREQ("dart:test-lib", ToCString(loc.script_url));
+  EXPECT_EQ(0, loc.token_pos);
+  EXPECT(loc.library_id > 0);
+}
+
+
 TEST_CASE(Debug_GetSupertype) {
   const char* kScriptChars =
       "class Test {\n"
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index fdd5489..9975d33 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -56,9 +56,9 @@
   // than the sequence we are replacing. We pad at the top with nops so that
   // the end of the new sequence is lined up with the code descriptor.
   instr1->SetInstructionBits(Instr::kNopInstruction);
-  instr2->SetImmInstrBits(LUI, ZR, TMP1, target_hi);
-  instr3->SetImmInstrBits(ORI, TMP1, TMP1, target_lo);
-  instr4->SetSpecialInstrBits(JALR, TMP1, ZR, RA);
+  instr2->SetImmInstrBits(LUI, ZR, TMP, target_hi);
+  instr3->SetImmInstrBits(ORI, TMP, TMP, target_lo);
+  instr4->SetSpecialInstrBits(JALR, TMP, ZR, RA);
   instr5->SetInstructionBits(Instr::kNopInstruction);
 
   CPU::FlushICache(pc_ - 5 * Instr::kInstrSize, 5 * Instr::kInstrSize);
@@ -72,7 +72,7 @@
   Instr* instr4 = Instr::At(pc_ - 2 * Instr::kInstrSize);
   Instr* instr5 = Instr::At(pc_ - 1 * Instr::kInstrSize);
 
-  ASSERT(instr2->OpcodeField() == LUI && instr2->RtField() == TMP1);
+  ASSERT(instr2->OpcodeField() == LUI && instr2->RtField() == TMP);
 
   instr1->SetImmInstrBits(LW, SP, RA, 2 * kWordSize);
   instr2->SetImmInstrBits(LW, SP, FP, 1 * kWordSize);
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 450d251..087010f 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -501,16 +501,16 @@
 
 
 // Allocate, initialize, and throw a TypeError or CastError.
-// If bound_error is not null, throw a TypeError, even for a type cast.
+// If error_msg is not null, throw a TypeError, even for a type cast.
 void Exceptions::CreateAndThrowTypeError(intptr_t location,
                                          const String& src_type_name,
                                          const String& dst_type_name,
                                          const String& dst_name,
-                                         const String& bound_error) {
+                                         const String& error_msg) {
   const Array& args = Array::Handle(Array::New(7));
 
   ExceptionType exception_type =
-      (bound_error.IsNull() && dst_name.Equals(kCastErrorDstName)) ?
+      (error_msg.IsNull() && dst_name.Equals(kCastErrorDstName)) ?
           kCast : kType;
 
   DartFrameIterator iterator;
@@ -527,17 +527,17 @@
   args.SetAt(1, Smi::Handle(Smi::New(line)));
   args.SetAt(2, Smi::Handle(Smi::New(column)));
 
-  // Initialize '_srcType', '_dstType', '_dstName', and '_boundError'.
+  // Initialize '_srcType', '_dstType', '_dstName', and '_errorMsg'.
   args.SetAt(3, src_type_name);
   args.SetAt(4, dst_type_name);
   args.SetAt(5, dst_name);
-  args.SetAt(6, bound_error);
+  args.SetAt(6, error_msg);
 
   // Type errors in the core library may be difficult to diagnose.
   // Print type error information before throwing the error when debugging.
   if (FLAG_print_stacktrace_at_throw) {
-    if (!bound_error.IsNull()) {
-      OS::Print("%s\n", bound_error.ToCString());
+    if (!error_msg.IsNull()) {
+      OS::Print("%s\n", error_msg.ToCString());
     }
     OS::Print("'%s': Failed type check: line %" Pd " pos %" Pd ": ",
               String::Handle(script.url()).ToCString(), line, column);
@@ -547,7 +547,7 @@
                 dst_type_name.ToCString(),
                 dst_name.ToCString());
     } else {
-      OS::Print("malbounded type used.\n");
+      OS::Print("type error.\n");
     }
   }
   // Throw TypeError or CastError instance.
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index c49b903..bf703dc 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -37,7 +37,7 @@
                                       const String& src_type_name,
                                       const String& dst_type_name,
                                       const String& dst_name,
-                                      const String& bound_error);
+                                      const String& error_msg);
 
   enum ExceptionType {
     kNone,
diff --git a/runtime/vm/find_code_object_test.cc b/runtime/vm/find_code_object_test.cc
index cd390dc..3daccd8 100644
--- a/runtime/vm/find_code_object_test.cc
+++ b/runtime/vm/find_code_object_test.cc
@@ -144,12 +144,12 @@
   pc = code.EntryPoint() + 16;
 #if defined(TARGET_ARCH_MIPS)
   // MIPS can only Branch +/- 128KB
-  EXPECT(code.Size() > (PageSpace::kPageSize / 2));
+  EXPECT(code.Size() > ((PageSpace::kPageSizeInWords << kWordSizeLog2) / 2));
   EXPECT(Code::LookupCode(pc) == code.raw());
-  pc = code.EntryPoint() + (PageSpace::kPageSize / 4);
+  pc = code.EntryPoint() + ((PageSpace::kPageSizeInWords << kWordSizeLog2) / 4);
   EXPECT(Code::LookupCode(pc) == code.raw());
 #else
-  EXPECT(code.Size() > PageSpace::kPageSize);
+  EXPECT(code.Size() > (PageSpace::kPageSizeInWords << kWordSizeLog2));
   EXPECT(Code::LookupCode(pc) == code.raw());
   EXPECT(code.Size() > (1 * MB));
   pc = code.EntryPoint() + (1 * MB);
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index d4469cd..a70becc 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -7,20 +7,26 @@
 #include "lib/invocation_mirror.h"
 #include "vm/ast_printer.h"
 #include "vm/bit_vector.h"
-#include "vm/code_descriptors.h"
-#include "vm/dart_entry.h"
+#include "vm/class_finalizer.h"
+#include "vm/exceptions.h"
 #include "vm/flags.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
+#include "vm/heap.h"
 #include "vm/il_printer.h"
 #include "vm/intermediate_language.h"
+#include "vm/isolate.h"
 #include "vm/longjump.h"
-#include "vm/object_store.h"
+#include "vm/object.h"
 #include "vm/os.h"
 #include "vm/parser.h"
 #include "vm/resolver.h"
+#include "vm/scopes.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
+#include "vm/token.h"
+#include "vm/zone.h"
 
 namespace dart {
 
@@ -36,6 +42,168 @@
 DECLARE_FLAG(bool, enable_type_checks);
 
 
+// Base class for a stack of enclosing statements of interest (e.g.,
+// blocks (breakable) and loops (continuable)).
+class NestedStatement : public ValueObject {
+ public:
+  FlowGraphBuilder* owner() const { return owner_; }
+  const SourceLabel* label() const { return label_; }
+  NestedStatement* outer() const { return outer_; }
+  JoinEntryInstr* break_target() const { return break_target_; }
+
+  virtual intptr_t ContextLevel() const;
+
+  virtual JoinEntryInstr* BreakTargetFor(SourceLabel* label);
+  virtual JoinEntryInstr* ContinueTargetFor(SourceLabel* label);
+
+ protected:
+  NestedStatement(FlowGraphBuilder* owner, const SourceLabel* label)
+      : owner_(owner),
+        label_(label),
+        outer_(owner->nesting_stack_),
+        break_target_(NULL) {
+    // Push on the owner's nesting stack.
+    owner->nesting_stack_ = this;
+  }
+
+  virtual ~NestedStatement() {
+    // Pop from the owner's nesting stack.
+    ASSERT(owner_->nesting_stack_ == this);
+    owner_->nesting_stack_ = outer_;
+  }
+
+ private:
+  FlowGraphBuilder* owner_;
+  const SourceLabel* label_;
+  NestedStatement* outer_;
+
+  JoinEntryInstr* break_target_;
+};
+
+
+intptr_t NestedStatement::ContextLevel() const {
+  // Context level is determined by the innermost nested statement having one.
+  return (outer() == NULL) ? 0 : outer()->ContextLevel();
+}
+
+
+intptr_t FlowGraphBuilder::context_level() const {
+  return (nesting_stack() == NULL) ? 0 : nesting_stack()->ContextLevel();
+}
+
+
+JoinEntryInstr* NestedStatement::BreakTargetFor(SourceLabel* label) {
+  if (label != label_) return NULL;
+  if (break_target_ == NULL) {
+    break_target_ =
+        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+  }
+  return break_target_;
+}
+
+
+JoinEntryInstr* NestedStatement::ContinueTargetFor(SourceLabel* label) {
+  return NULL;
+}
+
+
+// A nested statement that has its own context level.
+class NestedBlock : public NestedStatement {
+ public:
+  NestedBlock(FlowGraphBuilder* owner, SequenceNode* node)
+      : NestedStatement(owner, node->label()), scope_(node->scope()) {}
+
+  virtual intptr_t ContextLevel() const;
+
+ private:
+  LocalScope* scope_;
+};
+
+
+intptr_t NestedBlock::ContextLevel() const {
+  return ((scope_ == NULL) || (scope_->num_context_variables() == 0))
+      ? NestedStatement::ContextLevel()
+      : scope_->context_level();
+}
+
+
+// A nested statement that can be the target of a continue as well as a
+// break.
+class NestedLoop : public NestedStatement {
+ public:
+  NestedLoop(FlowGraphBuilder* owner, SourceLabel* label)
+      : NestedStatement(owner, label), continue_target_(NULL) {
+    owner->IncrementLoopDepth();
+  }
+
+  virtual ~NestedLoop() {
+    owner()->DecrementLoopDepth();
+  }
+
+  JoinEntryInstr* continue_target() const { return continue_target_; }
+
+  virtual JoinEntryInstr* ContinueTargetFor(SourceLabel* label);
+
+ private:
+  JoinEntryInstr* continue_target_;
+};
+
+
+JoinEntryInstr* NestedLoop::ContinueTargetFor(SourceLabel* label) {
+  if (label != this->label()) return NULL;
+  if (continue_target_ == NULL) {
+    continue_target_ =
+        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+  }
+  return continue_target_;
+}
+
+
+// A nested switch which can be the target of a break if labeled, and whose
+// cases can be the targets of continues.
+class NestedSwitch : public NestedStatement {
+ public:
+  NestedSwitch(FlowGraphBuilder* owner, SwitchNode* node);
+
+  virtual JoinEntryInstr* ContinueTargetFor(SourceLabel* label);
+
+ private:
+  GrowableArray<SourceLabel*> case_labels_;
+  GrowableArray<JoinEntryInstr*> case_targets_;
+};
+
+
+NestedSwitch::NestedSwitch(FlowGraphBuilder* owner, SwitchNode* node)
+    : NestedStatement(owner, node->label()),
+      case_labels_(node->body()->length()),
+      case_targets_(node->body()->length()) {
+  SequenceNode* body = node->body();
+  for (intptr_t i = 0; i < body->length(); ++i) {
+    CaseNode* case_node = body->NodeAt(i)->AsCaseNode();
+    if (case_node != NULL) {
+      case_labels_.Add(case_node->label());
+      case_targets_.Add(NULL);
+    }
+  }
+}
+
+
+JoinEntryInstr* NestedSwitch::ContinueTargetFor(SourceLabel* label) {
+  // Allocate a join for a case clause that matches the label.  This block
+  // is not necessarily targeted by a continue, but we always use a join in
+  // the graph anyway.
+  for (intptr_t i = 0; i < case_labels_.length(); ++i) {
+    if (label != case_labels_[i]) continue;
+    if (case_targets_[i] == NULL) {
+      case_targets_[i] =
+          new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+    }
+    return case_targets_[i];
+  }
+  return NULL;
+}
+
+
 FlowGraphBuilder::FlowGraphBuilder(ParsedFunction* parsed_function,
                                    const Array& ic_data_array,
                                    InlineExitCollector* exit_collector,
@@ -51,12 +219,13 @@
     exit_collector_(exit_collector),
     guarded_fields_(new ZoneGrowableArray<const Field*>()),
     last_used_block_id_(0),  // 0 is used for the graph entry.
-    context_level_(0),
     try_index_(CatchClauseNode::kInvalidTryIndex),
     catch_try_index_(CatchClauseNode::kInvalidTryIndex),
     loop_depth_(0),
     graph_entry_(NULL),
+    temp_count_(0),
     args_pushed_(0),
+    nesting_stack_(NULL),
     osr_id_(osr_id) { }
 
 
@@ -352,21 +521,19 @@
   if (other_fragment.is_empty()) return;
   if (is_empty()) {
     entry_ = other_fragment.entry();
-    exit_ = other_fragment.exit();
   } else {
     exit()->LinkTo(other_fragment.entry());
-    exit_ = other_fragment.exit();
   }
-  temp_index_ = other_fragment.temp_index();
+  exit_ = other_fragment.exit();
 }
 
 
 Value* EffectGraphVisitor::Bind(Definition* definition) {
   ASSERT(is_open());
-  DeallocateTempIndex(definition->InputCount());
+  owner()->DeallocateTemps(definition->InputCount());
+  owner()->add_args_pushed(-definition->ArgumentCount());
   definition->set_use_kind(Definition::kValue);
-  definition->set_temp_index(AllocateTempIndex());
-  owner_->add_args_pushed(-definition->ArgumentCount());
+  definition->set_temp_index(owner()->AllocateTemp());
   if (is_empty()) {
     entry_ = definition;
   } else {
@@ -379,9 +546,9 @@
 
 void EffectGraphVisitor::Do(Definition* definition) {
   ASSERT(is_open());
-  DeallocateTempIndex(definition->InputCount());
+  owner()->DeallocateTemps(definition->InputCount());
+  owner()->add_args_pushed(-definition->ArgumentCount());
   definition->set_use_kind(Definition::kEffect);
-  owner_->add_args_pushed(-definition->ArgumentCount());
   if (is_empty()) {
     entry_ = definition;
   } else {
@@ -395,8 +562,8 @@
   ASSERT(is_open());
   ASSERT(instruction->IsPushArgument() || !instruction->IsDefinition());
   ASSERT(!instruction->IsBlockEntry());
-  DeallocateTempIndex(instruction->InputCount());
-  owner_->add_args_pushed(-instruction->ArgumentCount());
+  owner()->DeallocateTemps(instruction->InputCount());
+  owner()->add_args_pushed(-instruction->ArgumentCount());
   if (is_empty()) {
     entry_ = exit_ = instruction;
   } else {
@@ -467,18 +634,14 @@
   // 3. Add a join or select one (or neither) of the arms as exit.
   if (true_exit == NULL) {
     exit_ = false_exit;  // May be NULL.
-    if (false_exit != NULL) temp_index_ = false_fragment.temp_index();
   } else if (false_exit == NULL) {
     exit_ = true_exit;
-    temp_index_ = true_fragment.temp_index();
   } else {
     JoinEntryInstr* join =
         new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
     true_exit->Goto(join);
     false_exit->Goto(join);
     exit_ = join;
-    ASSERT(true_fragment.temp_index() == false_fragment.temp_index());
-    temp_index_ = true_fragment.temp_index();
   }
 }
 
@@ -671,6 +834,7 @@
                              Token::kEQ_STRICT,
                              value,
                              constant_true);
+  comp->set_needs_number_check(false);
   BranchInstr* branch = new BranchInstr(comp);
   AddInstruction(branch);
   CloseFragment();
@@ -683,10 +847,8 @@
 void TestGraphVisitor::MergeBranchWithComparison(ComparisonInstr* comp) {
   BranchInstr* branch;
   if (Token::IsStrictEqualityOperator(comp->kind())) {
-    branch = new BranchInstr(new StrictCompareInstr(comp->token_pos(),
-                                                    comp->kind(),
-                                                    comp->left(),
-                                                    comp->right()));
+    ASSERT(comp->IsStrictCompare());
+    branch = new BranchInstr(comp);
   } else if (Token::IsEqualityOperator(comp->kind()) &&
              (comp->left()->BindsToConstantNull() ||
               comp->right()->BindsToConstantNull())) {
@@ -708,11 +870,13 @@
 void TestGraphVisitor::MergeBranchWithNegate(BooleanNegateInstr* neg) {
   ASSERT(!FLAG_enable_type_checks);
   Value* constant_true = Bind(new ConstantInstr(Bool::True()));
-  BranchInstr* branch = new BranchInstr(
+  StrictCompareInstr* comp =
       new StrictCompareInstr(condition_token_pos(),
                              Token::kNE_STRICT,
                              neg->value(),
-                             constant_true));
+                             constant_true);
+  comp->set_needs_number_check(false);
+  BranchInstr* branch = new BranchInstr(comp);
   AddInstruction(branch);
   CloseFragment();
   true_successor_addresses_.Add(branch->true_successor_address());
@@ -742,14 +906,10 @@
   // Operators "&&" and "||" cannot be overloaded therefore do not call
   // operator.
   if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
-    TestGraphVisitor for_left(owner(),
-                              temp_index(),
-                              node->left()->token_pos());
+    TestGraphVisitor for_left(owner(), node->left()->token_pos());
     node->left()->Visit(&for_left);
 
-    TestGraphVisitor for_right(owner(),
-                               temp_index(),
-                               node->right()->token_pos());
+    TestGraphVisitor for_right(owner(), node->right()->token_pos());
     node->right()->Visit(&for_right);
 
     Append(for_left);
@@ -787,16 +947,19 @@
 // <Statement> ::= Return { value:                <Expression>
 //                          inlined_finally_list: <InlinedFinally>* }
 void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->value()->Visit(&for_value);
   Append(for_value);
 
   for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) {
     InlineBailout("EffectGraphVisitor::VisitReturnNode (exception)");
-    EffectGraphVisitor for_effect(owner(), temp_index());
+    EffectGraphVisitor for_effect(owner());
     node->InlinedFinallyNodeAt(i)->Visit(&for_effect);
     Append(for_effect);
-    if (!is_open()) return;
+    if (!is_open()) {
+      owner()->DeallocateTemps(owner()->temp_count());
+      return;
+    }
   }
 
   Value* return_value = for_value.value();
@@ -828,9 +991,7 @@
     // CTX on entry was saved, but not linked as context parent.
     BuildRestoreContext(*owner()->parsed_function()->saved_entry_context_var());
   } else {
-    while (current_context_level-- > 0) {
-      UnchainContext();
-    }
+    UnchainContexts(current_context_level);
   }
 
   AddReturnExit(node->token_pos(), return_value);
@@ -885,7 +1046,7 @@
 
   // If the destination type is malformed or malbounded, a dynamic type error
   // must be thrown at run time.
-  if (dst_type.IsMalformed() || dst_type.IsMalbounded()) {
+  if (dst_type.IsMalformedOrMalbounded()) {
     return false;
   }
 
@@ -923,7 +1084,7 @@
 //                              type:     AbstractType
 //                              dst_name: String }
 void EffectGraphVisitor::VisitAssignableNode(AssignableNode* node) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->expr()->Visit(&for_value);
   Append(for_value);
   Definition* checked_value;
@@ -944,7 +1105,7 @@
 
 
 void ValueGraphVisitor::VisitAssignableNode(AssignableNode* node) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->expr()->Visit(&for_value);
   Append(for_value);
   ReturnValue(BuildAssignableValue(node->expr()->token_pos(),
@@ -962,13 +1123,11 @@
   // operator.
   if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
     // See ValueGraphVisitor::VisitBinaryOpNode.
-    TestGraphVisitor for_left(owner(),
-                              temp_index(),
-                              node->left()->token_pos());
+    TestGraphVisitor for_left(owner(), node->left()->token_pos());
     node->left()->Visit(&for_left);
-    EffectGraphVisitor empty(owner(), temp_index());
+    EffectGraphVisitor empty(owner());
     if (FLAG_enable_type_checks) {
-      ValueGraphVisitor for_right(owner(), temp_index());
+      ValueGraphVisitor for_right(owner());
       node->right()->Visit(&for_right);
       Value* right_value = for_right.value();
       for_right.Do(new AssertBooleanInstr(node->right()->token_pos(),
@@ -979,7 +1138,7 @@
         Join(for_left, empty, for_right);
       }
     } else {
-      EffectGraphVisitor for_right(owner(), temp_index());
+      EffectGraphVisitor for_right(owner());
       node->right()->Visit(&for_right);
       if (node->kind() == Token::kAND) {
         Join(for_left, for_right, empty);
@@ -989,12 +1148,12 @@
     }
     return;
   }
-  ValueGraphVisitor for_left_value(owner(), temp_index());
+  ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
   PushArgumentInstr* push_left = PushArgument(for_left_value.value());
 
-  ValueGraphVisitor for_right_value(owner(), temp_index());
+  ValueGraphVisitor for_right_value(owner());
   node->right()->Visit(&for_right_value);
   Append(for_right_value);
   PushArgumentInstr* push_right = PushArgument(for_right_value.value());
@@ -1026,12 +1185,10 @@
     // AND:  left ? right === true : false;
     // OR:   left ? true : right === true;
 
-    TestGraphVisitor for_test(owner(),
-                              temp_index(),
-                              node->left()->token_pos());
+    TestGraphVisitor for_test(owner(), node->left()->token_pos());
     node->left()->Visit(&for_test);
 
-    ValueGraphVisitor for_right(owner(), temp_index());
+    ValueGraphVisitor for_right(owner());
     node->right()->Visit(&for_right);
     Value* right_value = for_right.value();
     if (FLAG_enable_type_checks) {
@@ -1048,13 +1205,13 @@
     for_right.Do(BuildStoreExprTemp(compare));
 
     if (node->kind() == Token::kAND) {
-      ValueGraphVisitor for_false(owner(), temp_index());
+      ValueGraphVisitor for_false(owner());
       Value* constant_false = for_false.Bind(new ConstantInstr(Bool::False()));
       for_false.Do(BuildStoreExprTemp(constant_false));
       Join(for_test, for_right, for_false);
     } else {
       ASSERT(node->kind() == Token::kOR);
-      ValueGraphVisitor for_true(owner(), temp_index());
+      ValueGraphVisitor for_true(owner());
       Value* constant_true = for_true.Bind(new ConstantInstr(Bool::True()));
       for_true.Do(BuildStoreExprTemp(constant_true));
       Join(for_test, for_true, for_right);
@@ -1082,12 +1239,12 @@
 void EffectGraphVisitor::VisitBinaryOpWithMask32Node(
     BinaryOpWithMask32Node* node) {
   ASSERT((node->kind() != Token::kAND) && (node->kind() != Token::kOR));
-  ValueGraphVisitor for_left_value(owner(), temp_index());
+  ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
   PushArgumentInstr* push_left = PushArgument(for_left_value.value());
 
-  ValueGraphVisitor for_right_value(owner(), temp_index());
+  ValueGraphVisitor for_right_value(owner());
   node->right()->Visit(&for_right_value);
   Append(for_right_value);
   PushArgumentInstr* push_right = PushArgument(for_right_value.value());
@@ -1215,7 +1372,7 @@
 
 void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
   ASSERT(Token::IsTypeTestOperator(node->kind()));
-  EffectGraphVisitor for_left_value(owner(), temp_index());
+  EffectGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
 }
@@ -1224,13 +1381,13 @@
 void ValueGraphVisitor::BuildTypeTest(ComparisonNode* node) {
   ASSERT(Token::IsTypeTestOperator(node->kind()));
   const AbstractType& type = node->right()->AsTypeNode()->type();
-  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
   const bool negate_result = (node->kind() == Token::kISNOT);
   // All objects are instances of type T if Object type is a subtype of type T.
   const Type& object_type = Type::Handle(Type::ObjectType());
   if (type.IsInstantiated() && object_type.IsSubtypeOf(type, NULL)) {
     // Must evaluate left side.
-    EffectGraphVisitor for_left_value(owner(), temp_index());
+    EffectGraphVisitor for_left_value(owner());
     node->left()->Visit(&for_left_value);
     Append(for_left_value);
     ReturnDefinition(new ConstantInstr(Bool::Get(!negate_result)));
@@ -1258,7 +1415,7 @@
     return;
   }
 
-  ValueGraphVisitor for_left_value(owner(), temp_index());
+  ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
   PushArgumentInstr* push_left = PushArgument(for_left_value.value());
@@ -1300,8 +1457,8 @@
 void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) {
   ASSERT(Token::IsTypeCastOperator(node->kind()));
   const AbstractType& type = node->right()->AsTypeNode()->type();
-  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
+  ValueGraphVisitor for_value(owner());
   node->left()->Visit(&for_value);
   Append(for_value);
   const String& dst_name = String::ZoneHandle(
@@ -1323,7 +1480,7 @@
   ASSERT(!node->right()->AsTypeNode()->type().IsNull());
   const AbstractType& type = node->right()->AsTypeNode()->type();
   ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->left()->Visit(&for_value);
   Append(for_value);
   const String& dst_name = String::ZoneHandle(
@@ -1366,6 +1523,24 @@
 }
 
 
+StrictCompareInstr* EffectGraphVisitor::BuildStrictCompare(AstNode* left,
+                                                           AstNode* right,
+                                                           Token::Kind kind,
+                                                           intptr_t token_pos) {
+  ValueGraphVisitor for_left_value(owner());
+  left->Visit(&for_left_value);
+  Append(for_left_value);
+  ValueGraphVisitor for_right_value(owner());
+  right->Visit(&for_right_value);
+  Append(for_right_value);
+  StrictCompareInstr* comp = new StrictCompareInstr(token_pos,
+                                                    kind,
+                                                    for_left_value.value(),
+                                                    for_right_value.value());
+  return comp;
+}
+
+
 // <Expression> :: Comparison { kind:  Token::Kind
 //                              left:  <Expression>
 //                              right: <Expression> }
@@ -1379,65 +1554,74 @@
     BuildTypeCast(node);
     return;
   }
+
   if ((node->kind() == Token::kEQ_STRICT) ||
       (node->kind() == Token::kNE_STRICT)) {
-    ValueGraphVisitor for_left_value(owner(), temp_index());
-    node->left()->Visit(&for_left_value);
-    Append(for_left_value);
-    ValueGraphVisitor for_right_value(owner(), temp_index());
-    node->right()->Visit(&for_right_value);
-    Append(for_right_value);
-    StrictCompareInstr* comp = new StrictCompareInstr(node->token_pos(),
-                                                      node->kind(),
-                                                      for_left_value.value(),
-                                                      for_right_value.value());
-    ReturnDefinition(comp);
+    ReturnDefinition(BuildStrictCompare(node->left(), node->right(),
+                                        node->kind(), node->token_pos()));
     return;
   }
 
   if ((node->kind() == Token::kEQ) || (node->kind() == Token::kNE)) {
-    ValueGraphVisitor for_left_value(owner(), temp_index());
+    // Eagerly fold null-comparisons.
+    LiteralNode* left_lit = node->left()->AsLiteralNode();
+    LiteralNode* right_lit = node->right()->AsLiteralNode();
+    if (((left_lit != NULL) && left_lit->literal().IsNull()) ||
+        ((right_lit != NULL) && right_lit->literal().IsNull())) {
+      Token::Kind kind =
+          (node->kind() == Token::kEQ) ? Token::kEQ_STRICT : Token::kNE_STRICT;
+      StrictCompareInstr* compare =
+          BuildStrictCompare(node->left(), node->right(),
+                             kind, node->token_pos());
+      ReturnDefinition(compare);
+      return;
+    }
+
+    ZoneGrowableArray<PushArgumentInstr*>* arguments =
+        new ZoneGrowableArray<PushArgumentInstr*>(2);
+
+    ValueGraphVisitor for_left_value(owner());
     node->left()->Visit(&for_left_value);
     Append(for_left_value);
-    ValueGraphVisitor for_right_value(owner(), temp_index());
+    PushArgumentInstr* push_left = PushArgument(for_left_value.value());
+    arguments->Add(push_left);
+
+    ValueGraphVisitor for_right_value(owner());
     node->right()->Visit(&for_right_value);
     Append(for_right_value);
-    if (FLAG_enable_type_checks) {
-      EqualityCompareInstr* comp = new EqualityCompareInstr(
-          node->token_pos(),
-          Token::kEQ,
-          for_left_value.value(),
-          for_right_value.value(),
-          owner()->ic_data_array());
-      if (node->kind() == Token::kEQ) {
-        ReturnDefinition(comp);
-      } else {
-        Value* eq_result = Bind(comp);
-        eq_result = Bind(new AssertBooleanInstr(node->token_pos(), eq_result));
-        ReturnDefinition(new BooleanNegateInstr(eq_result));
+    PushArgumentInstr* push_right = PushArgument(for_right_value.value());
+    arguments->Add(push_right);
+
+    Definition* result =
+        new InstanceCallInstr(node->token_pos(),
+                              Symbols::EqualOperator(),
+                              Token::kEQ,  // Result is negated later for kNE.
+                              arguments,
+                              Object::null_array(),
+                              2,
+                              owner()->ic_data_array());
+    if (node->kind() == Token::kNE) {
+      if (FLAG_enable_type_checks) {
+        Value* value = Bind(result);
+        result = new AssertBooleanInstr(node->token_pos(), value);
       }
-    } else {
-      EqualityCompareInstr* comp = new EqualityCompareInstr(
-          node->token_pos(),
-          node->kind(),
-          for_left_value.value(),
-          for_right_value.value(),
-          owner()->ic_data_array());
-      ReturnDefinition(comp);
+      Value* value = Bind(result);
+      result = new BooleanNegateInstr(value);
     }
+    ReturnDefinition(result);
     return;
   }
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(2);
 
-  ValueGraphVisitor for_left_value(owner(), temp_index());
+  ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
   PushArgumentInstr* push_left = PushArgument(for_left_value.value());
   arguments->Add(push_left);
 
-  ValueGraphVisitor for_right_value(owner(), temp_index());
+  ValueGraphVisitor for_right_value(owner());
   node->right()->Visit(&for_right_value);
   Append(for_right_value);
   PushArgumentInstr* push_right = PushArgument(for_right_value.value());
@@ -1459,7 +1643,7 @@
 void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
   // "!" cannot be overloaded, therefore do not call operator.
   if (node->kind() == Token::kNOT) {
-    ValueGraphVisitor for_value(owner(), temp_index());
+    ValueGraphVisitor for_value(owner());
     node->operand()->Visit(&for_value);
     Append(for_value);
     Value* value = for_value.value();
@@ -1472,7 +1656,7 @@
     return;
   }
 
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->operand()->Visit(&for_value);
   Append(for_value);
   PushArgumentInstr* push_value = PushArgument(for_value.value());
@@ -1492,15 +1676,13 @@
 
 
 void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
-  TestGraphVisitor for_test(owner(),
-                            temp_index(),
-                            node->condition()->token_pos());
+  TestGraphVisitor for_test(owner(), node->condition()->token_pos());
   node->condition()->Visit(&for_test);
 
   // Translate the subexpressions for their effects.
-  EffectGraphVisitor for_true(owner(), temp_index());
+  EffectGraphVisitor for_true(owner());
   node->true_expr()->Visit(&for_true);
-  EffectGraphVisitor for_false(owner(), temp_index());
+  EffectGraphVisitor for_false(owner());
   node->false_expr()->Visit(&for_false);
 
   Join(for_test, for_true, for_false);
@@ -1508,17 +1690,15 @@
 
 
 void ValueGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
-  TestGraphVisitor for_test(owner(),
-                            temp_index(),
-                            node->condition()->token_pos());
+  TestGraphVisitor for_test(owner(), node->condition()->token_pos());
   node->condition()->Visit(&for_test);
 
-  ValueGraphVisitor for_true(owner(), temp_index());
+  ValueGraphVisitor for_true(owner());
   node->true_expr()->Visit(&for_true);
   ASSERT(for_true.is_open());
   for_true.Do(BuildStoreExprTemp(for_true.value()));
 
-  ValueGraphVisitor for_false(owner(), temp_index());
+  ValueGraphVisitor for_false(owner());
   node->false_expr()->Visit(&for_false);
   ASSERT(for_false.is_open());
   for_false.Do(BuildStoreExprTemp(for_false.value()));
@@ -1532,13 +1712,11 @@
 //                      true_branch: <Sequence>
 //                      false_branch: <Sequence> }
 void EffectGraphVisitor::VisitIfNode(IfNode* node) {
-  TestGraphVisitor for_test(owner(),
-                            temp_index(),
-                            node->condition()->token_pos());
+  TestGraphVisitor for_test(owner(), node->condition()->token_pos());
   node->condition()->Visit(&for_test);
 
-  EffectGraphVisitor for_true(owner(), temp_index());
-  EffectGraphVisitor for_false(owner(), temp_index());
+  EffectGraphVisitor for_true(owner());
+  EffectGraphVisitor for_false(owner());
 
   node->true_branch()->Visit(&for_true);
   // The for_false graph fragment will be empty (default graph fragment) if
@@ -1549,16 +1727,14 @@
 
 
 void EffectGraphVisitor::VisitSwitchNode(SwitchNode* node) {
-  EffectGraphVisitor switch_body(owner(), temp_index());
+  NestedSwitch nested_switch(owner(), node);
+  EffectGraphVisitor switch_body(owner());
   node->body()->Visit(&switch_body);
   Append(switch_body);
-  if ((node->label() != NULL) && (node->label()->join_for_break() != NULL)) {
-    if (is_open()) Goto(node->label()->join_for_break());
-    exit_ = node->label()->join_for_break();
+  if (nested_switch.break_target() != NULL) {
+    if (is_open()) Goto(nested_switch.break_target());
+    exit_ = nested_switch.break_target();
   }
-  // No continue label allowed.
-  ASSERT((node->label() == NULL) ||
-         (node->label()->join_for_continue() == NULL));
 }
 
 
@@ -1586,22 +1762,20 @@
 void EffectGraphVisitor::VisitCaseNode(CaseNode* node) {
   const intptr_t len = node->case_expressions()->length();
   // Create case statements instructions.
-  EffectGraphVisitor for_case_statements(owner(), temp_index());
-  // Compute start of statements fragment.
+  EffectGraphVisitor for_case_statements(owner());
+  // Compute the start of the statements fragment.
   JoinEntryInstr* statement_start = NULL;
-  if ((node->label() != NULL) && node->label()->is_continue_target()) {
-    // Since a labeled jump continue statement occur in a different case node,
-    // allocate JoinNode here and use it as statement start.
-    statement_start = node->label()->join_for_continue();
-    if (statement_start == NULL) {
-      statement_start = new JoinEntryInstr(owner()->AllocateBlockId(),
-                                           owner()->try_index());
-      node->label()->set_join_for_continue(statement_start);
-    }
-  } else {
+  if (node->label() == NULL) {
     statement_start = new JoinEntryInstr(owner()->AllocateBlockId(),
                                          owner()->try_index());
+  } else {
+    // The case nodes are nested inside a SequenceNode that is the body of a
+    // SwitchNode.  The SwitchNode on the nesting stack contains the
+    // continue labels for all the case clauses.
+    statement_start =
+        owner()->nesting_stack()->outer()->ContinueTargetFor(node->label());
   }
+  ASSERT(statement_start != NULL);
   node->statements()->Visit(&for_case_statements);
   Instruction* statement_exit =
       AppendFragment(statement_start, for_case_statements);
@@ -1617,9 +1791,7 @@
   TargetEntryInstr* next_target = NULL;
   for (intptr_t i = 0; i < len; i++) {
     AstNode* case_expr = node->case_expressions()->NodeAt(i);
-    TestGraphVisitor for_case_expression(owner(),
-                                         temp_index(),
-                                         case_expr->token_pos());
+    TestGraphVisitor for_case_expression(owner(), case_expr->token_pos());
     case_expr->Visit(&for_case_expression);
     if (i == 0) {
       // Append only the first one, everything else is connected from it.
@@ -1679,31 +1851,27 @@
 // f) loop-exit-target
 // g) break-join (optional)
 void EffectGraphVisitor::VisitWhileNode(WhileNode* node) {
-  owner()->IncrementLoopDepth();
-  TestGraphVisitor for_test(owner(),
-                            temp_index(),
-                            node->condition()->token_pos());
+  NestedLoop nested_loop(owner(), node->label());
+
+  TestGraphVisitor for_test(owner(), node->condition()->token_pos());
   node->condition()->Visit(&for_test);
   ASSERT(!for_test.is_empty());  // Language spec.
 
-  EffectGraphVisitor for_body(owner(), temp_index());
+  EffectGraphVisitor for_body(owner());
   node->body()->Visit(&for_body);
 
   // Labels are set after body traversal.
-  SourceLabel* lbl = node->label();
-  ASSERT(lbl != NULL);
-  JoinEntryInstr* join = lbl->join_for_continue();
+  JoinEntryInstr* join = nested_loop.continue_target();
   if (join != NULL) {
     if (for_body.is_open()) for_body.Goto(join);
     for_body.exit_ = join;
   }
   TieLoop(node->token_pos(), for_test, for_body);
-  join = lbl->join_for_break();
+  join = nested_loop.break_target();
   if (join != NULL) {
     Goto(join);
     exit_ = join;
   }
-  owner()->DecrementLoopDepth();
 }
 
 
@@ -1716,14 +1884,13 @@
 // f) loop-exit-target
 // g) break-join
 void EffectGraphVisitor::VisitDoWhileNode(DoWhileNode* node) {
-  owner()->IncrementLoopDepth();
-  // Traverse body first in order to generate continue and break labels.
-  EffectGraphVisitor for_body(owner(), temp_index());
+  NestedLoop nested_loop(owner(), node->label());
+
+  // Traverse the body first in order to generate continue and break labels.
+  EffectGraphVisitor for_body(owner());
   node->body()->Visit(&for_body);
 
-  TestGraphVisitor for_test(owner(),
-                            temp_index(),
-                            node->condition()->token_pos());
+  TestGraphVisitor for_test(owner(), node->condition()->token_pos());
   node->condition()->Visit(&for_test);
   ASSERT(is_open());
 
@@ -1734,7 +1901,7 @@
   Goto(body_entry_join);
   Instruction* body_exit = AppendFragment(body_entry_join, for_body);
 
-  JoinEntryInstr* join = node->label()->join_for_continue();
+  JoinEntryInstr* join = nested_loop.continue_target();
   if ((body_exit != NULL) || (join != NULL)) {
     if (join == NULL) {
       join = new JoinEntryInstr(owner()->AllocateBlockId(),
@@ -1750,14 +1917,13 @@
   }
 
   for_test.IfTrueGoto(body_entry_join);
-  join = node->label()->join_for_break();
+  join = nested_loop.break_target();
   if (join == NULL) {
     exit_ = for_test.CreateFalseSuccessor();
   } else {
     for_test.IfFalseGoto(join);
     exit_ = join;
   }
-  owner()->DecrementLoopDepth();
 }
 
 
@@ -1774,21 +1940,21 @@
 // h) loop-exit-target
 // i) break-join
 void EffectGraphVisitor::VisitForNode(ForNode* node) {
-  EffectGraphVisitor for_initializer(owner(), temp_index());
+  EffectGraphVisitor for_initializer(owner());
   node->initializer()->Visit(&for_initializer);
   Append(for_initializer);
   ASSERT(is_open());
 
-  owner()->IncrementLoopDepth();
+  NestedLoop nested_loop(owner(), node->label());
   // Compose body to set any jump labels.
-  EffectGraphVisitor for_body(owner(), temp_index());
+  EffectGraphVisitor for_body(owner());
   node->body()->Visit(&for_body);
 
-  EffectGraphVisitor for_increment(owner(), temp_index());
+  EffectGraphVisitor for_increment(owner());
   node->increment()->Visit(&for_increment);
 
   // Join the loop body and increment and then tie the loop.
-  JoinEntryInstr* continue_join = node->label()->join_for_continue();
+  JoinEntryInstr* continue_join = nested_loop.continue_target();
   if ((continue_join != NULL) || for_body.is_open()) {
     JoinEntryInstr* loop_entry =
         new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
@@ -1809,31 +1975,28 @@
   if (node->condition() == NULL) {
     // Endless loop, no test.
     Append(for_body);
-    exit_ = node->label()->join_for_break();  // May be NULL.
+    exit_ = nested_loop.break_target();  // May be NULL.
   } else {
-    TestGraphVisitor for_test(owner(),
-                              temp_index(),
-                              node->condition()->token_pos());
+    TestGraphVisitor for_test(owner(), node->condition()->token_pos());
     node->condition()->Visit(&for_test);
     Append(for_test);
 
     BlockEntryInstr* body_entry = for_test.CreateTrueSuccessor();
     AppendFragment(body_entry, for_body);
 
-    if (node->label()->join_for_break() == NULL) {
+    if (nested_loop.break_target() == NULL) {
       exit_ = for_test.CreateFalseSuccessor();
     } else {
-      for_test.IfFalseGoto(node->label()->join_for_break());
-      exit_ = node->label()->join_for_break();
+      for_test.IfFalseGoto(nested_loop.break_target());
+      exit_ = nested_loop.break_target();
     }
   }
-  owner()->DecrementLoopDepth();
 }
 
 
 void EffectGraphVisitor::VisitJumpNode(JumpNode* node) {
   for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) {
-    EffectGraphVisitor for_effect(owner(), temp_index());
+    EffectGraphVisitor for_effect(owner());
     node->InlinedFinallyNodeAt(i)->Visit(&for_effect);
     Append(for_effect);
     if (!is_open()) return;
@@ -1863,24 +2026,18 @@
   ASSERT(target_context_level >= 0);
   intptr_t current_context_level = owner()->context_level();
   ASSERT(current_context_level >= target_context_level);
-  while (current_context_level-- > target_context_level) {
-    UnchainContext();
-  }
+  UnchainContexts(current_context_level - target_context_level);
 
   JoinEntryInstr* jump_target = NULL;
-  if (node->kind() == Token::kBREAK) {
-    if (node->label()->join_for_break() == NULL) {
-      node->label()->set_join_for_break(
-          new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()));
-    }
-    jump_target = node->label()->join_for_break();
-  } else {
-    if (node->label()->join_for_continue() == NULL) {
-      node->label()->set_join_for_continue(
-          new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()));
-    }
-    jump_target = node->label()->join_for_continue();
+  NestedStatement* current = owner()->nesting_stack();
+  while (current != NULL) {
+    jump_target = (node->kind() == Token::kBREAK)
+        ? current->BreakTargetFor(node->label())
+        : current->ContinueTargetFor(node->label());
+    if (jump_target != NULL) break;
+    current = current->outer();
   }
+  ASSERT(jump_target != NULL);
   Goto(jump_target);
 }
 
@@ -1895,15 +2052,15 @@
       - owner()->num_stack_locals()
       - owner()->num_copied_params()
       - owner()->args_pushed()
-      - temp_index() + 1;
+      - owner()->temp_count() + 1;
 }
 
 
 LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
   Do(new PushTempInstr(value));
-  AllocateTempIndex();
+  owner()->AllocateTemp();
 
-  ASSERT(value->definition()->temp_index() == temp_index() - 1);
+  ASSERT(value->definition()->temp_index() == (owner()->temp_count() - 1));
   intptr_t index = GetCurrentTempLocalIndex();
   char name[64];
   OS::SNPrint(name, 64, ":tmp_local%" Pd, index);
@@ -1918,7 +2075,7 @@
 
 Definition* EffectGraphVisitor::ExitTempLocalScope(LocalVariable* var) {
     Value* tmp = Bind(new LoadLocalInstr(*var));
-    DeallocateTempIndex(1);
+    owner()->DeallocateTemps(1);
     ASSERT(GetCurrentTempLocalIndex() == var->index());
     return new DropTempsInstr(1, tmp);
 }
@@ -1927,13 +2084,13 @@
 void EffectGraphVisitor::BuildLetTempExpressions(LetNode* node) {
   intptr_t num_temps = node->num_temps();
   for (intptr_t i = 0; i < num_temps; ++i) {
-    ValueGraphVisitor for_value(owner(), temp_index());
+    ValueGraphVisitor for_value(owner());
     node->InitializerAt(i)->Visit(&for_value);
     Append(for_value);
     Value* temp_val = for_value.value();
     node->TempAt(i)->set_index(GetCurrentTempLocalIndex());
     Do(new PushTempInstr(temp_val));
-    AllocateTempIndex();
+    owner()->AllocateTemp();
   }
 }
 
@@ -1949,21 +2106,21 @@
 
     // Visit body.
     for (intptr_t i = 0; i < node->nodes().length() - 1; ++i) {
-      EffectGraphVisitor for_effect(owner(), temp_index());
+      EffectGraphVisitor for_effect(owner());
       node->nodes()[i]->Visit(&for_effect);
       Append(for_effect);
     }
     // Visit the last body expression for value.
-    ValueGraphVisitor for_value(owner(), temp_index());
+    ValueGraphVisitor for_value(owner());
     node->nodes().Last()->Visit(&for_value);
     Append(for_value);
     Value* result_value = for_value.value();
-    DeallocateTempIndex(num_temps);
+    owner()->DeallocateTemps(num_temps);
     Do(new DropTempsInstr(num_temps, result_value));
   } else {
     ASSERT(num_temps == 0);
     for (intptr_t i = 0; i < node->nodes().length(); ++i) {
-      EffectGraphVisitor for_effect(owner(), temp_index());
+      EffectGraphVisitor for_effect(owner());
       node->nodes()[i]->Visit(&for_effect);
       Append(for_effect);
     }
@@ -1976,19 +2133,19 @@
 
   // Visit body.
   for (intptr_t i = 0; i < node->nodes().length() - 1; ++i) {
-    EffectGraphVisitor for_effect(owner(), temp_index());
+    EffectGraphVisitor for_effect(owner());
     node->nodes()[i]->Visit(&for_effect);
     Append(for_effect);
   }
   // Visit the last body expression for value.
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->nodes().Last()->Visit(&for_value);
   Append(for_value);
   Value* result_value = for_value.value();
 
   intptr_t num_temps = node->num_temps();
   if (num_temps > 0) {
-    DeallocateTempIndex(num_temps);
+    owner()->DeallocateTemps(num_temps);
     ReturnDefinition(new DropTempsInstr(num_temps, result_value));
   } else {
     ReturnValue(result_value);
@@ -2013,7 +2170,7 @@
     for (int i = 0; i < node->length(); ++i) {
       Value* array = Bind(new LoadLocalInstr(*tmp_var));
       Value* index = Bind(new ConstantInstr(Smi::ZoneHandle(Smi::New(i))));
-      ValueGraphVisitor for_value(owner(), temp_index());
+      ValueGraphVisitor for_value(owner());
       node->ElementAt(i)->Visit(&for_value);
       Append(for_value);
       // No store barrier needed for constants.
@@ -2034,7 +2191,7 @@
 
 void EffectGraphVisitor::VisitStringInterpolateNode(
     StringInterpolateNode* node) {
-  ValueGraphVisitor for_argument(owner(), temp_index());
+  ValueGraphVisitor for_argument(owner());
   node->value()->Visit(&for_argument);
   Append(for_argument);
   StringInterpolateInstr* instr =
@@ -2153,7 +2310,7 @@
     }
   } else {
     ASSERT(function.IsImplicitInstanceClosureFunction());
-    ValueGraphVisitor for_receiver(owner(), temp_index());
+    ValueGraphVisitor for_receiver(owner());
     node->receiver()->Visit(&for_receiver);
     Append(for_receiver);
     Value* receiver = for_receiver.value();
@@ -2191,7 +2348,7 @@
     const ArgumentListNode& node,
     ZoneGrowableArray<PushArgumentInstr*>* values) {
   for (intptr_t i = 0; i < node.length(); ++i) {
-    ValueGraphVisitor for_argument(owner(), temp_index());
+    ValueGraphVisitor for_argument(owner());
     node.NodeAt(i)->Visit(&for_argument);
     Append(for_argument);
     PushArgumentInstr* push_arg = PushArgument(for_argument.value());
@@ -2201,7 +2358,7 @@
 
 
 void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
-  ValueGraphVisitor for_receiver(owner(), temp_index());
+  ValueGraphVisitor for_receiver(owner());
   node->receiver()->Visit(&for_receiver);
   Append(for_receiver);
   PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
@@ -2213,7 +2370,9 @@
   BuildPushArguments(*node->arguments(), arguments);
   InstanceCallInstr* call = new InstanceCallInstr(
       node->token_pos(),
-      node->function_name(), Token::kILLEGAL, arguments,
+      node->function_name(),
+      Token::kILLEGAL,
+      arguments,
       node->arguments()->names(),
       1,
       owner()->ic_data_array());
@@ -2273,7 +2432,7 @@
 
 ClosureCallInstr* EffectGraphVisitor::BuildClosureCall(
     ClosureCallNode* node) {
-  ValueGraphVisitor for_closure(owner(), temp_index());
+  ValueGraphVisitor for_closure(owner());
   node->closure()->Visit(&for_closure);
   Append(for_closure);
   PushArgumentInstr* push_closure = PushArgument(for_closure.value());
@@ -2485,7 +2644,7 @@
   }
 
   ASSERT(owner()->parsed_function()->instantiator() != NULL);
-  ValueGraphVisitor for_instantiator(owner(), temp_index());
+  ValueGraphVisitor for_instantiator(owner());
   owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
   Append(for_instantiator);
   return for_instantiator.value();
@@ -2506,7 +2665,7 @@
         Type::New(instantiator_class, type_arguments, token_pos, Heap::kNew));
     type ^= ClassFinalizer::FinalizeType(
         instantiator_class, type, ClassFinalizer::kFinalize);
-    ASSERT(!type.IsMalformed() && !type.IsMalbounded());
+    ASSERT(!type.IsMalformedOrMalbounded());
     type_arguments = type.arguments();
     type_arguments = type_arguments.Canonicalize();
     return Bind(new ConstantInstr(type_arguments));
@@ -2520,7 +2679,7 @@
     // No instantiator for factories.
     ASSERT(instantiator == NULL);
     ASSERT(owner()->parsed_function()->instantiator() != NULL);
-    ValueGraphVisitor for_instantiator(owner(), temp_index());
+    ValueGraphVisitor for_instantiator(owner());
     owner()->parsed_function()->instantiator()->Visit(&for_instantiator);
     Append(for_instantiator);
     return for_instantiator.value();
@@ -2658,7 +2817,7 @@
 
 
 void EffectGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
-  ValueGraphVisitor for_receiver(owner(), temp_index());
+  ValueGraphVisitor for_receiver(owner());
   node->receiver()->Visit(&for_receiver);
   Append(for_receiver);
   PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
@@ -2682,12 +2841,12 @@
     InstanceSetterNode* node,
     ZoneGrowableArray<PushArgumentInstr*>* arguments,
     bool result_is_needed) {
-  ValueGraphVisitor for_receiver(owner(), temp_index());
+  ValueGraphVisitor for_receiver(owner());
   node->receiver()->Visit(&for_receiver);
   Append(for_receiver);
   arguments->Add(PushArgument(for_receiver.value()));
 
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->value()->Visit(&for_value);
   Append(for_value);
 
@@ -2759,7 +2918,7 @@
       ReturnDefinition(call);
       return;
     } else {
-      ValueGraphVisitor receiver_value(owner(), temp_index());
+      ValueGraphVisitor receiver_value(owner());
       node->receiver()->Visit(&receiver_value);
       Append(receiver_value);
       arguments->Add(PushArgument(receiver_value.value()));
@@ -2853,12 +3012,12 @@
   } else {
     if (is_super_setter) {
       // Add receiver of instance getter.
-      ValueGraphVisitor for_receiver(owner(), temp_index());
+      ValueGraphVisitor for_receiver(owner());
       node->receiver()->Visit(&for_receiver);
       Append(for_receiver);
       arguments->Add(PushArgument(for_receiver.value()));
     }
-    ValueGraphVisitor for_value(owner(), temp_index());
+    ValueGraphVisitor for_value(owner());
     node->value()->Visit(&for_value);
     Append(for_value);
     Value* value = NULL;
@@ -2925,6 +3084,21 @@
   if (!function.IsClosureFunction()) {
     MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
     switch (kind) {
+      case MethodRecognizer::kObjectEquals: {
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+        LocalVariable* other_var =
+            node->scope()->LookupVariable(Symbols::Other(),
+                                          true);  // Test only.
+        Value* other = Bind(new LoadLocalInstr(*other_var));
+        StrictCompareInstr* compare =
+            new StrictCompareInstr(node->token_pos(),
+                                   Token::kEQ_STRICT,
+                                   receiver,
+                                   other);
+        // Receiver is not a number because numbers override equality.
+        compare->set_needs_number_check(false);
+        return ReturnDefinition(compare);
+      }
       case MethodRecognizer::kStringBaseLength:
       case MethodRecognizer::kStringBaseIsEmpty: {
         Value* receiver = Bind(BuildLoadThisVar(node->scope()));
@@ -3023,7 +3197,7 @@
 //                               value: <Expression> }
 void EffectGraphVisitor::HandleStoreLocal(StoreLocalNode* node,
                                           bool result_is_needed) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* store_value = for_value.value();
@@ -3052,7 +3226,7 @@
 
 void EffectGraphVisitor::VisitLoadInstanceFieldNode(
     LoadInstanceFieldNode* node) {
-  ValueGraphVisitor for_instance(owner(), temp_index());
+  ValueGraphVisitor for_instance(owner());
   node->instance()->Visit(&for_instance);
   Append(for_instance);
   LoadFieldInstr* load = new LoadFieldInstr(
@@ -3077,10 +3251,10 @@
 
 void EffectGraphVisitor::VisitStoreInstanceFieldNode(
     StoreInstanceFieldNode* node) {
-  ValueGraphVisitor for_instance(owner(), temp_index());
+  ValueGraphVisitor for_instance(owner());
   node->instance()->Visit(&for_instance);
   Append(for_instance);
-  ValueGraphVisitor for_value(owner(), for_instance.temp_index());
+  ValueGraphVisitor for_value(owner());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* store_value = for_value.value();
@@ -3133,7 +3307,7 @@
 
 Definition* EffectGraphVisitor::BuildStoreStaticField(
   StoreStaticFieldNode* node, bool result_is_needed) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* store_value = NULL;
@@ -3198,12 +3372,12 @@
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(2);
-  ValueGraphVisitor for_array(owner(), temp_index());
+  ValueGraphVisitor for_array(owner());
   node->array()->Visit(&for_array);
   Append(for_array);
   arguments->Add(PushArgument(for_array.value()));
 
-  ValueGraphVisitor for_index(owner(), temp_index());
+  ValueGraphVisitor for_index(owner());
   node->index_expr()->Visit(&for_index);
   Append(for_index);
   arguments->Add(PushArgument(for_index.value()));
@@ -3266,17 +3440,17 @@
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(3);
-  ValueGraphVisitor for_array(owner(), temp_index());
+  ValueGraphVisitor for_array(owner());
   node->array()->Visit(&for_array);
   Append(for_array);
   arguments->Add(PushArgument(for_array.value()));
 
-  ValueGraphVisitor for_index(owner(), temp_index());
+  ValueGraphVisitor for_index(owner());
   node->index_expr()->Visit(&for_index);
   Append(for_index);
   arguments->Add(PushArgument(for_index.value()));
 
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* value = NULL;
@@ -3341,13 +3515,17 @@
 }
 
 
-void EffectGraphVisitor::UnchainContext() {
-  Value* context = Bind(new CurrentContextInstr());
-  Value* parent = Bind(
-      new LoadFieldInstr(context,
-                         Context::parent_offset(),
-                         Type::ZoneHandle()));  // Not an instance, no type.
-  AddInstruction(new StoreContextInstr(parent));
+void EffectGraphVisitor::UnchainContexts(intptr_t n) {
+  if (n > 0) {
+    Value* context = Bind(new CurrentContextInstr());
+    while (n-- > 0) {
+      context = Bind(
+          new LoadFieldInstr(context,
+                             Context::parent_offset(),
+                             Type::ZoneHandle()));  // Not an instance, no type.
+    }
+    AddInstruction(new StoreContextInstr(context));
+  }
 }
 
 
@@ -3358,7 +3536,11 @@
   LocalScope* scope = node->scope();
   const intptr_t num_context_variables =
       (scope != NULL) ? scope->num_context_variables() : 0;
-  int previous_context_level = owner()->context_level();
+  // The outermost function sequence cannot contain a label.
+  ASSERT((node->label() == NULL) ||
+         (node != owner()->parsed_function()->node_sequence()));
+  NestedBlock nested_block(owner(), node);
+
   if (num_context_variables > 0) {
     // The loop local scope declares variables that are captured.
     // Allocate and chain a new context.
@@ -3388,7 +3570,6 @@
       AddInstruction(
           new StoreContextInstr(Bind(ExitTempLocalScope(tmp_var))));
     }
-    owner()->set_context_level(scope->context_level());
 
     // If this node_sequence is the body of the function being compiled, copy
     // the captured parameters from the frame into the context.
@@ -3463,7 +3644,7 @@
 
   intptr_t i = 0;
   while (is_open() && (i < node->length())) {
-    EffectGraphVisitor for_effect(owner(), temp_index());
+    EffectGraphVisitor for_effect(owner());
     node->NodeAt(i++)->Visit(&for_effect);
     Append(for_effect);
     if (!is_open()) {
@@ -3478,25 +3659,16 @@
       BuildRestoreContext(
           *owner()->parsed_function()->saved_entry_context_var());
     } else if (num_context_variables > 0) {
-      UnchainContext();
+      UnchainContexts(1);
     }
   }
 
-  // No continue on sequence allowed.
-  ASSERT((node->label() == NULL) ||
-         (node->label()->join_for_continue() == NULL));
   // If this node sequence is labeled, a break out of the sequence will have
   // taken care of unchaining the context.
-  if ((node->label() != NULL) &&
-      (node->label()->join_for_break() != NULL)) {
-    if (is_open()) Goto(node->label()->join_for_break());
-    exit_ = node->label()->join_for_break();
+  if (nested_block.break_target() != NULL) {
+    if (is_open()) Goto(nested_block.break_target());
+    exit_ = nested_block.break_target();
   }
-
-  // The outermost function sequence cannot contain a label.
-  ASSERT((node->label() == NULL) ||
-         (node != owner()->parsed_function()->node_sequence()));
-  owner()->set_context_level(previous_context_level);
 }
 
 
@@ -3505,7 +3677,7 @@
   // Restores CTX from local variable ':saved_context'.
   BuildRestoreContext(node->context_var());
 
-  EffectGraphVisitor for_catch(owner(), temp_index());
+  EffectGraphVisitor for_catch(owner());
   node->VisitChildren(&for_catch);
   Append(for_catch);
 }
@@ -3521,7 +3693,7 @@
   // Preserve CTX into local variable '%saved_context'.
   BuildSaveContext(node->context_var());
 
-  EffectGraphVisitor for_try(owner(), temp_index());
+  EffectGraphVisitor for_try(owner());
   node->try_block()->Visit(&for_try);
 
   if (for_try.is_open()) {
@@ -3554,7 +3726,7 @@
 
   owner()->set_try_index(catch_handler_index);
   owner()->set_catch_try_index(try_handler_index);
-  EffectGraphVisitor for_catch(owner(), temp_index());
+  EffectGraphVisitor for_catch(owner());
   catch_block->Visit(&for_catch);
   owner()->set_catch_try_index(prev_catch_try_index);
 
@@ -3572,11 +3744,12 @@
                                catch_block->stacktrace_var(),
                                catch_block->needs_stacktrace());
   owner()->AddCatchEntry(catch_entry);
-  ASSERT(!for_catch.is_open());
   AppendFragment(catch_entry, for_catch);
 
-  JoinEntryInstr* join = node->end_catch_label()->join_for_continue();
-  if (join != NULL) {
+  if (for_catch.is_open()) {
+    JoinEntryInstr* join = new JoinEntryInstr(owner()->AllocateBlockId(),
+                                              original_handler_index);
+    for_catch.Goto(join);
     if (is_open()) Goto(join);
     exit_ = join;
   }
@@ -3585,7 +3758,7 @@
     // Create a handler for the code in the catch block, containing the
     // code in the finally block.
     owner()->set_try_index(original_handler_index);
-    EffectGraphVisitor for_finally(owner(), temp_index());
+    EffectGraphVisitor for_finally(owner());
     for_finally.BuildRestoreContext(catch_block->context_var());
 
     finally_block->Visit(&for_finally);
@@ -3619,7 +3792,7 @@
 
   // Generate code for the finally block if one exists.
   if ((finally_block != NULL) && is_open()) {
-    EffectGraphVisitor for_finally_block(owner(), temp_index());
+    EffectGraphVisitor for_finally_block(owner());
     finally_block->Visit(&for_finally_block);
     Append(for_finally_block);
   }
@@ -3694,7 +3867,7 @@
     Value* arguments_value = Bind(new ConstantInstr(Array::ZoneHandle()));
     arguments->Add(PushArgument(arguments_value));
   } else {
-    ValueGraphVisitor array_val(owner(), temp_index());
+    ValueGraphVisitor array_val(owner());
     ArrayNode* array =
         new ArrayNode(token_pos, Type::ZoneHandle(Type::ArrayType()),
                       function_arguments->nodes());
@@ -3733,7 +3906,7 @@
 
 
 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
-  ValueGraphVisitor for_exception(owner(), temp_index());
+  ValueGraphVisitor for_exception(owner());
   node->exception()->Visit(&for_exception);
   Append(for_exception);
   PushArgument(for_exception.value());
@@ -3741,7 +3914,7 @@
   if (node->stacktrace() == NULL) {
     instr = new ThrowInstr(node->token_pos());
   } else {
-    ValueGraphVisitor for_stack_trace(owner(), temp_index());
+    ValueGraphVisitor for_stack_trace(owner());
     node->stacktrace()->Visit(&for_stack_trace);
     Append(for_stack_trace);
     PushArgument(for_stack_trace.value());
@@ -3780,7 +3953,7 @@
 
   JoinEntryInstr* finally_entry =
       new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
-  EffectGraphVisitor for_finally_block(owner(), temp_index());
+  EffectGraphVisitor for_finally_block(owner());
   node->finally_block()->Visit(&for_finally_block);
 
   if (try_index >= 0) {
@@ -3813,7 +3986,7 @@
       new TargetEntryInstr(AllocateBlockId(),
                            CatchClauseNode::kInvalidTryIndex);
   graph_entry_ = new GraphEntryInstr(parsed_function(), normal_entry, osr_id_);
-  EffectGraphVisitor for_effect(this, 0);
+  EffectGraphVisitor for_effect(this);
   // This check may be deleted if the generated code is leaf.
   // Native functions don't need a stack check at entry.
   if (!function.is_native()) {
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 0dfe02e..f9adcd6 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -5,36 +5,48 @@
 #ifndef VM_FLOW_GRAPH_BUILDER_H_
 #define VM_FLOW_GRAPH_BUILDER_H_
 
+#include "platform/assert.h"
+#include "platform/globals.h"
 #include "vm/allocation.h"
 #include "vm/ast.h"
 #include "vm/growable_array.h"
 #include "vm/intermediate_language.h"
+#include "vm/raw_object.h"
 
 namespace dart {
 
+class AbstractType;
+class AbstractTypeArguments;
+class Array;
+class Class;
+class Field;
 class FlowGraph;
-class Instruction;
+class LocalVariable;
 class ParsedFunction;
+class String;
+
+class NestedStatement;
+class TestGraphVisitor;
 
 // List of recognized list factories:
 // (factory-name-symbol, result-cid, fingerprint).
 // TODO(srdjan): Store the values in the snapshot instead.
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
-  V(_ListFactory, kArrayCid, 1436567945)                                       \
-  V(_GrowableListWithData, kGrowableObjectArrayCid, 461305701)                 \
-  V(_GrowableListFactory, kGrowableObjectArrayCid, 910639199)                  \
-  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 810750844)                      \
-  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 1246070930)                   \
-  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 1882603960)     \
-  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 565702275)                    \
-  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 745756560)                  \
-  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 2141385820)                   \
-  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 2076467298)                 \
-  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 1223523117)                   \
-  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 1032112679)                 \
-  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 1863852388)               \
-  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 1986018007)               \
-  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 1144749257)           \
+  V(_ListFactory, kArrayCid, 176587978)                                        \
+  V(_GrowableListWithData, kGrowableObjectArrayCid, 264792196)                 \
+  V(_GrowableListFactory, kGrowableObjectArrayCid, 1720763678)                 \
+  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 545976988)                      \
+  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 981297074)                    \
+  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 1617830104)     \
+  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 300928419)                    \
+  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 480982704)                  \
+  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 1876611964)                   \
+  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 1811693442)                 \
+  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 958749261)                    \
+  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 767338823)                  \
+  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 1599078532)               \
+  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 1721244151)               \
+  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 879975401)            \
 
 
 // A class to collect the exits from an inlined function during graph
@@ -117,8 +129,7 @@
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
   void SetInitialBlockId(intptr_t id) { last_used_block_id_ = id; }
 
-  void set_context_level(intptr_t value) { context_level_ = value; }
-  intptr_t context_level() const { return context_level_; }
+  intptr_t context_level() const;
 
   void IncrementLoopDepth() { ++loop_depth_; }
   void DecrementLoopDepth() { --loop_depth_; }
@@ -151,14 +162,25 @@
     return guarded_fields_;
   }
 
+  intptr_t temp_count() const { return temp_count_; }
+  intptr_t AllocateTemp() { return temp_count_++; }
+  void DeallocateTemps(intptr_t count) {
+    ASSERT(temp_count_ >= count);
+    temp_count_ -= count;
+  }
+
   intptr_t args_pushed() const { return args_pushed_; }
   void add_args_pushed(intptr_t n) { args_pushed_ += n; }
 
+  NestedStatement* nesting_stack() const { return nesting_stack_; }
+
   // When compiling for OSR, remove blocks that are not reachable from the
   // OSR entry point.
   void PruneUnreachable();
 
  private:
+  friend class NestedStatement;  // Explicit access to nesting_stack_.
+
   intptr_t parameter_count() const {
     return num_copied_params_ + num_non_copied_params_;
   }
@@ -176,15 +198,20 @@
   ZoneGrowableArray<const Field*>* guarded_fields_;
 
   intptr_t last_used_block_id_;
-  intptr_t context_level_;
   intptr_t try_index_;
   intptr_t catch_try_index_;
   intptr_t loop_depth_;
   GraphEntryInstr* graph_entry_;
 
+  // The expression stack height.
+  intptr_t temp_count_;
+
   // Outgoing argument stack height.
   intptr_t args_pushed_;
 
+  // A stack of enclosing nested statements.
+  NestedStatement* nesting_stack_;
+
   // The deopt id of the OSR entry or Isolate::kNoDeoptId if not compiling
   // for OSR.
   const intptr_t osr_id_;
@@ -193,8 +220,6 @@
 };
 
 
-class TestGraphVisitor;
-
 // Translate an AstNode to a control-flow graph fragment for its effects
 // (e.g., a statement or an expression in an effect context).  Implements a
 // function from an AstNode and next temporary index to a graph fragment
@@ -206,10 +231,8 @@
 //   - (i0, i1): an open graph fragment
 class EffectGraphVisitor : public AstNodeVisitor {
  public:
-  EffectGraphVisitor(FlowGraphBuilder* owner,
-                     intptr_t temp_index)
+  explicit EffectGraphVisitor(FlowGraphBuilder* owner)
       : owner_(owner),
-        temp_index_(temp_index),
         entry_(NULL),
         exit_(NULL) { }
 
@@ -220,7 +243,6 @@
 #undef DECLARE_VISIT
 
   FlowGraphBuilder* owner() const { return owner_; }
-  intptr_t temp_index() const { return temp_index_; }
   Instruction* entry() const { return entry_; }
   Instruction* exit() const { return exit_; }
 
@@ -331,20 +353,20 @@
       ZoneGrowableArray<PushArgumentInstr*>* arguments,
       bool result_is_needed);
 
+  StrictCompareInstr* BuildStrictCompare(AstNode* left,
+                                         AstNode* right,
+                                         Token::Kind kind,
+                                         intptr_t token_pos);
+
   virtual void BuildTypeTest(ComparisonNode* node);
   virtual void BuildTypeCast(ComparisonNode* node);
 
   bool MustSaveRestoreContext(SequenceNode* node) const;
 
-  // Moves parent context into the context register.
-  void UnchainContext();
+  // Moves the nth parent context into the context register.
+  void UnchainContexts(intptr_t n);
 
   void CloseFragment() { exit_ = NULL; }
-  intptr_t AllocateTempIndex() { return temp_index_++; }
-  void DeallocateTempIndex(intptr_t n) {
-    ASSERT(temp_index_ >= n);
-    temp_index_ -= n;
-  }
 
   // Returns a local variable index for a temporary local that is
   // on top of the current expression stack.
@@ -407,9 +429,6 @@
   // Shared global state.
   FlowGraphBuilder* owner_;
 
-  // Input parameters.
-  intptr_t temp_index_;
-
   // Output parameters.
   Instruction* entry_;
   Instruction* exit_;
@@ -423,9 +442,8 @@
 // language Value.
 class ValueGraphVisitor : public EffectGraphVisitor {
  public:
-  ValueGraphVisitor(FlowGraphBuilder* owner,
-                    intptr_t temp_index)
-      : EffectGraphVisitor(owner, temp_index), value_(NULL) { }
+  explicit ValueGraphVisitor(FlowGraphBuilder* owner)
+      : EffectGraphVisitor(owner), value_(NULL) { }
 
   // Visit functions overridden by this class.
   virtual void VisitLiteralNode(LiteralNode* node);
@@ -487,9 +505,8 @@
 class TestGraphVisitor : public ValueGraphVisitor {
  public:
   TestGraphVisitor(FlowGraphBuilder* owner,
-                   intptr_t temp_index,
                    intptr_t condition_token_pos)
-      : ValueGraphVisitor(owner, temp_index),
+      : ValueGraphVisitor(owner),
         true_successor_addresses_(1),
         false_successor_addresses_(1),
         condition_token_pos_(condition_token_pos) { }
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 6eeba1a..d1908aa 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -127,9 +127,6 @@
         if (current->IsInstanceCall()) {
           ic_data = current->AsInstanceCall()->ic_data();
           ASSERT(ic_data != NULL);
-        } else if (current->IsEqualityCompare()) {
-          ic_data = current->AsEqualityCompare()->ic_data();
-          ASSERT(ic_data != NULL);
         }
         if ((ic_data != NULL) && (ic_data->NumberOfChecks() == 0)) {
           may_reoptimize_ = true;
@@ -323,10 +320,23 @@
 }
 
 
-bool FlowGraphCompiler::CanFallThroughTo(BlockEntryInstr* block_entry) const {
+Label* FlowGraphCompiler::NextNonEmptyLabel() const {
   const intptr_t current_index = current_block()->postorder_number();
-  Label* next_nonempty = block_info_[current_index]->next_nonempty_label();
-  return next_nonempty == GetJumpLabel(block_entry);
+  return block_info_[current_index]->next_nonempty_label();
+}
+
+
+bool FlowGraphCompiler::CanFallThroughTo(BlockEntryInstr* block_entry) const {
+  return NextNonEmptyLabel() == GetJumpLabel(block_entry);
+}
+
+
+BranchLabels FlowGraphCompiler::CreateBranchLabels(BranchInstr* branch) const {
+  Label* true_label = GetJumpLabel(branch->true_successor());
+  Label* false_label = GetJumpLabel(branch->false_successor());
+  Label* fall_through = NextNonEmptyLabel();
+  BranchLabels result = { true_label, false_label, fall_through };
+  return result;
 }
 
 
@@ -1167,7 +1177,7 @@
 
 // Returns true if checking against this type is a direct class id comparison.
 bool FlowGraphCompiler::TypeCheckAsClassEquality(const AbstractType& type) {
-  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
   // Requires CHA, which can be applied in optimized code only,
   if (!FLAG_use_cha || !is_optimizing()) return false;
   if (!type.IsInstantiated()) return false;
@@ -1178,13 +1188,16 @@
   if (type_class.is_implemented()) return false;
   const intptr_t type_cid = type_class.id();
   if (CHA::HasSubclasses(type_cid)) return false;
-  if (type_class.NumTypeArguments() > 0) {
+  const intptr_t num_type_args = type_class.NumTypeArguments();
+  if (num_type_args > 0) {
     // Only raw types can be directly compared, thus disregarding type
     // arguments.
+    const intptr_t num_type_params = type_class.NumTypeParameters();
+    const intptr_t from_index = num_type_args - num_type_params;
     const AbstractTypeArguments& type_arguments =
         AbstractTypeArguments::Handle(type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(type_arguments.Length());
+        type_arguments.IsRaw(from_index, num_type_params);
     return is_raw_type;
   }
   return true;
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index debf138..3683838 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -23,6 +23,13 @@
 class ParsedFunction;
 
 
+struct BranchLabels {
+  Label* true_label;
+  Label* false_label;
+  Label* fall_through;
+};
+
+
 class ParallelMoveResolver : public ValueObject {
  public:
   explicit ParallelMoveResolver(FlowGraphCompiler* compiler);
@@ -371,15 +378,6 @@
                        intptr_t token_index,
                        LocationSummary* locs);
 
-  void EmitDoubleCompareBranch(Condition true_condition,
-                               FpuRegister left,
-                               FpuRegister right,
-                               BranchInstr* branch);
-  void EmitDoubleCompareBool(Condition true_condition,
-                             FpuRegister left,
-                             FpuRegister right,
-                             Register result);
-
   void EmitEqualityRegConstCompare(Register reg,
                                    const Object& obj,
                                    bool needs_number_check,
@@ -397,10 +395,16 @@
   Label* GetJumpLabel(BlockEntryInstr* block_entry) const;
   bool WasCompacted(BlockEntryInstr* block_entry) const;
 
+  // Returns the label of the fall-through of the current block.
+  Label* NextNonEmptyLabel() const;
+
   // Returns true if there is a next block after the current one in
   // the block order and if it is the given block.
   bool CanFallThroughTo(BlockEntryInstr* block_entry) const;
 
+  // Return true-, false- and fall-through label for a branch instruction.
+  BranchLabels CreateBranchLabels(BranchInstr* branch) const;
+
   void AddExceptionHandler(intptr_t try_index,
                            intptr_t outer_try_index,
                            intptr_t pc_offset,
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 244c211..737514f 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -236,10 +236,13 @@
   } else {
     __ b(is_not_instance_lbl, EQ);
   }
+  const intptr_t num_type_args = type_class.NumTypeArguments();
+  const intptr_t num_type_params = type_class.NumTypeParameters();
+  const intptr_t from_index = num_type_args - num_type_params;
   const AbstractTypeArguments& type_arguments =
       AbstractTypeArguments::ZoneHandle(type.arguments());
   const bool is_raw_type = type_arguments.IsNull() ||
-      type_arguments.IsRaw(type_arguments.Length());
+      type_arguments.IsRaw(from_index, num_type_params);
   // Signature class is an instantiated parameterized type.
   if (!type_class.IsSignatureClass()) {
     if (is_raw_type) {
@@ -646,7 +649,7 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformed() || dst_type.IsMalbounded() ||
+  ASSERT(dst_type.IsMalformedOrMalbounded() ||
          (!dst_type.IsDynamicType() && !dst_type.IsObjectType()));
   // Preserve instantiator (R2) and its type arguments (R1).
   __ PushList((1 << R1) | (1 << R2));
@@ -663,7 +666,7 @@
   }
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformed() || dst_type.IsMalbounded()) {
+  if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::ZoneHandle());  // Make room for the result.
     __ Push(R0);  // Push the source object.
     __ PushObject(dst_name);  // Push the name of the destination.
@@ -1438,8 +1441,8 @@
                                                     const Object& obj,
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
-  if (needs_number_check &&
-      (obj.IsMint() || obj.IsDouble() || obj.IsBigint())) {
+  if (needs_number_check) {
+    ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
     __ Push(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
@@ -1599,38 +1602,6 @@
 }
 
 
-void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
-                                                FpuRegister left,
-                                                FpuRegister right,
-                                                BranchInstr* branch) {
-  ASSERT(branch != NULL);
-  DRegister dleft = EvenDRegisterOf(left);
-  DRegister dright = EvenDRegisterOf(right);
-  assembler()->vcmpd(dleft, dright);
-  assembler()->vmstat();
-  BlockEntryInstr* nan_result = (true_condition == NE) ?
-      branch->true_successor() : branch->false_successor();
-  assembler()->b(GetJumpLabel(nan_result), VS);
-  branch->EmitBranchOnCondition(this, true_condition);
-}
-
-
-void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
-                                              FpuRegister left,
-                                              FpuRegister right,
-                                              Register result) {
-  DRegister dleft = EvenDRegisterOf(left);
-  DRegister dright = EvenDRegisterOf(right);
-  assembler()->vcmpd(dleft, dright);
-  assembler()->vmstat();
-  assembler()->LoadObject(result, Bool::False());
-  Label done;
-  assembler()->b(&done, VS);  // NaN -> false.
-  assembler()->LoadObject(result, Bool::True(), true_condition);
-  assembler()->Bind(&done);
-}
-
-
 // Do not implement or use this function.
 FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
                                                           intptr_t index_scale,
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index f97dda7..ed47c72 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -243,10 +243,13 @@
   } else {
     __ j(ZERO, is_not_instance_lbl);
   }
+  const intptr_t num_type_args = type_class.NumTypeArguments();
+  const intptr_t num_type_params = type_class.NumTypeParameters();
+  const intptr_t from_index = num_type_args - num_type_params;
   const AbstractTypeArguments& type_arguments =
       AbstractTypeArguments::ZoneHandle(type.arguments());
   const bool is_raw_type = type_arguments.IsNull() ||
-      type_arguments.IsRaw(type_arguments.Length());
+      type_arguments.IsRaw(from_index, num_type_params);
   // Signature class is an instantiated parameterized type.
   if (!type_class.IsSignatureClass()) {
     if (is_raw_type) {
@@ -572,7 +575,7 @@
                                            const AbstractType& type,
                                            bool negate_result,
                                            LocationSummary* locs) {
-  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
 
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -663,7 +666,7 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformed() || dst_type.IsMalbounded() ||
+  ASSERT(dst_type.IsMalformedOrMalbounded() ||
          (!dst_type.IsDynamicType() && !dst_type.IsObjectType()));
   __ pushl(ECX);  // Store instantiator.
   __ pushl(EDX);  // Store instantiator type arguments.
@@ -685,7 +688,7 @@
   }
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformed() || dst_type.IsMalbounded()) {
+  if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::ZoneHandle());  // Make room for the result.
     __ pushl(EAX);  // Push the source object.
     __ PushObject(dst_name);  // Push the name of the destination.
@@ -1442,11 +1445,8 @@
                                                     const Object& obj,
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
-  if (needs_number_check) {
-    if (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()) {
-      needs_number_check = false;
-    }
-  }
+  ASSERT(!needs_number_check ||
+         (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()));
 
   if (obj.IsSmi() && (Smi::Cast(obj).Value() == 0)) {
     ASSERT(!needs_number_check);
@@ -1604,37 +1604,6 @@
 }
 
 
-void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
-                                                FpuRegister left,
-                                                FpuRegister right,
-                                                BranchInstr* branch) {
-  ASSERT(branch != NULL);
-  assembler()->comisd(left, right);
-  BlockEntryInstr* nan_result = (true_condition == NOT_EQUAL) ?
-      branch->true_successor() : branch->false_successor();
-  assembler()->j(PARITY_EVEN, GetJumpLabel(nan_result));
-  branch->EmitBranchOnCondition(this, true_condition);
-}
-
-
-
-void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
-                                              FpuRegister left,
-                                              FpuRegister right,
-                                              Register result) {
-  assembler()->comisd(left, right);
-  Label is_false, is_true, done;
-  assembler()->j(PARITY_EVEN, &is_false, Assembler::kNearJump);  // NaN false;
-  assembler()->j(true_condition, &is_true, Assembler::kNearJump);
-  assembler()->Bind(&is_false);
-  assembler()->LoadObject(result, Bool::False());
-  assembler()->jmp(&done);
-  assembler()->Bind(&is_true);
-  assembler()->LoadObject(result, Bool::True());
-  assembler()->Bind(&done);
-}
-
-
 FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
                                                           intptr_t index_scale,
                                                           Register array,
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index e13470f..721597f 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -230,16 +230,19 @@
   const bool smi_is_ok = int_type.IsSubtypeOf(type, &malformed_error);
   // Malformed type should have been handled at graph construction time.
   ASSERT(smi_is_ok || malformed_error.IsNull());
-  __ andi(CMPRES, kInstanceReg, Immediate(kSmiTagMask));
+  __ andi(CMPRES1, kInstanceReg, Immediate(kSmiTagMask));
   if (smi_is_ok) {
-    __ beq(CMPRES, ZR, is_instance_lbl);
+    __ beq(CMPRES1, ZR, is_instance_lbl);
   } else {
-    __ beq(CMPRES, ZR, is_not_instance_lbl);
+    __ beq(CMPRES1, ZR, is_not_instance_lbl);
   }
+  const intptr_t num_type_args = type_class.NumTypeArguments();
+  const intptr_t num_type_params = type_class.NumTypeParameters();
+  const intptr_t from_index = num_type_args - num_type_params;
   const AbstractTypeArguments& type_arguments =
       AbstractTypeArguments::ZoneHandle(type.arguments());
   const bool is_raw_type = type_arguments.IsNull() ||
-      type_arguments.IsRaw(type_arguments.Length());
+      type_arguments.IsRaw(from_index, num_type_params);
   // Signature class is an instantiated parameterized type.
   if (!type_class.IsSignatureClass()) {
     if (is_raw_type) {
@@ -428,8 +431,8 @@
 
     // For Smi check quickly against int and num interfaces.
     Label not_smi;
-    __ andi(CMPRES, A0, Immediate(kSmiTagMask));
-    __ bne(CMPRES, ZR, &not_smi);  // Value is Smi?
+    __ andi(CMPRES1, A0, Immediate(kSmiTagMask));
+    __ bne(CMPRES1, ZR, &not_smi);  // Value is Smi?
     __ BranchEqual(T2, Type::ZoneHandle(Type::IntType()), is_instance_lbl);
     __ BranchEqual(T2, Type::ZoneHandle(Type::Number()), is_instance_lbl);
 
@@ -456,8 +459,8 @@
   if (type.IsType()) {
     const Register kInstanceReg = A0;
     const Register kTypeArgumentsReg = A1;
-    __ andi(CMPRES, kInstanceReg, Immediate(kSmiTagMask));
-    __ beq(CMPRES, ZR, is_not_instance_lbl);  // Is instance Smi?
+    __ andi(CMPRES1, kInstanceReg, Immediate(kSmiTagMask));
+    __ beq(CMPRES1, ZR, is_not_instance_lbl);  // Is instance Smi?
     __ lw(kTypeArgumentsReg, Address(SP, 0));  // Instantiator type args.
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator.
@@ -497,11 +500,11 @@
   if (TypeCheckAsClassEquality(type)) {
     const intptr_t type_cid = Class::Handle(type.type_class()).id();
     const Register kInstanceReg = A0;
-    __ andi(CMPRES, kInstanceReg, Immediate(kSmiTagMask));
+    __ andi(CMPRES1, kInstanceReg, Immediate(kSmiTagMask));
     if (type_cid == kSmiCid) {
-      __ beq(CMPRES, ZR, is_instance_lbl);
+      __ beq(CMPRES1, ZR, is_instance_lbl);
     } else {
-      __ beq(CMPRES, ZR, is_not_instance_lbl);
+      __ beq(CMPRES1, ZR, is_not_instance_lbl);
       __ LoadClassId(T0, kInstanceReg);
       __ BranchEqual(T0, type_cid, is_instance_lbl);
     }
@@ -651,7 +654,7 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformed() || dst_type.IsMalbounded() ||
+  ASSERT(dst_type.IsMalformedOrMalbounded() ||
          (!dst_type.IsDynamicType() && !dst_type.IsObjectType()));
   // Preserve instantiator and its type arguments.
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
@@ -670,15 +673,15 @@
   }
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformed() || dst_type.IsMalbounded()) {
+  if (dst_type.IsMalformedOrMalbounded()) {
     __ addiu(SP, SP, Immediate(-4 * kWordSize));
-    __ LoadObject(TMP1, Object::ZoneHandle());
-    __ sw(TMP1, Address(SP, 3 * kWordSize));  // Make room for the result.
+    __ LoadObject(TMP, Object::ZoneHandle());
+    __ sw(TMP, Address(SP, 3 * kWordSize));  // Make room for the result.
     __ sw(A0, Address(SP, 2 * kWordSize));  // Push the source object.
-    __ LoadObject(TMP1, dst_name);
-    __ sw(TMP1, Address(SP, 1 * kWordSize));  // Push the destination name.
-    __ LoadObject(TMP1, dst_type);
-    __ sw(TMP1, Address(SP, 0 * kWordSize));  // Push the destination type.
+    __ LoadObject(TMP, dst_name);
+    __ sw(TMP, Address(SP, 1 * kWordSize));  // Push the destination name.
+    __ LoadObject(TMP, dst_type);
+    __ sw(TMP, Address(SP, 0 * kWordSize));  // Push the destination type.
 
     GenerateRuntimeCall(token_pos,
                         deopt_id,
@@ -707,15 +710,15 @@
   __ lw(A2, Address(SP, 1 * kWordSize));
 
   __ addiu(SP, SP, Immediate(-7 * kWordSize));
-  __ LoadObject(TMP1, Object::ZoneHandle());
-  __ sw(TMP1, Address(SP, 6 * kWordSize));  // Make room for the result.
+  __ LoadObject(TMP, Object::ZoneHandle());
+  __ sw(TMP, Address(SP, 6 * kWordSize));  // Make room for the result.
   __ sw(A0, Address(SP, 5 * kWordSize));  // Push the source object.
-  __ LoadObject(TMP1, dst_type);
-  __ sw(TMP1, Address(SP, 4 * kWordSize));  // Push the type of the destination.
+  __ LoadObject(TMP, dst_type);
+  __ sw(TMP, Address(SP, 4 * kWordSize));  // Push the type of the destination.
   __ sw(A2, Address(SP, 3 * kWordSize));  // Push instantiator.
   __ sw(A1, Address(SP, 2 * kWordSize));  // Push type arguments.
-  __ LoadObject(TMP1, dst_name);
-  __ sw(TMP1, Address(SP, 1 * kWordSize));  // Push the name of the destination.
+  __ LoadObject(TMP, dst_name);
+  __ sw(TMP, Address(SP, 1 * kWordSize));  // Push the name of the destination.
   __ LoadObject(T0, test_cache);
   __ sw(T0, Address(SP, 0 * kWordSize));
 
@@ -1353,8 +1356,8 @@
   Label not_smi, load_cache;
   __ TraceSimMsg("MegamorphicInstanceCall");
   __ lw(T0, Address(SP, (argument_count - 1) * kWordSize));
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &not_smi);
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &not_smi);
   __ LoadImmediate(T0, Smi::RawValue(kSmiCid));
   __ b(&load_cache);
 
@@ -1380,8 +1383,8 @@
   __ and_(T3, T3, T1);
   const intptr_t base = Array::data_offset();
   // T3 is smi tagged, but table entries are two words, so LSL 2.
-  __ sll(TMP1, T3, 2);
-  __ addu(TMP1, T2, TMP1);
+  __ sll(TMP, T3, 2);
+  __ addu(TMP, T2, TMP);
   __ lw(T4, FieldAddress(TMP, base));
 
   ASSERT(kIllegalCid == 0);
@@ -1485,12 +1488,12 @@
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
   __ TraceSimMsg("EqualityRegConstCompare");
-  if (needs_number_check &&
-      (obj.IsMint() || obj.IsDouble() || obj.IsBigint())) {
+  if (needs_number_check) {
+    ASSERT(!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint());
     __ addiu(SP, SP, Immediate(-2 * kWordSize));
     __ sw(reg, Address(SP, 1 * kWordSize));
-    __ LoadObject(TMP1, obj);
-    __ sw(TMP1, Address(SP, 0 * kWordSize));
+    __ LoadObject(TMP, obj);
+    __ sw(TMP, Address(SP, 0 * kWordSize));
     if (is_optimizing()) {
       __ BranchLinkPatchable(
           &StubCode::OptimizedIdenticalWithNumberCheckLabel());
@@ -1531,7 +1534,8 @@
                          Isolate::kNoDeoptId,
                          token_pos);
     __ TraceSimMsg("EqualityRegRegCompare return");
-    // Stub returns result in CMPRES. If it is 0, then left and right are equal.
+    // Stub returns result in CMPRES1. If it is 0, then left and right are
+    // equal.
     __ lw(right, Address(SP, 0 * kWordSize));
     __ lw(left, Address(SP, 1 * kWordSize));
     __ addiu(SP, SP, Immediate(2 * kWordSize));
@@ -1665,80 +1669,6 @@
 }
 
 
-void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
-                                                FpuRegister left,
-                                                FpuRegister right,
-                                                BranchInstr* branch) {
-  ASSERT(branch != NULL);
-  __ Comment("DoubleCompareBranch");
-  assembler()->cund(left, right);
-  BlockEntryInstr* nan_result = (true_condition == NE) ?
-      branch->true_successor() : branch->false_successor();
-  assembler()->bc1t(GetJumpLabel(nan_result));
-
-  switch (true_condition) {
-    case EQ: assembler()->ceqd(left, right); break;
-    case NE: assembler()->ceqd(left, right); break;
-    case LT: assembler()->coltd(left, right); break;
-    case LE: assembler()->coled(left, right); break;
-    case GT: assembler()->coltd(right, left); break;
-    case GE: assembler()->coled(right, left); break;
-    default: {
-      // Should only passing the above conditions to this function.
-      UNREACHABLE();
-      break;
-    }
-  }
-
-  assembler()->LoadImmediate(TMP, 1);
-  if (true_condition == NE) {
-    assembler()->movf(CMPRES1, ZR);
-    assembler()->movt(CMPRES1, TMP);
-  } else {
-    assembler()->movf(CMPRES1, TMP);
-    assembler()->movt(CMPRES1, ZR);
-  }
-  assembler()->mov(CMPRES2, ZR);
-
-  // EmitBranchOnCondition expects ordering to be described by CMPRES, CMPRES2.
-  branch->EmitBranchOnCondition(this, EQ);
-}
-
-
-void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
-                                              FpuRegister left,
-                                              FpuRegister right,
-                                              Register result) {
-  Label done;
-  __ Comment("DoubleCompareBool");
-  assembler()->LoadObject(result, Bool::False());
-  assembler()->cund(left, right);
-  assembler()->bc1t(&done);
-
-  switch (true_condition) {
-    case EQ: assembler()->ceqd(left, right); break;
-    case NE: assembler()->ceqd(left, right); break;
-    case LT: assembler()->coltd(left, right); break;
-    case LE: assembler()->coled(left, right); break;
-    case GT: assembler()->coltd(right, left); break;
-    case GE: assembler()->coled(right, left); break;
-    default: {
-      // Should only passing the above conditions to this function.
-      UNREACHABLE();
-      break;
-    }
-  }
-
-  if (true_condition == NE) {
-    assembler()->bc1t(&done);  // False is already in result.
-  } else {
-    assembler()->bc1f(&done);
-  }
-  assembler()->LoadObject(result, Bool::True());
-  assembler()->Bind(&done);
-}
-
-
 FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
                                                           intptr_t index_scale,
                                                           Register array,
@@ -1930,15 +1860,15 @@
 void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
                                               const Address& src) {
   __ TraceSimMsg("ParallelMoveResolver::MoveMemoryToMemory");
-  __ lw(TMP1, src);
-  __ sw(TMP1, dst);
+  __ lw(TMP, src);
+  __ sw(TMP, dst);
 }
 
 
 void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
   __ TraceSimMsg("ParallelMoveResolver::StoreObject");
-  __ LoadObject(TMP1, obj);
-  __ sw(TMP1, dst);
+  __ LoadObject(TMP, obj);
+  __ sw(TMP, dst);
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 9b67e17..9257c35 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -236,10 +236,13 @@
   } else {
     __ j(ZERO, is_not_instance_lbl);
   }
+  const intptr_t num_type_args = type_class.NumTypeArguments();
+  const intptr_t num_type_params = type_class.NumTypeParameters();
+  const intptr_t from_index = num_type_args - num_type_params;
   const AbstractTypeArguments& type_arguments =
       AbstractTypeArguments::ZoneHandle(type.arguments());
   const bool is_raw_type = type_arguments.IsNull() ||
-      type_arguments.IsRaw(type_arguments.Length());
+      type_arguments.IsRaw(from_index, num_type_params);
   // Signature class is an instantiated parameterized type.
   if (!type_class.IsSignatureClass()) {
     if (is_raw_type) {
@@ -561,7 +564,7 @@
                                            const AbstractType& type,
                                            bool negate_result,
                                            LocationSummary* locs) {
-  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
 
   Label is_instance, is_not_instance;
   __ pushq(RCX);  // Store instantiator on stack.
@@ -650,7 +653,7 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformed() || dst_type.IsMalbounded() ||
+  ASSERT(dst_type.IsMalformedOrMalbounded() ||
          (!dst_type.IsDynamicType() && !dst_type.IsObjectType()));
   __ pushq(RCX);  // Store instantiator.
   __ pushq(RDX);  // Store instantiator type arguments.
@@ -667,7 +670,7 @@
   }
 
   // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformed() || dst_type.IsMalbounded()) {
+  if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
     __ pushq(RAX);  // Push the source object.
     __ PushObject(dst_name, PP);  // Push the name of the destination.
@@ -977,7 +980,7 @@
         ICData::New(function, Symbols::Call(), Object::empty_array(),
                     Isolate::kNoDeoptId, kNumArgsChecked));
     __ LoadObject(RBX, ic_data, PP);
-    __ LeaveFrameWithPP();  // The arguments are still on the stack.
+    __ LeaveDartFrame();  // The arguments are still on the stack.
     __ jmp(&StubCode::CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
     __ int3();
@@ -1176,7 +1179,7 @@
             ICData::New(function, name, Object::empty_array(),
                         Isolate::kNoDeoptId, kNumArgsChecked));
         __ LoadObject(RBX, ic_data, PP);
-        __ LeaveFrameWithPP();  // The arguments are still on the stack.
+        __ LeaveDartFrame();  // The arguments are still on the stack.
         __ jmp(&StubCode::CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
         __ int3();
@@ -1478,11 +1481,8 @@
                                                     const Object& obj,
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
-  if (needs_number_check) {
-    if (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()) {
-      needs_number_check = false;
-    }
-  }
+  ASSERT(!needs_number_check ||
+         (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()));
 
   if (obj.IsSmi() && (Smi::Cast(obj).Value() == 0)) {
     ASSERT(!needs_number_check);
@@ -1640,36 +1640,6 @@
 }
 
 
-void FlowGraphCompiler::EmitDoubleCompareBranch(Condition true_condition,
-                                                FpuRegister left,
-                                                FpuRegister right,
-                                                BranchInstr* branch) {
-  ASSERT(branch != NULL);
-  assembler()->comisd(left, right);
-  BlockEntryInstr* nan_result = (true_condition == NOT_EQUAL) ?
-      branch->true_successor() : branch->false_successor();
-  assembler()->j(PARITY_EVEN, GetJumpLabel(nan_result));
-  branch->EmitBranchOnCondition(this, true_condition);
-}
-
-
-void FlowGraphCompiler::EmitDoubleCompareBool(Condition true_condition,
-                                              FpuRegister left,
-                                              FpuRegister right,
-                                              Register result) {
-  assembler()->comisd(left, right);
-  Label is_false, is_true, done;
-  assembler()->j(PARITY_EVEN, &is_false, Assembler::kNearJump);  // NaN false;
-  assembler()->j(true_condition, &is_true, Assembler::kNearJump);
-  assembler()->Bind(&is_false);
-  assembler()->LoadObject(result, Bool::False(), PP);
-  assembler()->jmp(&done);
-  assembler()->Bind(&is_true);
-  assembler()->LoadObject(result, Bool::True(), PP);
-  assembler()->Bind(&done);
-}
-
-
 FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
                                                           intptr_t index_scale,
                                                           Register array,
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 79fcd02..b6512b1 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -69,58 +69,6 @@
 }
 
 
-// TODO(zerny): Remove the ChildrenVisitor and SourceLabelResetter once we have
-// moved the label/join map for control flow out of the AST and into the flow
-// graph builder.
-
-// Default visitor to traverse child nodes.
-class ChildrenVisitor : public AstNodeVisitor {
- public:
-  ChildrenVisitor() { }
-#define DEFINE_VISIT(BaseName)                                                 \
-  virtual void Visit##BaseName##Node(BaseName##Node* node) {                   \
-    node->VisitChildren(this);                                                 \
-  }
-
-  FOR_EACH_NODE(DEFINE_VISIT);
-#undef DEFINE_VISIT
-};
-
-
-// Visitor to clear each AST node containing source labels.
-class SourceLabelResetter : public ChildrenVisitor {
- public:
-  SourceLabelResetter() { }
-  virtual void VisitSequenceNode(SequenceNode* node) {
-    Reset(node, node->label());
-  }
-  virtual void VisitCaseNode(CaseNode* node) {
-    Reset(node, node->label());
-  }
-  virtual void VisitSwitchNode(SwitchNode* node) {
-    Reset(node, node->label());
-  }
-  virtual void VisitWhileNode(WhileNode* node) {
-    Reset(node, node->label());
-  }
-  virtual void VisitDoWhileNode(DoWhileNode* node) {
-    Reset(node, node->label());
-  }
-  virtual void VisitForNode(ForNode* node) {
-    Reset(node, node->label());
-  }
-  virtual void VisitJumpNode(JumpNode* node) {
-    Reset(node, node->label());
-  }
-  void Reset(AstNode* node, SourceLabel* lbl) {
-    node->VisitChildren(this);
-    if (lbl == NULL) return;
-    lbl->join_for_break_ = NULL;
-    lbl->join_for_continue_ = NULL;
-  }
-};
-
-
 // Helper to create a parameter stub from an actual argument.
 static Definition* CreateParameterStub(intptr_t i,
                                        Value* argument,
@@ -171,10 +119,22 @@
         ++instruction_count_;
         Instruction* current = it.Current();
         if (current->IsStaticCall() ||
-            current->IsClosureCall() ||
-            (current->IsPolymorphicInstanceCall() &&
-             !current->AsPolymorphicInstanceCall()->HasRecognizedTarget())) {
+            current->IsClosureCall()) {
           ++call_site_count_;
+          continue;
+        }
+        if (current->IsPolymorphicInstanceCall()) {
+          PolymorphicInstanceCallInstr* call =
+              current->AsPolymorphicInstanceCall();
+          // These checks make sure that the number of call-sites counted does
+          // not change relative to the time when the current set of inlining
+          // parameters was fixed.
+          // TODO(fschneider): Determine new heuristic parameters that avoid
+          // these checks entirely.
+          if (!call->HasRecognizedTarget() &&
+              (call->instance_call()->token_kind() != Token::kEQ)) {
+            ++call_site_count_;
+          }
         }
       }
     }
@@ -608,6 +568,11 @@
         FlowGraphOptimizer optimizer(callee_graph);
         optimizer.ApplyICData();
         DEBUG_ASSERT(callee_graph->VerifyUseLists());
+
+        // Optimize (a << b) & c patterns, merge instructions. Must occur before
+        // 'SelectRepresentations' which inserts conversion nodes.
+        optimizer.TryOptimizePatterns();
+        DEBUG_ASSERT(callee_graph->VerifyUseLists());
       }
 
       if (FLAG_trace_inlining &&
@@ -775,8 +740,6 @@
       ParsedFunction* parsed_function = function_cache_[i];
       if (parsed_function->function().raw() == function.raw()) {
         *in_cache = true;
-        SourceLabelResetter reset;
-        parsed_function->node_sequence()->Visit(&reset);
         return parsed_function;
       }
     }
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 378d474..a036153 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -26,6 +26,9 @@
 DEFINE_FLAG(bool, load_cse, true, "Use redundant load elimination.");
 DEFINE_FLAG(int, max_polymorphic_checks, 4,
     "Maximum number of polymorphic check, otherwise it is megamorphic.");
+DEFINE_FLAG(int, max_equality_polymorphic_checks, 32,
+    "Maximum number of polymorphic checks in equality operator,"
+    " otherwise use megamorphic dispatch.");
 DEFINE_FLAG(bool, remove_redundant_phis, true, "Remove redundant phis.");
 DEFINE_FLAG(bool, trace_constant_propagation, false,
     "Print constant propagation and useless code elimination.");
@@ -85,9 +88,6 @@
         ComparisonInstr* compare = instr->AsBranch()->comparison();
         if (compare->IsStrictCompare()) {
           VisitStrictCompare(compare->AsStrictCompare());
-        } else if (compare->IsEqualityCompare()) {
-          StrictifyEqualityCompare(compare->AsEqualityCompare(),
-                                   instr->AsBranch());
         }
       }
     }
@@ -251,12 +251,102 @@
 }
 
 
+
+// Used by TryMergeDivMod.
+// Inserts a load-indexed instruction between a TRUNCDIV or MOD instruction,
+// and the using instruction. This is an intermediate step before merging.
+static void DivModAppendLoadIndexed(BinarySmiOpInstr* instr,
+                                    FlowGraph* flow_graph) {
+  const intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(kArrayCid);
+  const intptr_t ix = (instr->op_kind() == Token::kTRUNCDIV) ? 0 : 1;
+  ConstantInstr* index_instr = new ConstantInstr(Smi::Handle(Smi::New(ix)));
+  flow_graph->InsertAfter(instr, index_instr, NULL, Definition::kValue);
+  LoadIndexedInstr* load = new LoadIndexedInstr(new Value(instr),
+                                                new Value(index_instr),
+                                                index_scale,
+                                                kArrayCid,
+                                                Isolate::kNoDeoptId);
+  instr->ReplaceUsesWith(load);
+  flow_graph->InsertAfter(index_instr, load, NULL, Definition::kValue);
+}
+
+
+// Dart:
+//  var x = d % 10;
+//  var y = d ~/ 10;
+//  var z = x + y;
+//
+// IL:
+//  v4 <- %(v2, v3)
+//  v5 <- ~/(v2, v3)
+//  v6 <- +(v4, v5)
+//
+// IL optimized:
+//  v4 <- DIVMOD(v2, v3);
+//  v5 <- LoadIndexed(v4, 0); // ~/ result
+//  v6 <- LoadIndexed(v4, 1); // % result
+//  v7 <- +(v5, v6)
+// Because of the environment it is important that merged instruction replaces
+// first original instruction encountered.
+void FlowGraphOptimizer::TryMergeTruncDivMod(
+    GrowableArray<BinarySmiOpInstr*>* merge_candidates) {
+  if (merge_candidates->length() < 2) {
+    // Need at least a TRUNCDIV and a MOD.
+    return;
+  }
+  for (intptr_t i = 0; i < merge_candidates->length(); i++) {
+    BinarySmiOpInstr* curr_instr = (*merge_candidates)[i];
+    if (curr_instr == NULL) {
+      // Instructions was merged already.
+      continue;
+    }
+    ASSERT((curr_instr->op_kind() == Token::kTRUNCDIV) ||
+           (curr_instr->op_kind() == Token::kMOD));
+    // Check if there is kMOD/kTRUNDIV binop with same inputs.
+    const intptr_t other_kind = (curr_instr->op_kind() == Token::kTRUNCDIV) ?
+        Token::kMOD : Token::kTRUNCDIV;
+    Definition* left_def = curr_instr->left()->definition();
+    Definition* right_def = curr_instr->right()->definition();
+    for (intptr_t k = i + 1; k < merge_candidates->length(); k++) {
+      BinarySmiOpInstr* other_binop = (*merge_candidates)[k];
+      // 'other_binop' can be NULL if it was already merged.
+      if ((other_binop != NULL) &&
+          (other_binop->op_kind() == other_kind) &&
+          (other_binop->left()->definition() == left_def) &&
+          (other_binop->right()->definition() == right_def)) {
+        (*merge_candidates)[k] = NULL;  // Clear it.
+        // Append a LoadIndexed behind TRUNC_DIV and MOD.
+        DivModAppendLoadIndexed(curr_instr, flow_graph_);
+        DivModAppendLoadIndexed(other_binop, flow_graph_);
+
+        ZoneGrowableArray<Value*>* args = new ZoneGrowableArray<Value*>(2);
+        args->Add(new Value(curr_instr->left()->definition()));
+        args->Add(new Value(curr_instr->right()->definition()));
+
+        // Replace with TruncDivMod.
+        MergedMathInstr* div_mod = new MergedMathInstr(
+            args,
+            curr_instr->deopt_id(),
+            MergedMathInstr::kTruncDivMod);
+        curr_instr->ReplaceWith(div_mod, current_iterator());
+        other_binop->ReplaceUsesWith(div_mod);
+        other_binop->RemoveFromGraph();
+      }
+    }
+  }
+}
+
+
 // Optimize (a << b) & c pattern: if c is a positive Smi or zero, then the
 // shift can be a truncating Smi shift-left and result is always Smi.
-void FlowGraphOptimizer::TryOptimizeLeftShiftWithBitAndPattern() {
+// Merging occurs only per basic-block.
+void FlowGraphOptimizer::TryOptimizePatterns() {
   if (!FLAG_truncating_left_shift) return;
   ASSERT(current_iterator_ == NULL);
+  GrowableArray<BinarySmiOpInstr*> for_merge;
   for (intptr_t i = 0; i < block_order_.length(); ++i) {
+    // Merging only per basic-block.
+    for_merge.Clear();
     BlockEntryInstr* entry = block_order_[i];
     ForwardInstructionIterator it(entry);
     current_iterator_ = &it;
@@ -267,6 +357,9 @@
           OptimizeLeftShiftBitAndSmiOp(binop,
                                        binop->left()->definition(),
                                        binop->right()->definition());
+        } else if ((binop->op_kind() == Token::kTRUNCDIV) ||
+                   (binop->op_kind() == Token::kMOD)) {
+          for_merge.Add(binop);
         }
       } else if (it.Current()->IsBinaryMintOp()) {
         BinaryMintOpInstr* mintop = it.Current()->AsBinaryMintOp();
@@ -277,6 +370,7 @@
         }
       }
     }
+    TryMergeTruncDivMod(&for_merge);
     current_iterator_ = NULL;
   }
 }
@@ -1288,6 +1382,101 @@
 
 static bool SmiFitsInDouble() { return kSmiBits < 53; }
 
+bool FlowGraphOptimizer::TryReplaceWithEqualityOp(InstanceCallInstr* call,
+                                                  Token::Kind op_kind) {
+  const ICData& ic_data = *call->ic_data();
+  ASSERT(ic_data.num_args_tested() == 2);
+
+  ASSERT(call->ArgumentCount() == 2);
+  Definition* left = call->ArgumentAt(0);
+  Definition* right = call->ArgumentAt(1);
+
+  intptr_t cid = kIllegalCid;
+  if (HasOnlyTwoOf(ic_data, kSmiCid)) {
+    InsertBefore(call,
+                 new CheckSmiInstr(new Value(left), call->deopt_id()),
+                 call->env(),
+                 Definition::kEffect);
+    InsertBefore(call,
+                 new CheckSmiInstr(new Value(right), call->deopt_id()),
+                 call->env(),
+                 Definition::kEffect);
+    cid = kSmiCid;
+  } else if (HasTwoMintOrSmi(ic_data) &&
+             FlowGraphCompiler::SupportsUnboxedMints()) {
+    cid = kMintCid;
+  } else if (HasTwoDoubleOrSmi(ic_data)) {
+    // Use double comparison.
+    if (SmiFitsInDouble()) {
+      cid = kDoubleCid;
+    } else {
+      if (ICDataHasReceiverArgumentClassIds(ic_data, kSmiCid, kSmiCid)) {
+        // We cannot use double comparison on two smis. Need polymorphic
+        // call.
+        return false;
+      } else {
+        InsertBefore(call,
+                     new CheckEitherNonSmiInstr(new Value(left),
+                                                new Value(right),
+                                                call->deopt_id()),
+                     call->env(),
+                     Definition::kEffect);
+        cid = kDoubleCid;
+      }
+    }
+  } else {
+    // Check if ICDData contains checks with Smi/Null combinations. In that case
+    // we can still emit the optimized Smi equality operation but need to add
+    // checks for null or Smi.
+    GrowableArray<intptr_t> smi_or_null(2);
+    smi_or_null.Add(kSmiCid);
+    smi_or_null.Add(kNullCid);
+    if (ICDataHasOnlyReceiverArgumentClassIds(ic_data,
+                                              smi_or_null,
+                                              smi_or_null)) {
+      const ICData& unary_checks_0 =
+          ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
+      AddCheckClass(left,
+                    unary_checks_0,
+                    call->deopt_id(),
+                    call->env(),
+                    call);
+
+      const ICData& unary_checks_1 =
+          ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecksForArgNr(1));
+      AddCheckClass(right,
+                    unary_checks_1,
+                    call->deopt_id(),
+                    call->env(),
+                    call);
+      cid = kSmiCid;
+    } else {
+      // Shortcut for equality with null.
+      ConstantInstr* right_const = right->AsConstant();
+      ConstantInstr* left_const = left->AsConstant();
+      if ((right_const != NULL && right_const->value().IsNull()) ||
+          (left_const != NULL && left_const->value().IsNull())) {
+        StrictCompareInstr* comp = new StrictCompareInstr(call->token_pos(),
+                                                          Token::kEQ_STRICT,
+                                                          new Value(left),
+                                                          new Value(right));
+        ReplaceCall(call, comp);
+        return true;
+      }
+      return false;
+    }
+  }
+  ASSERT(cid != kIllegalCid);
+  EqualityCompareInstr* comp = new EqualityCompareInstr(call->token_pos(),
+                                                        op_kind,
+                                                        new Value(left),
+                                                        new Value(right),
+                                                        cid,
+                                                        call->deopt_id());
+  ReplaceCall(call, comp);
+  return true;
+}
+
 
 bool FlowGraphOptimizer::TryReplaceWithRelationalOp(InstanceCallInstr* call,
                                                     Token::Kind op_kind) {
@@ -1401,13 +1590,6 @@
         return false;
       }
       break;
-    case Token::kMOD:
-      if (HasOnlyTwoOf(ic_data, kSmiCid)) {
-        operands_type = kSmiCid;
-      } else {
-        return false;
-      }
-      break;
     case Token::kBIT_AND:
     case Token::kBIT_OR:
     case Token::kBIT_XOR:
@@ -1427,7 +1609,9 @@
         // Left shift may overflow from smi into mint or big ints.
         // Don't generate smi code if the IC data is marked because
         // of an overflow.
-        if (ic_data.deopt_reason() == kDeoptShiftMintOp) return false;
+        if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+          return false;
+        }
         operands_type = (ic_data.deopt_reason() == kDeoptBinarySmiOp)
             ? kMintCid
             : kSmiCid;
@@ -1436,16 +1620,21 @@
                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
-        if (ic_data.deopt_reason() == kDeoptShiftMintOp) return false;
+        if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+          return false;
+        }
         // Check for smi/mint << smi or smi/mint >> smi.
         operands_type = kMintCid;
       } else {
         return false;
       }
       break;
+    case Token::kMOD:
     case Token::kTRUNCDIV:
       if (HasOnlyTwoOf(ic_data, kSmiCid)) {
-        if (ic_data.deopt_reason() == kDeoptBinarySmiOp) return false;
+        if (ic_data.deopt_reason() == kDeoptBinarySmiOp) {
+          return false;
+        }
         operands_type = kSmiCid;
       } else {
         return false;
@@ -1493,26 +1682,34 @@
   } else if (operands_type == kInt32x4Cid) {
     return InlineInt32x4BinaryOp(call, op_kind);
   } else if (op_kind == Token::kMOD) {
-    // TODO(vegorov): implement fast path code for modulo.
     ASSERT(operands_type == kSmiCid);
-    if (!right->IsConstant()) return false;
-    const Object& obj = right->AsConstant()->value();
-    if (!obj.IsSmi()) return false;
-    const intptr_t value = Smi::Cast(obj).Value();
-    if (!Utils::IsPowerOfTwo(value)) return false;
-
-    // Insert smi check and attach a copy of the original environment
-    // because the smi operation can still deoptimize.
-    InsertBefore(call,
-                 new CheckSmiInstr(new Value(left), call->deopt_id()),
-                 call->env(),
-                 Definition::kEffect);
-    ConstantInstr* constant =
-        flow_graph()->GetConstant(Smi::Handle(Smi::New(value - 1)));
+    if (right->IsConstant()) {
+      const Object& obj = right->AsConstant()->value();
+      if (obj.IsSmi() && Utils::IsPowerOfTwo(Smi::Cast(obj).Value())) {
+        // Insert smi check and attach a copy of the original environment
+        // because the smi operation can still deoptimize.
+        InsertBefore(call,
+                     new CheckSmiInstr(new Value(left), call->deopt_id()),
+                     call->env(),
+                     Definition::kEffect);
+        ConstantInstr* constant =
+            flow_graph()->GetConstant(Smi::Handle(
+                Smi::New(Smi::Cast(obj).Value() - 1)));
+        BinarySmiOpInstr* bin_op =
+            new BinarySmiOpInstr(Token::kBIT_AND,
+                                 new Value(left),
+                                 new Value(constant),
+                                 call->deopt_id());
+        ReplaceCall(call, bin_op);
+        return true;
+      }
+    }
+    // Insert two smi checks and attach a copy of the original
+    // environment because the smi operation can still deoptimize.
+    AddCheckSmi(left, call->deopt_id(), call->env(), call);
+    AddCheckSmi(right, call->deopt_id(), call->env(), call);
     BinarySmiOpInstr* bin_op =
-        new BinarySmiOpInstr(Token::kBIT_AND,
-                             new Value(left),
-                             new Value(constant),
+        new BinarySmiOpInstr(op_kind, new Value(left), new Value(right),
                              call->deopt_id());
     ReplaceCall(call, bin_op);
   } else {
@@ -2897,17 +3094,20 @@
 RawBool* FlowGraphOptimizer::InstanceOfAsBool(const ICData& ic_data,
                                               const AbstractType& type) const {
   ASSERT(ic_data.num_args_tested() == 1);  // Unary checks only.
-  if (!type.IsInstantiated() || type.IsMalformed() || type.IsMalbounded()) {
+  if (!type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
     return Bool::null();
   }
   const Class& type_class = Class::Handle(type.type_class());
-  if (type_class.NumTypeArguments() > 0) {
+  const intptr_t num_type_args = type_class.NumTypeArguments();
+  if (num_type_args > 0) {
     // Only raw types can be directly compared, thus disregarding type
     // arguments.
+    const intptr_t num_type_params = type_class.NumTypeParameters();
+    const intptr_t from_index = num_type_args - num_type_params;
     const AbstractTypeArguments& type_arguments =
         AbstractTypeArguments::Handle(type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
-        type_arguments.IsRaw(type_arguments.Length());
+        type_arguments.IsRaw(from_index, num_type_params);
     if (!is_raw_type) {
       // Unknown result.
       return Bool::null();
@@ -2933,6 +3133,18 @@
 }
 
 
+static Definition* OriginalDefinition(Definition* defn) {
+  while (defn->IsRedefinition() || defn->IsAssertAssignable()) {
+    if (defn->IsRedefinition()) {
+      defn = defn->AsRedefinition()->value()->definition();
+    } else {
+      defn = defn->AsAssertAssignable()->value()->definition();
+    }
+  }
+  return defn;
+}
+
+
 // TODO(srdjan): Use ICData to check if always true or false.
 void FlowGraphOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
   ASSERT(Token::IsTypeTestOperator(call->token_kind()));
@@ -2941,8 +3153,8 @@
   Definition* type_args = call->ArgumentAt(2);
   const AbstractType& type =
       AbstractType::Cast(call->ArgumentAt(3)->AsConstant()->value());
-  const bool negate =
-      Bool::Cast(call->ArgumentAt(4)->AsConstant()->value()).value();
+  const bool negate = Bool::Cast(
+      OriginalDefinition(call->ArgumentAt(4))->AsConstant()->value()).value();
   const ICData& unary_checks =
       ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
@@ -2983,7 +3195,7 @@
   Definition* type_args = call->ArgumentAt(2);
   const AbstractType& type =
       AbstractType::Cast(call->ArgumentAt(3)->AsConstant()->value());
-  ASSERT(!type.IsMalformed() && !type.IsMalbounded());
+  ASSERT(!type.IsMalformedOrMalbounded());
   const ICData& unary_checks =
       ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
@@ -3041,7 +3253,10 @@
   const ICData& unary_checks =
       ICData::ZoneHandle(instr->ic_data()->AsUnaryClassChecks());
 
-  if ((unary_checks.NumberOfChecks() > FLAG_max_polymorphic_checks) &&
+  intptr_t max_checks = (op_kind == Token::kEQ)
+      ? FLAG_max_equality_polymorphic_checks
+      : FLAG_max_polymorphic_checks;
+  if ((unary_checks.NumberOfChecks() > max_checks) &&
       InstanceCallNeedsClassCheck(instr)) {
     // Too many checks, it will be megamorphic which needs unary checks.
     instr->set_ic_data(&unary_checks);
@@ -3055,6 +3270,10 @@
     return;
   }
 
+  if (op_kind == Token::kEQ && TryReplaceWithEqualityOp(instr, op_kind)) {
+    return;
+  }
+
   if (Token::IsRelationalOperator(op_kind) &&
       TryReplaceWithRelationalOp(instr, op_kind)) {
     return;
@@ -3280,222 +3499,6 @@
 }
 
 
-bool FlowGraphOptimizer::CanStrictifyEqualityCompare(
-    EqualityCompareInstr* compare) {
-  // If one of the inputs is null this is a strict comparison.
-  if (compare->left()->BindsToConstantNull() ||
-      compare->right()->BindsToConstantNull()) {
-    return true;
-  }
-
-  if (compare->left()->Type()->IsNone()) {
-    return false;  // We might be running prior to any type propagation passes.
-  }
-
-  // Try resolving target function using propagated cid for the receiver.
-  // If receiver is either null or has default equality operator then
-  // we can convert such comparison to a strict one.
-  const intptr_t receiver_cid =
-     compare->left()->Type()->ToNullableCid();
-
-  if (receiver_cid == kDynamicCid) {
-    return false;
-  }
-
-  const Class& receiver_class = Class::Handle(
-      Isolate::Current()->class_table()->At(receiver_cid));
-
-  // Resolve equality operator.
-  const intptr_t kNumArgs = 2;
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kNumArgs)));
-  const Function& function = Function::Handle(
-      Resolver::ResolveDynamicForReceiverClass(
-          receiver_class,
-          Symbols::EqualOperator(),
-          args_desc));
-
-  if (function.IsNull()) {
-    return false;
-  }
-
-  // Default equality operator declared on the Object class just calls
-  // identical.
-  return (Class::Handle(function.Owner()).id() == kInstanceCid);
-}
-
-
-template <typename T>
-bool FlowGraphOptimizer::StrictifyEqualityCompare(
-    EqualityCompareInstr* compare,
-    T current_instruction) const {
-  if (CanStrictifyEqualityCompare(compare)) {
-    Token::Kind strict_kind = (compare->kind() == Token::kEQ) ?
-        Token::kEQ_STRICT : Token::kNE_STRICT;
-    StrictCompareInstr* strict_comp =
-        new StrictCompareInstr(compare->token_pos(),
-                               strict_kind,
-                               compare->left()->CopyWithType(),
-                               compare->right()->CopyWithType());
-    // Numbers override equality and are therefore not part of this conversion.
-    strict_comp->set_needs_number_check(false);
-    current_instruction->ReplaceWith(strict_comp, current_iterator());
-    return true;
-  }
-  return false;
-}
-
-
-// Returns true if we converted EqualityCompare to StrictCompare.
-template <typename T>
-bool FlowGraphOptimizer::StrictifyEqualityCompareWithICData(
-    EqualityCompareInstr* compare,
-    const ICData& unary_ic_data,
-    T current_instruction) {
-  ASSERT(unary_ic_data.num_args_tested() == 1);
-  if (unary_ic_data.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
-    // If possible classes do not override Object's equality then replace
-    // with strict equality.
-    Function& target = Function::Handle();
-    Class& targets_class = Class::Handle();
-    for (intptr_t i = 0; i < unary_ic_data.NumberOfChecks(); i++) {
-      intptr_t cid = kIllegalCid;
-      unary_ic_data.GetOneClassCheckAt(i, &cid, &target);
-      targets_class = target.Owner();
-      if (targets_class.id() != kInstanceCid) {
-        // Overriden equality operator.
-        return false;
-      }
-    }
-    AddCheckClass(compare->left()->definition(),
-                  unary_ic_data,
-                  compare->deopt_id(),
-                  current_instruction->env(),
-                  current_instruction);
-    ASSERT((compare->kind() == Token::kEQ) || (compare->kind() == Token::kNE));
-    Token::Kind strict_kind = (compare->kind() == Token::kEQ) ?
-        Token::kEQ_STRICT : Token::kNE_STRICT;
-    StrictCompareInstr* strict_comp =
-        new StrictCompareInstr(compare->token_pos(),
-                               strict_kind,
-                               compare->left()->Copy(),
-                               compare->right()->Copy());
-    // Numbers override equality and are therefore not part of this conversion.
-    strict_comp->set_needs_number_check(false);
-    current_instruction->ReplaceWith(strict_comp, current_iterator());
-    return true;
-  }
-  return false;
-}
-
-
-template <typename T>
-void FlowGraphOptimizer::HandleEqualityCompare(EqualityCompareInstr* comp,
-                                               T current_instruction) {
-  if (StrictifyEqualityCompare(comp, current_instruction)) {
-    // Based on input types, equality converted to strict-equality.
-    return;
-  }
-
-  if (!comp->HasICData() || (comp->ic_data()->NumberOfChecks() == 0)) {
-    return;
-  }
-
-  const ICData& ic_data = *comp->ic_data();
-  ASSERT(ic_data.num_args_tested() == 2);
-  ASSERT(comp->operation_cid() == kIllegalCid);
-  if (HasOnlyTwoOf(ic_data, kSmiCid)) {
-    InsertBefore(current_instruction,
-                 new CheckSmiInstr(comp->left()->Copy(), comp->deopt_id()),
-                 current_instruction->env(),
-                 Definition::kEffect);
-    InsertBefore(current_instruction,
-                 new CheckSmiInstr(comp->right()->Copy(), comp->deopt_id()),
-                 current_instruction->env(),
-                 Definition::kEffect);
-    comp->set_operation_cid(kSmiCid);
-  } else if (HasTwoMintOrSmi(ic_data) &&
-             FlowGraphCompiler::SupportsUnboxedMints()) {
-    comp->set_operation_cid(kMintCid);
-  } else if (HasTwoDoubleOrSmi(ic_data)) {
-    // Use double comparison.
-    if (SmiFitsInDouble()) {
-      comp->set_operation_cid(kDoubleCid);
-    } else {
-      if (ICDataHasReceiverArgumentClassIds(ic_data, kSmiCid, kSmiCid)) {
-        // We cannot use double comparison on two smis.
-        ASSERT(comp->operation_cid() == kIllegalCid);
-      } else {
-        InsertBefore(current_instruction,
-                     new CheckEitherNonSmiInstr(comp->left()->Copy(),
-                                                comp->right()->Copy(),
-                                                comp->deopt_id()),
-                     current_instruction->env(),
-                     Definition::kEffect);
-        comp->set_operation_cid(kDoubleCid);
-      }
-    }
-  }
-
-  if (comp->operation_cid() != kIllegalCid) {
-    // Done.
-    return;
-  }
-
-  const ICData& unary_checks_0 =
-      ICData::ZoneHandle(comp->ic_data()->AsUnaryClassChecks());
-  if (StrictifyEqualityCompareWithICData(
-        comp, unary_checks_0, current_instruction)) {
-    // Based on ICData, equality converted to strict-equality.
-    return;
-  }
-
-  // Check if ICDData contains checks with Smi/Null combinations. In that case
-  // we can still emit the optimized Smi equality operation but need to add
-  // checks for null or Smi.
-  // TODO(srdjan): Add it for Double and Mint.
-  GrowableArray<intptr_t> smi_or_null(2);
-  smi_or_null.Add(kSmiCid);
-  smi_or_null.Add(kNullCid);
-  if (ICDataHasOnlyReceiverArgumentClassIds(ic_data,
-                                            smi_or_null,
-                                            smi_or_null)) {
-    AddCheckClass(comp->left()->definition(),
-                  unary_checks_0,
-                  comp->deopt_id(),
-                  current_instruction->env(),
-                  current_instruction);
-
-    const ICData& unary_checks_1 =
-        ICData::ZoneHandle(comp->ic_data()->AsUnaryClassChecksForArgNr(1));
-    AddCheckClass(comp->right()->definition(),
-                  unary_checks_1,
-                  comp->deopt_id(),
-                  current_instruction->env(),
-                  current_instruction);
-    comp->set_operation_cid(kSmiCid);
-  }
-}
-
-
-
-
-void FlowGraphOptimizer::VisitEqualityCompare(EqualityCompareInstr* instr) {
-  HandleEqualityCompare(instr, instr);
-}
-
-
-void FlowGraphOptimizer::VisitBranch(BranchInstr* instr) {
-  ComparisonInstr* comparison = instr->comparison();
-  if (comparison->IsEqualityCompare()) {
-    HandleEqualityCompare(comparison->AsEqualityCompare(), instr);
-  } else {
-    ASSERT(comparison->IsStrictCompare());
-    // Nothing to do.
-  }
-}
-
-
 // Range analysis for smi values.
 class RangeAnalysis : public ValueObject {
  public:
@@ -4601,17 +4604,6 @@
   static Place* Wrap(const Place& place);
 
  private:
-  static Definition* OriginalDefinition(Definition* defn) {
-    while (defn->IsRedefinition() || defn->IsAssertAssignable()) {
-      if (defn->IsRedefinition()) {
-        defn = defn->AsRedefinition()->value()->definition();
-      } else {
-        defn = defn->AsAssertAssignable()->value()->definition();
-      }
-    }
-    return defn;
-  }
-
   bool SameField(Place* other) const {
     return (kind_ == kField) ? (field().raw() == other->field().raw())
                              : (offset_in_bytes_ == other->offset_in_bytes_);
@@ -6302,8 +6294,11 @@
   } else if (IsConstant(value)) {
     // We are ignoring the instantiator and instantiator_type_arguments, but
     // still monotonic and safe.
-    // TODO(kmillikin): Handle constants.
-    SetValue(instr, non_constant_);
+    if (instr->value()->Type()->IsAssignableTo(instr->dst_type())) {
+      SetValue(instr, value);
+    } else {
+      SetValue(instr, non_constant_);
+    }
   }
 }
 
@@ -6313,8 +6308,11 @@
   if (IsNonConstant(value)) {
     SetValue(instr, non_constant_);
   } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle assertion.
-    SetValue(instr, non_constant_);
+    if (value.IsBool()) {
+      SetValue(instr, value);
+    } else {
+      SetValue(instr, non_constant_);
+    }
   }
 }
 
@@ -6418,14 +6416,28 @@
         (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) {
       bool result = left.IsNull() ? instr->right()->Type()->IsNull()
                                   : instr->left()->Type()->IsNull();
-      if (instr->kind() == Token::kNE_STRICT) result = !result;
+      if (instr->kind() == Token::kNE_STRICT) {
+        result = !result;
+      }
       SetValue(instr, Bool::Get(result));
     } else {
-      SetValue(instr, non_constant_);
+      const intptr_t left_cid = instr->left()->Type()->ToCid();
+      const intptr_t right_cid = instr->right()->Type()->ToCid();
+      // If exact classes (cids) are known and they differ, the result
+      // of strict compare can be computed.
+      if ((left_cid != kDynamicCid) && (right_cid != kDynamicCid) &&
+          (left_cid != right_cid)) {
+        const bool result = (instr->kind() != Token::kEQ_STRICT);
+        SetValue(instr, Bool::Get(result));
+      } else {
+        SetValue(instr, non_constant_);
+      }
     }
   } else if (IsConstant(left) && IsConstant(right)) {
     bool result = (left.raw() == right.raw());
-    if (instr->kind() == Token::kNE_STRICT) result = !result;
+    if (instr->kind() == Token::kNE_STRICT) {
+      result = !result;
+    }
     SetValue(instr, Bool::Get(result));
   }
 }
@@ -6449,15 +6461,33 @@
 }
 
 
+void ConstantPropagator::VisitTestSmi(TestSmiInstr* instr) {
+  const Object& left = instr->left()->definition()->constant_value();
+  const Object& right = instr->right()->definition()->constant_value();
+  if (IsNonConstant(left) || IsNonConstant(right)) {
+    SetValue(instr, non_constant_);
+  } else if (IsConstant(left) && IsConstant(right)) {
+    if (left.IsInteger() && right.IsInteger()) {
+      const bool result = CompareIntegers(
+          instr->kind(),
+          Integer::Handle(Integer::Cast(left).BitOp(Token::kBIT_AND,
+                                                    Integer::Cast(right))),
+          Smi::Handle(Smi::New(0)));
+      SetValue(instr, result ? Bool::True() : Bool::False());
+    } else {
+      SetValue(instr, non_constant_);
+    }
+  }
+}
+
+
 void ConstantPropagator::VisitEqualityCompare(EqualityCompareInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
 
   if (instr->left()->definition() == instr->right()->definition()) {
-    // Fold x == x, and x != x to true/false for numbers and checked strict
-    // comparisons.
-    if (instr->IsCheckedStrictEqual() ||
-        RawObject::IsIntegerClassId(instr->operation_cid())) {
+    // Fold x == x, and x != x to true/false for numbers comparisons.
+    if (RawObject::IsIntegerClassId(instr->operation_cid())) {
       return SetValue(instr, Bool::Get(instr->kind() == Token::kEQ));
     }
   }
@@ -6564,9 +6594,26 @@
 
 
 void ConstantPropagator::VisitInstanceOf(InstanceOfInstr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
+  const Definition* def = instr->value()->definition();
+  const Object& value = def->constant_value();
   if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
+    const AbstractType& checked_type = instr->type();
+    intptr_t value_cid = instr->value()->Type()->ToCid();
+    Representation rep = def->representation();
+    if ((checked_type.IsFloat32x4Type() && (rep == kUnboxedFloat32x4)) ||
+        (checked_type.IsInt32x4Type() && (rep == kUnboxedInt32x4))     ||
+        (checked_type.IsDoubleType() && (rep == kUnboxedDouble))       ||
+        (checked_type.IsIntType() && (rep == kUnboxedMint))) {
+      // Ensure that compile time type matches representation.
+      ASSERT(((rep == kUnboxedFloat32x4) && (value_cid == kFloat32x4Cid)) ||
+             ((rep == kUnboxedInt32x4) && (value_cid == kInt32x4Cid))     ||
+             ((rep == kUnboxedDouble) && (value_cid == kDoubleCid))       ||
+             ((rep == kUnboxedMint) && (value_cid == kMintCid)));
+      // The representation guarantees the type check to be true.
+      SetValue(instr, instr->negate_result() ? Bool::False() : Bool::True());
+    } else {
+      SetValue(instr, non_constant_);
+    }
   } else if (IsConstant(value)) {
     // TODO(kmillikin): Handle instanceof on constants.
     SetValue(instr, non_constant_);
@@ -6880,6 +6927,13 @@
   SetValue(instr, non_constant_);
 }
 
+
+void ConstantPropagator::VisitMergedMath(MergedMathInstr* instr) {
+  // TODO(srdjan): Handle merged instruction.
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitConstant(ConstantInstr* instr) {
   SetValue(instr, instr->value());
 }
@@ -7428,9 +7482,8 @@
                                  comparison->kind(),
                                  left,
                                  right,
-                                 Object::null_array());
-    new_equality_compare->set_ic_data(equality_compare->ic_data());
-    new_equality_compare->set_operation_cid(equality_compare->operation_cid());
+                                 equality_compare->operation_cid(),
+                                 equality_compare->deopt_id());
     new_comparison = new_equality_compare;
   } else {
     ASSERT(comparison->IsRelationalOp());
@@ -7603,10 +7656,6 @@
 
 
 void IfConverter::Simplify(FlowGraph* flow_graph) {
-  if (!IfThenElseInstr::IsSupported()) {
-    return;
-  }
-
   bool changed = false;
 
   const GrowableArray<BlockEntryInstr*>& postorder = flow_graph->postorder();
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index bd26fdd..6137831 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -31,7 +31,8 @@
 
   // Optimize (a << b) & c pattern: if c is a positive Smi or zero, then the
   // shift can be a truncating Smi shift-left and result is always Smi.
-  void TryOptimizeLeftShiftWithBitAndPattern();
+  // Merge instructions (only per basic-block).
+  void TryOptimizePatterns();
 
   // Returns true if any instructions were canonicalized away.
   bool Canonicalize();
@@ -58,8 +59,6 @@
 
   virtual void VisitStaticCall(StaticCallInstr* instr);
   virtual void VisitInstanceCall(InstanceCallInstr* instr);
-  virtual void VisitEqualityCompare(EqualityCompareInstr* instr);
-  virtual void VisitBranch(BranchInstr* instr);
 
   void InsertBefore(Instruction* next,
                     Instruction* instr,
@@ -101,6 +100,7 @@
   bool TryReplaceWithBinaryOp(InstanceCallInstr* call, Token::Kind op_kind);
   bool TryReplaceWithUnaryOp(InstanceCallInstr* call, Token::Kind op_kind);
 
+  bool TryReplaceWithEqualityOp(InstanceCallInstr* call, Token::Kind op_kind);
   bool TryReplaceWithRelationalOp(InstanceCallInstr* call, Token::Kind op_kind);
 
   bool TryInlineInstanceGetter(InstanceCallInstr* call);
@@ -201,26 +201,10 @@
   void ReplaceWithMathCFunction(InstanceCallInstr* call,
                                 MethodRecognizer::Kind recognized_kind);
 
-  // Visit an equality compare.  The current instruction can be the
-  // comparison itself or a branch on the comparison.
-  template <typename T>
-  void HandleEqualityCompare(EqualityCompareInstr* comp,
-                             T current_instruction);
-
-  static bool CanStrictifyEqualityCompare(EqualityCompareInstr* call);
-
-  template <typename T>
-  bool StrictifyEqualityCompare(EqualityCompareInstr* compare,
-                                T current_instruction) const;
-
-  template <typename T>
-  bool StrictifyEqualityCompareWithICData(EqualityCompareInstr* compare,
-                                          const ICData& unary_ic_data,
-                                          T current_instruction);
-
   void OptimizeLeftShiftBitAndSmiOp(Definition* bit_and_instr,
                                     Definition* left_instr,
                                     Definition* right_instr);
+  void TryMergeTruncDivMod(GrowableArray<BinarySmiOpInstr*>* merge_candidates);
 
   FlowGraph* flow_graph_;
 
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index d259022..e19c5c2 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -563,7 +563,7 @@
                                          bool* is_instance) {
   ASSERT(is_instance != NULL);
   // We cannot give an answer if the given type is malformed or malbounded.
-  if (type.IsMalformed() || type.IsMalbounded()) {
+  if (type.IsMalformedOrMalbounded()) {
     return false;
   }
 
@@ -578,7 +578,7 @@
 
   // Consider the compile type of the value.
   const AbstractType& compile_type = *ToAbstractType();
-  if (compile_type.IsMalformed() || compile_type.IsMalbounded()) {
+  if (compile_type.IsMalformedOrMalbounded()) {
     return false;
   }
 
@@ -803,24 +803,20 @@
 }
 
 
-CompileType EqualityCompareInstr::ComputeType() const {
-  return IsInlinedNumericComparison() ? CompileType::Bool()
-                                      : CompileType::Dynamic();
-}
-
-
-bool EqualityCompareInstr::RecomputeType() {
-  return UpdateType(ComputeType());
-}
-
-
-CompileType RelationalOpInstr::ComputeType() const {
+CompileType TestSmiInstr::ComputeType() const {
   return CompileType::Bool();
 }
 
 
-bool RelationalOpInstr::RecomputeType() {
-  return UpdateType(ComputeType());
+CompileType EqualityCompareInstr::ComputeType() const {
+  // Used for numeric comparisons only.
+  return CompileType::Bool();
+}
+
+
+CompileType RelationalOpInstr::ComputeType() const {
+  // Used for numeric comparisons only.
+  return CompileType::Bool();
 }
 
 
@@ -898,6 +894,18 @@
     return CompileType::FromAbstractType(
         AbstractType::ZoneHandle(StaticField().type()));
   }
+  const Field& field = this->StaticField();
+  ASSERT(field.is_static());
+  if (field.is_final()) {
+    Instance& obj = Instance::Handle(field.value());
+    if ((obj.raw() != Object::sentinel().raw()) &&
+        (obj.raw() != Object::transition_sentinel().raw()) &&
+        !obj.IsNull()) {
+      return CompileType(CompileType::kNonNullable,
+                         Class::Handle(obj.clazz()).id(),
+                         NULL);
+    }
+  }
   return CompileType::Dynamic();
 }
 
@@ -1212,4 +1220,13 @@
 }
 
 
+CompileType MergedMathInstr::ComputeType() const {
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    return CompileType::FromCid(kArrayCid);
+  } else {
+    UNIMPLEMENTED();
+    return CompileType::Dynamic();
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 8f6633c..63d0c9d 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -44,9 +44,9 @@
     old_weak_tables_[sel] = new WeakTable();
   }
   new_space_ = new Scavenger(this,
-                             (FLAG_new_gen_heap_size * MB),
+                             (FLAG_new_gen_heap_size * MBInWords),
                              kNewObjectAlignmentOffset);
-  old_space_ = new PageSpace(this, (FLAG_old_gen_heap_size * MB));
+  old_space_ = new PageSpace(this, (FLAG_old_gen_heap_size * MBInWords));
   stats_.num_ = 0;
 }
 
@@ -251,9 +251,9 @@
 
 
 void Heap::StartEndAddress(uword* start, uword* end) const {
-  ASSERT(new_space_->capacity() != 0);
+  ASSERT(new_space_->CapacityInWords() != 0);
   new_space_->StartEndAddress(start, end);
-  if (old_space_->capacity() != 0) {
+  if (old_space_->CapacityInWords() != 0) {
     uword old_start;
     uword old_end;
     old_space_->StartEndAddress(&old_start, &old_end);
@@ -298,18 +298,21 @@
 void Heap::PrintSizes() const {
   OS::PrintErr("New space (%" Pd "k of %" Pd "k) "
                "Old space (%" Pd "k of %" Pd "k)\n",
-               (Used(kNew) / KB), (Capacity(kNew) / KB),
-               (Used(kOld) / KB), (Capacity(kOld) / KB));
+               (UsedInWords(kNew) / KBInWords),
+               (CapacityInWords(kNew) / KBInWords),
+               (UsedInWords(kOld) / KBInWords),
+               (CapacityInWords(kOld) / KBInWords));
 }
 
 
-intptr_t Heap::Used(Space space) const {
-  return space == kNew ? new_space_->in_use() : old_space_->in_use();
+intptr_t Heap::UsedInWords(Space space) const {
+  return space == kNew ? new_space_->UsedInWords() : old_space_->UsedInWords();
 }
 
 
-intptr_t Heap::Capacity(Space space) const {
-  return space == kNew ? new_space_->capacity() : old_space_->capacity();
+intptr_t Heap::CapacityInWords(Space space) const {
+  return space == kNew ? new_space_->CapacityInWords() :
+                         old_space_->CapacityInWords();
 }
 
 
@@ -410,10 +413,10 @@
   stats_.space_ = space;
   stats_.reason_ = reason;
   stats_.before_.micros_ = OS::GetCurrentTimeMicros();
-  stats_.before_.new_used_ = new_space_->in_use();
-  stats_.before_.new_capacity_ = new_space_->capacity();
-  stats_.before_.old_used_ = old_space_->in_use();
-  stats_.before_.old_capacity_ = old_space_->capacity();
+  stats_.before_.new_used_in_words_ = new_space_->UsedInWords();
+  stats_.before_.new_capacity_in_words_ = new_space_->CapacityInWords();
+  stats_.before_.old_used_in_words_ = old_space_->UsedInWords();
+  stats_.before_.old_capacity_in_words_ = old_space_->CapacityInWords();
   stats_.times_[0] = 0;
   stats_.times_[1] = 0;
   stats_.times_[2] = 0;
@@ -427,32 +430,15 @@
 
 void Heap::RecordAfterGC() {
   stats_.after_.micros_ = OS::GetCurrentTimeMicros();
-  stats_.after_.new_used_ = new_space_->in_use();
-  stats_.after_.new_capacity_ = new_space_->capacity();
-  stats_.after_.old_used_ = old_space_->in_use();
-  stats_.after_.old_capacity_ = old_space_->capacity();
+  stats_.after_.new_used_in_words_ = new_space_->UsedInWords();
+  stats_.after_.new_capacity_in_words_ = new_space_->CapacityInWords();
+  stats_.after_.old_used_in_words_ = old_space_->UsedInWords();
+  stats_.after_.old_capacity_in_words_ = old_space_->CapacityInWords();
   ASSERT(gc_in_progress_);
   gc_in_progress_ = false;
 }
 
 
-static intptr_t RoundToKB(intptr_t memory_size) {
-  return (memory_size + (KB >> 1)) >> KBLog2;
-}
-
-
-static double RoundToSecs(int64_t micros) {
-  const int k1M = 1000000;  // Converting us to secs.
-  return static_cast<double>(micros + (k1M / 2)) / k1M;
-}
-
-
-static double RoundToMillis(int64_t micros) {
-  const int k1K = 1000;  // Conversting us to ms.
-  return static_cast<double>(micros + (k1K / 2)) / k1K;
-}
-
-
 void Heap::PrintStats() {
   if (!FLAG_verbose_gc) return;
   Isolate* isolate = Isolate::Current();
@@ -480,18 +466,21 @@
     "]\n",  // End with a comma to make it easier to import in spreadsheets.
     isolate->main_port(), space_str, GCReasonToString(stats_.reason_),
     stats_.num_,
-    RoundToSecs(stats_.before_.micros_ - isolate->start_time()),
-    RoundToMillis(stats_.after_.micros_ - stats_.before_.micros_),
-    RoundToKB(stats_.before_.new_used_), RoundToKB(stats_.after_.new_used_),
-    RoundToKB(stats_.before_.new_capacity_),
-    RoundToKB(stats_.after_.new_capacity_),
-    RoundToKB(stats_.before_.old_used_), RoundToKB(stats_.after_.old_used_),
-    RoundToKB(stats_.before_.old_capacity_),
-    RoundToKB(stats_.after_.old_capacity_),
-    RoundToMillis(stats_.times_[0]),
-    RoundToMillis(stats_.times_[1]),
-    RoundToMillis(stats_.times_[2]),
-    RoundToMillis(stats_.times_[3]),
+    RoundMicrosecondsToSeconds(stats_.before_.micros_ - isolate->start_time()),
+    RoundMicrosecondsToMilliseconds(stats_.after_.micros_ -
+                                    stats_.before_.micros_),
+    RoundWordsToKB(stats_.before_.new_used_in_words_),
+    RoundWordsToKB(stats_.after_.new_used_in_words_),
+    RoundWordsToKB(stats_.before_.new_capacity_in_words_),
+    RoundWordsToKB(stats_.after_.new_capacity_in_words_),
+    RoundWordsToKB(stats_.before_.old_used_in_words_),
+    RoundWordsToKB(stats_.after_.old_used_in_words_),
+    RoundWordsToKB(stats_.before_.old_capacity_in_words_),
+    RoundWordsToKB(stats_.after_.old_capacity_in_words_),
+    RoundMicrosecondsToMilliseconds(stats_.times_[0]),
+    RoundMicrosecondsToMilliseconds(stats_.times_[1]),
+    RoundMicrosecondsToMilliseconds(stats_.times_[2]),
+    RoundMicrosecondsToMilliseconds(stats_.times_[3]),
     stats_.data_[0],
     stats_.data_[1],
     stats_.data_[2],
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 2502674..680c294 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -162,8 +162,8 @@
   void PrintSizes() const;
 
   // Return amount of memory used and capacity in a space.
-  intptr_t Used(Space space) const;
-  intptr_t Capacity(Space space) const;
+  intptr_t UsedInWords(Space space) const;
+  intptr_t CapacityInWords(Space space) const;
 
   // Returns the [lowest, highest) addresses in the heap.
   void StartEndAddress(uword* start, uword* end) const;
@@ -244,10 +244,10 @@
     public:
       Data() {}
       int64_t micros_;
-      intptr_t new_used_;
-      intptr_t new_capacity_;
-      intptr_t old_used_;
-      intptr_t old_capacity_;
+      intptr_t new_used_in_words_;
+      intptr_t new_capacity_in_words_;
+      intptr_t old_used_in_words_;
+      intptr_t old_capacity_in_words_;
     private:
       DISALLOW_COPY_AND_ASSIGN(Data);
     };
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 202bb3c..ef2dde6 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -372,9 +372,6 @@
   left()->PrintTo(f);
   f->Print(" %s ", Token::Str(kind()));
   right()->PrintTo(f);
-  if (HasICData()) {
-    PrintICData(f, *ic_data());
-  }
 }
 
 
@@ -576,6 +573,18 @@
 }
 
 
+void MathUnaryInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("'%s', ", MethodRecognizer::KindToCString(kind()));
+  value()->PrintTo(f);
+}
+
+
+void MergedMathInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("'%s', ", MergedMathInstr::KindToCString(kind()));
+  Definition::PrintOperandsTo(f);
+}
+
+
 void BinarySmiOpInstr::PrintTo(BufferFormatter* f) const {
   Definition::PrintTo(f);
   f->Print(" %co", overflow_ ? '+' : '-');
diff --git a/runtime/vm/instructions_mips.cc b/runtime/vm/instructions_mips.cc
index ae6fbf2..2e8aee7 100644
--- a/runtime/vm/instructions_mips.cc
+++ b/runtime/vm/instructions_mips.cc
@@ -180,9 +180,9 @@
   uint16_t target_lo = target_address & 0xffff;
   uint16_t target_hi = target_address >> 16;
 
-  lui->SetImmInstrBits(LUI, ZR, TMP1, target_hi);
-  ori->SetImmInstrBits(ORI, TMP1, TMP1, target_lo);
-  jr->SetSpecialInstrBits(JALR, TMP1, ZR, RA);
+  lui->SetImmInstrBits(LUI, ZR, TMP, target_hi);
+  ori->SetImmInstrBits(ORI, TMP, TMP, target_lo);
+  jr->SetSpecialInstrBits(JALR, TMP, ZR, RA);
   nop->SetInstructionBits(Instr::kNopInstruction);
 
   ASSERT(kFixedLengthInBytes == 4 * Instr::kInstrSize);
diff --git a/runtime/vm/instructions_x64_test.cc b/runtime/vm/instructions_x64_test.cc
index 72d41ea..c9abf0f 100644
--- a/runtime/vm/instructions_x64_test.cc
+++ b/runtime/vm/instructions_x64_test.cc
@@ -27,21 +27,29 @@
 }
 
 
+static intptr_t prologue_code_size = -1;
+
+
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ EnterDartFrame(0);  // 20 bytes
+  ASSERT(assembler->CodeSize() == 0);
+  __ pushq(PP);
+  __ LoadPoolPointer(PP);
+  prologue_code_size = assembler->CodeSize();
   __ JmpPatchable(&StubCode::InstanceFunctionLookupLabel(), PP);
   __ JmpPatchable(&StubCode::AllocateArrayLabel(), PP);
-  __ LeaveFrameWithPP();
+  __ popq(PP);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(Jump, test) {
-  JumpPattern jump1(test->entry() + 20, test->code());
+  ASSERT(prologue_code_size != -1);
+  JumpPattern jump1(test->entry() + prologue_code_size, test->code());
   jump1.IsValid();
   EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
             jump1.TargetAddress());
-  JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes() + 20,
+  JumpPattern jump2((test->entry() +
+                     jump1.pattern_length_in_bytes() + prologue_code_size),
                     test->code());
   EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
             jump2.TargetAddress());
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 1877a5c..8a8f06a 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -24,16 +24,12 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, max_equality_polymorphic_checks, 32,
-    "Maximum number of polymorphic checks in equality operator,"
-    " otherwise use megamorphic dispatch.");
 DEFINE_FLAG(bool, new_identity_spec, true,
     "Use new identity check rules for numbers.");
 DEFINE_FLAG(bool, propagate_ic_data, true,
     "Propagate IC data from unoptimized to optimized IC calls.");
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, eliminate_type_checks);
-DECLARE_FLAG(int, max_polymorphic_checks);
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, trace_constant_propagation);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
@@ -170,6 +166,7 @@
       (result_cid() == other_op->result_cid());
 }
 
+
 bool BinarySmiOpInstr::AttributesEqual(Instruction* other) const {
   BinarySmiOpInstr* other_op = other->AsBinarySmiOp();
   ASSERT(other_op != NULL);
@@ -490,7 +487,7 @@
 
 Instruction* Instruction::RemoveFromGraph(bool return_previous) {
   ASSERT(!IsBlockEntry());
-  ASSERT(!IsControl());
+  ASSERT(!IsBranch());
   ASSERT(!IsThrow());
   ASSERT(!IsReturn());
   ASSERT(!IsReThrow());
@@ -763,6 +760,7 @@
       is_checked_(is_checked),
       constrained_type_(NULL),
       constant_target_(NULL) {
+  ASSERT(comparison->env() == NULL);
   for (intptr_t i = comparison->InputCount() - 1; i >= 0; --i) {
     comparison->InputAt(i)->set_instruction(this);
   }
@@ -774,28 +772,19 @@
 }
 
 
-// A misleadingly named function for use in template functions that replace
-// both definitions with definitions and branch comparisons with
-// comparisons.  In the branch case, leave the branch intact and replace its
-// comparison with a new comparison not currently in the graph.
-void BranchInstr::ReplaceWith(ComparisonInstr* other,
-                              ForwardInstructionIterator* ignored) {
-  SetComparison(other);
-}
-
-
-void BranchInstr::SetComparison(ComparisonInstr* comp) {
-  for (intptr_t i = comp->InputCount() - 1; i >= 0; --i) {
-    Value* input = comp->InputAt(i);
+void BranchInstr::SetComparison(ComparisonInstr* new_comparison) {
+  for (intptr_t i = new_comparison->InputCount() - 1; i >= 0; --i) {
+    Value* input = new_comparison->InputAt(i);
     input->definition()->AddInputUse(input);
     input->set_instruction(this);
   }
   // There should be no need to copy or unuse an environment.
   ASSERT(comparison()->env() == NULL);
+  ASSERT(new_comparison->env() == NULL);
   // Remove the current comparison's input uses.
   comparison()->UnuseAllInputs();
-  ASSERT(!comp->HasUses());
-  comparison_ = comp;
+  ASSERT(!new_comparison->HasUses());
+  comparison_ = new_comparison;
 }
 
 
@@ -1090,12 +1079,12 @@
 }
 
 
-intptr_t ControlInstruction::SuccessorCount() const {
+intptr_t BranchInstr::SuccessorCount() const {
   return 2;
 }
 
 
-BlockEntryInstr* ControlInstruction::SuccessorAt(intptr_t index) const {
+BlockEntryInstr* BranchInstr::SuccessorAt(intptr_t index) const {
   if (index == 0) return true_successor_;
   if (index == 1) return false_successor_;
   UNREACHABLE();
@@ -1119,21 +1108,6 @@
 }
 
 
-bool EqualityCompareInstr::IsPolymorphic() const {
-  return HasICData() &&
-      (ic_data()->NumberOfChecks() > 0) &&
-      (ic_data()->NumberOfChecks() <= FLAG_max_polymorphic_checks);
-}
-
-
-bool EqualityCompareInstr::IsCheckedStrictEqual() const {
-  if (!HasICData()) return false;
-  return ic_data()->AllTargetsHaveSameOwner(kInstanceCid) &&
-         (unary_ic_data_->NumberOfChecks() <=
-             FLAG_max_equality_polymorphic_checks);
-}
-
-
 bool BinarySmiOpInstr::CanDeoptimize() const {
   if (FLAG_throw_on_javascript_int_overflow && (Smi::kBits > 32)) {
     // If Smi's are bigger than 32-bits, then the instruction could deoptimize
@@ -1455,7 +1429,7 @@
     const AbstractType& new_dst_type = AbstractType::Handle(
         dst_type().InstantiateFrom(instantiator_type_args, NULL));
     // If dst_type is instantiated to dynamic or Object, skip the test.
-    if (!new_dst_type.IsMalformed() && !new_dst_type.IsMalbounded() &&
+    if (!new_dst_type.IsMalformedOrMalbounded() &&
         (new_dst_type.IsDynamicType() || new_dst_type.IsObjectType())) {
       return value()->definition();
     }
@@ -1542,9 +1516,9 @@
 
 Definition* BooleanNegateInstr::Canonicalize(FlowGraph* flow_graph) {
   Definition* defn = value()->definition();
-  if (defn->IsComparison() &&
-      (value()->Type()->ToCid() == kBoolCid) &&
-      defn->HasOnlyUse(value())) {
+  if (defn->IsComparison() && defn->HasOnlyUse(value())) {
+    // Comparisons always have a bool result.
+    ASSERT(value()->Type()->ToCid() == kBoolCid);
     defn->AsComparison()->NegateComparison();
     return defn;
   }
@@ -1613,7 +1587,7 @@
       (other->Type()->ToCid() == kBoolCid)) {
     return other_defn;
   }
-  // Handle e !== true
+  // Handle e !== true.
   if ((kind == Token::kNE_STRICT) &&
       (constant.raw() == Bool::True().raw()) &&
       other_defn->IsComparison() &&
@@ -1622,6 +1596,7 @@
     *negated = true;
     return other_defn;
   }
+  // Handle e === false.
   if ((kind == Token::kEQ_STRICT) &&
       (constant.raw() == Bool::False().raw()) &&
       other_defn->IsComparison() &&
@@ -1634,6 +1609,25 @@
 }
 
 
+// Recognize the pattern (a & b) == 0 where left is a bitwise and operation
+// and right is a constant 0.
+static bool RecognizeTestPattern(Value* left, Value* right) {
+  if (!right->BindsToConstant()) {
+    return false;
+  }
+
+  const Object& value = right->BoundConstant();
+  if (!value.IsSmi() || (Smi::Cast(value).Value() != 0)) {
+    return false;
+  }
+
+  Definition* left_defn = left->definition();
+  return left_defn->IsBinarySmiOp() &&
+      (left_defn->AsBinarySmiOp()->op_kind() == Token::kBIT_AND) &&
+      left_defn->HasOnlyUse(left);
+}
+
+
 Instruction* BranchInstr::Canonicalize(FlowGraph* flow_graph) {
   // Only handle strict-compares.
   if (comparison()->IsStrictCompare()) {
@@ -1681,6 +1675,29 @@
       comp->ClearSSATempIndex();
       comp->ClearTempIndex();
     }
+  } else if (comparison()->IsEqualityCompare() &&
+             comparison()->operation_cid() == kSmiCid) {
+    BinarySmiOpInstr* bit_and = NULL;
+    if (RecognizeTestPattern(comparison()->left(), comparison()->right())) {
+      bit_and = comparison()->left()->definition()->AsBinarySmiOp();
+    } else if (RecognizeTestPattern(comparison()->right(),
+                                    comparison()->left())) {
+      bit_and = comparison()->right()->definition()->AsBinarySmiOp();
+    }
+    if (bit_and != NULL) {
+      if (FLAG_trace_optimization) {
+        OS::Print("Merging test smi v%" Pd "\n", bit_and->ssa_temp_index());
+      }
+      TestSmiInstr* test = new TestSmiInstr(comparison()->token_pos(),
+                                            comparison()->kind(),
+                                            bit_and->left()->Copy(),
+                                            bit_and->right()->Copy());
+      ASSERT(!CanDeoptimize());
+      RemoveEnvironment();
+      flow_graph->CopyDeoptTarget(this, bit_and);
+      SetComparison(test);
+      bit_and->RemoveFromGraph();
+    }
   }
   return this;
 }
@@ -2453,6 +2470,29 @@
 }
 
 
+static bool BindsToSmiConstant(Value* value) {
+  return value->BindsToConstant() && value->BoundConstant().IsSmi();
+}
+
+
+bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
+                               Value* v1,
+                               Value* v2) {
+  if (!(comparison->IsStrictCompare() &&
+        !comparison->AsStrictCompare()->needs_number_check()) &&
+      !(comparison->IsEqualityCompare() &&
+        (comparison->AsEqualityCompare()->operation_cid() == kSmiCid))) {
+    return false;
+  }
+
+  if (!BindsToSmiConstant(v1) || !BindsToSmiConstant(v2)) {
+    return false;
+  }
+
+  return true;
+}
+
+
 void PhiInstr::InferRange() {
   RangeBoundary new_min;
   RangeBoundary new_max;
@@ -2898,6 +2938,22 @@
   return kSinRuntimeEntry;
 }
 
+
+MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs,
+                                 intptr_t original_deopt_id,
+                                 MergedMathInstr::Kind kind)
+    : inputs_(inputs),
+      locs_(NULL),
+      kind_(kind) {
+  ASSERT(inputs_->length() == InputCountFor(kind_));
+  for (intptr_t i = 0; i < inputs_->length(); ++i) {
+    ASSERT((*inputs)[i] != NULL);
+    (*inputs)[i]->set_instruction(this);
+    (*inputs)[i]->set_use_index(i);
+  }
+  deopt_id_ = original_deopt_id;
+}
+
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 0ebdeab..3d85345 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -21,7 +21,6 @@
 class BufferFormatter;
 class CatchBlockEntryInstr;
 class ComparisonInstr;
-class ControlInstruction;
 class Definition;
 class Environment;
 class FlowGraph;
@@ -39,11 +38,12 @@
 // See intrinsifier for fingerprint computation.
 #define RECOGNIZED_LIST(V)                                                     \
   V(::, identical, ObjectIdentical, 496869842)                                 \
-  V(Object, Object., ObjectConstructor, 1058585294)                            \
-  V(Object, get:_cid, ObjectCid, 1498721510)                                   \
-  V(_List, get:length, ObjectArrayLength, 215153395)                           \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 578733070)               \
-  V(_TypedList, get:length, TypedDataLength, 26616328)                         \
+  V(Object, ==, ObjectEquals, 1068471689)                                      \
+  V(Object, Object., ObjectConstructor, 1058615085)                            \
+  V(Object, get:_cid, ObjectCid, 1498751301)                                   \
+  V(_List, get:length, ObjectArrayLength, 215183186)                           \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
+  V(_TypedList, get:length, TypedDataLength, 26646119)                         \
   V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 272598802)                     \
   V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 831354841)                   \
   V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 1832126257)                  \
@@ -54,27 +54,27 @@
   V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1356392173)              \
   V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1239681356)          \
   V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 163795162)               \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1443265945)                    \
-  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 1864204733)                  \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 1807419109)                  \
-  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 1246454605)                \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 517505240)                   \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1425812717)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1457395244)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 49127618)                \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1261559935)          \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1871750680)              \
-  V(_GrowableList, get:length, GrowableArrayLength, 1654225242)                \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 817090003)            \
-  V(_GrowableList, _setData, GrowableArraySetData, 1375509957)                 \
-  V(_GrowableList, _setLength, GrowableArraySetLength, 1227678442)             \
-  V(_StringBase, get:length, StringBaseLength, 1483520063)                     \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 879849436)                    \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1793798234)                    \
+  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 67253374)                    \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 10467750)                    \
+  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 1596986894)                \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 868037529)                   \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1776345006)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1807927533)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 399659907)               \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1612092224)          \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 74799321)                \
+  V(_GrowableList, get:length, GrowableArrayLength, 1654255033)                \
+  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 817119794)            \
+  V(_GrowableList, _setData, GrowableArraySetData, 970836644)                  \
+  V(_GrowableList, _setLength, GrowableArraySetLength, 823005129)              \
+  V(_StringBase, get:length, StringBaseLength, 1483549854)                     \
+  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 1599468763)                   \
   V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 1958436584)                 \
-  V(_StringBase, [], StringBaseCharAt, 990046076)                              \
-  V(_StringBase, _interpolate, StringBaseInterpolate, 1824308855)              \
-  V(_OneByteString, _setAt, OneByteStringSetAt, 308408714)                     \
-  V(_IntegerImplementation, toDouble, IntegerToDouble, 2011998508)             \
+  V(_StringBase, [], StringBaseCharAt, 585372763)                              \
+  V(_StringBase, _interpolate, StringBaseInterpolate, 2013078843)              \
+  V(_OneByteString, _setAt, OneByteStringSetAt, 658941003)                     \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, 1947355341)             \
   V(_IntegerImplementation, _leftShiftWithMask32, IntegerLeftShiftWithMask32,  \
       2095943661)                                                              \
   V(_Double, toInt, DoubleToInteger, 1328149975)                               \
@@ -86,21 +86,21 @@
   V(::, sqrt, MathSqrt, 465520247)                                             \
   V(::, sin, MathSin, 730107143)                                               \
   V(::, cos, MathCos, 1282146521)                                              \
-  V(::, min, MathMin, 1830216388)                                              \
-  V(::, max, MathMax, 234565686)                                               \
-  V(::, _doublePow, MathDoublePow, 1728171041)                                 \
-  V(Float32x4, Float32x4., Float32x4Constructor, 786169160)                    \
-  V(Float32x4, Float32x4.zero, Float32x4Zero, 1589383280)                      \
-  V(Float32x4, Float32x4.splat, Float32x4Splat, 62513275)                      \
+  V(::, min, MathMin, 1022567780)                                              \
+  V(::, max, MathMax, 612058870)                                               \
+  V(::, _doublePow, MathDoublePow, 1591032382)                                 \
+  V(Float32x4, Float32x4., Float32x4Constructor, 1314950569)                   \
+  V(Float32x4, Float32x4.zero, Float32x4Zero, 1432281809)                      \
+  V(Float32x4, Float32x4.splat, Float32x4Splat, 1148280442)                    \
   V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits,            \
-      1933861675)                                                              \
+      872145194)                                                               \
   V(_Float32x4, shuffle, Float32x4Shuffle, 1178727105)                         \
   V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 927956119)                    \
-  V(_Float32x4, get:x, Float32x4ShuffleX, 1351717838)                          \
-  V(_Float32x4, get:y, Float32x4ShuffleY, 217386410)                           \
-  V(_Float32x4, get:z, Float32x4ShuffleZ, 2144923721)                          \
-  V(_Float32x4, get:w, Float32x4ShuffleW, 1447699119)                          \
-  V(_Float32x4, get:signMask, Float32x4GetSignMask, 1198849347)                \
+  V(_Float32x4, get:x, Float32x4ShuffleX, 1351747629)                          \
+  V(_Float32x4, get:y, Float32x4ShuffleY, 217416201)                           \
+  V(_Float32x4, get:z, Float32x4ShuffleZ, 2144953512)                          \
+  V(_Float32x4, get:w, Float32x4ShuffleW, 1447728910)                          \
+  V(_Float32x4, get:signMask, Float32x4GetSignMask, 1198879138)                \
   V(_Float32x4, _cmpequal, Float32x4Equal, 1944929844)                         \
   V(_Float32x4, _cmpgt, Float32x4GreaterThan, 499965951)                       \
   V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 1003006845)              \
@@ -120,66 +120,66 @@
   V(_Float32x4, withY, Float32x4WithY, 1806065938)                             \
   V(_Float32x4, withZ, Float32x4WithZ, 320659034)                              \
   V(_Float32x4, withW, Float32x4WithW, 1108437255)                             \
-  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 1477593884)                 \
+  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 295910141)                  \
   V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits,              \
-      1955567428)                                                              \
-  V(_Int32x4, get:flagX, Int32x4GetFlagX, 729235803)                           \
-  V(_Int32x4, get:flagY, Int32x4GetFlagY, 430840849)                           \
-  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 1981076496)                          \
-  V(_Int32x4, get:flagW, Int32x4GetFlagW, 629356099)                           \
-  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1598787746)                    \
+      893850947)                                                               \
+  V(_Int32x4, get:flagX, Int32x4GetFlagX, 729265594)                           \
+  V(_Int32x4, get:flagY, Int32x4GetFlagY, 430870640)                           \
+  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 1981106287)                          \
+  V(_Int32x4, get:flagW, Int32x4GetFlagW, 629385890)                           \
+  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1598817537)                    \
   V(_Int32x4, shuffle, Int32x4Shuffle, 599391160)                              \
   V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 1491641197)                       \
-  V(_Int32x4, select, Int32x4Select, 598942806)                                \
+  V(_Int32x4, select, Int32x4Select, 194269493)                                \
   V(_Int32x4, withFlagX, Int32x4WithFlagX, 63248661)                           \
   V(_Int32x4, withFlagY, Int32x4WithFlagY, 1498755850)                         \
   V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 457856832)                          \
   V(_Int32x4, withFlagW, Int32x4WithFlagW, 690638779)                          \
-  V(_List, [], ObjectArrayGetIndexed, 1079829188)                              \
-  V(_List, []=, ObjectArraySetIndexed, 748954698)                              \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 25983597)                    \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 1686777561)                    \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 327404102)                    \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 1225286513)                     \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 1155155195)                    \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 871118335)                      \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 214271306)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 199925538)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 25452746)                            \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 502448555)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 182237960)                         \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 1292893603)           \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 670971404)           \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1831383216)         \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 1660673499)        \
+  V(_List, [], ObjectArrayGetIndexed, 675155875)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1228569706)                             \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1768793932)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 1282104248)                    \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 807019110)                    \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 1461569776)                     \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 1318757370)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1107401598)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 377873481)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 436208801)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 1257450859)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 738731818)                          \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1414236073)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 1529176866)           \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1902969517)          \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 2067666479)         \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 745187964)         \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
-    1831906095)                                                                \
+    2068189358)                                                                \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
-    19235519)                                                                  \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 1191799443)                         \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 1182335435)                        \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 814177144)                        \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 663508528)                       \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 787321640)                          \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 1515238594)                        \
-  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1421922726)                       \
-  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1980947178)                      \
-  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1901126825)                 \
-  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 1419416331)                \
-  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1675579883)                     \
-  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 809970636)                     \
+    1251233632)                                                                \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 1428082706)                         \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 266849900)                         \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1050460407)                       \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1895506641)                      \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 1023604903)                         \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 599753059)                         \
+  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1658205989)                       \
+  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1065461643)                      \
+  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 2137410088)                 \
+  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 1583018506)                \
+  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1911863146)                     \
+  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 973572811)                     \
 
 
 // A list of core function that should always be inlined.
 #define INLINE_WHITE_LIST(V)                                                   \
-  V(_List, get:length, ObjectArrayLength, 215153395)                           \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 578733070)               \
-  V(_TypedList, get:length, TypedDataLength, 26616328)                         \
-  V(_GrowableList, get:length, GrowableArrayLength, 1654225242)                \
-  V(_StringBase, get:length, StringBaseLength, 1483520063)                     \
-  V(ListIterator, moveNext, ListIteratorMoveNext, 90930587)                    \
-  V(_GrowableList, get:iterator, GrowableArrayIterator, 1305127405)            \
-  V(_GrowableList, forEach, GrowableArrayForEach, 1675430533)                  \
+  V(_List, get:length, ObjectArrayLength, 215183186)                           \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
+  V(_TypedList, get:length, TypedDataLength, 26646119)                         \
+  V(_GrowableList, get:length, GrowableArrayLength, 1654255033)                \
+  V(_StringBase, get:length, StringBaseLength, 1483549854)                     \
+  V(ListIterator, moveNext, ListIteratorMoveNext, 881367324)                   \
+  V(_GrowableList, get:iterator, GrowableArrayIterator, 1155241039)            \
+  V(_GrowableList, forEach, GrowableArrayForEach, 195359970)                   \
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
@@ -660,8 +660,8 @@
   M(BoxDouble)                                                                 \
   M(BoxFloat32x4)                                                              \
   M(UnboxFloat32x4)                                                            \
-  M(BoxInt32x4)                                                               \
-  M(UnboxInt32x4)                                                             \
+  M(BoxInt32x4)                                                                \
+  M(UnboxInt32x4)                                                              \
   M(UnboxInteger)                                                              \
   M(BoxInteger)                                                                \
   M(BinaryMintOp)                                                              \
@@ -672,6 +672,7 @@
   M(StringFromCharCode)                                                        \
   M(StringInterpolate)                                                         \
   M(InvokeMathCFunction)                                                       \
+  M(MergedMath)                                                                \
   M(GuardField)                                                                \
   M(IfThenElse)                                                                \
   M(BinaryFloat32x4Op)                                                         \
@@ -688,14 +689,15 @@
   M(Float32x4ZeroArg)                                                          \
   M(Float32x4Clamp)                                                            \
   M(Float32x4With)                                                             \
-  M(Float32x4ToInt32x4)                                                       \
+  M(Float32x4ToInt32x4)                                                        \
   M(MaterializeObject)                                                         \
-  M(Int32x4BoolConstructor)                                                   \
-  M(Int32x4GetFlag)                                                           \
-  M(Int32x4Select)                                                            \
-  M(Int32x4SetFlag)                                                           \
-  M(Int32x4ToFloat32x4)                                                       \
-  M(BinaryInt32x4Op)                                                          \
+  M(Int32x4BoolConstructor)                                                    \
+  M(Int32x4GetFlag)                                                            \
+  M(Int32x4Select)                                                             \
+  M(Int32x4SetFlag)                                                            \
+  M(Int32x4ToFloat32x4)                                                        \
+  M(BinaryInt32x4Op)                                                           \
+  M(TestSmi)                                                                   \
 
 
 #define FORWARD_DECLARATION(type) class type##Instr;
@@ -744,9 +746,6 @@
   bool IsDefinition() { return (AsDefinition() != NULL); }
   virtual Definition* AsDefinition() { return NULL; }
 
-  bool IsControl() { return (AsControl() != NULL); }
-  virtual ControlInstruction* AsControl() { return NULL; }
-
   virtual intptr_t InputCount() const = 0;
   virtual Value* InputAt(intptr_t i) const = 0;
   void SetInputAt(intptr_t i, Value* value) {
@@ -785,7 +784,7 @@
   void set_next(Instruction* instr) {
     ASSERT(!IsGraphEntry());
     ASSERT(!IsReturn());
-    ASSERT(!IsControl() || (instr == NULL));
+    ASSERT(!IsBranch() || (instr == NULL));
     ASSERT(!IsPhi());
     ASSERT(instr == NULL || !instr->IsBlockEntry());
     // TODO(fschneider): Also add Throw and ReThrow to the list of instructions
@@ -1000,11 +999,11 @@
   friend class DoubleToSmiInstr;
   friend class DoubleToDoubleInstr;
   friend class InvokeMathCFunctionInstr;
+  friend class MergedMathInstr;
   friend class FlowGraphOptimizer;
   friend class LoadIndexedInstr;
   friend class StoreIndexedInstr;
   friend class StoreInstanceFieldInstr;
-  friend class ControlInstruction;
   friend class ComparisonInstr;
   friend class TargetEntryInstr;
   friend class JoinEntryInstr;
@@ -1015,6 +1014,7 @@
   friend class BranchSimplifier;
   friend class BlockEntryInstr;
   friend class RelationalOpInstr;
+  friend class EqualityCompareInstr;
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
@@ -2130,64 +2130,131 @@
 };
 
 
-class ControlInstruction : public Instruction {
+template<intptr_t N>
+class TemplateDefinition : public Definition {
  public:
-  ControlInstruction() : true_successor_(NULL), false_successor_(NULL) { }
+  TemplateDefinition<N>() : locs_(NULL) { }
 
-  virtual ControlInstruction* AsControl() { return this; }
+  virtual intptr_t InputCount() const { return N; }
+  virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
 
-  TargetEntryInstr* true_successor() const { return true_successor_; }
-  TargetEntryInstr* false_successor() const { return false_successor_; }
+  // Returns a structure describing the location constraints required
+  // to emit native code for this definition.
+  LocationSummary* locs() {
+    if (locs_ == NULL) {
+      locs_ = MakeLocationSummary();
+    }
+    return locs_;
+  }
 
-  TargetEntryInstr** true_successor_address() { return &true_successor_; }
-  TargetEntryInstr** false_successor_address() { return &false_successor_; }
-
-  virtual intptr_t SuccessorCount() const;
-  virtual BlockEntryInstr* SuccessorAt(intptr_t index) const;
-
-  void EmitBranchOnCondition(FlowGraphCompiler* compiler,
-                             Condition true_condition);
-
-  void EmitBranchOnValue(FlowGraphCompiler* compiler, bool result);
+ protected:
+  EmbeddedArray<Value*, N> inputs_;
 
  private:
-  TargetEntryInstr* true_successor_;
-  TargetEntryInstr* false_successor_;
+  friend class BranchInstr;
 
-  DISALLOW_COPY_AND_ASSIGN(ControlInstruction);
+  virtual void RawSetInputAt(intptr_t i, Value* value) {
+    inputs_[i] = value;
+  }
+
+  LocationSummary* locs_;
 };
 
 
-class BranchInstr : public ControlInstruction {
+class ComparisonInstr : public TemplateDefinition<2> {
+ public:
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+
+  virtual ComparisonInstr* AsComparison() { return this; }
+
+  intptr_t token_pos() const { return token_pos_; }
+  Token::Kind kind() const { return kind_; }
+
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
+                              BranchInstr* branch) = 0;
+
+  void SetDeoptId(intptr_t deopt_id) {
+    deopt_id_ = deopt_id;
+  }
+
+  // Operation class id is computed from collected ICData.
+  void set_operation_cid(intptr_t value) { operation_cid_ = value; }
+  intptr_t operation_cid() const { return operation_cid_; }
+
+  void NegateComparison() {
+    kind_ = Token::NegateComparison(kind_);
+  }
+
+ protected:
+  ComparisonInstr(intptr_t token_pos,
+                  Token::Kind kind,
+                  Value* left,
+                  Value* right)
+      : token_pos_(token_pos), kind_(kind), operation_cid_(kIllegalCid) {
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+  }
+
+ private:
+  const intptr_t token_pos_;
+  Token::Kind kind_;
+  intptr_t operation_cid_;  // Set by optimizer.
+
+  DISALLOW_COPY_AND_ASSIGN(ComparisonInstr);
+};
+
+
+class BranchInstr : public Instruction {
  public:
   explicit BranchInstr(ComparisonInstr* comparison, bool is_checked = false);
 
   DECLARE_INSTRUCTION(Branch)
 
-  virtual intptr_t ArgumentCount() const;
-  intptr_t InputCount() const;
-  Value* InputAt(intptr_t i) const;
-  virtual bool CanDeoptimize() const;
-  virtual bool CanBecomeDeoptimizationTarget() const;
+  virtual intptr_t ArgumentCount() const {
+    return comparison()->ArgumentCount();
+  }
 
-  virtual EffectSet Effects() const;
+  intptr_t InputCount() const { return comparison()->InputCount(); }
+
+  Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); }
+
+  virtual bool CanDeoptimize() const {
+    // Branches need a deoptimization info in checked mode if they
+    // can throw a type check error.
+    return comparison()->CanDeoptimize() || is_checked();
+  }
+
+  virtual bool CanBecomeDeoptimizationTarget() const {
+    return comparison()->CanBecomeDeoptimizationTarget();
+  }
+
+  virtual EffectSet Effects() const {
+    return comparison()->Effects();
+  }
 
   ComparisonInstr* comparison() const { return comparison_; }
   void SetComparison(ComparisonInstr* comp);
 
   bool is_checked() const { return is_checked_; }
 
-  virtual LocationSummary* locs();
-  virtual intptr_t DeoptimizationTarget() const;
-  virtual Representation RequiredInputRepresentation(intptr_t i) const;
+  virtual LocationSummary* locs() {
+    if (comparison()->locs_ == NULL) {
+      LocationSummary* summary = comparison()->MakeLocationSummary();
+      // Branches don't produce a result.
+      summary->set_out(Location::NoLocation());
+      comparison()->locs_ = summary;
+    }
+    return comparison()->locs_;
+  }
 
-  // A misleadingly named function for use in template functions that also
-  // replace definitions.  In this case, leave the branch intact and replace
-  // its comparison with another comparison that has been removed from the
-  // graph but still has uses properly linked into their definition's use
-  // list.
-  void ReplaceWith(ComparisonInstr* other,
-                   ForwardInstructionIterator* ignored);
+  virtual intptr_t DeoptimizationTarget() const {
+    return comparison()->DeoptimizationTarget();
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t i) const {
+    return comparison()->RequiredInputRepresentation(i);
+  }
 
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
@@ -2215,16 +2282,27 @@
 
   virtual void InheritDeoptTarget(Instruction* other);
 
-  virtual bool MayThrow() const;
+  virtual bool MayThrow() const {
+    return comparison()->MayThrow();
+  }
+
+  TargetEntryInstr* true_successor() const { return true_successor_; }
+  TargetEntryInstr* false_successor() const { return false_successor_; }
+
+  TargetEntryInstr** true_successor_address() { return &true_successor_; }
+  TargetEntryInstr** false_successor_address() { return &false_successor_; }
+
+  virtual intptr_t SuccessorCount() const;
+  virtual BlockEntryInstr* SuccessorAt(intptr_t index) const;
 
  private:
   virtual void RawSetInputAt(intptr_t i, Value* value);
 
+  TargetEntryInstr* true_successor_;
+  TargetEntryInstr* false_successor_;
   ComparisonInstr* comparison_;
   const bool is_checked_;
-
   ConstrainedCompileType* constrained_type_;
-
   TargetEntryInstr* constant_target_;
 
   DISALLOW_COPY_AND_ASSIGN(BranchInstr);
@@ -2258,37 +2336,6 @@
 };
 
 
-template<intptr_t N>
-class TemplateDefinition : public Definition {
- public:
-  TemplateDefinition<N>() : locs_(NULL) { }
-
-  virtual intptr_t InputCount() const { return N; }
-  virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
-
-  // Returns a structure describing the location constraints required
-  // to emit native code for this definition.
-  LocationSummary* locs() {
-    if (locs_ == NULL) {
-      locs_ = MakeLocationSummary();
-    }
-    return locs_;
-  }
-
- protected:
-  EmbeddedArray<Value*, N> inputs_;
-
- private:
-  friend class BranchInstr;
-
-  virtual void RawSetInputAt(intptr_t i, Value* value) {
-    inputs_[i] = value;
-  }
-
-  LocationSummary* locs_;
-};
-
-
 class RedefinitionInstr : public TemplateDefinition<1> {
  public:
   explicit RedefinitionInstr(Value* value) {
@@ -2733,6 +2780,7 @@
     ASSERT(!arguments->is_empty());
     ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
     ASSERT(Token::IsBinaryOperator(token_kind) ||
+           Token::IsEqualityOperator(token_kind) ||
            Token::IsRelationalOperator(token_kind) ||
            Token::IsPrefixOperator(token_kind) ||
            Token::IsIndexOperator(token_kind) ||
@@ -2835,110 +2883,6 @@
 };
 
 
-class ComparisonInstr : public TemplateDefinition<2> {
- public:
-  Value* left() const { return inputs_[0]; }
-  Value* right() const { return inputs_[1]; }
-
-  virtual ComparisonInstr* AsComparison() { return this; }
-
-  intptr_t token_pos() const { return token_pos_; }
-  Token::Kind kind() const { return kind_; }
-
-  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
-                              BranchInstr* branch) = 0;
-
-  void SetDeoptId(intptr_t deopt_id) {
-    deopt_id_ = deopt_id;
-  }
-
-  // Operation class id is computed from collected ICData.
-  void set_operation_cid(intptr_t value) { operation_cid_ = value; }
-  intptr_t operation_cid() const { return operation_cid_; }
-
-  void NegateComparison() {
-    kind_ = Token::NegateComparison(kind_);
-  }
-
- protected:
-  ComparisonInstr(intptr_t token_pos,
-                  Token::Kind kind,
-                  Value* left,
-                  Value* right)
-      : token_pos_(token_pos), kind_(kind), operation_cid_(kIllegalCid) {
-    SetInputAt(0, left);
-    SetInputAt(1, right);
-  }
-
- private:
-  const intptr_t token_pos_;
-  Token::Kind kind_;
-  intptr_t operation_cid_;  // Set by optimizer.
-
-  DISALLOW_COPY_AND_ASSIGN(ComparisonInstr);
-};
-
-
-// Inlined functions from class BranchInstr that forward to their comparison.
-inline intptr_t BranchInstr::ArgumentCount() const {
-  return comparison()->ArgumentCount();
-}
-
-
-inline intptr_t BranchInstr::InputCount() const {
-  return comparison()->InputCount();
-}
-
-
-inline Value* BranchInstr::InputAt(intptr_t i) const {
-  return comparison()->InputAt(i);
-}
-
-
-inline bool BranchInstr::CanDeoptimize() const {
-  // Branches need a deoptimization info in checked mode if they
-  // can throw a type check error.
-  return comparison()->CanDeoptimize() || is_checked();
-}
-
-
-inline bool BranchInstr::CanBecomeDeoptimizationTarget() const {
-  return comparison()->CanBecomeDeoptimizationTarget();
-}
-
-
-inline EffectSet BranchInstr::Effects() const {
-  return comparison()->Effects();
-}
-
-
-inline LocationSummary* BranchInstr::locs() {
-  if (comparison()->locs_ == NULL) {
-    LocationSummary* summary = comparison()->MakeLocationSummary();
-    // Branches don't produce a result.
-    summary->set_out(Location::NoLocation());
-    comparison()->locs_ = summary;
-  }
-  return comparison()->locs_;
-}
-
-
-inline intptr_t BranchInstr::DeoptimizationTarget() const {
-  return comparison()->DeoptimizationTarget();
-}
-
-
-inline Representation BranchInstr::RequiredInputRepresentation(
-    intptr_t i) const {
-  return comparison()->RequiredInputRepresentation(i);
-}
-
-
-inline bool BranchInstr::MayThrow() const {
-  return comparison()->MayThrow();
-}
-
-
 class StrictCompareInstr : public ComparisonInstr {
  public:
   StrictCompareInstr(intptr_t token_pos,
@@ -2982,49 +2926,69 @@
 };
 
 
+// Comparison instruction that is equivalent to the (left & right) == 0
+// comparison pattern.
+class TestSmiInstr : public ComparisonInstr {
+ public:
+  TestSmiInstr(intptr_t token_pos, Token::Kind kind, Value* left, Value* right)
+      : ComparisonInstr(token_pos, kind, left, right) {
+    ASSERT(kind == Token::kEQ || kind == Token::kNE);
+  }
+
+  DECLARE_INSTRUCTION(TestSmi);
+  virtual CompileType ComputeType() const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual bool CanBecomeDeoptimizationTarget() const {
+    // TestSmi can be merged into Branch and thus needs an environment.
+    return true;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    return GetDeoptId();
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    return kTagged;
+  }
+
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+
+  virtual bool MayThrow() const { return false; }
+
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
+                              BranchInstr* branch);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestSmiInstr);
+};
+
+
 class EqualityCompareInstr : public ComparisonInstr {
  public:
   EqualityCompareInstr(intptr_t token_pos,
                        Token::Kind kind,
                        Value* left,
                        Value* right,
-                       const Array& ic_data_array)
-      : ComparisonInstr(token_pos, kind, left, right),
-        ic_data_(GetICData(ic_data_array)),
-        unary_ic_data_(NULL) {
-    ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-    if (HasICData()) {
-      unary_ic_data_ = &ICData::ZoneHandle(ic_data_->AsUnaryClassChecks());
-    }
+                       intptr_t cid,
+                       intptr_t deopt_id)
+      : ComparisonInstr(token_pos, kind, left, right) {
+    ASSERT(Token::IsEqualityOperator(kind));
+    set_operation_cid(cid);
+    deopt_id_ = deopt_id;  // Override generated deopt-id.
   }
 
   DECLARE_INSTRUCTION(EqualityCompare)
   virtual CompileType ComputeType() const;
-  virtual bool RecomputeType();
-
-  const ICData* ic_data() const { return ic_data_; }
-  bool HasICData() const {
-    return (ic_data() != NULL) && !ic_data()->IsNull();
-  }
-  void set_ic_data(const ICData* value) {
-    ic_data_ = value;
-    if (HasICData()) {
-      unary_ic_data_ = &ICData::ZoneHandle(ic_data_->AsUnaryClassChecks());
-    }
-  }
-
-  bool IsInlinedNumericComparison() const {
-    return (operation_cid() == kDoubleCid)
-        || (operation_cid() == kMintCid)
-        || (operation_cid() == kSmiCid);
-  }
-
-  bool IsCheckedStrictEqual() const;
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-  virtual bool CanDeoptimize() const {
-    return !IsInlinedNumericComparison();
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual bool CanBecomeDeoptimizationTarget() const {
+    // EqualityCompare can be merged into Branch and thus needs an environment.
+    return true;
   }
 
   virtual void EmitBranchCode(FlowGraphCompiler* compiler,
@@ -3041,20 +3005,11 @@
     return kTagged;
   }
 
-  bool IsPolymorphic() const;
+  virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual EffectSet Effects() const {
-    return IsInlinedNumericComparison() ? EffectSet::None() : EffectSet::All();
-  }
-
-  virtual bool MayThrow() const {
-    return !IsInlinedNumericComparison() && !IsCheckedStrictEqual();
-  }
+  virtual bool MayThrow() const { return false; }
 
  private:
-  const ICData* ic_data_;
-  ICData* unary_ic_data_;
-
   DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr);
 };
 
@@ -3075,7 +3030,6 @@
 
   DECLARE_INSTRUCTION(RelationalOp)
   virtual CompileType ComputeType() const;
-  virtual bool RecomputeType();
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
@@ -3129,9 +3083,6 @@
     SetInputAt(1, right);
   }
 
-  // Returns true if this instruction is supported on the current platform.
-  static bool IsSupported();
-
   // Returns true if this combination of comparison and values flowing on
   // the true and false paths is supported on the current platform.
   static bool Supports(ComparisonInstr* comparison, Value* v1, Value* v2);
@@ -3781,7 +3732,7 @@
 };
 
 
-// Note overrideable, built-in: value? false : true.
+// Note overrideable, built-in: value ? false : true.
 class BooleanNegateInstr : public TemplateDefinition<1> {
  public:
   explicit BooleanNegateInstr(Value* value) {
@@ -4798,6 +4749,8 @@
   MethodRecognizer::Kind kind() const { return kind_; }
   const RuntimeEntry& TargetFunction() const;
 
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual Representation representation() const {
@@ -6615,6 +6568,108 @@
 };
 
 
+class MergedMathInstr : public Definition {
+ public:
+  enum Kind {
+    kTruncDivMod,
+    kTruncDivRem,
+    kSinCos,
+  };
+
+  MergedMathInstr(ZoneGrowableArray<Value*>* inputs,
+                  intptr_t original_deopt_id,
+                  MergedMathInstr::Kind kind);
+
+  static intptr_t InputCountFor(MergedMathInstr::Kind kind) {
+    if (kind == kTruncDivMod) {
+      return 2;
+    } else {
+      UNIMPLEMENTED();
+      return -1;
+    }
+  }
+
+  MergedMathInstr::Kind kind() const { return kind_; }
+
+  virtual intptr_t InputCount() const { return inputs_->length(); }
+
+  virtual Value* InputAt(intptr_t i) const {
+    return (*inputs_)[i];
+  }
+
+  virtual CompileType ComputeType() const;
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const {
+    if (kind_ == kTruncDivMod) {
+      return true;
+    } else {
+      UNIMPLEMENTED();
+      return false;
+    }
+  }
+
+  virtual Representation representation() const {
+    if (kind_ == kTruncDivMod) {
+      return kTagged;
+    } else {
+      UNIMPLEMENTED();
+      return kTagged;
+    }
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    if (kind_ == kTruncDivMod) {
+      ASSERT((0 <= idx) && (idx < InputCount()));
+      return kTagged;
+    } else {
+      UNIMPLEMENTED();
+      return kTagged;
+    }
+  }
+
+  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
+
+  DECLARE_INSTRUCTION(MergedMath)
+
+  // Returns a structure describing the location constraints required
+  // to emit native code for this definition.
+  LocationSummary* locs() {
+    if (locs_ == NULL) {
+      locs_ = MakeLocationSummary();
+    }
+    return locs_;
+  }
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    MergedMathInstr* other_invoke = other->AsMergedMath();
+    return other_invoke->kind() == kind();
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+  static const char* KindToCString(MergedMathInstr::Kind kind) {
+    if (kind == kTruncDivMod) return "TruncDivMod";
+    UNIMPLEMENTED();
+    return "";
+  }
+
+ private:
+  virtual void RawSetInputAt(intptr_t i, Value* value) {
+    (*inputs_)[i] = value;
+  }
+
+  ZoneGrowableArray<Value*>* inputs_;
+  LocationSummary* locs_;
+  MergedMathInstr::Kind kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(MergedMathInstr);
+};
+
+
 class CheckClassInstr : public TemplateInstruction<1> {
  public:
   CheckClassInstr(Value* value,
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 43ab8a1..0377a24 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -109,27 +109,109 @@
 }
 
 
-bool IfThenElseInstr::IsSupported() {
-  return false;
+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;
+  }
 }
 
 
-bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
-                               Value* v1,
-                               Value* v2) {
-  UNREACHABLE();
-  return false;
+// 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() const {
-  UNREACHABLE();
-  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::RegisterOrConstant(left()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
+  locs->set_out(Location::RequiresRegister());
+  return locs;
 }
 
 
 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNREACHABLE();
+  const Register result = locs()->out().reg();
+  ASSERT(Token::IsEqualityOperator(kind()));
+
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+
+  // Clear out register.
+  __ eor(result, result, ShifterOperand(result));
+
+  // Compare left and right. For now only equality comparison is supported.
+  // TODO(vegorov): reuse code from the other comparison instructions instead of
+  // generating it inline here.
+  if (left.IsConstant()) {
+    __ CompareObject(right.reg(), left.constant());
+  } else if (right.IsConstant()) {
+    __ CompareObject(left.reg(), right.constant());
+  } else {
+    __ cmp(left.reg(), ShifterOperand(right.reg()));
+  }
+
+  Condition true_condition =
+      ((kind_ == Token::kEQ_STRICT) || (kind_ == Token::kEQ)) ? EQ : NE;
+
+  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);
+    }
+  }
+
+  __ mov(result, ShifterOperand(1), 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, ShifterOperand(1));
+    const int32_t val =
+        Smi::RawValue(true_value) - Smi::RawValue(false_value);
+    __ AndImmediate(result, result, val);
+    if (false_value != 0) {
+      __ AddImmediate(result, Smi::RawValue(false_value));
+    }
+  }
 }
 
 
@@ -315,84 +397,8 @@
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
-  if (IsCheckedStrictEqual()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresRegister());
-    locs->set_in(1, Location::RequiresRegister());
-    locs->set_temp(0, Location::RequiresRegister());
-    locs->set_out(Location::RequiresRegister());
-    return locs;
-  }
-  if (IsPolymorphic()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-    locs->set_in(0, Location::RegisterLocation(R1));
-    locs->set_in(1, Location::RegisterLocation(R0));
-    locs->set_temp(0, Location::RegisterLocation(R5));
-    locs->set_out(Location::RegisterLocation(R0));
-    return locs;
-  }
-  const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_in(0, Location::RegisterLocation(R1));
-  locs->set_in(1, Location::RegisterLocation(R0));
-  locs->set_temp(0, Location::RegisterLocation(R5));
-  locs->set_out(Location::RegisterLocation(R0));
-  return locs;
-}
-
-
-static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos,
-                                       Token::Kind kind,
-                                       LocationSummary* locs,
-                                       const ICData& original_ic_data) {
-  if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
-                                   deopt_id,
-                                   token_pos);
-  }
-  const int kNumberOfArguments = 2;
-  const Array& kNoArgumentNames = Object::null_array();
-  const int kNumArgumentsChecked = 2;
-
-  ICData& equality_ic_data = ICData::ZoneHandle();
-  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
-    ASSERT(!original_ic_data.IsNull());
-    if (original_ic_data.NumberOfChecks() == 0) {
-      // IC call for reoptimization populates original ICData.
-      equality_ic_data = original_ic_data.raw();
-    } else {
-      // Megamorphic call.
-      equality_ic_data = original_ic_data.AsUnaryClassChecks();
-    }
-  } else {
-    const Array& arguments_descriptor =
-        Array::Handle(ArgumentsDescriptor::New(kNumberOfArguments,
-                                               kNoArgumentNames));
-    equality_ic_data = ICData::New(compiler->parsed_function().function(),
-                                   Symbols::EqualOperator(),
-                                   arguments_descriptor,
-                                   deopt_id,
-                                   kNumArgumentsChecked);
-  }
-  compiler->GenerateInstanceCall(deopt_id,
-                                 token_pos,
-                                 kNumberOfArguments,
-                                 kNoArgumentNames,
-                                 locs,
-                                 equality_ic_data);
-  if (kind == Token::kNE) {
-    // Negate the condition: true label returns false and vice versa.
-    __ CompareObject(R0, Bool::True());
-    __ LoadObject(R0, Bool::True(), NE);
-    __ LoadObject(R0, Bool::False(), EQ);
-  }
+  UNREACHABLE();
+  return NULL;
 }
 
 
@@ -415,173 +421,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;
-  }
-}
-
-
-// R1: left, also on stack.
-// R0: right, also on stack.
-static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
-                                          const ICData& orig_ic_data,
-                                          LocationSummary* locs,
-                                          BranchInstr* branch,
-                                          Token::Kind kind,
-                                          intptr_t deopt_id,
-                                          intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  ASSERT(ic_data.NumberOfChecks() > 0);
-  ASSERT(ic_data.num_args_tested() == 1);
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  ASSERT(left == R1);
-  ASSERT(right == R0);
-  Register temp = locs->temp(0).reg();
-  LoadValueCid(compiler, temp, left,
-               (ic_data.GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
-  // 'temp' contains class-id of the left argument.
-  ObjectStore* object_store = Isolate::Current()->object_store();
-  Condition cond = TokenKindToSmiCondition(kind);
-  Label done;
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    // Assert that the Smi is at position 0, if at all.
-    ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
-    Label next_test;
-    __ CompareImmediate(temp, ic_data.GetReceiverClassIdAt(i));
-    if (i < len - 1) {
-      __ b(&next_test, NE);
-    } else {
-      __ b(deopt, NE);
-    }
-    const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(i));
-    if (target.Owner() == object_store->object_class()) {
-      // Object.== is same as ===.
-      __ Drop(2);
-      __ cmp(left, ShifterOperand(right));
-      if (branch != NULL) {
-        branch->EmitBranchOnCondition(compiler, cond);
-      } else {
-        Register result = locs->out().reg();
-        __ LoadObject(result, Bool::True(), cond);
-        __ LoadObject(result, Bool::False(), NegateCondition(cond));
-      }
-    } else {
-      const int kNumberOfArguments = 2;
-      const Array& kNoArgumentNames = Object::null_array();
-      compiler->GenerateStaticCall(deopt_id,
-                                   token_pos,
-                                   target,
-                                   kNumberOfArguments,
-                                   kNoArgumentNames,
-                                   locs);
-      if (branch == NULL) {
-        if (kind == Token::kNE) {
-          __ CompareObject(R0, Bool::True());
-          __ LoadObject(R0, Bool::True(), NE);
-          __ LoadObject(R0, Bool::False(), EQ);
-        }
-      } else {
-        if (branch->is_checked()) {
-          EmitAssertBoolean(R0, token_pos, deopt_id, locs, compiler);
-        }
-        __ CompareObject(R0, Bool::True());
-        branch->EmitBranchOnCondition(compiler, cond);
-      }
-    }
-    if (i < len - 1) {
-      __ b(&done);
-      __ Bind(&next_test);
-    }
-  }
-  __ Bind(&done);
-}
-
-
-// Emit code when ICData's targets are all Object == (which is ===).
-static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
-                                   const ICData& orig_ic_data,
-                                   const LocationSummary& locs,
-                                   Token::Kind kind,
-                                   BranchInstr* branch,
-                                   intptr_t deopt_id) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  Register left = locs.in(0).reg();
-  Register right = locs.in(1).reg();
-  Register temp = locs.temp(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-  __ tst(left, ShifterOperand(kSmiTagMask));
-  __ b(deopt, EQ);
-  // 'left' is not Smi.
-  Label identity_compare;
-  __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
-  __ cmp(right, ShifterOperand(IP));
-  __ b(&identity_compare, EQ);
-  __ cmp(left, ShifterOperand(IP));
-  __ b(&identity_compare, EQ);
-
-  __ LoadClassId(temp, left);
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    __ CompareImmediate(temp, ic_data.GetReceiverClassIdAt(i));
-    if (i == (len - 1)) {
-      __ b(deopt, NE);
-    } else {
-      __ b(&identity_compare, EQ);
-    }
-  }
-  __ Bind(&identity_compare);
-  __ cmp(left, ShifterOperand(right));
-  if (branch == NULL) {
-    Register result = locs.out().reg();
-    __ LoadObject(result, Bool::Get(kind == Token::kEQ), EQ);
-    __ LoadObject(result, Bool::Get(kind != Token::kEQ), NE);
-  } else {
-    Condition cond = TokenKindToSmiCondition(kind);
-    branch->EmitBranchOnCondition(compiler, cond);
-  }
-}
-
-
-// First test if receiver is NULL, in which case === is applied.
-// If type feedback was provided (lists of <class-id, target>), do a
-// type by type check (either === or static call to the operator.
-static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
-                                       LocationSummary* locs,
-                                       Token::Kind kind,
-                                       BranchInstr* branch,
-                                       const ICData& ic_data,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  ASSERT(left == R1);
-  ASSERT(right == R0);
-  __ PushList((1 << R0) | (1 << R1));
-  EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
-                                deopt_id, token_pos);
-}
-
-
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
     case EQ: return EQ;
@@ -601,12 +440,30 @@
 }
 
 
-static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
-                                const LocationSummary& locs,
-                                Token::Kind kind,
-                                BranchInstr* branch) {
-  Location left = locs.in(0);
-  Location right = locs.in(1);
+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);
@@ -619,30 +476,7 @@
   } else {
     __ cmp(left.reg(), ShifterOperand(right.reg()));
   }
-
-  if (branch != NULL) {
-    branch->EmitBranchOnCondition(compiler, true_condition);
-  } else {
-    Register result = locs.out().reg();
-    __ LoadObject(result, Bool::True(), true_condition);
-    __ LoadObject(result, Bool::False(), NegateCondition(true_condition));
-  }
-}
-
-
-static void EmitUnboxedMintEqualityOp(FlowGraphCompiler* compiler,
-                                      const LocationSummary& locs,
-                                      Token::Kind kind,
-                                      BranchInstr* branch) {
-  UNIMPLEMENTED();
-}
-
-
-static void EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler,
-                                        const LocationSummary& locs,
-                                        Token::Kind kind,
-                                        BranchInstr* branch) {
-  UNIMPLEMENTED();
+  return true_condition;
 }
 
 
@@ -662,106 +496,98 @@
 
 
 static void EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
-                                   const LocationSummary& locs,
-                                   Token::Kind kind,
-                                   BranchInstr* branch) {
-  QRegister left = locs.in(0).fpu_reg();
-  QRegister right = locs.in(1).fpu_reg();
-
-  Condition true_condition = TokenKindToDoubleCondition(kind);
-  if (branch != NULL) {
-    compiler->EmitDoubleCompareBranch(
-        true_condition, left, right, branch);
-  } else {
-    compiler->EmitDoubleCompareBool(
-        true_condition, left, right, locs.out().reg());
-  }
+                                   LocationSummary* locs) {
+  QRegister left = locs->in(0).fpu_reg();
+  QRegister right = locs->in(1).fpu_reg();
+  DRegister dleft = EvenDRegisterOf(left);
+  DRegister dright = EvenDRegisterOf(right);
+  __ vcmpd(dleft, dright);
+  __ vmstat();
 }
 
 
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
-  BranchInstr* kNoBranch = NULL;
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
+    Condition true_condition = EmitSmiComparisonOp(compiler, locs(), kind());
+    Register result = locs()->out().reg();
+    __ LoadObject(result, Bool::True(), true_condition);
+    __ LoadObject(result, Bool::False(), NegateCondition(true_condition));
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, locs());
+
+    Register result = locs()->out().reg();
+    Condition true_condition = TokenKindToDoubleCondition(kind());
+    Label done;
+    __ LoadObject(result, Bool::False());
+    if (true_condition != NE) {
+      __ b(&done, VS);  // x == NaN -> false, x != NaN -> true.
+    }
+    __ LoadObject(result, Bool::True(), true_condition);
+    __ Bind(&done);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), kNoBranch);
-    return;
-  }
-  if (operation_cid() == kDoubleCid) {
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
-  }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), kNoBranch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), kNoBranch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
-  Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  ASSERT(left == R1);
-  ASSERT(right == R0);
-  __ PushList((1 << R0) | (1 << R1));
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             kind(),
-                             locs(),
-                             *ic_data());
-  ASSERT(locs()->out().reg() == R0);
 }
 
 
 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                           BranchInstr* branch) {
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  Condition true_condition = kNoCondition;
   if (operation_cid() == kSmiCid) {
-    // Deoptimizes if both arguments not Smi.
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    true_condition = EmitSmiComparisonOp(compiler, locs(), kind());
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    true_condition = TokenKindToDoubleCondition(kind());
+    EmitDoubleComparisonOp(compiler, locs());
+
+    Label* nan_result = (true_condition == NE) ?
+        labels.true_label : labels.false_label;
+    __ b(nan_result, VS);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  if (operation_cid() == kDoubleCid) {
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), branch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), branch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
+  EmitBranchOnCondition(compiler, true_condition, labels);
+}
+
+
+LocationSummary* TestSmiInstr::MakeLocationSummary() const {
+  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;
+}
+
+
+void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Never emitted outside of the BranchInstr.
+  UNREACHABLE();
+}
+
+
+void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                  BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  Condition true_condition = (kind() == Token::kNE) ? NE : EQ;
   Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  ASSERT(left == R1);
-  ASSERT(right == R0);
-  __ PushList((1 << R0) | (1 << R1));
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             Token::kEQ,  // kNE reverse occurs at branch.
-                             locs(),
-                             *ic_data());
-  if (branch->is_checked()) {
-    EmitAssertBoolean(R0, token_pos(), deopt_id(), locs(), compiler);
+  Location right = locs()->in(1);
+  if (right.IsConstant()) {
+    ASSERT(right.constant().IsSmi());
+    const int32_t imm =
+        reinterpret_cast<int32_t>(right.constant().raw());
+    __ TestImmediate(left, imm);
+  } else {
+    __ tst(left, ShifterOperand(right.reg()));
   }
-  Condition branch_condition = (kind() == Token::kNE) ? NE : EQ;
-  __ CompareObject(R0, Bool::True());
-  branch->EmitBranchOnCondition(compiler, branch_condition);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -803,30 +629,44 @@
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), NULL);
-    return;
+    Condition true_condition = EmitSmiComparisonOp(compiler, locs(), kind());
+    Register result = locs()->out().reg();
+    __ LoadObject(result, Bool::True(), true_condition);
+    __ LoadObject(result, Bool::False(), NegateCondition(true_condition));
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, locs());
+
+    Register result = locs()->out().reg();
+    Condition true_condition = TokenKindToDoubleCondition(kind());
+    Label done;
+    __ LoadObject(result, Bool::False());
+    if (true_condition != NE) {
+      __ b(&done, VS);  // x == NaN -> false, x != NaN -> true.
+    }
+    __ LoadObject(result, Bool::True(), true_condition);
+    __ Bind(&done);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), NULL);
-    return;
-  }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), NULL);
 }
 
 
 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                        BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  Condition true_condition = kNoCondition;
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    true_condition = EmitSmiComparisonOp(compiler, locs(), kind());
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    true_condition = TokenKindToDoubleCondition(kind());
+    EmitDoubleComparisonOp(compiler, locs());
+
+    Label* nan_result = (true_condition == NE) ?
+        labels.true_label : labels.false_label;
+    __ b(nan_result, VS);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -2368,6 +2208,14 @@
     summary->set_out(Location::RequiresRegister());
     return summary;
   }
+  if (op_kind() == Token::kMOD) {
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::RequiresRegister());
+    summary->AddTemp(Location::RequiresRegister());
+    summary->AddTemp(Location::RequiresFpuRegister());
+    summary->set_out(Location::RequiresRegister());
+    return summary;
+  }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   if (((op_kind() == Token::kSHL) && !is_truncating()) ||
@@ -2596,6 +2444,38 @@
       __ SmiTag(result);
       break;
     }
+    case Token::kMOD: {
+      // Handle divide by zero in runtime.
+      __ cmp(right, ShifterOperand(0));
+      __ b(deopt, EQ);
+      Register temp = locs()->temp(0).reg();
+      DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
+      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+
+      __ IntegerDivide(result, temp, IP, dtemp, DTMP);
+
+      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ mls(result, IP, 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;
+      __ cmp(result, ShifterOperand(0));
+      __ b(&done, GE);
+      // Result is negative, adjust it.
+      __ cmp(right, ShifterOperand(0));
+      __ sub(result, result, ShifterOperand(right), LT);
+      __ add(result, result, ShifterOperand(right), GE);
+      __ Bind(&done);
+      break;
+    }
     case Token::kSHR: {
       if (CanDeoptimize()) {
         __ CompareImmediate(right, 0);
@@ -2622,11 +2502,6 @@
       UNREACHABLE();
       break;
     }
-    case Token::kMOD: {
-      // TODO(srdjan): Implement.
-      UNREACHABLE();
-      break;
-    }
     case Token::kOR:
     case Token::kAND: {
       // Flow graph builder has dissected this operation to guarantee correct
@@ -4190,6 +4065,89 @@
 }
 
 
+LocationSummary* MergedMathInstr::MakeLocationSummary() const {
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    const intptr_t kNumInputs = 2;
+    const intptr_t kNumTemps = 4;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::RequiresRegister());
+    summary->set_temp(0, Location::RequiresRegister());
+    summary->set_temp(1, Location::RequiresFpuRegister());
+    summary->set_temp(2, Location::RequiresRegister());  // result_div.
+    summary->set_temp(3, Location::RequiresRegister());  // result_mod.
+    summary->set_out(Location::RequiresRegister());
+    return summary;
+  }
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+  }
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    Register left = locs()->in(0).reg();
+    Register right = locs()->in(1).reg();
+    Register result = locs()->out().reg();
+    // Handle divide by zero in runtime.
+    __ cmp(right, ShifterOperand(0));
+    __ b(deopt, EQ);
+    Register temp = locs()->temp(0).reg();
+    DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
+    Register result_div = locs()->temp(2).reg();
+    Register result_mod = locs()->temp(3).reg();
+    __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+    __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+
+    __ IntegerDivide(result_div, temp, IP, dtemp, DTMP);
+
+    // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+    // case we cannot tag the result.
+    __ CompareImmediate(result_div, 0x40000000);
+    __ b(deopt, EQ);
+    __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+    // result_mod <- left - right * result_div.
+    __ mls(result_mod, IP, result_div, temp);
+    __ SmiTag(result_div);
+    __ SmiTag(result_mod);
+    // Correct MOD result:
+    //  res = left % right;
+    //  if (res < 0) {
+    //    if (right < 0) {
+    //      res = res - right;
+    //    } else {
+    //      res = res + right;
+    //    }
+    //  }
+    Label done;
+    __ cmp(result_mod, ShifterOperand(0));
+    __ b(&done, GE);
+    // Result is negative, adjust it.
+    __ cmp(right, ShifterOperand(0));
+    __ sub(result_mod, result_mod, ShifterOperand(right), LT);
+    __ add(result_mod, result_mod, ShifterOperand(right), GE);
+    __ Bind(&done);
+
+    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)));
+    // Note that index is expected smi-tagged, (i.e, times 2) for all arrays.
+    // [0]: divide resut, [1]: mod result.
+    __ mov(temp, ShifterOperand(0 +
+        FlowGraphCompiler::DataOffsetFor(kArrayCid) - kHeapObjectTag));
+    Address store_address(result, temp, LSL, 0);
+    __ StoreIntoObjectNoBarrier(result, store_address, result_div);
+    __ add(temp, temp, ShifterOperand(kWordSize));
+    __ StoreIntoObjectNoBarrier(result, store_address, result_mod);
+    return;
+  }
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const {
   return MakeCallSummary();
 }
@@ -4510,34 +4468,6 @@
 }
 
 
-void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
-                                           bool value) {
-  if (value && !compiler->CanFallThroughTo(true_successor())) {
-    __ b(compiler->GetJumpLabel(true_successor()));
-  } else if (!value && !compiler->CanFallThroughTo(false_successor())) {
-    __ b(compiler->GetJumpLabel(false_successor()));
-  }
-}
-
-
-void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
-                                               Condition true_condition) {
-  if (compiler->CanFallThroughTo(false_successor())) {
-    // If the next block is the false successor we will fall through to it.
-    __ b(compiler->GetJumpLabel(true_successor()), true_condition);
-  } else {
-    // If the next block is not the false successor we will branch to it.
-    Condition false_condition = NegateCondition(true_condition);
-    __ b(compiler->GetJumpLabel(false_successor()), false_condition);
-
-    // Fall through or jump to the true successor.
-    if (!compiler->CanFallThroughTo(true_successor())) {
-      __ b(compiler->GetJumpLabel(true_successor()));
-    }
-  }
-}
-
-
 LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
@@ -4553,44 +4483,59 @@
 LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
+  if (needs_number_check()) {
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    locs->set_in(0, Location::RegisterLocation(R0));
+    locs->set_in(1, Location::RegisterLocation(R1));
+    locs->set_out(Location::RegisterLocation(R0));
+    return locs;
+  }
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
   locs->set_out(Location::RequiresRegister());
   return locs;
 }
 
 
+static void EmitStrictComparison(FlowGraphCompiler* compiler,
+                                 StrictCompareInstr* compare) {
+  LocationSummary* locs = compare->locs();
+  bool needs_number_check = compare->needs_number_check();
+  intptr_t token_pos = compare->token_pos();
+  Location left = locs->in(0);
+  Location right = locs->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                       right.reg(),
+                                       needs_number_check,
+                                       token_pos);
+  }
+}
+
+
 // Special code for numbers (compare values instead of references.)
 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    __ LoadObject(locs()->out().reg(), Bool::Get(result));
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                       right.reg(),
-                                       needs_number_check(),
-                                       token_pos());
-  }
+
+  EmitStrictComparison(compiler, this);
 
   Register result = locs()->out().reg();
   Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQ : NE;
@@ -4602,35 +4547,12 @@
 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                         BranchInstr* branch) {
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    branch->EmitBranchOnValue(compiler, result);
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                        right.reg(),
-                                        needs_number_check(),
-                                        token_pos());
-  }
 
+  EmitStrictComparison(compiler, this);
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
   Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQ : NE;
-  branch->EmitBranchOnCondition(compiler, true_condition);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 160fe52..b0e0f54 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -264,89 +264,8 @@
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
-  if (IsCheckedStrictEqual()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresRegister());
-    locs->set_in(1, Location::RequiresRegister());
-    locs->set_temp(0, Location::RequiresRegister());
-    locs->set_out(Location::RequiresRegister());
-    return locs;
-  }
-  if (IsPolymorphic()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-    locs->set_in(0, Location::RegisterLocation(ECX));
-    locs->set_in(1, Location::RegisterLocation(EDX));
-    locs->set_temp(0, Location::RegisterLocation(EBX));
-    locs->set_out(Location::RegisterLocation(EAX));
-    return locs;
-  }
-  const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_in(0, Location::RegisterLocation(EBX));
-  locs->set_in(1, Location::RegisterLocation(EDX));
-  locs->set_temp(0, Location::RegisterLocation(ECX));
-  locs->set_out(Location::RegisterLocation(EAX));
-  return locs;
-}
-
-
-static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos,
-                                       Token::Kind kind,
-                                       LocationSummary* locs,
-                                       const ICData& original_ic_data) {
-  if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
-                                   deopt_id,
-                                   token_pos);
-  }
-  const int kNumberOfArguments = 2;
-  const Array& kNoArgumentNames = Object::null_array();
-  const int kNumArgumentsChecked = 2;
-
-  ICData& equality_ic_data = ICData::ZoneHandle();
-  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
-    ASSERT(!original_ic_data.IsNull());
-    if (original_ic_data.NumberOfChecks() == 0) {
-      // IC call for reoptimization populates original ICData.
-      equality_ic_data = original_ic_data.raw();
-    } else {
-      // Megamorphic call.
-      equality_ic_data = original_ic_data.AsUnaryClassChecks();
-    }
-  } else {
-    const Array& arguments_descriptor =
-        Array::Handle(ArgumentsDescriptor::New(kNumberOfArguments,
-                                               kNoArgumentNames));
-    equality_ic_data = ICData::New(compiler->parsed_function().function(),
-                                   Symbols::EqualOperator(),
-                                   arguments_descriptor,
-                                   deopt_id,
-                                   kNumArgumentsChecked);
-  }
-  compiler->GenerateInstanceCall(deopt_id,
-                                 token_pos,
-                                 kNumberOfArguments,
-                                 kNoArgumentNames,
-                                 locs,
-                                 equality_ic_data);
-  if (kind == Token::kNE) {
-    Label true_label, done;
-    // Negate the condition: true label returns false and vice versa.
-    __ CompareObject(EAX, Bool::True());
-    __ j(EQUAL, &true_label, Assembler::kNearJump);
-    __ LoadObject(EAX, Bool::True());
-    __ jmp(&done, Assembler::kNearJump);
-    __ Bind(&true_label);
-    __ LoadObject(EAX, Bool::False());
-    __ Bind(&done);
-  }
+  UNREACHABLE();
+  return NULL;
 }
 
 
@@ -369,164 +288,6 @@
 }
 
 
-static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
-                                          const ICData& orig_ic_data,
-                                          LocationSummary* locs,
-                                          BranchInstr* branch,
-                                          Token::Kind kind,
-                                          intptr_t deopt_id,
-                                          intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  ASSERT(ic_data.NumberOfChecks() > 0);
-  ASSERT(ic_data.num_args_tested() == 1);
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  Register temp = locs->temp(0).reg();
-  LoadValueCid(compiler, temp, left,
-               (ic_data.GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
-  // 'temp' contains class-id of the left argument.
-  ObjectStore* object_store = Isolate::Current()->object_store();
-  Condition cond = TokenKindToSmiCondition(kind);
-  Label done;
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    // Assert that the Smi is at position 0, if at all.
-    ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
-    Label next_test;
-    __ cmpl(temp, Immediate(ic_data.GetReceiverClassIdAt(i)));
-    if (i < len - 1) {
-      __ j(NOT_EQUAL, &next_test);
-    } else {
-      __ j(NOT_EQUAL, deopt);
-    }
-    const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(i));
-    if (target.Owner() == object_store->object_class()) {
-      // Object.== is same as ===.
-      __ Drop(2);
-      __ cmpl(left, right);
-      if (branch != NULL) {
-        branch->EmitBranchOnCondition(compiler, cond);
-      } else {
-        Register result = locs->out().reg();
-        Label load_true;
-        __ j(cond, &load_true, Assembler::kNearJump);
-        __ LoadObject(result, Bool::False());
-        __ jmp(&done);
-        __ Bind(&load_true);
-        __ LoadObject(result, Bool::True());
-      }
-    } else {
-      const int kNumberOfArguments = 2;
-      const Array& kNoArgumentNames = Object::null_array();
-      compiler->GenerateStaticCall(deopt_id,
-                                   token_pos,
-                                   target,
-                                   kNumberOfArguments,
-                                   kNoArgumentNames,
-                                   locs);
-      if (branch == NULL) {
-        if (kind == Token::kNE) {
-          Label false_label;
-          __ CompareObject(EAX, Bool::True());
-          __ j(EQUAL, &false_label, Assembler::kNearJump);
-          __ LoadObject(EAX, Bool::True());
-          __ jmp(&done);
-          __ Bind(&false_label);
-          __ LoadObject(EAX, Bool::False());
-        }
-      } else {
-        if (branch->is_checked()) {
-          EmitAssertBoolean(EAX, token_pos, deopt_id, locs, compiler);
-        }
-        __ CompareObject(EAX, Bool::True());
-        branch->EmitBranchOnCondition(compiler, cond);
-      }
-    }
-    if (i < len - 1) {
-      __ jmp(&done);
-      __ Bind(&next_test);
-    }
-  }
-  __ Bind(&done);
-}
-
-
-// Emit code when ICData's targets are all Object == (which is ===).
-static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
-                                   const ICData& orig_ic_data,
-                                   const LocationSummary& locs,
-                                   Token::Kind kind,
-                                   BranchInstr* branch,
-                                   intptr_t deopt_id) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  Register left = locs.in(0).reg();
-  Register right = locs.in(1).reg();
-  Register temp = locs.temp(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-  __ testl(left, Immediate(kSmiTagMask));
-  __ j(ZERO, deopt);
-  // 'left' is not Smi.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  Label identity_compare;
-  __ cmpl(right, raw_null);
-  __ j(EQUAL, &identity_compare);
-  __ cmpl(left, raw_null);
-  __ j(EQUAL, &identity_compare);
-
-  __ LoadClassId(temp, left);
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    __ cmpl(temp, Immediate(ic_data.GetReceiverClassIdAt(i)));
-    if (i == (len - 1)) {
-      __ j(NOT_EQUAL, deopt);
-    } else {
-      __ j(EQUAL, &identity_compare);
-    }
-  }
-  __ Bind(&identity_compare);
-  __ cmpl(left, right);
-  if (branch == NULL) {
-    Label done, is_equal;
-    Register result = locs.out().reg();
-    __ j(EQUAL, &is_equal, Assembler::kNearJump);
-    // Not equal.
-    __ LoadObject(result, Bool::Get(kind != Token::kEQ));
-    __ jmp(&done, Assembler::kNearJump);
-    __ Bind(&is_equal);
-    __ LoadObject(result, Bool::Get(kind == Token::kEQ));
-    __ Bind(&done);
-  } else {
-    Condition cond = TokenKindToSmiCondition(kind);
-    branch->EmitBranchOnCondition(compiler, cond);
-  }
-}
-
-
-// First test if receiver is NULL, in which case === is applied.
-// If type feedback was provided (lists of <class-id, target>), do a
-// type by type check (either === or static call to the operator.
-static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
-                                       LocationSummary* locs,
-                                       Token::Kind kind,
-                                       BranchInstr* branch,
-                                       const ICData& ic_data,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  __ pushl(left);
-  __ pushl(right);
-  EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
-                                deopt_id, token_pos);
-}
-
-
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
     case EQUAL:         return EQUAL;
@@ -546,10 +307,48 @@
 }
 
 
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQUAL:         return NOT_EQUAL;
+    case NOT_EQUAL:     return EQUAL;
+    case LESS:          return GREATER_EQUAL;
+    case LESS_EQUAL:    return GREATER;
+    case GREATER:       return LESS_EQUAL;
+    case GREATER_EQUAL: return LESS;
+    case BELOW:         return ABOVE_EQUAL;
+    case BELOW_EQUAL:   return ABOVE;
+    case ABOVE:         return BELOW_EQUAL;
+    case ABOVE_EQUAL:   return BELOW;
+    default:
+      UNIMPLEMENTED();
+      return EQUAL;
+  }
+}
+
+
+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, fall through to it.
+    __ j(true_condition, labels.true_label);
+  } else {
+    // If the next block is not the false successor, branch to it.
+    Condition false_condition = NegateCondition(true_condition);
+    __ j(false_condition, labels.false_label);
+
+    // Fall through or jump to the true successor.
+    if (labels.fall_through != labels.true_label) {
+      __ jmp(labels.true_label);
+    }
+  }
+}
+
+
 static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
                                 const LocationSummary& locs,
                                 Token::Kind kind,
-                                BranchInstr* branch) {
+                                BranchLabels labels) {
   Location left = locs.in(0);
   Location right = locs.in(1);
   ASSERT(!left.IsConstant() || !right.IsConstant());
@@ -566,19 +365,7 @@
   } else {
     __ cmpl(left.reg(), right.reg());
   }
-
-  if (branch != NULL) {
-    branch->EmitBranchOnCondition(compiler, true_condition);
-  } else {
-    Register result = locs.out().reg();
-    Label done, is_true;
-    __ j(true_condition, &is_true);
-    __ LoadObject(result, Bool::False());
-    __ jmp(&done);
-    __ Bind(&is_true);
-    __ LoadObject(result, Bool::True());
-    __ Bind(&done);
-  }
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -626,7 +413,7 @@
 static void EmitUnboxedMintEqualityOp(FlowGraphCompiler* compiler,
                                       const LocationSummary& locs,
                                       Token::Kind kind,
-                                      BranchInstr* branch) {
+                                      BranchLabels labels) {
   ASSERT(Token::IsEqualityOperator(kind));
   XmmRegister left = locs.in(0).fpu_reg();
   XmmRegister right = locs.in(1).fpu_reg();
@@ -637,31 +424,18 @@
 
   Condition true_condition = TokenKindToMintCondition(kind);
   __ cmpl(temp, Immediate(-1));
-
-  if (branch != NULL) {
-    branch->EmitBranchOnCondition(compiler, true_condition);
-  } else {
-    Register result = locs.out().reg();
-    Label done, is_true;
-    __ j(true_condition, &is_true);
-    __ LoadObject(result, Bool::False());
-    __ jmp(&done);
-    __ Bind(&is_true);
-    __ LoadObject(result, Bool::True());
-    __ Bind(&done);
-  }
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
 static void EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler,
                                         const LocationSummary& locs,
                                         Token::Kind kind,
-                                        BranchInstr* branch) {
+                                        BranchLabels labels) {
   XmmRegister left = locs.in(0).fpu_reg();
   XmmRegister right = locs.in(1).fpu_reg();
   Register left_tmp = locs.temp(0).reg();
   Register right_tmp = locs.temp(1).reg();
-  Register result = branch == NULL ? locs.out().reg() : kNoRegister;
 
   Condition hi_cond = OVERFLOW, lo_cond = OVERFLOW;
   switch (kind) {
@@ -690,31 +464,14 @@
   __ pextrd(left_tmp, left, Immediate(1));
   __ pextrd(right_tmp, right, Immediate(1));
   __ cmpl(left_tmp, right_tmp);
-  if (branch != NULL) {
-    __ j(hi_cond, compiler->GetJumpLabel(branch->true_successor()));
-    __ j(FlipCondition(hi_cond),
-         compiler->GetJumpLabel(branch->false_successor()));
-  } else {
-    __ j(hi_cond, &is_true);
-    __ j(FlipCondition(hi_cond), &is_false);
-  }
+  __ j(hi_cond, labels.true_label);
+  __ j(FlipCondition(hi_cond), labels.false_label);
 
   // If upper is equal, compare lower half.
   __ pextrd(left_tmp, left, Immediate(0));
   __ pextrd(right_tmp, right, Immediate(0));
   __ cmpl(left_tmp, right_tmp);
-  if (branch != NULL) {
-    branch->EmitBranchOnCondition(compiler, lo_cond);
-  } else {
-    Label done;
-    __ j(lo_cond, &is_true);
-    __ Bind(&is_false);
-    __ LoadObject(result, Bool::False());
-    __ jmp(&done);
-    __ Bind(&is_true);
-    __ LoadObject(result, Bool::True());
-    __ Bind(&done);
-  }
+  EmitBranchOnCondition(compiler, lo_cond, labels);
 }
 
 
@@ -736,102 +493,97 @@
 static void EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
                                    const LocationSummary& locs,
                                    Token::Kind kind,
-                                   BranchInstr* branch) {
+                                   BranchLabels labels) {
   XmmRegister left = locs.in(0).fpu_reg();
   XmmRegister right = locs.in(1).fpu_reg();
 
+  __ comisd(left, right);
+
   Condition true_condition = TokenKindToDoubleCondition(kind);
-  if (branch != NULL) {
-    compiler->EmitDoubleCompareBranch(
-        true_condition, left, right, branch);
-  } else {
-    compiler->EmitDoubleCompareBool(
-        true_condition, left, right, locs.out().reg());
-  }
+  Label* nan_result = (true_condition == NOT_EQUAL)
+      ? labels.true_label : labels.false_label;
+  __ j(PARITY_EVEN, nan_result);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
-  BranchInstr* kNoBranch = NULL;
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else if (operation_cid() == kMintCid) {
+    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), kNoBranch);
-    return;
-  }
-  if (operation_cid() == kDoubleCid) {
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
-  }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), kNoBranch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), kNoBranch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
-  Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  __ pushl(left);
-  __ pushl(right);
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             kind(),
-                             locs(),
-                             *ic_data());
-  ASSERT(locs()->out().reg() == EAX);
+  Register result = locs()->out().reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False());
+  __ jmp(&done, Assembler::kNearJump);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True());
+  __ Bind(&done);
 }
 
 
 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                           BranchInstr* branch) {
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
   if (operation_cid() == kSmiCid) {
-    // Deoptimizes if both arguments not Smi.
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else if (operation_cid() == kMintCid) {
+    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  if (operation_cid() == kDoubleCid) {
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), branch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), branch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
+}
+
+
+LocationSummary* TestSmiInstr::MakeLocationSummary() const {
+  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;
+}
+
+
+void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Never emitted outside of the BranchInstr.
+  UNREACHABLE();
+}
+
+
+void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                  BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  Condition true_condition = (kind() == Token::kNE) ? NOT_ZERO : ZERO;
   Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  __ pushl(left);
-  __ pushl(right);
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             Token::kEQ,  // kNE reverse occurs at branch.
-                             locs(),
-                             *ic_data());
-  if (branch->is_checked()) {
-    EmitAssertBoolean(EAX, token_pos(), deopt_id(), locs(), compiler);
+  Location right = locs()->in(1);
+  if (right.IsConstant()) {
+    ASSERT(right.constant().IsSmi());
+    const int32_t imm =
+        reinterpret_cast<int32_t>(right.constant().raw());
+    __ testl(left, Immediate(imm));
+  } else {
+    __ testl(left, right.reg());
   }
-  Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL;
-  __ CompareObject(EAX, Bool::True());
-  branch->EmitBranchOnCondition(compiler, branch_condition);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -872,31 +624,40 @@
 
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), NULL);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else if (operation_cid() == kMintCid) {
+    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), NULL);
-    return;
-  }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), NULL);
+  Register result = locs()->out().reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False());
+  __ jmp(&done, Assembler::kNearJump);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True());
+  __ Bind(&done);
 }
 
 
 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                        BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else if (operation_cid() == kMintCid) {
+    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
 }
 
 
@@ -2454,6 +2215,17 @@
       summary->set_temp(0, Location::RegisterLocation(EDX));
     }
     return summary;
+  } else if (op_kind() == Token::kMOD) {
+    const intptr_t kNumTemps = 1;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    // Both inputs must be writable because they will be untagged.
+    summary->set_in(0, Location::RegisterLocation(EDX));
+    summary->set_in(1, Location::WritableRegister());
+    summary->set_out(Location::SameAsFirstInput());
+    // Will be used for sign extension and division.
+    summary->set_temp(0, Location::RegisterLocation(EAX));
+    return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
     LocationSummary* summary =
@@ -2699,6 +2471,41 @@
       __ SmiTag(result);
       break;
     }
+    case Token::kMOD: {
+      // Handle divide by zero in runtime.
+      __ testl(right, right);
+      __ j(ZERO, deopt);
+      ASSERT(left == EDX);
+      ASSERT((right != EDX) && (right != EAX));
+      ASSERT(locs()->temp(0).reg() == EAX);
+      ASSERT(result == EDX);
+      __ SmiUntag(left);
+      __ SmiUntag(right);
+      __ movl(EAX, EDX);
+      __ cdq();  // Sign extend EAX -> EDX:EAX.
+      __ idivl(right);  //  EAX: quotient, EDX: remainder.
+      //  res = left % right;
+      //  if (res < 0) {
+      //    if (right < 0) {
+      //      res = res - right;
+      //    } else {
+      //      res = res + right;
+      //    }
+      //  }
+      Label subtract, done;
+      __ cmpl(result, Immediate(0));
+      __ j(GREATER_EQUAL, &done, Assembler::kNearJump);
+      // Result is negative, adjust it.
+      __ cmpl(right, Immediate(0));
+      __ j(LESS, &subtract, Assembler::kNearJump);
+      __ addl(result, right);
+      __ jmp(&done, Assembler::kNearJump);
+      __ Bind(&subtract);
+      __ subl(result, right);
+      __ Bind(&done);
+      __ SmiTag(result);
+      break;
+    }
     case Token::kSHR: {
       if (CanDeoptimize()) {
         __ cmpl(right, Immediate(0));
@@ -2728,11 +2535,6 @@
       UNREACHABLE();
       break;
     }
-    case Token::kMOD: {
-      // TODO(srdjan): Implement.
-      UNREACHABLE();
-      break;
-    }
     case Token::kOR:
     case Token::kAND: {
       // Flow graph builder has dissected this operation to guarantee correct
@@ -4176,6 +3978,97 @@
 }
 
 
+LocationSummary* MergedMathInstr::MakeLocationSummary() const {
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    const intptr_t kNumInputs = 2;
+    const intptr_t kNumTemps = 1;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    // Both inputs must be writable because they will be untagged.
+    summary->set_in(0, Location::RegisterLocation(EAX));
+    summary->set_in(1, Location::WritableRegister());
+    summary->set_out(Location::RequiresRegister());
+    // Will be used for sign extension and division.
+    summary->set_temp(0, Location::RegisterLocation(EDX));
+    return summary;
+  }
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt  = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+  }
+
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    Register left = locs()->in(0).reg();
+    Register right = locs()->in(1).reg();
+    Register result = locs()->out().reg();
+    // Handle divide by zero in runtime.
+    __ testl(right, right);
+    __ j(ZERO, deopt);
+    ASSERT(left == EAX);
+    ASSERT((right != EDX) && (right != EAX));
+    ASSERT(locs()->temp(0).reg() == EDX);
+    ASSERT((result != EDX) && (result != EAX));
+    __ SmiUntag(left);
+    __ SmiUntag(right);
+    __ cdq();  // Sign extend EAX -> EDX:EAX.
+    __ idivl(right);  //  EAX: quotient, EDX: remainder.
+    // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+    // case we cannot tag the result.
+    // TODO(srdjan): We could store instead untagged intermediate results in a
+    // typed array, but then the load indexed instructions would need to be
+    // able to deoptimize.
+    __ cmpl(EAX, Immediate(0x40000000));
+    __ j(EQUAL, deopt);
+    // Modulo result (EDX) correction:
+    //  res = left % right;
+    //  if (res < 0) {
+    //    if (right < 0) {
+    //      res = res - right;
+    //    } else {
+    //      res = res + right;
+    //    }
+    //  }
+    Label subtract, done;
+    __ cmpl(EDX, Immediate(0));
+    __ j(GREATER_EQUAL, &done, Assembler::kNearJump);
+    // Result is negative, adjust it.
+    __ cmpl(right, Immediate(0));
+    __ j(LESS, &subtract, Assembler::kNearJump);
+    __ addl(EDX, right);
+    __ jmp(&done, Assembler::kNearJump);
+    __ Bind(&subtract);
+    __ subl(EDX, right);
+    __ Bind(&done);
+
+    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)));
+    const intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(kArrayCid);
+    Address trunc_div_address(
+        FlowGraphCompiler::ElementAddressForIntIndex(kArrayCid,
+                                                     index_scale,
+                                                     result,
+                                                     0));
+    Address mod_address(
+        FlowGraphCompiler::ElementAddressForIntIndex(kArrayCid,
+                                                     index_scale,
+                                                     result,
+                                                     1));
+    __ SmiTag(EAX);
+    __ SmiTag(EDX);
+    __ StoreIntoObjectNoBarrier(result, trunc_div_address, EAX);
+    __ StoreIntoObjectNoBarrier(result, mod_address, EDX);
+    return;
+  }
+
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const {
   return MakeCallSummary();
 }
@@ -4780,53 +4673,6 @@
 }
 
 
-static Condition NegateCondition(Condition condition) {
-  switch (condition) {
-    case EQUAL:         return NOT_EQUAL;
-    case NOT_EQUAL:     return EQUAL;
-    case LESS:          return GREATER_EQUAL;
-    case LESS_EQUAL:    return GREATER;
-    case GREATER:       return LESS_EQUAL;
-    case GREATER_EQUAL: return LESS;
-    case BELOW:         return ABOVE_EQUAL;
-    case BELOW_EQUAL:   return ABOVE;
-    case ABOVE:         return BELOW_EQUAL;
-    case ABOVE_EQUAL:   return BELOW;
-    default:
-      UNIMPLEMENTED();
-      return EQUAL;
-  }
-}
-
-
-void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
-                                           bool value) {
-  if (value && !compiler->CanFallThroughTo(true_successor())) {
-    __ jmp(compiler->GetJumpLabel(true_successor()));
-  } else if (!value && !compiler->CanFallThroughTo(false_successor())) {
-    __ jmp(compiler->GetJumpLabel(false_successor()));
-  }
-}
-
-
-void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
-                                               Condition true_condition) {
-  if (compiler->CanFallThroughTo(false_successor())) {
-    // If the next block is the false successor, fall through to it.
-    __ j(true_condition, compiler->GetJumpLabel(true_successor()));
-  } else {
-    // If the next block is not the false successor, branch to it.
-    Condition false_condition = NegateCondition(true_condition);
-    __ j(false_condition, compiler->GetJumpLabel(false_successor()));
-
-    // Fall through or jump to the true successor.
-    if (!compiler->CanFallThroughTo(true_successor())) {
-      __ jmp(compiler->GetJumpLabel(true_successor()));
-    }
-  }
-}
-
-
 LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
@@ -4842,52 +4688,73 @@
 LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
+  if (needs_number_check()) {
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    locs->set_in(0, Location::RegisterLocation(EAX));
+    locs->set_in(1, Location::RegisterLocation(ECX));
+    locs->set_out(Location::RegisterLocation(EAX));
+    return locs;
+  }
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
   locs->set_out(Location::RequiresRegister());
   return locs;
 }
 
 
+static void EmitStrictComparison(FlowGraphCompiler* compiler,
+                                 StrictCompareInstr* compare,
+                                 BranchLabels labels) {
+  LocationSummary* locs = compare->locs();
+  bool needs_number_check = compare->needs_number_check();
+  intptr_t token_pos = compare->token_pos();
+  Token::Kind kind = compare->kind();
+  Location left = locs->in(0);
+  Location right = locs->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                        right.reg(),
+                                        needs_number_check,
+                                        token_pos);
+  }
+  Condition true_condition = (kind == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
+  EmitBranchOnCondition(compiler, true_condition, labels);
+}
+
+
 // Special code for numbers (compare values instead of references.)
 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    __ LoadObject(locs()->out().reg(), Bool::Get(result));
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                       right.reg(),
-                                       needs_number_check(),
-                                       token_pos());
-  }
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
+  EmitStrictComparison(compiler, this, labels);
 
   Register result = locs()->out().reg();
-  Label load_true, done;
-  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
-  __ j(true_condition, &load_true, Assembler::kNearJump);
+  Label done;
+  __ Bind(&is_false);
   __ LoadObject(result, Bool::False());
   __ jmp(&done, Assembler::kNearJump);
-  __ Bind(&load_true);
+  __ Bind(&is_true);
   __ LoadObject(result, Bool::True());
   __ Bind(&done);
 }
@@ -4896,50 +4763,10 @@
 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                         BranchInstr* branch) {
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    branch->EmitBranchOnValue(compiler, result);
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                        right.reg(),
-                                        needs_number_check(),
-                                        token_pos());
-  }
 
-  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
-  branch->EmitBranchOnCondition(compiler, true_condition);
-}
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
 
-
-static bool BindsToSmiConstant(Value* val, intptr_t* smi_value) {
-  if (!val->BindsToConstant()) {
-    return false;
-  }
-
-  const Object& bound_constant = val->BoundConstant();
-  if (!bound_constant.IsSmi()) {
-    return false;
-  }
-
-  *smi_value = Smi::Cast(bound_constant).Value();
-  return true;
+  EmitStrictComparison(compiler, this, labels);
 }
 
 
@@ -4950,39 +4777,17 @@
 }
 
 
-bool IfThenElseInstr::IsSupported() {
-  return true;
-}
-
-
-bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
-                               Value* v1,
-                               Value* v2) {
-  if (!(comparison->IsStrictCompare() &&
-        !comparison->AsStrictCompare()->needs_number_check()) &&
-      !(comparison->IsEqualityCompare() &&
-        (comparison->AsEqualityCompare()->operation_cid() == kSmiCid))) {
-    return false;
-  }
-
-  intptr_t v1_value, v2_value;
-
-  if (!BindsToSmiConstant(v1, &v1_value) ||
-      !BindsToSmiConstant(v2, &v2_value)) {
-    return false;
-  }
-
-  return true;
-}
-
-
 LocationSummary* IfThenElseInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
   // TODO(vegorov): support byte register constraints in the register allocator.
   locs->set_out(Location::RegisterLocation(EDX));
   return locs;
@@ -4995,18 +4800,6 @@
 
   Location left = locs()->in(0);
   Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(srdjan): Determine why this instruction was not eliminated.
-    bool result = (left.constant().raw() == right.constant().raw());
-    if ((kind_ == Token::kNE_STRICT) || (kind_ == Token::kNE)) {
-      result = !result;
-    }
-    __ movl(locs()->out().reg(),
-            Immediate(reinterpret_cast<int32_t>(
-                Smi::New(result ? if_true_ : if_false_))));
-    return;
-  }
-
   ASSERT(!left.IsConstant() || !right.IsConstant());
 
   // Clear upper part of the out register. We are going to use setcc on it
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 77e0ffc..1d31672 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -111,27 +111,113 @@
 }
 
 
-bool IfThenElseInstr::IsSupported() {
-  return false;
+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;
+    default:
+      OS::Print("Error: Condition not recognized: %d\n", condition);
+      UNIMPLEMENTED();
+      return EQ;
+  }
 }
 
 
-bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
-                               Value* v1,
-                               Value* v2) {
-  UNREACHABLE();
-  return false;
+// 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() const {
-  UNREACHABLE();
-  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::RegisterOrConstant(left()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
+  locs->set_out(Location::RequiresRegister());
+  return locs;
 }
 
 
 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNREACHABLE();
+  const Register result = locs()->out().reg();
+  ASSERT(Token::IsEqualityOperator(kind()));
+
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+
+  // Clear out register.
+  __ mov(result, ZR);
+
+  // Compare left and right. For now only equality comparison is supported.
+  // TODO(vegorov): reuse code from the other comparison instructions instead of
+  // generating it inline here.
+  if (left.IsConstant()) {
+    __ CompareObject(CMPRES1, CMPRES2, right.reg(), left.constant());
+  } else if (right.IsConstant()) {
+    __ CompareObject(CMPRES1, CMPRES2, left.reg(), right.constant());
+  } else {
+    __ slt(CMPRES1, left.reg(), right.reg());
+    __ slt(CMPRES2, right.reg(), left.reg());
+  }
+
+  Condition true_condition =
+      ((kind_ == Token::kEQ_STRICT) || (kind_ == Token::kEQ)) ? EQ : NE;
+
+  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);
+    }
+  }
+
+  if (true_condition == EQ) {
+    __ xor_(result, CMPRES1, CMPRES2);
+    __ xori(result, result, Immediate(1));
+  } else {
+    ASSERT(true_condition == NE);
+    __ xor_(result, CMPRES1, CMPRES2);
+  }
+
+  if (is_power_of_two_kind) {
+    const intptr_t shift =
+        Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
+    __ sll(result, result, shift + kSmiTagSize);
+  } else {
+    __ AddImmediate(result, result, -1);
+    const int32_t val =
+        Smi::RawValue(true_value) - Smi::RawValue(false_value);
+    __ AndImmediate(result, result, val);
+    if (false_value != 0) {
+      __ AddImmediate(result, result, Smi::RawValue(false_value));
+    }
+  }
 }
 
 
@@ -304,95 +390,8 @@
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
-  if (IsCheckedStrictEqual()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresRegister());
-    locs->set_in(1, Location::RequiresRegister());
-    locs->set_temp(0, Location::RequiresRegister());
-    locs->set_out(Location::RequiresRegister());
-    return locs;
-  }
-  if (IsPolymorphic()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-    locs->set_in(0, Location::RegisterLocation(A1));
-    locs->set_in(1, Location::RegisterLocation(A0));
-    locs->set_temp(0, Location::RegisterLocation(T0));
-    locs->set_out(Location::RegisterLocation(V0));
-    return locs;
-  }
-  const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_in(0, Location::RegisterLocation(A1));
-  locs->set_in(1, Location::RegisterLocation(A0));
-  locs->set_temp(0, Location::RegisterLocation(T0));
-  locs->set_out(Location::RegisterLocation(V0));
-  return locs;
-}
-
-
-// A1: left.
-// A0: right.
-// Uses T0 to load ic_call_data.
-// Result in V0.
-static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos,
-                                       Token::Kind kind,
-                                       LocationSummary* locs,
-                                       const ICData& original_ic_data) {
-  if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
-                                   deopt_id,
-                                   token_pos);
-  }
-  const int kNumberOfArguments = 2;
-  const Array& kNoArgumentNames = Object::null_array();
-  const int kNumArgumentsChecked = 2;
-
-  __ TraceSimMsg("EmitEqualityAsInstanceCall");
-  __ Comment("EmitEqualityAsInstanceCall");
-
-  ICData& equality_ic_data = ICData::ZoneHandle();
-  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
-    ASSERT(!original_ic_data.IsNull());
-    if (original_ic_data.NumberOfChecks() == 0) {
-      // IC call for reoptimization populates original ICData.
-      equality_ic_data = original_ic_data.raw();
-    } else {
-      // Megamorphic call.
-      equality_ic_data = original_ic_data.AsUnaryClassChecks();
-    }
-  } else {
-    const Array& arguments_descriptor =
-        Array::Handle(ArgumentsDescriptor::New(kNumberOfArguments,
-                                               kNoArgumentNames));
-    equality_ic_data = ICData::New(compiler->parsed_function().function(),
-                                   Symbols::EqualOperator(),
-                                   arguments_descriptor,
-                                   deopt_id,
-                                   kNumArgumentsChecked);
-  }
-  compiler->GenerateInstanceCall(deopt_id,
-                                 token_pos,
-                                 kNumberOfArguments,
-                                 kNoArgumentNames,
-                                 locs,
-                                 equality_ic_data);
-  if (kind == Token::kNE) {
-    Label true_label, done;
-    // Negate the condition: true label returns false and vice versa.
-    __ BranchEqual(V0, Bool::True(), &true_label);
-    __ LoadObject(V0, Bool::True());
-    __ b(&done);
-    __ Bind(&true_label);
-    __ LoadObject(V0, Bool::False());
-    __ Bind(&done);
-  }
+  UNREACHABLE();
+  return NULL;
 }
 
 
@@ -431,10 +430,10 @@
 }
 
 
-// Branches on condition c assuming comparison results in CMPRES and CMPRES2.
+// Branches on condition c assuming comparison results in CMPRES1 and CMPRES2.
 static void EmitBranchAfterCompare(
-    FlowGraphCompiler* compiler, Condition c, Label* is_true) {
-  switch (c) {
+    FlowGraphCompiler* compiler, Condition condition, Label* is_true) {
+  switch (condition) {
     case EQ: __ beq(CMPRES1, CMPRES2, is_true); break;
     case NE: __ bne(CMPRES1, CMPRES2, is_true); break;
     case GT: __ bne(CMPRES2, ZR, is_true); break;
@@ -448,178 +447,6 @@
 }
 
 
-// A1: left, also on stack.
-// A0: right, also on stack.
-static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
-                                          const ICData& orig_ic_data,
-                                          LocationSummary* locs,
-                                          BranchInstr* branch,
-                                          Token::Kind kind,
-                                          intptr_t deopt_id,
-                                          intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  ASSERT(ic_data.NumberOfChecks() > 0);
-  ASSERT(ic_data.num_args_tested() == 1);
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  ASSERT(left == A1);
-  ASSERT(right == A0);
-  Register temp = locs->temp(0).reg();
-
-  __ TraceSimMsg("EmitEqualityAsPolymorphicCall");
-  __ Comment("EmitEqualityAsPolymorphicCall");
-
-  LoadValueCid(compiler, temp, left,
-               (ic_data.GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
-  // 'temp' contains class-id of the left argument.
-  ObjectStore* object_store = Isolate::Current()->object_store();
-  Condition cond = TokenKindToSmiCondition(kind);
-  Label done;
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    // Assert that the Smi is at position 0, if at all.
-    ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
-    Label next_test;
-    if (i < len - 1) {
-      __ BranchNotEqual(temp, ic_data.GetReceiverClassIdAt(i), &next_test);
-    } else {
-      __ BranchNotEqual(temp, ic_data.GetReceiverClassIdAt(i), deopt);
-    }
-    const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(i));
-    if (target.Owner() == object_store->object_class()) {
-      // Object.== is same as ===.
-      __ Drop(2);
-      __ slt(CMPRES1, left, right);
-      __ slt(CMPRES2, right, left);
-      if (branch != NULL) {
-        branch->EmitBranchOnCondition(compiler, cond);
-      } else {
-        Register result = locs->out().reg();
-        Label load_true;
-        EmitBranchAfterCompare(compiler, cond, &load_true);
-        __ LoadObject(result, Bool::False());
-        __ b(&done);
-        __ Bind(&load_true);
-        __ LoadObject(result, Bool::True());
-      }
-    } else {
-      const int kNumberOfArguments = 2;
-      const Array& kNoArgumentNames = Object::null_array();
-      compiler->GenerateStaticCall(deopt_id,
-                                   token_pos,
-                                   target,
-                                   kNumberOfArguments,
-                                   kNoArgumentNames,
-                                   locs);
-      if (branch == NULL) {
-        if (kind == Token::kNE) {
-          Label is_true;
-          __ CompareObject(CMPRES1, CMPRES2, V0, Bool::True());
-          __ beq(CMPRES, CMPRES2, &is_true);
-          __ LoadObject(V0, Bool::True());
-          __ b(&done);
-          __ Bind(&is_true);
-          __ LoadObject(V0, Bool::False());
-        }
-      } else {
-        if (branch->is_checked()) {
-          EmitAssertBoolean(V0, token_pos, deopt_id, locs, compiler);
-        }
-        __ CompareObject(CMPRES1, CMPRES2, V0, Bool::True());
-        branch->EmitBranchOnCondition(compiler, cond);
-      }
-    }
-    if (i < len - 1) {
-      __ b(&done);
-      __ Bind(&next_test);
-    }
-  }
-  __ Bind(&done);
-}
-
-
-// Emit code when ICData's targets are all Object == (which is ===).
-static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
-                                   const ICData& orig_ic_data,
-                                   const LocationSummary& locs,
-                                   Token::Kind kind,
-                                   BranchInstr* branch,
-                                   intptr_t deopt_id) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  Register left = locs.in(0).reg();
-  Register right = locs.in(1).reg();
-  Register temp = locs.temp(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-
-  __ Comment("CheckedStrictEqual");
-
-  __ andi(CMPRES, left, Immediate(kSmiTagMask));
-  __ beq(CMPRES, ZR, deopt);
-  // 'left' is not Smi.
-  Label identity_compare;
-  __ LoadImmediate(CMPRES1, reinterpret_cast<int32_t>(Object::null()));
-  __ beq(right, CMPRES1, &identity_compare);
-  __ beq(left, CMPRES1, &identity_compare);
-
-  __ LoadClassId(temp, left);
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    if (i == (len - 1)) {
-      __ BranchNotEqual(temp, ic_data.GetReceiverClassIdAt(i), deopt);
-    } else {
-      __ BranchEqual(temp, ic_data.GetReceiverClassIdAt(i), &identity_compare);
-    }
-  }
-  __ Bind(&identity_compare);
-  __ subu(CMPRES1, left, right);
-  if (branch == NULL) {
-    Label done, is_equal;
-    Register result = locs.out().reg();
-    __ beq(CMPRES, ZR, &is_equal);
-    // Not equal.
-    __ LoadObject(result, Bool::Get(kind != Token::kEQ));
-    __ b(&done);
-    __ Bind(&is_equal);
-    __ LoadObject(result, Bool::Get(kind == Token::kEQ));
-    __ Bind(&done);
-
-  } else {
-    Condition cond = TokenKindToSmiCondition(kind);
-    __ mov(CMPRES2, ZR);
-    branch->EmitBranchOnCondition(compiler, cond);
-  }
-}
-
-
-// First test if receiver is NULL, in which case === is applied.
-// If type feedback was provided (lists of <class-id, target>), do a
-// type by type check (either === or static call to the operator.
-static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
-                                       LocationSummary* locs,
-                                       Token::Kind kind,
-                                       BranchInstr* branch,
-                                       const ICData& ic_data,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  __ TraceSimMsg("EmitGenericEqualityCompare");
-  __ Comment("EmitGenericEqualityCompare");
-  ASSERT(left == A1);
-  ASSERT(right == A0);
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ sw(A1, Address(SP, 1 * kWordSize));
-  __ sw(A0, Address(SP, 0 * kWordSize));
-  EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
-                                deopt_id, token_pos);
-}
-
-
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
     case EQ: return EQ;
@@ -635,10 +462,30 @@
 }
 
 
+// The comparison result is in CMPRES1/CMPRES2.
+static void EmitBranchOnCondition(FlowGraphCompiler* compiler,
+                                  Condition true_condition,
+                                  BranchLabels labels) {
+  __ TraceSimMsg("ControlInstruction::EmitBranchOnCondition");
+  if (labels.fall_through == labels.false_label) {
+    // If the next block is the false successor, fall through to it.
+    EmitBranchAfterCompare(compiler, true_condition, labels.true_label);
+  } else {
+    // If the next block is not the false successor, branch to it.
+    Condition false_condition = NegateCondition(true_condition);
+    EmitBranchAfterCompare(compiler, false_condition, labels.false_label);
+    // Fall through or jump to the true successor.
+    if (labels.fall_through != labels.true_label) {
+      __ b(labels.true_label);
+    }
+  }
+}
+
+
 static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
                                 const LocationSummary& locs,
                                 Token::Kind kind,
-                                BranchInstr* branch) {
+                                BranchLabels labels) {
   __ TraceSimMsg("EmitSmiComparisonOp");
   __ Comment("EmitSmiComparisonOp");
   Location left = locs.in(0);
@@ -656,35 +503,7 @@
     __ slt(CMPRES1, left.reg(), right.reg());
     __ slt(CMPRES2, right.reg(), left.reg());
   }
-
-  if (branch != NULL) {
-    branch->EmitBranchOnCondition(compiler, true_condition);
-  } else {
-    Register result = locs.out().reg();
-    Label done, is_true;
-    EmitBranchAfterCompare(compiler, true_condition, &is_true);
-    __ LoadObject(result, Bool::False());
-    __ b(&done);
-    __ Bind(&is_true);
-    __ LoadObject(result, Bool::True());
-    __ Bind(&done);
-  }
-}
-
-
-static void EmitUnboxedMintEqualityOp(FlowGraphCompiler* compiler,
-                                      const LocationSummary& locs,
-                                      Token::Kind kind,
-                                      BranchInstr* branch) {
-  UNIMPLEMENTED();
-}
-
-
-static void EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler,
-                                        const LocationSummary& locs,
-                                        Token::Kind kind,
-                                        BranchInstr* branch) {
-  UNIMPLEMENTED();
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -706,63 +525,68 @@
 static void EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
                                    const LocationSummary& locs,
                                    Token::Kind kind,
-                                   BranchInstr* branch) {
+                                   BranchLabels labels) {
   DRegister left = locs.in(0).fpu_reg();
   DRegister right = locs.in(1).fpu_reg();
 
   __ Comment("DoubleComparisonOp(left=%d, right=%d)", left, right);
 
   Condition true_condition = TokenKindToDoubleCondition(kind);
-  if (branch != NULL) {
-    compiler->EmitDoubleCompareBranch(
-        true_condition, left, right, branch);
-  } else {
-    compiler->EmitDoubleCompareBool(
-        true_condition, left, right, locs.out().reg());
+  __ cund(left, right);
+  Label* nan_label = (true_condition == NE)
+      ? labels.true_label : labels.false_label;
+  __ bc1t(nan_label);
+
+  switch (true_condition) {
+    case EQ: __ ceqd(left, right); break;
+    case NE: __ ceqd(left, right); break;
+    case LT: __ coltd(left, right); break;
+    case LE: __ coled(left, right); break;
+    case GT: __ coltd(right, left); break;
+    case GE: __ coled(right, left); break;
+    default: {
+      // Should only passing the above conditions to this function.
+      UNREACHABLE();
+      break;
+    }
   }
+
+  __ LoadImmediate(TMP, 1);
+  if (true_condition == NE) {
+    __ movf(CMPRES1, ZR);
+    __ movt(CMPRES1, TMP);
+  } else {
+    __ movf(CMPRES1, TMP);
+    __ movt(CMPRES1, ZR);
+  }
+  __ mov(CMPRES2, ZR);
+
+  // EmitBranchOnCondition expects ordering to be described by CMPRES1, CMPRES2.
+  EmitBranchOnCondition(compiler, EQ, labels);
 }
 
 
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
-  BranchInstr* kNoBranch = NULL;
   __ Comment("EqualityCompareInstr");
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), kNoBranch);
-    return;
-  }
-  if (operation_cid() == kDoubleCid) {
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
-  }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), kNoBranch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), kNoBranch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
-  Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  ASSERT(left == A1);
-  ASSERT(right == A0);
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ sw(A1, Address(SP, 1 * kWordSize));
-  __ sw(A0, Address(SP, 0 * kWordSize));
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             kind(),
-                             locs(),
-                             *ic_data());
-  ASSERT(locs()->out().reg() == V0);
+  Register result = locs()->out().reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False());
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True());
+  __ Bind(&done);
 }
 
 
@@ -771,48 +595,54 @@
   __ TraceSimMsg("EqualityCompareInstr");
   __ Comment("EqualityCompareInstr:BranchCode");
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
   if (operation_cid() == kSmiCid) {
-    // Deoptimizes if both arguments not Smi.
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintEqualityOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  if (operation_cid() == kDoubleCid) {
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), branch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), branch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
+}
+
+
+LocationSummary* TestSmiInstr::MakeLocationSummary() const {
+  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;
+}
+
+
+void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Never emitted outside of the BranchInstr.
+  UNREACHABLE();
+}
+
+
+void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                  BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  Condition true_condition = (kind() == Token::kNE) ? NE : EQ;
   Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  ASSERT(left == A1);
-  ASSERT(right == A0);
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ sw(A1, Address(SP, 1 * kWordSize));
-  __ sw(A0, Address(SP, 0 * kWordSize));
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             Token::kEQ,  // kNE reverse occurs at branch.
-                             locs(),
-                             *ic_data());
-  if (branch->is_checked()) {
-    EmitAssertBoolean(V0, token_pos(), deopt_id(), locs(), compiler);
+  Location right = locs()->in(1);
+  if (right.IsConstant()) {
+    ASSERT(right.constant().IsSmi());
+    const int32_t imm =
+        reinterpret_cast<int32_t>(right.constant().raw());
+    __ AndImmediate(CMPRES1, left, imm);
+  } else {
+    __ and_(CMPRES1, left, right.reg());
   }
-  Condition branch_condition = (kind() == Token::kNE) ? NE : EQ;
-  __ CompareObject(CMPRES1, CMPRES2, V0, Bool::True());
-  branch->EmitBranchOnCondition(compiler, branch_condition);
+  __ mov(CMPRES2, ZR);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -854,33 +684,39 @@
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("RelationalOpInstr");
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), NULL);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), NULL);
-    return;
-  }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), NULL);
-  return;
+  Register result = locs()->out().reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False());
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True());
+  __ Bind(&done);
 }
 
 
 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                        BranchInstr* branch) {
   __ TraceSimMsg("RelationalOpInstr");
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kMintCid) {
-    EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), branch);
-    return;
-  }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
 }
 
 
@@ -958,9 +794,9 @@
   __ LoadImmediate(result,
                    reinterpret_cast<uword>(Symbols::PredefinedAddress()));
   __ AddImmediate(result, Symbols::kNullCharCodeSymbolOffset * kWordSize);
-  __ sll(TMP1, char_code, 1);  // Char code is a smi.
-  __ addu(TMP1, TMP1, result);
-  __ lw(result, Address(TMP1));
+  __ sll(TMP, char_code, 1);  // Char code is a smi.
+  __ addu(TMP, TMP, result);
+  __ lw(result, Address(TMP));
 }
 
 
@@ -1017,8 +853,8 @@
   Register object = locs()->in(0).reg();
   Register result = locs()->out().reg();
   Label load, done;
-  __ andi(CMPRES, object, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &load);
+  __ andi(CMPRES1, object, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &load);
   __ LoadImmediate(result, Smi::RawValue(kSmiCid));
   __ b(&done);
   __ Bind(&load);
@@ -1236,9 +1072,9 @@
         Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptUint32Load);
         __ lw(result, element_address);
         // Verify that the unsigned value in 'result' can fit inside a Smi.
-        __ LoadImmediate(TMP1, 0xC0000000);
-        __ and_(CMPRES, result, TMP1);
-        __ bne(CMPRES, ZR, deopt);
+        __ LoadImmediate(TMP, 0xC0000000);
+        __ and_(CMPRES1, result, TMP);
+        __ bne(CMPRES1, ZR, deopt);
         __ SmiTag(result);
       }
       break;
@@ -1421,8 +1257,8 @@
         __ SmiUntag(value);
         __ BranchUnsignedLess(value, 0xFF + 1, &store_value);
         __ LoadImmediate(TMP, 0xFF);
-        __ slti(CMPRES, value, Immediate(1));
-        __ movn(TMP, ZR, CMPRES);
+        __ slti(CMPRES1, value, Immediate(1));
+        __ movn(TMP, ZR, CMPRES1);
         __ mov(value, TMP);
         __ Bind(&store_value);
         __ sb(value, element_address);
@@ -1610,31 +1446,29 @@
         __ bne(CMPRES1, ZR, fail);
       }
       __ Bind(&skip_length_check);
-      __ lw(TMP1, field_nullability_operand);
-      __ subu(CMPRES, value_cid_reg, TMP1);
+      __ lw(TMP, field_nullability_operand);
+      __ subu(CMPRES1, value_cid_reg, TMP);
     } else if (value_cid == kNullCid) {
-      // TODO(regis): TMP1 may conflict. Revisit.
-      __ lw(TMP1, field_nullability_operand);
-      __ LoadImmediate(CMPRES, value_cid);
-      __ subu(CMPRES, TMP1, CMPRES);
+      __ lw(TMP, field_nullability_operand);
+      __ LoadImmediate(CMPRES1, value_cid);
+      __ subu(CMPRES1, TMP, CMPRES1);
     } else {
       Label skip_length_check;
-      // TODO(regis): TMP1 may conflict. Revisit.
-      __ lw(TMP1, field_cid_operand);
-      __ LoadImmediate(CMPRES, value_cid);
-      __ subu(CMPRES, TMP1, CMPRES);
-      __ bne(CMPRES, ZR, &skip_length_check);
+      __ lw(TMP, field_cid_operand);
+      __ LoadImmediate(CMPRES1, value_cid);
+      __ subu(CMPRES1, TMP, CMPRES1);
+      __ bne(CMPRES1, ZR, &skip_length_check);
       // Insert length check.
       if (field_has_length) {
         ASSERT(value_cid_reg != kNoRegister);
         if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
           __ lw(TMP, FieldAddress(value_reg, Array::length_offset()));
-          __ LoadImmediate(CMPRES, Smi::RawValue(field_length));
-          __ subu(CMPRES, TMP, CMPRES);
+          __ LoadImmediate(CMPRES1, Smi::RawValue(field_length));
+          __ subu(CMPRES1, TMP, CMPRES1);
         } else if (RawObject::IsTypedDataClassId(value_cid)) {
           __ lw(TMP, FieldAddress(value_reg, TypedData::length_offset()));
-          __ LoadImmediate(CMPRES, Smi::RawValue(field_length));
-          __ subu(CMPRES, TMP, CMPRES);
+          __ LoadImmediate(CMPRES1, Smi::RawValue(field_length));
+          __ subu(CMPRES1, TMP, CMPRES1);
         } else if (field_cid != kIllegalCid) {
           ASSERT(field_cid != value_cid);
           ASSERT(field_length >= 0);
@@ -1646,11 +1480,11 @@
           ASSERT(field_length == Field::kUnknownFixedLength);
           // Following jump cannot not occur, fall through.
         }
-        __ bne(CMPRES, ZR, fail);
+        __ bne(CMPRES1, ZR, fail);
       }
       __ Bind(&skip_length_check);
     }
-    __ beq(CMPRES, ZR, &ok);
+    __ beq(CMPRES1, ZR, &ok);
 
     __ lw(CMPRES1, field_cid_operand);
     __ BranchNotEqual(CMPRES1, kIllegalCid, fail);
@@ -1684,16 +1518,15 @@
         // Updated field length from regular array.
         __ b(&length_set);
         __ Bind(&no_fixed_length);
-        // TODO(regis): TMP1 may conflict. Revisit.
-        __ LoadImmediate(TMP1, Smi::RawValue(Field::kNoFixedLength));
-        __ sw(TMP1, field_length_operand);
+        __ LoadImmediate(TMP, Smi::RawValue(Field::kNoFixedLength));
+        __ sw(TMP, field_length_operand);
         __ Bind(&length_set);
       }
     } else {
       ASSERT(field_reg != kNoRegister);
-      __ LoadImmediate(TMP1, value_cid);
-      __ sw(TMP1, field_cid_operand);
-      __ sw(TMP1, field_nullability_operand);
+      __ LoadImmediate(TMP, value_cid);
+      __ sw(TMP, field_cid_operand);
+      __ sw(TMP, field_nullability_operand);
       if (field_has_length) {
         ASSERT(value_cid_reg != kNoRegister);
         if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
@@ -1722,18 +1555,18 @@
     }
     if (value_cid == kDynamicCid) {
       // Field's guarded class id is fixed by value's class id is not known.
-      __ andi(CMPRES, value_reg, Immediate(kSmiTagMask));
+      __ andi(CMPRES1, value_reg, Immediate(kSmiTagMask));
 
       if (field_cid != kSmiCid) {
-        __ beq(CMPRES, ZR, fail);
+        __ beq(CMPRES1, ZR, fail);
         __ LoadClassId(value_cid_reg, value_reg);
-        __ LoadImmediate(TMP1, field_cid);
-        __ subu(CMPRES, value_cid_reg, TMP1);
+        __ LoadImmediate(TMP, field_cid);
+        __ subu(CMPRES1, value_cid_reg, TMP);
       }
 
       if (field_has_length) {
         // Jump when Value CID != Field guard CID
-        __ bne(CMPRES, ZR, fail);
+        __ bne(CMPRES1, ZR, fail);
         // Classes are same, perform guarded list length check.
         ASSERT(field_reg != kNoRegister);
         ASSERT(value_cid_reg != kNoRegister);
@@ -1748,20 +1581,20 @@
           __ lw(value_cid_reg,
                 FieldAddress(value_reg, TypedData::length_offset()));
         }
-        __ lw(TMP1, field_length_operand);
-        __ subu(CMPRES, value_cid_reg, TMP1);
+        __ lw(TMP, field_length_operand);
+        __ subu(CMPRES1, value_cid_reg, TMP);
       }
 
       if (field().is_nullable() && (field_cid != kNullCid)) {
-        __ beq(CMPRES, ZR, &ok);
+        __ beq(CMPRES1, ZR, &ok);
         __ LoadImmediate(TMP, reinterpret_cast<int32_t>(Object::null()));
-        __ subu(CMPRES, value_reg, TMP);
+        __ subu(CMPRES1, value_reg, TMP);
       }
 
       if (ok_is_fall_through) {
-        __ bne(CMPRES, ZR, fail);
+        __ bne(CMPRES1, ZR, fail);
       } else {
-        __ beq(CMPRES, ZR, &ok);
+        __ beq(CMPRES1, ZR, &ok);
       }
     } else {
       // Both value's and field's class id is known.
@@ -1780,10 +1613,10 @@
           __ lw(value_cid_reg,
                 FieldAddress(value_reg, TypedData::length_offset()));
         }
-        __ LoadImmediate(TMP1, Smi::RawValue(field_length));
-        __ subu(CMPRES, value_cid_reg, TMP1);
+        __ LoadImmediate(TMP, Smi::RawValue(field_length));
+        __ subu(CMPRES1, value_cid_reg, TMP);
         if (ok_is_fall_through) {
-          __ bne(CMPRES, ZR, fail);
+          __ bne(CMPRES1, ZR, fail);
         }
       } else {
         // Nothing to emit.
@@ -2002,10 +1835,10 @@
   // (or null).
   // A runtime call to instantiate the type is required.
   __ addiu(SP, SP, Immediate(-3 * kWordSize));
-  __ LoadObject(TMP1, Object::ZoneHandle());
-  __ sw(TMP1, Address(SP, 2 * kWordSize));  // Make room for the result.
-  __ LoadObject(TMP1, type());
-  __ sw(TMP1, Address(SP, 1 * kWordSize));
+  __ LoadObject(TMP, Object::ZoneHandle());
+  __ sw(TMP, Address(SP, 2 * kWordSize));  // Make room for the result.
+  __ LoadObject(TMP, type());
+  __ sw(TMP, Address(SP, 1 * kWordSize));
   // Push instantiator type arguments.
   __ sw(instantiator_reg, Address(SP, 0 * kWordSize));
 
@@ -2056,10 +1889,10 @@
   // Instantiate non-null type arguments.
   // A runtime call to instantiate the type arguments is required.
   __ addiu(SP, SP, Immediate(-3 * kWordSize));
-  __ LoadObject(TMP1, Object::ZoneHandle());
-  __ sw(TMP1, Address(SP, 2 * kWordSize));  // Make room for the result.
-  __ LoadObject(TMP1, type_arguments());
-  __ sw(TMP1, Address(SP, 1 * kWordSize));
+  __ LoadObject(TMP, Object::ZoneHandle());
+  __ sw(TMP, Address(SP, 2 * kWordSize));  // Make room for the result.
+  __ LoadObject(TMP, type_arguments());
+  __ sw(TMP, Address(SP, 1 * kWordSize));
   // Push instantiator type arguments.
   __ sw(instantiator_reg, Address(SP, 0 * kWordSize));
 
@@ -2202,8 +2035,8 @@
   __ TraceSimMsg("CloneContextInstr");
 
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ LoadObject(TMP1, Object::ZoneHandle());  // Make room for the result.
-  __ sw(TMP1, Address(SP, 1 * kWordSize));
+  __ LoadObject(TMP, Object::ZoneHandle());  // Make room for the result.
+  __ sw(TMP, Address(SP, 1 * kWordSize));
   __ sw(context_value, Address(SP, 0 * kWordSize));
 
   compiler->GenerateRuntimeCall(token_pos(),
@@ -2230,11 +2063,11 @@
                                 catch_handler_types_,
                                 needs_stacktrace());
   // Restore pool pointer.
-  __ GetNextPC(CMPRES, TMP);
+  __ GetNextPC(CMPRES1, TMP);
   const intptr_t object_pool_pc_dist =
      Instructions::HeaderSize() - Instructions::object_pool_offset() +
      compiler->assembler()->CodeSize() - 1 * Instr::kInstrSize;
-  __ LoadFromOffset(PP, CMPRES, -object_pool_pc_dist);
+  __ LoadFromOffset(PP, CMPRES1, -object_pool_pc_dist);
 
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -2310,9 +2143,9 @@
   CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
-  __ LoadImmediate(TMP1, Isolate::Current()->stack_limit_address());
+  __ LoadImmediate(TMP, Isolate::Current()->stack_limit_address());
 
-  __ lw(CMPRES1, Address(TMP1));
+  __ lw(CMPRES1, Address(TMP));
   __ BranchUnsignedLessEqual(SP, CMPRES1, slow_path->entry_label());
   if (compiler->CanOSRFunction() && in_loop()) {
     Register temp = locs()->temp(0).reg();
@@ -2362,8 +2195,8 @@
     } else {
       if (!is_truncating) {
         // Check for overflow (preserve left).
-        __ sll(TMP1, left, value);
-        __ sra(CMPRES1, TMP1, value);
+        __ sll(TMP, left, value);
+        __ sra(CMPRES1, TMP, value);
         __ bne(CMPRES1, left, deopt);  // Overflow.
       }
       // Shift for result now we know there is no overflow.
@@ -2413,13 +2246,13 @@
       }
       Label done, is_not_zero;
 
-      __ sltiu(CMPRES,
+      __ sltiu(CMPRES1,
           right, Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
-      __ movz(result, ZR, CMPRES);  // result = right >= kBits ? 0 : result.
-      __ sra(TMP1, right, kSmiTagSize);
-      __ sllv(TMP1, left, TMP1);
+      __ movz(result, ZR, CMPRES1);  // result = right >= kBits ? 0 : result.
+      __ sra(TMP, right, kSmiTagSize);
+      __ sllv(TMP, left, TMP);
       // result = right < kBits ? left << right : result.
-      __ movn(result, TMP1, CMPRES);
+      __ movn(result, TMP, CMPRES1);
     } else {
       __ sra(TMP, right, kSmiTagSize);
       __ sllv(result, left, TMP);
@@ -2461,6 +2294,13 @@
     summary->set_out(Location::RequiresRegister());
     return summary;
   }
+  if (op_kind() == Token::kMOD) {
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::RequiresRegister());
+    summary->AddTemp(Location::RequiresRegister());
+    summary->set_out(Location::RequiresRegister());
+    return summary;
+  }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
   if (((op_kind() == Token::kSHL) && !is_truncating()) ||
@@ -2502,8 +2342,8 @@
         if (deopt == NULL) {
           __ AddImmediate(result, left, -imm);
         } else {
-          __ SubImmediateDetectOverflow(result, left, imm, CMPRES);
-          __ bltz(CMPRES, deopt);
+          __ SubImmediateDetectOverflow(result, left, imm, CMPRES1);
+          __ bltz(CMPRES1, deopt);
         }
         break;
       }
@@ -2512,8 +2352,8 @@
           __ AddImmediate(result, left, imm);
         } else {
           Register temp = locs()->temp(0).reg();
-          __ AddImmediateDetectOverflow(result, left, imm, CMPRES, temp);
-          __ bltz(CMPRES, deopt);
+          __ AddImmediateDetectOverflow(result, left, imm, CMPRES1, temp);
+          __ bltz(CMPRES1, deopt);
         }
         break;
       }
@@ -2524,8 +2364,8 @@
           if (value == 2) {
             __ sll(result, left, 1);
           } else {
-            __ LoadImmediate(TMP1, value);
-            __ mult(left, TMP1);
+            __ LoadImmediate(TMP, value);
+            __ mult(left, TMP);
             __ mflo(result);
           }
         } else {
@@ -2533,12 +2373,12 @@
             __ sra(CMPRES2, left, 31);  // CMPRES2 = sign of left.
             __ sll(result, left, 1);
           } else {
-            __ LoadImmediate(TMP1, value);
-            __ mult(left, TMP1);
+            __ LoadImmediate(TMP, value);
+            __ mult(left, TMP);
             __ mflo(result);
             __ mfhi(CMPRES2);
           }
-          __ sra(CMPRES, result, 31);
+          __ sra(CMPRES1, result, 31);
           __ bne(CMPRES1, CMPRES2, deopt);
         }
         break;
@@ -2579,8 +2419,8 @@
         if (Utils::IsUint(kImmBits, imm)) {
           __ andi(result, left, Immediate(imm));
         } else {
-          __ LoadImmediate(TMP1, imm);
-          __ and_(result, left, TMP1);
+          __ LoadImmediate(TMP, imm);
+          __ and_(result, left, TMP);
         }
         break;
       }
@@ -2589,8 +2429,8 @@
         if (Utils::IsUint(kImmBits, imm)) {
           __ ori(result, left, Immediate(imm));
         } else {
-          __ LoadImmediate(TMP1, imm);
-          __ or_(result, left, TMP1);
+          __ LoadImmediate(TMP, imm);
+          __ or_(result, left, TMP);
         }
         break;
       }
@@ -2599,8 +2439,8 @@
         if (Utils::IsUint(kImmBits, imm)) {
           __ xori(result, left, Immediate(imm));
         } else {
-          __ LoadImmediate(TMP1, imm);
-          __ xor_(result, left, TMP1);
+          __ LoadImmediate(TMP, imm);
+          __ xor_(result, left, TMP);
         }
         break;
       }
@@ -2645,8 +2485,8 @@
         __ addu(result, left, right);
       } else {
         Register temp = locs()->temp(0).reg();
-        __ AdduDetectOverflow(result, left, right, CMPRES, temp);
-        __ bltz(CMPRES, deopt);
+        __ AdduDetectOverflow(result, left, right, CMPRES1, temp);
+        __ bltz(CMPRES1, deopt);
       }
       break;
     }
@@ -2655,8 +2495,8 @@
       if (deopt == NULL) {
         __ subu(result, left, right);
       } else {
-        __ SubuDetectOverflow(result, left, right, CMPRES);
-        __ bltz(CMPRES, deopt);
+        __ SubuDetectOverflow(result, left, right, CMPRES1);
+        __ bltz(CMPRES1, deopt);
       }
       break;
     }
@@ -2701,6 +2541,33 @@
       __ SmiTag(result);
       break;
     }
+    case Token::kMOD: {
+      // Handle divide by zero in runtime.
+      __ beq(right, ZR, deopt);
+      Register temp = locs()->temp(0).reg();
+      __ sra(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+      __ sra(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ div(temp, TMP);
+      __ mfhi(result);
+      //  res = left % right;
+      //  if (res < 0) {
+      //    if (right < 0) {
+      //      res = res - right;
+      //    } else {
+      //      res = res + right;
+      //    }
+      //  }
+      Label done, subtract;
+      __ bgez(result, &done);
+      __ bltz(right, &subtract);
+      __ addu(result, result, TMP);
+      __ b(&done);
+      __ Bind(&subtract);
+      __ subu(result, result, TMP);
+      __ Bind(&done);
+      __ SmiTag(result);
+      break;
+    }
     case Token::kSHR: {
       Register temp = locs()->temp(0).reg();
       if (CanDeoptimize()) {
@@ -2729,11 +2596,6 @@
       UNREACHABLE();
       break;
     }
-    case Token::kMOD: {
-      // TODO(srdjan): Implement.
-      UNREACHABLE();
-      break;
-    }
     case Token::kOR:
     case Token::kAND: {
       // Flow graph builder has dissected this operation to guarantee correct
@@ -2769,14 +2631,14 @@
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   if (left_cid == kSmiCid) {
-    __ andi(CMPRES, right, Immediate(kSmiTagMask));
+    __ andi(CMPRES1, right, Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
-    __ andi(CMPRES, left, Immediate(kSmiTagMask));
+    __ andi(CMPRES1, left, Immediate(kSmiTagMask));
   } else {
     __ or_(TMP, left, right);
-    __ andi(CMPRES, TMP, Immediate(kSmiTagMask));
+    __ andi(CMPRES1, TMP, Immediate(kSmiTagMask));
   }
-  __ beq(CMPRES, ZR, deopt);
+  __ beq(CMPRES1, ZR, deopt);
 }
 
 
@@ -2872,8 +2734,8 @@
     Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
     Label is_smi, done;
 
-    __ andi(CMPRES, value, Immediate(kSmiTagMask));
-    __ beq(CMPRES, ZR, &is_smi);
+    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+    __ beq(CMPRES1, ZR, &is_smi);
     __ LoadClassId(CMPRES1, value);
     __ BranchNotEqual(CMPRES1, kDoubleCid, deopt);
     __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
@@ -3331,8 +3193,8 @@
     case Token::kNEGATE: {
       Label* deopt = compiler->AddDeoptStub(deopt_id(),
                                             kDeoptUnaryOp);
-      __ SubuDetectOverflow(result, ZR, value, CMPRES);
-      __ bltz(CMPRES, deopt);
+      __ SubuDetectOverflow(result, ZR, value, CMPRES1);
+      __ bltz(CMPRES1, deopt);
       break;
     }
     case Token::kBIT_NOT:
@@ -3414,8 +3276,8 @@
   Label do_call, done;
   // Check for overflow and that it fits into Smi.
   __ LoadImmediate(TMP, 0xC0000000);
-  __ subu(CMPRES, result, TMP);
-  __ bltz(CMPRES, &do_call);
+  __ subu(CMPRES1, result, TMP);
+  __ bltz(CMPRES1, &do_call);
   __ SmiTag(result);
   __ b(&done);
   __ Bind(&do_call);
@@ -3456,8 +3318,8 @@
 
   // Check for overflow and that it fits into Smi.
   __ LoadImmediate(TMP, 0xC0000000);
-  __ subu(CMPRES, result, TMP);
-  __ bltz(CMPRES, deopt);
+  __ subu(CMPRES1, result, TMP);
+  __ bltz(CMPRES1, deopt);
   __ SmiTag(result);
 }
 
@@ -3535,6 +3397,82 @@
 }
 
 
+LocationSummary* MergedMathInstr::MakeLocationSummary() const {
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    const intptr_t kNumInputs = 2;
+    const intptr_t kNumTemps = 3;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::RequiresRegister());
+    summary->set_temp(0, Location::RequiresRegister());
+    summary->set_temp(1, Location::RequiresRegister());  // result_div.
+    summary->set_temp(2, Location::RequiresRegister());  // result_mod.
+    summary->set_out(Location::RequiresRegister());
+    return summary;
+  }
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+  }
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    Register left = locs()->in(0).reg();
+    Register right = locs()->in(1).reg();
+    Register result = locs()->out().reg();
+    Register temp = locs()->temp(0).reg();
+    Register result_div = locs()->temp(1).reg();
+    Register result_mod = locs()->temp(2).reg();
+    // Handle divide by zero in runtime.
+    __ beq(right, ZR, deopt);
+    __ sra(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+    __ sra(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+    __ div(temp, TMP);
+    __ mflo(result_div);
+    __ mfhi(result_mod);
+    // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+    // case we cannot tag the result.
+    __ BranchEqual(result_div, 0x40000000, deopt);
+    //  res = left % right;
+    //  if (res < 0) {
+    //    if (right < 0) {
+    //      res = res - right;
+    //    } else {
+    //      res = res + right;
+    //    }
+    //  }
+    Label done, subtract;
+    __ bgez(result_mod, &done);
+    __ bltz(right, &subtract);
+    __ addu(result_mod, result_mod, TMP);
+    __ b(&done);
+    __ Bind(&subtract);
+    __ subu(result_mod, result_mod, TMP);
+    __ Bind(&done);
+
+    __ SmiTag(result_div);
+    __ SmiTag(result_mod);
+    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)));
+    // Note that index is expected smi-tagged, (i.e, times 2) for all arrays.
+    // [0]: divide resut, [1]: mod result.
+    __ LoadImmediate(temp,
+        FlowGraphCompiler::DataOffsetFor(kArrayCid) - kHeapObjectTag);
+    __ addu(temp, result, temp);
+    Address div_result_address(temp, 0);
+    Address mod_result_address(temp, kWordSize);
+    __ StoreIntoObjectNoBarrier(result, div_result_address, result_div);
+    __ StoreIntoObjectNoBarrier(result, mod_result_address, result_mod);
+    return;
+  }
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const {
   return MakeCallSummary();
 }
@@ -3621,23 +3559,23 @@
   Label is_ok;
   intptr_t cix = 0;
   if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) {
-    __ andi(CMPRES, value, Immediate(kSmiTagMask));
-    __ beq(CMPRES, ZR, &is_ok);
+    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+    __ beq(CMPRES1, ZR, &is_ok);
     cix++;  // Skip first check.
   } else {
-    __ andi(CMPRES, value, Immediate(kSmiTagMask));
-    __ beq(CMPRES, ZR, deopt);
+    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+    __ beq(CMPRES1, ZR, deopt);
   }
   __ 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);
-    __ LoadImmediate(TMP1, unary_checks().GetReceiverClassIdAt(i));
-    __ subu(CMPRES, temp, TMP1);
+    __ LoadImmediate(TMP, unary_checks().GetReceiverClassIdAt(i));
+    __ subu(CMPRES1, temp, TMP);
     if (i == (num_checks - 1)) {
-      __ bne(CMPRES, ZR, deopt);
+      __ bne(CMPRES1, ZR, deopt);
     } else {
-      __ beq(CMPRES, ZR, &is_ok);
+      __ beq(CMPRES1, ZR, &is_ok);
     }
   }
   __ Bind(&is_ok);
@@ -3857,54 +3795,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;
-    default:
-      OS::Print("Error: Condition not recognized: %d\n", condition);
-      UNIMPLEMENTED();
-      return EQ;
-  }
-}
-
-
-void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
-                                           bool value) {
-  __ TraceSimMsg("ControlInstruction::EmitBranchOnValue");
-  if (value && !compiler->CanFallThroughTo(true_successor())) {
-    __ b(compiler->GetJumpLabel(true_successor()));
-  } else if (!value && !compiler->CanFallThroughTo(false_successor())) {
-    __ b(compiler->GetJumpLabel(false_successor()));
-  }
-}
-
-
-// The comparison result is in CMPRES.
-void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
-                                               Condition true_condition) {
-  __ TraceSimMsg("ControlInstruction::EmitBranchOnCondition");
-  if (compiler->CanFallThroughTo(false_successor())) {
-    // If the next block is the false successor, fall through to it.
-    Label* label = compiler->GetJumpLabel(true_successor());
-    EmitBranchAfterCompare(compiler, true_condition, label);
-  } else {
-    // If the next block is not the false successor, branch to it.
-    Condition false_condition = NegateCondition(true_condition);
-    Label* label = compiler->GetJumpLabel(false_successor());
-    EmitBranchAfterCompare(compiler, false_condition, label);
-    // Fall through or jump to the true successor.
-    if (!compiler->CanFallThroughTo(true_successor())) {
-      __ b(compiler->GetJumpLabel(true_successor()));
-    }
-  }
-}
-
-
 LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
@@ -3920,58 +3810,74 @@
 LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
+  if (needs_number_check()) {
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    locs->set_in(0, Location::RegisterLocation(A0));
+    locs->set_in(1, Location::RegisterLocation(A1));
+    locs->set_out(Location::RegisterLocation(A0));
+    return locs;
+  }
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
   locs->set_out(Location::RequiresRegister());
   return locs;
 }
 
 
+static void EmitStrictComparison(FlowGraphCompiler* compiler,
+                                 StrictCompareInstr* compare,
+                                 BranchLabels labels) {
+  LocationSummary* locs = compare->locs();
+  bool needs_number_check = compare->needs_number_check();
+  intptr_t token_pos = compare->token_pos();
+  Token::Kind kind = compare->kind();
+  Location left = locs->in(0);
+  Location right = locs->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                       right.reg(),
+                                       needs_number_check,
+                                       token_pos);
+  }
+  Condition true_condition = (kind == Token::kEQ_STRICT) ? EQ : NE;
+  EmitBranchOnCondition(compiler, true_condition, labels);
+}
+
 // Special code for numbers (compare values instead of references.)
 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("StrictCompareInstr");
   __ Comment("StrictCompareInstr");
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    __ LoadObject(locs()->out().reg(), Bool::Get(result));
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                       right.reg(),
-                                       needs_number_check(),
-                                       token_pos());
-  }
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
+  EmitStrictComparison(compiler, this, labels);
 
   Register result = locs()->out().reg();
-  Label load_true, done;
-  if (kind() == Token::kEQ_STRICT) {
-    __ beq(CMPRES1, CMPRES2, &load_true);
-  } else {
-    ASSERT(kind() == Token::kNE_STRICT);
-    __ bne(CMPRES1, CMPRES2, &load_true);
-  }
+  Label done;
+  __ Bind(&is_false);
   __ LoadObject(result, Bool::False());
   __ b(&done);
-  __ Bind(&load_true);
+  __ Bind(&is_true);
   __ LoadObject(result, Bool::True());
   __ Bind(&done);
 }
@@ -3981,35 +3887,10 @@
                                         BranchInstr* branch) {
   __ TraceSimMsg("StrictCompareInstr::EmitBranchCode");
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    branch->EmitBranchOnValue(compiler, result);
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                        right.reg(),
-                                        needs_number_check(),
-                                        token_pos());
-  }
 
-  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQ : NE;
-  branch->EmitBranchOnCondition(compiler, true_condition);
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  EmitStrictComparison(compiler, this, labels);
 }
 
 
@@ -4025,9 +3906,9 @@
   Register result = locs()->out().reg();
 
   __ LoadObject(result, Bool::True());
-  __ LoadObject(TMP1, Bool::False());
-  __ subu(CMPRES, value, result);
-  __ movz(result, TMP1, CMPRES);  // If value is True, move False into result.
+  __ LoadObject(TMP, Bool::False());
+  __ subu(CMPRES1, value, result);
+  __ movz(result, TMP, CMPRES1);  // If value is True, move False into result.
 }
 
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index e2dfa5d..055ba3c 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -123,21 +123,6 @@
 }
 
 
-static bool BindsToSmiConstant(Value* val, intptr_t* smi_value) {
-  if (!val->BindsToConstant()) {
-    return false;
-  }
-
-  const Object& bound_constant = val->BoundConstant();
-  if (!bound_constant.IsSmi()) {
-    return false;
-  }
-
-  *smi_value = Smi::Cast(bound_constant).Value();
-  return true;
-}
-
-
 // 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)) ||
@@ -145,39 +130,17 @@
 }
 
 
-bool IfThenElseInstr::IsSupported() {
-  return true;
-}
-
-
-bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
-                               Value* v1,
-                               Value* v2) {
-  if (!(comparison->IsStrictCompare() &&
-        !comparison->AsStrictCompare()->needs_number_check()) &&
-      !(comparison->IsEqualityCompare() &&
-        (comparison->AsEqualityCompare()->operation_cid() == kSmiCid))) {
-    return false;
-  }
-
-  intptr_t v1_value, v2_value;
-
-  if (!BindsToSmiConstant(v1, &v1_value) ||
-      !BindsToSmiConstant(v2, &v2_value)) {
-    return false;
-  }
-
-  return false;
-}
-
-
 LocationSummary* IfThenElseInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
   // TODO(vegorov): support byte register constraints in the register allocator.
   locs->set_out(Location::RegisterLocation(RDX));
   return locs;
@@ -190,18 +153,6 @@
 
   Location left = locs()->in(0);
   Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(srdjan): Determine why this instruction was not eliminated.
-    bool result = (left.constant().raw() == right.constant().raw());
-    if ((kind_ == Token::kNE_STRICT) || (kind_ == Token::kNE)) {
-      result = !result;
-    }
-    __ LoadImmediate(locs()->out().reg(),
-            Immediate(reinterpret_cast<int64_t>(
-                Smi::New(result ? if_true_ : if_false_))), PP);
-    return;
-  }
-
   ASSERT(!left.IsConstant() || !right.IsConstant());
 
   // Clear upper part of the out register. We are going to use setcc on it
@@ -407,89 +358,8 @@
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
-  if (IsCheckedStrictEqual()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresRegister());
-    locs->set_in(1, Location::RequiresRegister());
-    locs->set_temp(0, Location::RequiresRegister());
-    locs->set_out(Location::RequiresRegister());
-    return locs;
-  }
-  if (IsPolymorphic()) {
-    const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-    locs->set_in(0, Location::RegisterLocation(RCX));
-    locs->set_in(1, Location::RegisterLocation(RDX));
-    locs->set_temp(0, Location::RegisterLocation(RBX));
-    locs->set_out(Location::RegisterLocation(RAX));
-    return locs;
-  }
-  const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_in(0, Location::RegisterLocation(RCX));
-  locs->set_in(1, Location::RegisterLocation(RDX));
-  locs->set_temp(0, Location::RegisterLocation(RBX));
-  locs->set_out(Location::RegisterLocation(RAX));
-  return locs;
-}
-
-
-static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos,
-                                       Token::Kind kind,
-                                       LocationSummary* locs,
-                                       const ICData& original_ic_data) {
-  if (!compiler->is_optimizing()) {
-    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
-                                   deopt_id,
-                                   token_pos);
-  }
-  const int kNumberOfArguments = 2;
-  const Array& kNoArgumentNames = Object::null_array();
-  const int kNumArgumentsChecked = 2;
-
-  ICData& equality_ic_data = ICData::ZoneHandle(original_ic_data.raw());
-  if (compiler->is_optimizing() && FLAG_propagate_ic_data) {
-    ASSERT(!original_ic_data.IsNull());
-    if (original_ic_data.NumberOfChecks() == 0) {
-      // IC call for reoptimization populates original ICData.
-      equality_ic_data = original_ic_data.raw();
-    } else {
-      // Megamorphic call.
-      equality_ic_data = original_ic_data.AsUnaryClassChecks();
-    }
-  } else {
-    const Array& arguments_descriptor =
-        Array::Handle(ArgumentsDescriptor::New(kNumberOfArguments,
-                                               kNoArgumentNames));
-    equality_ic_data = ICData::New(compiler->parsed_function().function(),
-                                   Symbols::EqualOperator(),
-                                   arguments_descriptor,
-                                   deopt_id,
-                                   kNumArgumentsChecked);
-  }
-  compiler->GenerateInstanceCall(deopt_id,
-                                 token_pos,
-                                 kNumberOfArguments,
-                                 kNoArgumentNames,
-                                 locs,
-                                 equality_ic_data);
-  if (kind == Token::kNE) {
-    Label true_label, done;
-    // Negate the condition: true label returns false and vice versa.
-    __ CompareObject(RAX, Bool::True(), PP);
-    __ j(EQUAL, &true_label, Assembler::kNearJump);
-    __ LoadObject(RAX, Bool::True(), PP);
-    __ jmp(&done, Assembler::kNearJump);
-    __ Bind(&true_label);
-    __ LoadObject(RAX, Bool::False(), PP);
-    __ Bind(&done);
-  }
+  UNREACHABLE();
+  return NULL;
 }
 
 
@@ -512,164 +382,6 @@
 }
 
 
-static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
-                                          const ICData& orig_ic_data,
-                                          LocationSummary* locs,
-                                          BranchInstr* branch,
-                                          Token::Kind kind,
-                                          intptr_t deopt_id,
-                                          intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  ASSERT(ic_data.NumberOfChecks() > 0);
-  ASSERT(ic_data.num_args_tested() == 1);
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  Register temp = locs->temp(0).reg();
-  LoadValueCid(compiler, temp, left,
-               (ic_data.GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
-  // 'temp' contains class-id of the left argument.
-  ObjectStore* object_store = Isolate::Current()->object_store();
-  Condition cond = TokenKindToSmiCondition(kind);
-  Label done;
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    // Assert that the Smi is at position 0, if at all.
-    ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
-    Label next_test;
-    __ CompareImmediate(temp, Immediate(ic_data.GetReceiverClassIdAt(i)), PP);
-    if (i < len - 1) {
-      __ j(NOT_EQUAL, &next_test);
-    } else {
-      __ j(NOT_EQUAL, deopt);
-    }
-    const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(i));
-    if (target.Owner() == object_store->object_class()) {
-      // Object.== is same as ===.
-      __ Drop(2);
-      __ cmpq(left, right);
-      if (branch != NULL) {
-        branch->EmitBranchOnCondition(compiler, cond);
-      } else {
-        // This case should be rare.
-        Register result = locs->out().reg();
-        Label load_true;
-        __ j(cond, &load_true, Assembler::kNearJump);
-        __ LoadObject(result, Bool::False(), PP);
-        __ jmp(&done);
-        __ Bind(&load_true);
-        __ LoadObject(result, Bool::True(), PP);
-      }
-    } else {
-      const int kNumberOfArguments = 2;
-      const Array& kNoArgumentNames = Object::null_array();
-      compiler->GenerateStaticCall(deopt_id,
-                                   token_pos,
-                                   target,
-                                   kNumberOfArguments,
-                                   kNoArgumentNames,
-                                   locs);
-      if (branch == NULL) {
-        if (kind == Token::kNE) {
-          Label false_label;
-          __ CompareObject(RAX, Bool::True(), PP);
-          __ j(EQUAL, &false_label, Assembler::kNearJump);
-          __ LoadObject(RAX, Bool::True(), PP);
-          __ jmp(&done);
-          __ Bind(&false_label);
-          __ LoadObject(RAX, Bool::False(), PP);
-        }
-      } else {
-        if (branch->is_checked()) {
-          EmitAssertBoolean(RAX, token_pos, deopt_id, locs, compiler);
-        }
-        __ CompareObject(RAX, Bool::True(), PP);
-        branch->EmitBranchOnCondition(compiler, cond);
-      }
-    }
-    if (i < len - 1) {
-      __ jmp(&done);
-      __ Bind(&next_test);
-    }
-  }
-  __ Bind(&done);
-}
-
-
-// Emit code when ICData's targets are all Object == (which is ===).
-static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
-                                   const ICData& orig_ic_data,
-                                   const LocationSummary& locs,
-                                   Token::Kind kind,
-                                   BranchInstr* branch,
-                                   intptr_t deopt_id) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  Register left = locs.in(0).reg();
-  Register right = locs.in(1).reg();
-  Register temp = locs.temp(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
-  __ testq(left, Immediate(kSmiTagMask));
-  __ j(ZERO, deopt);
-  // 'left' is not Smi.
-
-  Label identity_compare;
-  __ CompareObject(right, Object::null_object(), PP);
-  __ j(EQUAL, &identity_compare);
-  __ CompareObject(left, Object::null_object(), PP);
-  __ j(EQUAL, &identity_compare);
-
-  __ LoadClassId(temp, left);
-  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    __ CompareImmediate(temp, Immediate(ic_data.GetReceiverClassIdAt(i)), PP);
-    if (i == (len - 1)) {
-      __ j(NOT_EQUAL, deopt);
-    } else {
-      __ j(EQUAL, &identity_compare);
-    }
-  }
-  __ Bind(&identity_compare);
-  __ cmpq(left, right);
-  if (branch == NULL) {
-    Label done, is_equal;
-    Register result = locs.out().reg();
-    __ j(EQUAL, &is_equal, Assembler::kNearJump);
-    // Not equal.
-    __ LoadObject(result, Bool::Get(kind != Token::kEQ), PP);
-    __ jmp(&done, Assembler::kNearJump);
-    __ Bind(&is_equal);
-    __ LoadObject(result, Bool::Get(kind == Token::kEQ), PP);
-    __ Bind(&done);
-  } else {
-    Condition cond = TokenKindToSmiCondition(kind);
-    branch->EmitBranchOnCondition(compiler, cond);
-  }
-}
-
-
-// First test if receiver is NULL, in which case === is applied.
-// If type feedback was provided (lists of <class-id, target>), do a
-// type by type check (either === or static call to the operator.
-static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
-                                       LocationSummary* locs,
-                                       Token::Kind kind,
-                                       BranchInstr* branch,
-                                       const ICData& ic_data,
-                                       intptr_t deopt_id,
-                                       intptr_t token_pos) {
-  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
-  Register left = locs->in(0).reg();
-  Register right = locs->in(1).reg();
-  __ pushq(left);
-  __ pushq(right);
-  EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
-                                deopt_id, token_pos);
-}
-
-
 static Condition FlipCondition(Condition condition) {
   switch (condition) {
     case EQUAL:         return EQUAL;
@@ -689,10 +401,29 @@
 }
 
 
+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, fall through to it.
+    __ j(true_condition, labels.true_label);
+  } else {
+    // If the next block is not the false successor, branch to it.
+    Condition false_condition = NegateCondition(true_condition);
+    __ j(false_condition, labels.false_label);
+
+    // Fall through or jump to the true successor.
+    if (labels.fall_through != labels.true_label) {
+      __ jmp(labels.true_label);
+    }
+  }
+}
+
+
 static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
                                 const LocationSummary& locs,
                                 Token::Kind kind,
-                                BranchInstr* branch) {
+                                BranchLabels labels) {
   Location left = locs.in(0);
   Location right = locs.in(1);
   ASSERT(!left.IsConstant() || !right.IsConstant());
@@ -709,19 +440,7 @@
   } else {
     __ cmpq(left.reg(), right.reg());
   }
-
-  if (branch != NULL) {
-    branch->EmitBranchOnCondition(compiler, true_condition);
-  } else {
-    Register result = locs.out().reg();
-    Label done, is_true;
-    __ j(true_condition, &is_true);
-    __ LoadObject(result, Bool::False(), PP);
-    __ jmp(&done);
-    __ Bind(&is_true);
-    __ LoadObject(result, Bool::True(), PP);
-    __ Bind(&done);
-  }
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
@@ -743,97 +462,93 @@
 static void EmitDoubleComparisonOp(FlowGraphCompiler* compiler,
                                    const LocationSummary& locs,
                                    Token::Kind kind,
-                                   BranchInstr* branch) {
+                                   BranchLabels labels) {
   XmmRegister left = locs.in(0).fpu_reg();
   XmmRegister right = locs.in(1).fpu_reg();
 
+  __ comisd(left, right);
+
   Condition true_condition = TokenKindToDoubleCondition(kind);
-  if (branch != NULL) {
-    compiler->EmitDoubleCompareBranch(
-        true_condition, left, right, branch);
-  } else {
-    compiler->EmitDoubleCompareBool(
-        true_condition, left, right, locs.out().reg());
-  }
+  Label* nan_result = (true_condition == NOT_EQUAL)
+      ? labels.true_label : labels.false_label;
+  __ j(PARITY_EVEN, nan_result);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE));
-  BranchInstr* kNoBranch = NULL;
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
   if (operation_cid() == kSmiCid) {
-    // Deoptimizes if both arguments not Smi.
-    EmitSmiComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kDoubleCid) {
-    // Deoptimizes if both arguments are Smi, or if none is Double or Smi.
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), kNoBranch);
-    return;
-  }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), kNoBranch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), kNoBranch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
-  Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  __ pushq(left);
-  __ pushq(right);
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             kind(),
-                             locs(),
-                             *ic_data());
-  ASSERT(locs()->out().reg() == RAX);
+  Register result = locs()->out().reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False(), PP);
+  __ jmp(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True(), PP);
+  __ Bind(&done);
 }
 
 
 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                           BranchInstr* branch) {
   ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ));
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
   if (operation_cid() == kSmiCid) {
-    // Deoptimizes if both arguments not Smi.
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else  {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  if (operation_cid() == kDoubleCid) {
-    // Deoptimizes if both arguments are Smi, or if none is Double or Smi.
-    EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+}
+
+
+LocationSummary* TestSmiInstr::MakeLocationSummary() const {
+  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;
+}
+
+
+void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // Never emitted outside of the BranchInstr.
+  UNREACHABLE();
+}
+
+
+void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                  BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  Condition branch_condition = (kind() == Token::kNE) ? NOT_ZERO : ZERO;
+  Register left_reg = locs()->in(0).reg();
+  Location right = locs()->in(1);
+  if (right.IsConstant()) {
+    ASSERT(right.constant().IsSmi());
+    const int64_t imm =
+        reinterpret_cast<int64_t>(right.constant().raw());
+    __ TestImmediate(left_reg, Immediate(imm), PP);
+  } else {
+    __ testq(left_reg, right.reg());
   }
-  if (IsCheckedStrictEqual()) {
-    EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), branch,
-                           deopt_id());
-    return;
-  }
-  if (IsPolymorphic()) {
-    EmitGenericEqualityCompare(compiler, locs(), kind(), branch, *ic_data(),
-                               deopt_id(), token_pos());
-    return;
-  }
-  Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  __ pushq(left);
-  __ pushq(right);
-  EmitEqualityAsInstanceCall(compiler,
-                             deopt_id(),
-                             token_pos(),
-                             Token::kEQ,  // kNE reverse occurs at branch.
-                             locs(),
-                             *ic_data());
-  if (branch->is_checked()) {
-    EmitAssertBoolean(RAX, token_pos(), deopt_id(), locs(), compiler);
-  }
-  Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL;
-  __ CompareObject(RAX, Bool::True(), PP);
-  branch->EmitBranchOnCondition(compiler, branch_condition);
+  EmitBranchOnCondition(compiler, branch_condition, labels);
 }
 
 
@@ -863,23 +578,36 @@
 
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), NULL);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), NULL);
+  Register result = locs()->out().reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False(), PP);
+  __ jmp(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True(), PP);
+  __ Bind(&done);
 }
 
 
 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                        BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
   if (operation_cid() == kSmiCid) {
-    EmitSmiComparisonOp(compiler, *locs(), kind(), branch);
-    return;
+    EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+  } else {
+    ASSERT(operation_cid() == kDoubleCid);
+    EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
   }
-  ASSERT(operation_cid() == kDoubleCid);
-  EmitDoubleComparisonOp(compiler, *locs(), kind(), branch);
 }
 
 
@@ -2417,6 +2145,7 @@
       (op_kind() != Token::kTRUNCDIV) &&
       (op_kind() != Token::kSHL) &&
       (op_kind() != Token::kMUL) &&
+      (op_kind() != Token::kMOD) &&
       CanBeImmediate(right_constant->value())) {
     const intptr_t kNumTemps = 0;
     LocationSummary* summary =
@@ -2446,6 +2175,17 @@
       summary->set_temp(0, Location::RegisterLocation(RDX));
     }
     return summary;
+  } else if (op_kind() == Token::kMOD) {
+    const intptr_t kNumTemps = 1;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    // Both inputs must be writable because they will be untagged.
+    summary->set_in(0, Location::RegisterLocation(RDX));
+    summary->set_in(1, Location::WritableRegister());
+    summary->set_out(Location::SameAsFirstInput());
+    // Will be used for sign extension and division.
+    summary->set_temp(0, Location::RegisterLocation(RAX));
+    return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
     LocationSummary* summary =
@@ -2730,6 +2470,67 @@
       __ SmiTag(result);
       break;
     }
+    case Token::kMOD: {
+      Label not_32bit, div_done;
+
+      Register temp = locs()->temp(0).reg();
+      ASSERT(left == RDX);
+      ASSERT((right != RDX) && (right != RAX));
+      ASSERT(temp == RAX);
+      ASSERT(result == RDX);
+      // Handle divide by zero in runtime.
+      __ testq(right, right);
+      __ j(ZERO, deopt);
+      // Check if both operands fit into 32bits as idiv with 64bit operands
+      // requires twice as many cycles and has much higher latency.
+      // We are checking this before untagging them to avoid corner case
+      // dividing INT_MAX by -1 that raises exception because quotient is
+      // too large for 32bit register.
+      __ movsxd(temp, left);
+      __ cmpq(temp, left);
+      __ j(NOT_EQUAL, &not_32bit);
+      __ movsxd(temp, right);
+      __ cmpq(temp, right);
+      __ j(NOT_EQUAL, &not_32bit);
+      // Both operands are 31bit smis. Divide using 32bit idiv.
+      __ SmiUntag(left);
+      __ SmiUntag(right);
+      __ movq(RAX, RDX);
+      __ cdq();
+      __ idivl(right);
+      __ movsxd(result, result);
+      __ jmp(&div_done);
+
+      // Divide using 64bit idiv.
+      __ Bind(&not_32bit);
+      __ SmiUntag(left);
+      __ SmiUntag(right);
+      __ movq(RAX, RDX);
+      __ cqo();  // Sign extend RAX -> RDX:RAX.
+      __ idivq(right);  //  RAX: quotient, RDX: remainder.
+      __ Bind(&div_done);
+      //  res = left % right;
+      //  if (res < 0) {
+      //    if (right < 0) {
+      //      res = res - right;
+      //    } else {
+      //      res = res + right;
+      //    }
+      //  }
+      Label subtract, all_done;
+      __ cmpq(result, Immediate(0));
+      __ j(GREATER_EQUAL, &all_done, Assembler::kNearJump);
+      // Result is negative, adjust it.
+      __ cmpq(right, Immediate(0));
+      __ j(LESS, &subtract, Assembler::kNearJump);
+      __ addq(result, right);
+      __ jmp(&all_done, Assembler::kNearJump);
+      __ Bind(&subtract);
+      __ subq(result, right);
+      __ Bind(&all_done);
+      __ SmiTag(result);
+      break;
+    }
     case Token::kSHR: {
       if (CanDeoptimize()) {
         __ CompareImmediate(right, Immediate(0), PP);
@@ -2759,11 +2560,6 @@
       UNREACHABLE();
       break;
     }
-    case Token::kMOD: {
-      // TODO(srdjan): Implement.
-      UNREACHABLE();
-      break;
-    }
     case Token::kOR:
     case Token::kAND: {
       // Flow graph builder has dissected this operation to guarantee correct
@@ -4246,6 +4042,123 @@
 }
 
 
+LocationSummary* MergedMathInstr::MakeLocationSummary() const {
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    const intptr_t kNumInputs = 2;
+    const intptr_t kNumTemps = 1;
+    LocationSummary* summary =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    // Both inputs must be writable because they will be untagged.
+    summary->set_in(0, Location::RegisterLocation(RAX));
+    summary->set_in(1, Location::WritableRegister());
+    summary->set_out(Location::RequiresRegister());
+    // Will be used for sign extension and division.
+    summary->set_temp(0, Location::RegisterLocation(RDX));
+    return summary;
+  }
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt  = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+  }
+  if (kind() == MergedMathInstr::kTruncDivMod) {
+    Register left = locs()->in(0).reg();
+    Register right = locs()->in(1).reg();
+    Register result = locs()->out().reg();
+    Label not_32bit, done;
+    Register temp = locs()->temp(0).reg();
+    ASSERT(left == RAX);
+    ASSERT((right != RDX) && (right != RAX));
+    ASSERT(temp == RDX);
+    ASSERT((result != RDX) && (result != RAX));
+    // Handle divide by zero in runtime.
+    __ testq(right, right);
+    __ j(ZERO, deopt);
+    // Check if both operands fit into 32bits as idiv with 64bit operands
+    // requires twice as many cycles and has much higher latency.
+    // We are checking this before untagging them to avoid corner case
+    // dividing INT_MAX by -1 that raises exception because quotient is
+    // too large for 32bit register.
+    __ movsxd(temp, left);
+    __ cmpq(temp, left);
+    __ j(NOT_EQUAL, &not_32bit);
+    __ movsxd(temp, right);
+    __ cmpq(temp, right);
+    __ j(NOT_EQUAL, &not_32bit);
+
+    // Both operands are 31bit smis. Divide using 32bit idiv.
+    __ SmiUntag(left);
+    __ SmiUntag(right);
+    __ cdq();
+    __ idivl(right);
+    __ movsxd(RAX, RAX);
+    __ movsxd(RDX, RDX);
+    __ jmp(&done);
+
+    // Divide using 64bit idiv.
+    __ Bind(&not_32bit);
+    __ SmiUntag(left);
+    __ SmiUntag(right);
+    __ cqo();  // Sign extend RAX -> RDX:RAX.
+    __ idivq(right);  //  RAX: quotient, RDX: remainder.
+    // Check the corner case of dividing the 'MIN_SMI' with -1, in which
+    // case we cannot tag the result.
+    __ CompareImmediate(RAX, Immediate(0x4000000000000000), PP);
+    __ j(EQUAL, deopt);
+    __ Bind(&done);
+
+    // Modulo correction (RDX).
+    //  res = left % right;
+    //  if (res < 0) {
+    //    if (right < 0) {
+    //      res = res - right;
+    //    } else {
+    //      res = res + right;
+    //    }
+    //  }
+    Label subtract, all_done;
+    __ cmpq(RDX, Immediate(0));
+    __ j(GREATER_EQUAL, &all_done, Assembler::kNearJump);
+    // Result is negative, adjust it.
+    __ cmpq(right, Immediate(0));
+    __ j(LESS, &subtract, Assembler::kNearJump);
+    __ addq(RDX, right);
+    __ jmp(&all_done, Assembler::kNearJump);
+    __ Bind(&subtract);
+    __ subq(RDX, right);
+    __ Bind(&all_done);
+    __ SmiTag(result);
+
+    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)), PP);
+    const intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(kArrayCid);
+    Address trunc_div_address(
+        FlowGraphCompiler::ElementAddressForIntIndex(kArrayCid,
+                                                     index_scale,
+                                                     result,
+                                                     0));
+    Address mod_address(
+        FlowGraphCompiler::ElementAddressForIntIndex(kArrayCid,
+                                                     index_scale,
+                                                     result,
+                                                     1));
+    __ SmiTag(RAX);
+    __ SmiTag(RDX);
+    __ StoreIntoObjectNoBarrier(result, trunc_div_address, RAX);
+    __ StoreIntoObjectNoBarrier(result, mod_address, RDX);
+    // FLAG_throw_on_javascript_int_overflow: not needed.
+    // Note that the result of an integer division/modulo of two
+    // in-range arguments, cannot create out-of-range result.
+    return;
+  }
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const {
   return MakeCallSummary();
 }
@@ -4570,34 +4483,6 @@
 }
 
 
-void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler,
-                                           bool value) {
-  if (value && !compiler->CanFallThroughTo(true_successor())) {
-    __ jmp(compiler->GetJumpLabel(true_successor()));
-  } else if (!value && !compiler->CanFallThroughTo(false_successor())) {
-    __ jmp(compiler->GetJumpLabel(false_successor()));
-  }
-}
-
-
-void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
-                                               Condition true_condition) {
-  if (compiler->CanFallThroughTo(false_successor())) {
-    // If the next block is the false successor, fall through to it.
-    __ j(true_condition, compiler->GetJumpLabel(true_successor()));
-  } else {
-    // If the next block is not the false successor, branch to it.
-    Condition false_condition = NegateCondition(true_condition);
-    __ j(false_condition, compiler->GetJumpLabel(false_successor()));
-
-    // Fall through or jump to the true successor.
-    if (!compiler->CanFallThroughTo(true_successor())) {
-      __ jmp(compiler->GetJumpLabel(true_successor()));
-    }
-  }
-}
-
-
 LocationSummary* CurrentContextInstr::MakeLocationSummary() const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
@@ -4613,52 +4498,74 @@
 LocationSummary* StrictCompareInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
+  if (needs_number_check()) {
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    locs->set_in(0, Location::RegisterLocation(RAX));
+    locs->set_in(1, Location::RegisterLocation(RCX));
+    locs->set_out(Location::RegisterLocation(RAX));
+    return locs;
+  }
   LocationSummary* locs =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
   locs->set_out(Location::RequiresRegister());
   return locs;
 }
 
 
+static void EmitStrictComparison(FlowGraphCompiler* compiler,
+                                 StrictCompareInstr* compare,
+                                 BranchLabels labels) {
+  LocationSummary* locs = compare->locs();
+  bool needs_number_check = compare->needs_number_check();
+  intptr_t token_pos = compare->token_pos();
+  Token::Kind kind = compare->kind();
+  Location left = locs->in(0);
+  Location right = locs->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check,
+                                          token_pos);
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                        right.reg(),
+                                        needs_number_check,
+                                        token_pos);
+  }
+
+  Condition true_condition = (kind == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
+  EmitBranchOnCondition(compiler, true_condition, labels);
+}
+
+
 // Special code for numbers (compare values instead of references.)
 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    __ LoadObject(locs()->out().reg(), Bool::Get(result), PP);
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                       right.reg(),
-                                       needs_number_check(),
-                                       token_pos());
-  }
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+
+  EmitStrictComparison(compiler, this, labels);
 
   Register result = locs()->out().reg();
-  Label load_true, done;
-  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
-  __ j(true_condition, &load_true, Assembler::kNearJump);
+  Label done;
+  __ Bind(&is_false);
   __ LoadObject(result, Bool::False(), PP);
-  __ jmp(&done, Assembler::kNearJump);
-  __ Bind(&load_true);
+  __ jmp(&done);
+  __ Bind(&is_true);
   __ LoadObject(result, Bool::True(), PP);
   __ Bind(&done);
 }
@@ -4667,35 +4574,10 @@
 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                         BranchInstr* branch) {
   ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
-  Location left = locs()->in(0);
-  Location right = locs()->in(1);
-  if (left.IsConstant() && right.IsConstant()) {
-    // TODO(vegorov): should be eliminated earlier by constant propagation.
-    const bool result = (kind() == Token::kEQ_STRICT) ?
-        left.constant().raw() == right.constant().raw() :
-        left.constant().raw() != right.constant().raw();
-    branch->EmitBranchOnValue(compiler, result);
-    return;
-  }
-  if (left.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(right.reg(),
-                                          left.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else if (right.IsConstant()) {
-    compiler->EmitEqualityRegConstCompare(left.reg(),
-                                          right.constant(),
-                                          needs_number_check(),
-                                          token_pos());
-  } else {
-    compiler->EmitEqualityRegRegCompare(left.reg(),
-                                        right.reg(),
-                                        needs_number_check(),
-                                        token_pos());
-  }
 
-  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
-  branch->EmitBranchOnCondition(compiler, true_condition);
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+
+  EmitStrictComparison(compiler, this, labels);
 }
 
 
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index bfba629..d1605d9 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -16,123 +16,120 @@
 // When adding a new function for intrinsification add a 0 as fingerprint,
 // build and run to get the correct fingerprint from the mismatch error.
 #define CORE_LIB_INTRINSIC_LIST(V)                                             \
-  V(_Smi, ~, Smi_bitNegate, 692936755)                                         \
-  V(_Smi, get:bitLength, Smi_bitLength, 383417456)                             \
-  V(_Double, >, Double_greaterThan, 1187341070)                                \
-  V(_Double, >=, Double_greaterEqualThan, 1770896399)                          \
-  V(_Double, <, Double_lessThan, 1238163699)                                   \
-  V(_Double, <=, Double_lessEqualThan, 467854831)                              \
-  V(_Double, ==, Double_equal, 1917937673)                                     \
-  V(_Double, +, Double_add, 461982313)                                         \
-  V(_Double, -, Double_sub, 1346226222)                                        \
-  V(_Double, *, Double_mul, 18608141)                                          \
-  V(_Double, /, Double_div, 2070118187)                                        \
-  V(_Double, get:isNaN, Double_getIsNaN, 916566322)                            \
-  V(_Double, get:isNegative, Double_getIsNegative, 1711391869)                 \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, 1238321808)               \
-  V(_Double, .fromInteger, Double_fromInteger, 82414734)                       \
-  V(_List, ., List_Allocate, 1436567945)                                       \
-  V(_List, get:length, Array_getLength, 215153395)                             \
-  V(_List, [], Array_getIndexed, 1079829188)                                   \
-  V(_List, []=, Array_setIndexed, 748954698)                                   \
-  V(_GrowableList, .withData, GrowableList_Allocate, 461305701)                \
-  V(_GrowableList, get:length, GrowableList_getLength, 1654225242)             \
-  V(_GrowableList, get:_capacity, GrowableList_getCapacity, 817090003)         \
-  V(_GrowableList, [], GrowableList_getIndexed, 1686777561)                    \
-  V(_GrowableList, []=, GrowableList_setIndexed, 327404102)                    \
-  V(_GrowableList, _setLength, GrowableList_setLength, 1227678442)             \
-  V(_GrowableList, _setData, GrowableList_setData, 1375509957)                 \
-  V(_GrowableList, add, GrowableList_add, 996912766)                           \
-  V(_ImmutableList, [], ImmutableList_getIndexed, 25983597)                    \
-  V(_ImmutableList, get:length, ImmutableList_getLength, 578733070)            \
-  V(Object, ==, Object_equal, 936042315)                                       \
-  V(_StringBase, get:hashCode, String_getHashCode, 654543028)                  \
-  V(_StringBase, get:isEmpty, String_getIsEmpty, 879849436)                    \
-  V(_StringBase, get:length, String_getLength, 1483520063)                     \
+  V(_Smi, ~, Smi_bitNegate, 721565906)                                         \
+  V(_Smi, get:bitLength, Smi_bitLength, 383447247)                             \
+  V(_Double, >, Double_greaterThan, 196653614)                                 \
+  V(_Double, >=, Double_greaterEqualThan, 1420124977)                          \
+  V(_Double, <, Double_lessThan, 1368169970)                                   \
+  V(_Double, <=, Double_lessEqualThan, 117083409)                              \
+  V(_Double, ==, Double_equal, 617620743)                                      \
+  V(_Double, +, Double_add, 1618778505)                                        \
+  V(_Double, -, Double_sub, 355538766)                                         \
+  V(_Double, *, Double_mul, 1175404333)                                        \
+  V(_Double, /, Double_div, 1079430731)                                        \
+  V(_Double, get:isNaN, Double_getIsNaN, 916596113)                            \
+  V(_Double, get:isNegative, Double_getIsNegative, 1711421660)                 \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 1392340623)               \
+  V(_Double, .fromInteger, Double_fromInteger, 2033384877)                     \
+  V(_List, ., List_Allocate, 176587978)                                        \
+  V(_List, get:length, Array_getLength, 215183186)                             \
+  V(_List, [], Array_getIndexed, 675155875)                                    \
+  V(_List, []=, Array_setIndexed, 1228569706)                                  \
+  V(_GrowableList, .withData, GrowableList_Allocate, 264792196)                \
+  V(_GrowableList, get:length, GrowableList_getLength, 1654255033)             \
+  V(_GrowableList, get:_capacity, GrowableList_getCapacity, 817119794)         \
+  V(_GrowableList, [], GrowableList_getIndexed, 1282104248)                    \
+  V(_GrowableList, []=, GrowableList_setIndexed, 807019110)                    \
+  V(_GrowableList, _setLength, GrowableList_setLength, 823005129)              \
+  V(_GrowableList, _setData, GrowableList_setData, 970836644)                  \
+  V(_GrowableList, add, GrowableList_add, 1667349856)                          \
+  V(_ImmutableList, [], ImmutableList_getIndexed, 1768793932)                  \
+  V(_ImmutableList, get:length, ImmutableList_getLength, 578762861)            \
+  V(Object, ==, Object_equal, 1068471689)                                      \
+  V(_StringBase, get:hashCode, String_getHashCode, 654572819)                  \
+  V(_StringBase, get:isEmpty, String_getIsEmpty, 1599468763)                   \
+  V(_StringBase, get:length, String_getLength, 1483549854)                     \
   V(_StringBase, codeUnitAt, String_codeUnitAt, 1958436584)                    \
-  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1236464016)       \
+  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1236493807)       \
   V(_OneByteString, _substringUncheckedNative,                                 \
       OneByteString_substringUnchecked, 25652388)                              \
-  V(_OneByteString, _setAt, OneByteString_setAt, 308408714)                    \
-  V(_OneByteString, _allocate, OneByteString_allocate, 1744068081)             \
-  V(_OneByteString, ==, OneByteString_equality, 1064139944)                    \
-  V(_TwoByteString, ==, TwoByteString_equality, 1616855207)                    \
+  V(_OneByteString, _setAt, OneByteString_setAt, 658941003)                    \
+  V(_OneByteString, _allocate, OneByteString_allocate, 2084097266)             \
+  V(_OneByteString, ==, OneByteString_equality, 1194175975)                    \
+  V(_TwoByteString, ==, TwoByteString_equality, 1746891238)                    \
 
 
 #define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
     740884607)                                                                 \
-  V(_IntegerImplementation, +, Integer_add, 772815665)                         \
+  V(_IntegerImplementation, +, Integer_add, 1875695122)                        \
   V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger,           \
     584777821)                                                                 \
-  V(_IntegerImplementation, -, Integer_sub, 1938559678)                        \
+  V(_IntegerImplementation, -, Integer_sub, 893955487)                         \
   V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
     1757603756)                                                                \
-  V(_IntegerImplementation, *, Integer_mul, 1993715518)                        \
-  V(_IntegerImplementation, remainder, Integer_remainder, 1331308305)          \
+  V(_IntegerImplementation, *, Integer_mul, 949111327)                         \
   V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
     1398988805)                                                                \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 41718791)                 \
-  V(_IntegerImplementation, unary-, Integer_negate, 341268208)                 \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 1011141318)               \
+  V(_IntegerImplementation, unary-, Integer_negate, 145678255)                 \
   V(_IntegerImplementation, _bitAndFromInteger,                                \
     Integer_bitAndFromInteger, 512285096)                                      \
-  V(_IntegerImplementation, &, Integer_bitAnd, 1735910176)                     \
+  V(_IntegerImplementation, &, Integer_bitAnd, 691305985)                      \
   V(_IntegerImplementation, _bitOrFromInteger,                                 \
     Integer_bitOrFromInteger, 333543947)                                       \
-  V(_IntegerImplementation, |, Integer_bitOr, 1120891571)                      \
+  V(_IntegerImplementation, |, Integer_bitOr, 76287380)                        \
   V(_IntegerImplementation, _bitXorFromInteger,                                \
     Integer_bitXorFromInteger, 1746295953)                                     \
-  V(_IntegerImplementation, ^, Integer_bitXor, 21793459)                       \
+  V(_IntegerImplementation, ^, Integer_bitXor, 1124672916)                     \
   V(_IntegerImplementation,                                                    \
     _greaterThanFromInteger,                                                   \
     Integer_greaterThanFromInt, 1883218996)                                    \
-  V(_IntegerImplementation, >, Integer_greaterThan, 253817845)                 \
-  V(_IntegerImplementation, ==, Integer_equal, 1899239372)                     \
+  V(_IntegerImplementation, >, Integer_greaterThan, 1356697302)                \
+  V(_IntegerImplementation, ==, Integer_equal, 1631095021)                     \
   V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger,           \
     111745915)                                                                 \
-  V(_IntegerImplementation, <, Integer_lessThan, 1393706801)                   \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 1022701101)             \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 178259021)           \
-  V(_IntegerImplementation, <<, Integer_shl, 1566363602)                       \
-  V(_IntegerImplementation, >>, Integer_sar, 1845114891)                       \
+  V(_IntegerImplementation, <, Integer_lessThan, 1523713072)                   \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 671929679)              \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 1974971247)          \
+  V(_IntegerImplementation, <<, Integer_shl, 521759411)                        \
+  V(_IntegerImplementation, >>, Integer_sar, 800510700)                        \
   V(_Double, toInt, Double_toInt, 1328149975)
 
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
   V(::, sqrt, Math_sqrt, 465520247)                                            \
-  V(::, sin, Math_sin, 730107143)                                              \
-  V(::, cos, Math_cos, 1282146521)                                             \
-  V(_Random, _nextState, Random_nextState, 1145672271)                         \
+  V(_Random, _nextState, Random_nextState, 1174301422)                         \
 
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
-  V(_TypedList, get:length, TypedData_getLength, 26616328)                     \
-  V(_Int8Array, _new, TypedData_Int8Array_new, 1825804665)                     \
-  V(_Uint8Array, _new, TypedData_Uint8Array_new, 1778042338)                   \
-  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 568753997)      \
-  V(_Int16Array, _new, TypedData_Int16Array_new, 82856584)                     \
-  V(_Uint16Array, _new, TypedData_Uint16Array_new, 1061515393)                 \
-  V(_Int32Array, _new, TypedData_Int32Array_new, 2011561738)                   \
-  V(_Uint32Array, _new, TypedData_Uint32Array_new, 601429759)                  \
-  V(_Int64Array, _new, TypedData_Int64Array_new, 682666769)                    \
-  V(_Uint64Array, _new, TypedData_Uint64Array_new, 388094865)                  \
-  V(_Float32Array, _new, TypedData_Float32Array_new, 1931183334)               \
-  V(_Float64Array, _new, TypedData_Float64Array_new, 2119419798)               \
-  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 435301615)            \
-  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 1734048395)               \
-  V(_Int8Array, ., TypedData_Int8Array_factory, 810750844)                     \
-  V(_Uint8Array, ., TypedData_Uint8Array_factory, 1246070930)                  \
-  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 1882603960)    \
-  V(_Int16Array, ., TypedData_Int16Array_factory, 565702275)                   \
-  V(_Uint16Array, ., TypedData_Uint16Array_factory, 745756560)                 \
-  V(_Int32Array, ., TypedData_Int32Array_factory, 2141385820)                  \
-  V(_Uint32Array, ., TypedData_Uint32Array_factory, 2076467298)                \
-  V(_Int64Array, ., TypedData_Int64Array_factory, 1223523117)                  \
-  V(_Uint64Array, ., TypedData_Uint64Array_factory, 1032112679)                \
-  V(_Float32Array, ., TypedData_Float32Array_factory, 1986018007)              \
-  V(_Float64Array, ., TypedData_Float64Array_factory, 1863852388)              \
-  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1144749257)          \
-  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 1189356537)              \
+  V(_TypedList, get:length, TypedData_getLength, 26646119)                     \
+  V(_Int8Array, _new, TypedData_Int8Array_new, 18350202)                       \
+  V(_Uint8Array, _new, TypedData_Uint8Array_new, 2118071523)                   \
+  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 908783182)      \
+  V(_Int16Array, _new, TypedData_Int16Array_new, 422885769)                    \
+  V(_Uint16Array, _new, TypedData_Uint16Array_new, 1401544578)                 \
+  V(_Int32Array, _new, TypedData_Int32Array_new, 204107275)                    \
+  V(_Uint32Array, _new, TypedData_Uint32Array_new, 941458944)                  \
+  V(_Int64Array, _new, TypedData_Int64Array_new, 1022695954)                   \
+  V(_Uint64Array, _new, TypedData_Uint64Array_new, 728124050)                  \
+  V(_Float32Array, _new, TypedData_Float32Array_new, 123728871)                \
+  V(_Float64Array, _new, TypedData_Float64Array_new, 311965335)                \
+  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 775330800)            \
+  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 2074077580)               \
+  V(_Int8Array, ., TypedData_Int8Array_factory, 545976988)                     \
+  V(_Uint8Array, ., TypedData_Uint8Array_factory, 981297074)                   \
+  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 1617830104)    \
+  V(_Int16Array, ., TypedData_Int16Array_factory, 300928419)                   \
+  V(_Uint16Array, ., TypedData_Uint16Array_factory, 480982704)                 \
+  V(_Int32Array, ., TypedData_Int32Array_factory, 1876611964)                  \
+  V(_Uint32Array, ., TypedData_Uint32Array_factory, 1811693442)                \
+  V(_Int64Array, ., TypedData_Int64Array_factory, 958749261)                   \
+  V(_Uint64Array, ., TypedData_Uint64Array_factory, 767338823)                 \
+  V(_Float32Array, ., TypedData_Float32Array_factory, 1721244151)              \
+  V(_Float64Array, ., TypedData_Float64Array_factory, 1599078532)              \
+  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 879975401)           \
+  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 924582681)               \
 
 
 // TODO(srdjan): Implement _FixedSizeArrayIterator, get:current and
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 63ccb89..e1f820e 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -723,24 +723,6 @@
 }
 
 
-void Intrinsifier::Integer_remainder(Assembler* assembler) {
-  // Check to see if we have integer division
-  Label fall_through;
-  TestBothArgumentsSmis(assembler, &fall_through);
-  // R1: Tagged left (dividend).
-  // R0: Tagged right (divisor).
-  // Check if modulo by zero -> exception thrown in main function.
-  __ cmp(R0, ShifterOperand(0));
-  __ b(&fall_through, EQ);
-  EmitRemainderOperation(assembler);
-  // Untagged remainder result in R1.
-  __ mov(R0, ShifterOperand(R1, LSL, 1));  // Tag result and return.
-  __ Ret();
-
-  __ Bind(&fall_through);
-}
-
-
 void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
   // Check to see if we have integer division
   Label fall_through;
@@ -1321,14 +1303,6 @@
 }
 
 
-void Intrinsifier::Math_sin(Assembler* assembler) {
-}
-
-
-void Intrinsifier::Math_cos(Assembler* assembler) {
-}
-
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 8130965..f222a50 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -730,27 +730,6 @@
 }
 
 
-void Intrinsifier::Integer_remainder(Assembler* assembler) {
-  Label fall_through;
-  TestBothArgumentsSmis(assembler, &fall_through);
-  // EAX: right argument (divisor)
-  __ movl(EBX, EAX);
-  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Left argument (dividend).
-  // EAX: Tagged left (dividend).
-  // EBX: Tagged right (divisor).
-  // Check if modulo by zero -> exception thrown in main function.
-  __ cmpl(EBX, Immediate(0));
-  __ j(EQUAL, &fall_through, Assembler::kNearJump);
-  EmitRemainderOperation(assembler);
-  // Untagged remainder result in EDX.
-  __ movl(EAX, EDX);
-  __ SmiTag(EAX);
-  __ ret();
-
-  __ Bind(&fall_through);
-}
-
-
 void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
@@ -1347,60 +1326,6 @@
 }
 
 
-enum TrigonometricFunctions {
-  kSine,
-  kCosine,
-};
-
-
-static void EmitTrigonometric(Assembler* assembler,
-                              TrigonometricFunctions kind) {
-  Label fall_through, is_smi, double_op;
-  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
-  // Argument is double and is in EAX.
-  __ fldl(FieldAddress(EAX, Double::value_offset()));
-  __ Bind(&double_op);
-  switch (kind) {
-    case kSine:   __ fsin(); break;
-    case kCosine: __ fcos(); break;
-    default:
-      UNREACHABLE();
-  }
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  Label alloc_failed;
-  __ TryAllocate(double_class,
-                 &alloc_failed,
-                 Assembler::kNearJump,
-                 EAX);  // Result register.
-  __ fstpl(FieldAddress(EAX, Double::value_offset()));
-  __ ret();
-
-  __ Bind(&is_smi);  // smi -> double.
-  __ SmiUntag(EAX);
-  __ pushl(EAX);
-  __ filds(Address(ESP, 0));
-  __ popl(EAX);
-  __ jmp(&double_op);
-
-  __ Bind(&alloc_failed);
-  __ ffree(0);
-  __ fincstp();
-
-  __ Bind(&fall_through);
-}
-
-
-void Intrinsifier::Math_sin(Assembler* assembler) {
-  EmitTrigonometric(assembler, kSine);
-}
-
-
-void Intrinsifier::Math_cos(Assembler* assembler) {
-  EmitTrigonometric(assembler, kCosine);
-}
-
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index de170c9..a899a6d 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -31,8 +31,8 @@
   __ lw(T3, Address(SP, kArrayLengthOffset));  // Array length.
 
   // Check that length is a positive Smi.
-  __ andi(CMPRES, T3, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);
+  __ andi(CMPRES1, T3, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);
   __ bltz(T3, &fall_through);
 
   // Check for maximum allowed length.
@@ -56,8 +56,8 @@
   __ LoadImmediate(T3, heap->TopAddress());
   __ lw(T0, Address(T3, 0));  // Potential new object start.
 
-  __ AdduDetectOverflow(T1, T0, T2, CMPRES);  // Potential next object start.
-  __ bltz(CMPRES, &fall_through);  // CMPRES < 0 on overflow.
+  __ AdduDetectOverflow(T1, T0, T2, CMPRES1);  // Potential next object start.
+  __ bltz(CMPRES1, &fall_through);  // CMPRES1 < 0 on overflow.
 
   // Check if the allocation fits into the remaining space.
   // T0: potential new object start.
@@ -90,8 +90,8 @@
 
     // Get the class index and insert it into the tags.
     // T2: size and bit tags.
-    __ LoadImmediate(TMP1, RawObject::ClassIdTag::encode(cls.id()));
-    __ or_(T2, T2, TMP1);
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ or_(T2, T2, TMP);
     __ sw(T2, FieldAddress(T0, Array::tags_offset()));  // Store tags.
   }
 
@@ -150,8 +150,8 @@
 
   __ lw(T0, Address(SP, + 0 * kWordSize));  // Index
 
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);  // Index is not an smi, fall through
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);  // Index is not an smi, fall through
   __ delay_slot()->lw(T1, Address(SP, + 1 * kWordSize));  // Array
 
   // range check
@@ -217,17 +217,17 @@
     __ BranchEqual(T0, Type::ZoneHandle(Type::DynamicType()), &checked_ok);
 
     // Check for int and num.
-    __ andi(CMPRES, T2, Immediate(kSmiTagMask));
-    __ bne(CMPRES, ZR, &fall_through);  // Non-smi value.
+    __ andi(CMPRES1, T2, Immediate(kSmiTagMask));
+    __ bne(CMPRES1, ZR, &fall_through);  // Non-smi value.
 
     __ BranchEqual(T0, Type::ZoneHandle(Type::IntType()), &checked_ok);
     __ BranchNotEqual(T0, Type::ZoneHandle(Type::Number()), &fall_through);
     __ Bind(&checked_ok);
   }
   __ lw(T1, Address(SP, 1 * kWordSize));  // Index.
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
   // Index not Smi.
-  __ bne(CMPRES, ZR, &fall_through);
+  __ bne(CMPRES1, ZR, &fall_through);
 
   __ lw(T0, Address(SP, 2 * kWordSize));  // Array.
   // Range check.
@@ -337,8 +337,8 @@
 
   __ lw(T0, Address(SP, 0 * kWordSize));  // Index
 
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);  // Index is not an smi, fall through
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);  // Index is not an smi, fall through
   __ delay_slot()->lw(T1, Address(SP, 1 * kWordSize));  // Array
 
   // range check
@@ -365,8 +365,8 @@
   }
   Label fall_through;
   __ lw(T1, Address(SP, 1 * kWordSize));  // Index.
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);  // Non-smi index.
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);  // Non-smi index.
   __ delay_slot()->lw(T0, Address(SP, 2 * kWordSize));  // GrowableArray.
   // Range check using _length field.
   __ lw(T2, FieldAddress(T0, GrowableObjectArray::length_offset()));
@@ -392,8 +392,8 @@
 void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
   Label fall_through;
   __ lw(T1, Address(SP, 0 * kWordSize));  // Length value.
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);  // Non-smi length.
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);  // Non-smi length.
   __ delay_slot()->lw(T0, Address(SP, 1 * kWordSize));  // Growable array.
   __ Ret();
   __ delay_slot()->sw(T1,
@@ -411,8 +411,8 @@
   Label fall_through;
   __ lw(T1, Address(SP, 0 * kWordSize));  // Data.
   // Check that data is an ObjectArray.
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
-  __ beq(CMPRES, ZR, &fall_through);  // Data is Smi.
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
+  __ beq(CMPRES1, ZR, &fall_through);  // Data is Smi.
   __ LoadClassId(CMPRES1, T1);
   __ BranchNotEqual(CMPRES1, kArrayCid, &fall_through);
   __ lw(T0, Address(SP, 1 * kWordSize));  // Growable array.
@@ -464,8 +464,8 @@
   __ lw(T2, Address(SP, kArrayLengthStackOffset));  /* Array length. */        \
   /* Check that length is a positive Smi. */                                   \
   /* T2: requested array length argument. */                                   \
-  __ andi(CMPRES, T2, Immediate(kSmiTagMask));                                 \
-  __ bne(CMPRES, ZR, &fall_through);                                           \
+  __ andi(CMPRES1, T2, Immediate(kSmiTagMask));                                \
+  __ bne(CMPRES1, ZR, &fall_through);                                          \
   __ BranchSignedLess(T2, 0, &fall_through);                                   \
   __ SmiUntag(T2);                                                             \
   /* Check for maximum allowed length. */                                      \
@@ -482,8 +482,8 @@
   __ lw(V0, Address(V0, 0));                                                   \
                                                                                \
   /* T2: allocation size. */                                                   \
-  __ AdduDetectOverflow(T1, V0, T2, CMPRES);                                   \
-  __ bltz(CMPRES, &fall_through);                                              \
+  __ AdduDetectOverflow(T1, V0, T2, CMPRES1);                                  \
+  __ bltz(CMPRES1, &fall_through);                                             \
                                                                                \
   /* Check if the allocation fits into the remaining space. */                 \
   /* V0: potential new object start. */                                        \
@@ -588,9 +588,9 @@
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ lw(T1, Address(SP, 1 * kWordSize));
-  __ or_(CMPRES, T0, T1);
-  __ andi(CMPRES, CMPRES, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, not_smi);
+  __ or_(CMPRES1, T0, T1);
+  __ andi(CMPRES1, CMPRES1, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, not_smi);
   return;
 }
 
@@ -599,8 +599,8 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);  // Checks two Smis.
-  __ AdduDetectOverflow(V0, T0, T1, CMPRES);  // Add.
-  __ bltz(CMPRES, &fall_through);  // Fall through on overflow.
+  __ AdduDetectOverflow(V0, T0, T1, CMPRES1);  // Add.
+  __ bltz(CMPRES1, &fall_through);  // Fall through on overflow.
   __ Ret();  // Nothing in branch delay slot.
   __ Bind(&fall_through);
 }
@@ -615,8 +615,8 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ SubuDetectOverflow(V0, T0, T1, CMPRES);  // Subtract.
-  __ bltz(CMPRES, &fall_through);  // Fall through on overflow.
+  __ SubuDetectOverflow(V0, T0, T1, CMPRES1);  // Subtract.
+  __ bltz(CMPRES1, &fall_through);  // Fall through on overflow.
   __ Ret();
   __ Bind(&fall_through);
 }
@@ -626,8 +626,8 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ SubuDetectOverflow(V0, T1, T0, CMPRES);  // Subtract.
-  __ bltz(CMPRES, &fall_through);  // Fall through on overflow.
+  __ SubuDetectOverflow(V0, T1, T0, CMPRES1);  // Subtract.
+  __ bltz(CMPRES1, &fall_through);  // Fall through on overflow.
   __ Ret();  // Nothing in branch delay slot.
   __ Bind(&fall_through);
 }
@@ -706,9 +706,9 @@
   // Test arguments for smi.
   __ lw(T1, Address(SP, 0 * kWordSize));
   __ lw(T0, Address(SP, 1 * kWordSize));
-  __ or_(CMPRES, T0, T1);
-  __ andi(CMPRES, CMPRES, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);
+  __ or_(CMPRES1, T0, T1);
+  __ andi(CMPRES1, CMPRES1, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);
   // T1: Tagged left (dividend).
   // T0: Tagged right (divisor).
   // Check if modulo by zero -> exception thrown in main function.
@@ -736,24 +736,6 @@
 }
 
 
-void Intrinsifier::Integer_remainder(Assembler* assembler) {
-  Label fall_through;
-
-  TestBothArgumentsSmis(assembler, &fall_through);
-  // T1: Tagged left (dividend).
-  // T0: Tagged right (divisor).
-  // Check if modulo by zero -> exception thrown in main function.
-  __ beq(T0, ZR, &fall_through);
-  EmitRemainderOperation(assembler);
-  // Untagged right in T0. Untagged remainder result in V0.
-
-  __ Ret();
-  __ delay_slot()->SmiTag(V0);
-
-  __ Bind(&fall_through);
-}
-
-
 void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
   Label fall_through;
 
@@ -777,10 +759,10 @@
   Label fall_through;
 
   __ lw(T0, Address(SP, + 0 * kWordSize));  // Grabs first argument.
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));  // Test for Smi.
-  __ bne(CMPRES, ZR, &fall_through);  // Fall through if not a Smi.
-  __ SubuDetectOverflow(V0, ZR, T0, CMPRES);
-  __ bltz(CMPRES, &fall_through);  // There was overflow.
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));  // Test for Smi.
+  __ bne(CMPRES1, ZR, &fall_through);  // Fall through if not a Smi.
+  __ SubuDetectOverflow(V0, ZR, T0, CMPRES1);
+  __ bltz(CMPRES1, &fall_through);  // There was overflow.
   __ Ret();
   __ Bind(&fall_through);
 }
@@ -887,8 +869,8 @@
                            Register reg,
                            Label* not_smi_or_mint) {
   Label not_smi, done;
-  __ andi(CMPRES, reg, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &not_smi);
+  __ andi(CMPRES1, reg, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &not_smi);
   __ SmiUntag(reg);
 
   // Sign extend to 64 bit
@@ -1015,9 +997,9 @@
   __ beq(T0, T1, &true_label);
 
   __ or_(T2, T0, T1);
-  __ andi(CMPRES, T2, Immediate(kSmiTagMask));
+  __ andi(CMPRES1, T2, Immediate(kSmiTagMask));
   // If T0 or T1 is not a smi do Mint checks.
-  __ bne(CMPRES, ZR, &check_for_mint);
+  __ bne(CMPRES1, ZR, &check_for_mint);
 
   // Both arguments are smi, '===' is good enough.
   __ LoadObject(V0, Bool::False());
@@ -1030,8 +1012,8 @@
   Label receiver_not_smi;
   __ Bind(&check_for_mint);
 
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &receiver_not_smi);  // Check receiver.
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &receiver_not_smi);  // Check receiver.
 
   // Left (receiver) is Smi, return false if right is not Double.
   // Note that an instance of Mint or Bigint never contains a value that can be
@@ -1048,8 +1030,8 @@
   __ LoadClassId(CMPRES1, T1);
   __ BranchNotEqual(CMPRES1, kMintCid, &fall_through);
   // Receiver is Mint, return false if right is Smi.
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);
   __ LoadObject(V0, Bool::False());
   __ Ret();
   // TODO(srdjan): Implement Mint == Mint comparison.
@@ -1073,8 +1055,8 @@
   __ bltz(T0, &fall_through);
 
   __ LoadImmediate(T2, 0x1F);
-  __ slt(CMPRES, T2, T0);  // CMPRES <- 0x1F < T0 ? 1 : 0
-  __ movn(T0, T2, CMPRES);  // T0 <- 0x1F < T0 ? 0x1F : T0
+  __ slt(CMPRES1, T2, T0);  // CMPRES1 <- 0x1F < T0 ? 1 : 0
+  __ movn(T0, T2, CMPRES1);  // T0 <- 0x1F < T0 ? 0x1F : T0
 
   __ SmiUntag(T1);
   __ srav(V0, T1, T0);
@@ -1104,8 +1086,8 @@
                                      Label* is_smi,
                                      Label* not_double_smi) {
   __ lw(T0, Address(SP, 0 * kWordSize));
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
-  __ beq(CMPRES, ZR, is_smi);
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
+  __ beq(CMPRES1, ZR, is_smi);
   __ LoadClassId(CMPRES1, T0);
   __ BranchNotEqual(CMPRES1, kDoubleCid, not_double_smi);
   // Fall through with Double in T0.
@@ -1246,8 +1228,8 @@
   Label fall_through;
   // Only smis allowed.
   __ lw(T0, Address(SP, 0 * kWordSize));
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);
 
   // Is Smi.
   __ SmiUntag(T0);
@@ -1273,7 +1255,7 @@
   Label fall_through;
 
   __ lw(T0, Address(SP, 0 * kWordSize));
-  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
   __ bne(T0, ZR, &fall_through);
 
   // Is Smi.
@@ -1334,7 +1316,7 @@
   // Check for negative zero by looking at the sign bit.
   __ mfc1(T0, F1);  // Moves bits 32...63 of D0 to T0.
   __ srl(T0, T0, 31);  // Get the sign bit down to bit 0 of T0.
-  __ andi(CMPRES, T0, Immediate(1));  // Check if the bit is set.
+  __ andi(CMPRES1, T0, Immediate(1));  // Check if the bit is set.
   __ bne(T0, ZR, &is_true);  // Sign bit set. True.
   __ b(&is_false);
 }
@@ -1351,8 +1333,8 @@
   Label fall_through;
   // Check for overflow and that it fits into Smi.
   __ LoadImmediate(TMP, 0xC0000000);
-  __ subu(CMPRES, V0, TMP);
-  __ bltz(CMPRES, &fall_through);
+  __ subu(CMPRES1, V0, TMP);
+  __ bltz(CMPRES1, &fall_through);
   __ Ret();
   __ delay_slot()->SmiTag(V0);
   __ Bind(&fall_through);
@@ -1383,14 +1365,6 @@
 }
 
 
-void Intrinsifier::Math_sin(Assembler* assembler) {
-}
-
-
-void Intrinsifier::Math_cos(Assembler* assembler) {
-}
-
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
@@ -1477,7 +1451,7 @@
   __ lw(T0, Address(SP, 1 * kWordSize));  // String.
 
   // Checks.
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
   __ bne(T1, ZR, &fall_through);  // Index is not a Smi.
   __ lw(T2, FieldAddress(T0, String::length_offset()));  // Range check.
   // Runtime throws exception.
@@ -1608,8 +1582,8 @@
   __ lw(V0, Address(T3, 0));
 
   // length_reg: allocation size.
-  __ AdduDetectOverflow(T1, V0, length_reg, CMPRES);
-  __ bltz(CMPRES, failure);  // Fail on overflow.
+  __ AdduDetectOverflow(T1, V0, length_reg, CMPRES1);
+  __ bltz(CMPRES1, failure);  // Fail on overflow.
 
   // Check if the allocation fits into the remaining space.
   // V0: potential new object start.
@@ -1644,8 +1618,8 @@
 
     // Get the class index and insert it into the tags.
     // T2: size and bit tags.
-    __ LoadImmediate(TMP1, RawObject::ClassIdTag::encode(cls.id()));
-    __ or_(T2, T2, TMP1);
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ or_(T2, T2, TMP);
     __ sw(T2, FieldAddress(V0, String::tags_offset()));  // Store tags.
   }
 
@@ -1671,9 +1645,9 @@
 
   __ lw(T2, Address(SP, kEndIndexOffset));
   __ lw(TMP, Address(SP, kStartIndexOffset));
-  __ or_(CMPRES, T2, TMP);
-  __ andi(CMPRES, CMPRES, Immediate(kSmiTagMask));
-  __ bne(CMPRES, ZR, &fall_through);  // 'start', 'end' not Smi.
+  __ or_(CMPRES1, T2, TMP);
+  __ andi(CMPRES1, CMPRES1, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, &fall_through);  // 'start', 'end' not Smi.
 
   __ subu(T2, T2, TMP);
   TryAllocateOnebyteString(assembler, &ok, &fall_through);
@@ -1752,8 +1726,8 @@
   __ beq(T0, T1, &is_true);
 
   // Is other OneByteString?
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
-  __ beq(CMPRES, ZR, &fall_through);  // Other is Smi.
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
+  __ beq(CMPRES1, ZR, &fall_through);  // Other is Smi.
   __ LoadClassId(CMPRES1, T1);  // Class ID check.
   __ BranchNotEqual(CMPRES1, string_cid, &fall_through);
 
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index cd3c79f..f80f856 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -712,24 +712,6 @@
 }
 
 
-void Intrinsifier::Integer_remainder(Assembler* assembler) {
-  Label fall_through;
-  TestBothArgumentsSmis(assembler, &fall_through);
-  // RAX: right argument (divisor)
-  __ movq(RCX, RAX);
-  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left argument (dividend).
-  // RAX: Tagged left (dividend).
-  // RCX: Tagged right (divisor).
-  __ cmpq(RCX, Immediate(0));
-  __ j(EQUAL, &fall_through);
-  EmitRemainderOperation(assembler);
-  // Untagged remainder result in RAX.
-  __ SmiTag(RAX);
-  __ ret();
-  __ Bind(&fall_through);
-}
-
-
 void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
   Label fall_through, not_32bit;
   TestBothArgumentsSmis(assembler, &fall_through);
@@ -1214,51 +1196,6 @@
 }
 
 
-enum TrigonometricFunctions {
-  kSine,
-  kCosine,
-};
-
-
-static void EmitTrigonometric(Assembler* assembler,
-                              TrigonometricFunctions kind) {
-  Label fall_through, is_smi, double_op;
-  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
-  // Argument is double and is in EAX.
-  __ fldl(FieldAddress(RAX, Double::value_offset()));
-  __ Bind(&double_op);
-  switch (kind) {
-    case kSine:   __ fsin(); break;
-    case kCosine: __ fcos(); break;
-    default:
-      UNREACHABLE();
-  }
-  const Class& double_class = Class::Handle(
-      Isolate::Current()->object_store()->double_class());
-  Label alloc_failed;
-  __ TryAllocate(double_class,
-                 &alloc_failed,
-                 Assembler::kNearJump,
-                 RAX,  // Result register.
-                 kNoRegister);  // Pool pointer might not be loaded.
-  __ fstpl(FieldAddress(RAX, Double::value_offset()));
-  __ ret();
-
-  __ Bind(&is_smi);  // smi -> double.
-  __ SmiUntag(RAX);
-  __ pushq(RAX);
-  __ fildl(Address(RSP, 0));
-  __ popq(RAX);
-  __ jmp(&double_op);
-
-  __ Bind(&alloc_failed);
-  __ ffree(0);
-  __ fincstp();
-
-  __ Bind(&fall_through);
-}
-
-
 void Intrinsifier::Double_toInt(Assembler* assembler) {
   __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
@@ -1299,16 +1236,6 @@
 }
 
 
-void Intrinsifier::Math_sin(Assembler* assembler) {
-  EmitTrigonometric(assembler, kSine);
-}
-
-
-void Intrinsifier::Math_cos(Assembler* assembler) {
-  EmitTrigonometric(assembler, kCosine);
-}
-
-
 //    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index b89db64..82a444c 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -22,8 +22,10 @@
 #include "vm/object_store.h"
 #include "vm/parser.h"
 #include "vm/port.h"
+#include "vm/profiler.h"
 #include "vm/reusable_handles.h"
 #include "vm/service.h"
+#include "vm/signal_handler.h"
 #include "vm/simulator.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
@@ -309,6 +311,7 @@
       stack_frame_index_(-1),
       object_histogram_(NULL),
       object_id_ring_(NULL),
+      profiler_data_(NULL),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
       reusable_handles_() {
   if (FLAG_print_object_histogram && (Dart::vm_isolate() != NULL)) {
@@ -337,7 +340,15 @@
 }
 
 void Isolate::SetCurrent(Isolate* current) {
+  ScopedSignalBlocker ssb;
+  Isolate* old_isolate = Current();
+  if (old_isolate != NULL) {
+    ProfilerManager::DescheduleIsolate(old_isolate);
+  }
   Thread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current));
+  if (current != NULL) {
+    ProfilerManager::ScheduleIsolate(current);
+  }
 }
 
 
@@ -397,6 +408,10 @@
                 "\tisolate:    %s\n", result->name());
     }
   }
+
+  // Setup for profiling.
+  ProfilerManager::SetupIsolateForProfiling(result);
+
   return result;
 }
 
@@ -444,6 +459,21 @@
 }
 
 
+bool Isolate::GetStackBounds(uintptr_t* lower, uintptr_t* upper) {
+  uintptr_t stack_lower = stack_limit();
+  if (stack_lower == static_cast<uintptr_t>(~0)) {
+    stack_lower = saved_stack_limit();
+  }
+  if (stack_lower == static_cast<uintptr_t>(~0)) {
+    return false;
+  }
+  uintptr_t stack_upper = stack_lower + GetSpecifiedStackSize();
+  *lower = stack_lower;
+  *upper = stack_upper;
+  return true;
+}
+
+
 void Isolate::ScheduleInterrupts(uword interrupt_bits) {
   // TODO(turnidge): Can't use MutexLocker here because MutexLocker is
   // a StackResource, which requires a current isolate.  Should
@@ -674,6 +704,11 @@
     StackZone stack_zone(this);
     HandleScope handle_scope(this);
 
+    ScopedSignalBlocker ssb;
+
+    ProfilerManager::DescheduleIsolate(this);
+
+
     if (FLAG_print_object_histogram) {
       heap()->CollectAllGarbage();
       object_histogram()->Print();
@@ -715,6 +750,7 @@
   // TODO(5411455): For now just make sure there are no current isolates
   // as we are shutting down the isolate.
   SetCurrent(NULL);
+  ProfilerManager::ShutdownIsolateForProfiling(this);
 }
 
 
@@ -934,11 +970,11 @@
   char buffer[300];
   int64_t address = reinterpret_cast<int64_t>(this);
   int n = OS::SNPrint(buffer, 300, format, address, name(), main_port(),
-                      (start_time() / 1000L), saved_stack_limit(),
-                      heap()->Used(Heap::kNew) / KB,
-                      heap()->Capacity(Heap::kNew) / KB,
-                      heap()->Used(Heap::kOld) / KB,
-                      heap()->Capacity(Heap::kOld) / KB);
+                      start_time() / 1000L, saved_stack_limit(),
+                      RoundWordsToKB(heap()->UsedInWords(Heap::kNew)),
+                      RoundWordsToKB(heap()->CapacityInWords(Heap::kNew)),
+                      RoundWordsToKB(heap()->UsedInWords(Heap::kOld)),
+                      RoundWordsToKB(heap()->CapacityInWords(Heap::kOld)));
   ASSERT(n < 300);
   return strdup(buffer);
 }
@@ -996,17 +1032,21 @@
     : isolate_(NULL),
       script_url_(NULL),
       library_url_(NULL),
+      class_name_(NULL),
       function_name_(NULL),
       exception_callback_name_(NULL) {
   script_url_ = NULL;
   const Class& cls = Class::Handle(func.Owner());
-  ASSERT(cls.IsTopLevel());
   const Library& lib = Library::Handle(cls.library());
   const String& lib_url = String::Handle(lib.url());
   library_url_ = strdup(lib_url.ToCString());
 
   const String& func_name = String::Handle(func.name());
   function_name_ = strdup(func_name.ToCString());
+  if (!cls.IsTopLevel()) {
+    const String& class_name = String::Handle(cls.Name());
+    class_name_ = strdup(class_name.ToCString());
+  }
   exception_callback_name_ = strdup("_unhandledExceptionCallback");
 }
 
@@ -1014,6 +1054,7 @@
 IsolateSpawnState::IsolateSpawnState(const char* script_url)
     : isolate_(NULL),
       library_url_(NULL),
+      class_name_(NULL),
       function_name_(NULL),
       exception_callback_name_(NULL) {
   script_url_ = strdup(script_url);
@@ -1027,6 +1068,7 @@
   free(script_url_);
   free(library_url_);
   free(function_name_);
+  free(class_name_);
   free(exception_callback_name_);
 }
 
@@ -1048,13 +1090,36 @@
   ASSERT(!lib.IsNull());
 
   // Resolve the function.
-  const String& func_name =
-      String::Handle(String::New(function_name()));
-  const Function& func = Function::Handle(lib.LookupLocalFunction(func_name));
+  const String& func_name = String::Handle(String::New(function_name()));
+
+  if (class_name() == NULL) {
+    const Function& func = Function::Handle(lib.LookupLocalFunction(func_name));
+    if (func.IsNull()) {
+      const String& msg = String::Handle(String::NewFormatted(
+          "Unable to resolve function '%s' in library '%s'.",
+          function_name(),
+          (library_url() != NULL ? library_url() : script_url())));
+      return LanguageError::New(msg);
+    }
+    return func.raw();
+  }
+
+  const String& cls_name = String::Handle(String::New(class_name()));
+  const Class& cls = Class::Handle(lib.LookupLocalClass(cls_name));
+  if (cls.IsNull()) {
+    const String& msg = String::Handle(String::NewFormatted(
+          "Unable to resolve class '%s' in library '%s'.",
+          class_name(),
+          (library_url() != NULL ? library_url() : script_url())));
+    return LanguageError::New(msg);
+  }
+  const Function& func =
+      Function::Handle(cls.LookupStaticFunctionAllowPrivate(func_name));
   if (func.IsNull()) {
     const String& msg = String::Handle(String::NewFormatted(
-        "Unable to resolve function '%s' in library '%s'.",
-        function_name(), (library_url() ? library_url() : script_url())));
+          "Unable to resolve static method '%s.%s' in library '%s'.",
+          class_name(), function_name(),
+          (library_url() != NULL ? library_url() : script_url())));
     return LanguageError::New(msg);
   }
   return func.raw();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index a01638d..b62150f 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -34,6 +34,7 @@
 class Heap;
 class ICData;
 class Instance;
+class IsolateProfilerData;
 class LongJump;
 class MessageHandler;
 class Mutex;
@@ -50,6 +51,7 @@
 class RawError;
 class RawFloat32x4;
 class RawInt32x4;
+class SampleBuffer;
 class Simulator;
 class StackResource;
 class StackZone;
@@ -203,6 +205,9 @@
   // The true stack limit for this isolate.
   uword saved_stack_limit() const { return saved_stack_limit_; }
 
+  // Retrieve the stack address bounds.
+  bool GetStackBounds(uintptr_t* lower, uintptr_t* upper);
+
   static uword GetSpecifiedStackSize();
 
   static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize);
@@ -383,6 +388,18 @@
     return defer_finalization_count_ == 0;
   }
 
+  Mutex* profiler_data_mutex() {
+    return &profiler_data_mutex_;
+  }
+
+  void set_profiler_data(IsolateProfilerData* profiler_data) {
+    profiler_data_ = profiler_data;
+  }
+
+  IsolateProfilerData* profiler_data() {
+    return profiler_data_;
+  }
+
  private:
   Isolate();
 
@@ -441,6 +458,9 @@
   // Ring buffer of objects assigned an id.
   ObjectIdRing* object_id_ring_;
 
+  IsolateProfilerData* profiler_data_;
+  Mutex profiler_data_mutex_;
+
   // Reusable handles support.
 #define REUSABLE_HANDLE_FIELDS(object)                                         \
   object* object##_handle_;                                                    \
@@ -541,6 +561,7 @@
   void set_isolate(Isolate* value) { isolate_ = value; }
   char* script_url() const { return script_url_; }
   char* library_url() const { return library_url_; }
+  char* class_name() const { return class_name_; }
   char* function_name() const { return function_name_; }
   char* exception_callback_name() const { return exception_callback_name_; }
   bool is_spawn_uri() const { return library_url_ == NULL; }
@@ -552,6 +573,7 @@
   Isolate* isolate_;
   char* script_url_;
   char* library_url_;
+  char* class_name_;
   char* function_name_;
   char* exception_callback_name_;
 };
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index e751ff9..e5d0fab 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -159,6 +159,8 @@
     f->Print("S%+" Pd "", stack_index());
   } else if (kind() == kDoubleStackSlot) {
     f->Print("DS%+" Pd "", stack_index());
+  } else if (kind() == kQuadStackSlot) {
+    f->Print("QS%+" Pd "", stack_index());
   } else {
     f->Print("%s", Name());
   }
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index a142540..cb21834 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -120,17 +120,4 @@
   return result;
 }
 
-
-DART_EXPORT Dart_Handle Dart_CheckFunctionFingerprints() {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  Dart_Handle result = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(result)) {
-    return result;
-  }
-  CHECK_CALLBACK_STATE(isolate);
-  Library::CheckFunctionFingerprints();
-  return result;
-}
-
 }  // namespace dart
diff --git a/runtime/vm/native_symbol.h b/runtime/vm/native_symbol.h
new file mode 100644
index 0000000..52151b2
--- /dev/null
+++ b/runtime/vm/native_symbol.h
@@ -0,0 +1,26 @@
+// 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.
+
+#ifndef VM_NATIVE_SYMBOL_H_
+#define VM_NATIVE_SYMBOL_H_
+
+#include "vm/allocation.h"
+#include "vm/globals.h"
+
+namespace dart {
+
+class Mutex;
+
+class NativeSymbolResolver : public AllStatic {
+ public:
+  static void InitOnce();
+  static void ShutdownOnce();
+  static char* LookupSymbolName(uintptr_t pc);
+  static void FreeSymbolName(char* name);
+};
+
+
+}  // namespace dart
+
+#endif  // VM_NATIVE_SYMBOL_H_
diff --git a/runtime/vm/native_symbol_android.cc b/runtime/vm/native_symbol_android.cc
new file mode 100644
index 0000000..76ee86f
--- /dev/null
+++ b/runtime/vm/native_symbol_android.cc
@@ -0,0 +1,43 @@
+// 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.
+
+#include "platform/globals.h"
+#if defined(TARGET_OS_ANDROID)
+
+#include "vm/native_symbol.h"
+#include "vm/thread.h"
+
+#include <dlfcn.h>  // NOLINT
+
+namespace dart {
+
+void NativeSymbolResolver::InitOnce() {
+}
+
+
+void NativeSymbolResolver::ShutdownOnce() {
+}
+
+
+char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc) {
+  Dl_info info;
+  int r = dladdr(reinterpret_cast<void*>(pc), &info);
+  if (r == 0) {
+    return NULL;
+  }
+  if (info.dli_sname == NULL) {
+    return NULL;
+  }
+  return strdup(info.dli_sname);
+}
+
+
+void NativeSymbolResolver::FreeSymbolName(char* name) {
+  free(name);
+}
+
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_ANDROID)
diff --git a/runtime/vm/native_symbol_linux.cc b/runtime/vm/native_symbol_linux.cc
new file mode 100644
index 0000000..225a4b0
--- /dev/null
+++ b/runtime/vm/native_symbol_linux.cc
@@ -0,0 +1,44 @@
+// 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.
+
+#include "vm/globals.h"
+#if defined(TARGET_OS_LINUX)
+
+#include "vm/native_symbol.h"
+#include "vm/thread.h"
+
+
+#include <dlfcn.h>  // NOLINT
+
+namespace dart {
+
+void NativeSymbolResolver::InitOnce() {
+}
+
+
+void NativeSymbolResolver::ShutdownOnce() {
+}
+
+
+char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc) {
+  Dl_info info;
+  int r = dladdr(reinterpret_cast<void*>(pc), &info);
+  if (r == 0) {
+    return NULL;
+  }
+  if (info.dli_sname == NULL) {
+    return NULL;
+  }
+  return strdup(info.dli_sname);
+}
+
+
+void NativeSymbolResolver::FreeSymbolName(char* name) {
+  free(name);
+}
+
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_LINUX)
diff --git a/runtime/vm/native_symbol_macos.cc b/runtime/vm/native_symbol_macos.cc
new file mode 100644
index 0000000..3b240bd
--- /dev/null
+++ b/runtime/vm/native_symbol_macos.cc
@@ -0,0 +1,43 @@
+// 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.
+
+#include "vm/globals.h"
+#if defined(TARGET_OS_MACOS)
+
+#include "vm/native_symbol.h"
+#include "vm/thread.h"
+
+#include <dlfcn.h>  // NOLINT
+
+namespace dart {
+
+void NativeSymbolResolver::InitOnce() {
+}
+
+
+void NativeSymbolResolver::ShutdownOnce() {
+}
+
+
+char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc) {
+  Dl_info info;
+  int r = dladdr(reinterpret_cast<void*>(pc), &info);
+  if (r == 0) {
+    return NULL;
+  }
+  if (info.dli_sname == NULL) {
+    return NULL;
+  }
+  return strdup(info.dli_sname);
+}
+
+
+void NativeSymbolResolver::FreeSymbolName(char* name) {
+  free(name);
+}
+
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_MACOS)
diff --git a/runtime/vm/native_symbol_win.cc b/runtime/vm/native_symbol_win.cc
new file mode 100644
index 0000000..7e8350f
--- /dev/null
+++ b/runtime/vm/native_symbol_win.cc
@@ -0,0 +1,83 @@
+// 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.
+
+#include "vm/globals.h"
+#if defined(TARGET_OS_WINDOWS)
+
+#include "vm/native_symbol.h"
+#include "vm/thread.h"
+
+#include <dbghelp.h>  // NOLINT
+
+namespace dart {
+
+static bool running_ = false;
+static Mutex* lock_ = NULL;
+
+void NativeSymbolResolver::InitOnce() {
+  ASSERT(running_ == false);
+  lock_ = new Mutex();
+  running_ = true;
+#if 0
+  SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);
+  HANDLE hProcess = GetCurrentProcess();
+  if (!SymInitialize(hProcess, NULL, TRUE)) {
+    DWORD error = GetLastError();
+    printf("Failed to init NativeSymbolResolver (SymInitialize %d)\n", error);
+    return;
+  }
+#endif
+}
+
+
+void NativeSymbolResolver::ShutdownOnce() {
+  ScopedMutex lock(lock_);
+  if (!running_) {
+    return;
+  }
+  running_ = false;
+#if 0
+  HANDLE hProcess = GetCurrentProcess();
+  if (!SymCleanup(hProcess)) {
+    DWORD error = GetLastError();
+    printf("Failed to shutdown NativeSymbolResolver (SymCleanup  %d)\n", error);
+  }
+#endif
+}
+
+
+char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc) {
+  static const intptr_t kMaxNameLength = 2048;
+  static const intptr_t kSymbolInfoSize = sizeof(SYMBOL_INFO);  // NOLINT.
+  static char buffer[kSymbolInfoSize + kMaxNameLength];
+  static char name_buffer[kMaxNameLength];
+  ScopedMutex lock(lock_);
+  if (!running_) {
+    return NULL;
+  }
+#if 0
+  memset(&buffer[0], 0, sizeof(buffer));
+  HANDLE hProcess = GetCurrentProcess();
+  DWORD64 address = static_cast<DWORD64>(pc);
+  PSYMBOL_INFO pSymbol = reinterpret_cast<PSYMBOL_INFO>(&buffer[0]);
+  pSymbol->SizeOfStruct = kSymbolInfoSize;
+  pSymbol->MaxNameLen = kMaxNameLength;
+  BOOL r = SymFromAddr(hProcess, address, NULL, pSymbol);
+  if (r == FALSE) {
+    return NULL;
+  }
+  return strdup(pSymbol->Name);
+#endif
+  return NULL;
+}
+
+
+void NativeSymbolResolver::FreeSymbolName(char* name) {
+  free(name);
+}
+
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_WINDOWS)
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 139e0ca..c420682 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -62,7 +62,6 @@
 DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, error_on_bad_override);
-DECLARE_FLAG(bool, error_on_bad_type);
 DECLARE_FLAG(bool, trace_compiler);
 DECLARE_FLAG(bool, trace_deoptimization);
 DECLARE_FLAG(bool, trace_deoptimization_verbose);
@@ -166,6 +165,10 @@
   V(CoreLibrary, int, _parse)                                                  \
   V(CoreLibrary, StackTrace, _setupFullStackTrace)                             \
   V(CoreLibrary, _OneByteString, _setAt)                                       \
+  V(CoreLibrary, _StringBase, _substringUncheckedNative)                       \
+  V(CoreLibrary, _OneByteString, _substringUncheckedNative)                    \
+  V(CoreLibrary, _GrowableList, _setData)                                      \
+  V(CoreLibrary, _GrowableList, _setLength)                                    \
   V(TypedDataLibrary, _TypedList, _getInt8)                                    \
   V(TypedDataLibrary, _TypedList, _setInt8)                                    \
   V(TypedDataLibrary, _TypedList, _getUint8)                                   \
@@ -1506,6 +1509,8 @@
 
 
 RawString* Class::Name() const {
+  // TODO(turnidge): This assert fails for the fake kFreeListElement class.
+  // Fix this.
   ASSERT(raw_ptr()->name_ != String::null());
   return raw_ptr()->name_;
 }
@@ -2609,8 +2614,8 @@
 }
 
 
-void Class::set_is_mixin_typedef() const {
-  set_state_bits(MixinTypedefBit::update(true, raw_ptr()->state_bits_));
+void Class::set_is_mixin_app_alias() const {
+  set_state_bits(MixinAppAliasBit::update(true, raw_ptr()->state_bits_));
 }
 
 
@@ -2661,7 +2666,7 @@
 }
 
 bool Class::IsAnonymousMixinApplication() const {
-  return IsMixinApplication() && !is_mixin_typedef();
+  return IsMixinApplication() && !is_mixin_app_alias();
 }
 
 void Class::set_patch_class(const Class& cls) const {
@@ -2773,17 +2778,21 @@
     }
     // Check for reflexivity.
     if (thsi.raw() == other.raw()) {
-      const intptr_t len = thsi.NumTypeArguments();
-      if (len == 0) {
+      const intptr_t num_type_args = thsi.NumTypeArguments();
+      if (num_type_args == 0) {
         return true;
       }
+      const intptr_t num_type_params = thsi.NumTypeParameters();
+      const intptr_t from_index = num_type_args - num_type_params;
       // Since we do not truncate the type argument vector of a subclass (see
-      // below), we only check a prefix of the proper length.
+      // below), we only check a subvector of the proper length.
       // Check for covariance.
-      if (other_type_arguments.IsNull() || other_type_arguments.IsRaw(len)) {
+      if (other_type_arguments.IsNull() ||
+          other_type_arguments.IsRaw(from_index, num_type_params)) {
         return true;
       }
-      if (type_arguments.IsNull() || type_arguments.IsRaw(len)) {
+      if (type_arguments.IsNull() ||
+          type_arguments.IsRaw(from_index, num_type_params)) {
         // Other type can't be more specific than this one because for that
         // it would have to have all dynamic type arguments which is checked
         // above.
@@ -2791,7 +2800,8 @@
       }
       return type_arguments.TypeTest(test_kind,
                                      other_type_arguments,
-                                     len,
+                                     from_index,
+                                     num_type_params,
                                      bound_error);
     }
     const bool other_is_function_class = other.IsFunctionClass();
@@ -2847,12 +2857,10 @@
             thsi, interface, ClassFinalizer::kCanonicalize);
         interfaces.SetAt(i, interface);
       }
-      error = Error::null();
-      if (interface.IsMalboundedWithError(&error)) {
+      if (interface.IsMalbounded()) {
         // Return the first bound error to the caller if it requests it.
         if ((bound_error != NULL) && bound_error->IsNull()) {
-          ASSERT(!error.IsNull());
-          *bound_error = error.raw();
+          *bound_error = interface.error();
         }
         continue;  // Another interface may work better.
       }
@@ -3228,6 +3236,10 @@
   jsobj.AddProperty("name", internal_class_name);
   jsobj.AddProperty("user_name", user_visible_class_name);
   if (!ref) {
+    const Error& err = Error::Handle(EnsureIsFinalized(Isolate::Current()));
+    if (!err.IsNull()) {
+      jsobj.AddProperty("error", err);
+    }
     jsobj.AddProperty("implemented", is_implemented());
     jsobj.AddProperty("abstract", is_abstract());
     jsobj.AddProperty("patch", is_patch());
@@ -3452,11 +3464,10 @@
 
 
 bool AbstractTypeArguments::Equals(const AbstractTypeArguments& other) const {
-  ASSERT(!IsNull());  // Use AbstractTypeArguments::AreEqual().
   if (this->raw() == other.raw()) {
     return true;
   }
-  if (other.IsNull()) {
+  if (IsNull() || other.IsNull()) {
     return false;
   }
   const intptr_t num_types = Length();
@@ -3476,22 +3487,6 @@
 }
 
 
-bool AbstractTypeArguments::AreEqual(
-    const AbstractTypeArguments& arguments,
-    const AbstractTypeArguments& other_arguments) {
-  if (arguments.raw() == other_arguments.raw()) {
-    return true;
-  }
-  if (arguments.IsNull()) {
-    return other_arguments.IsDynamicTypes(false, other_arguments.Length());
-  }
-  if (other_arguments.IsNull()) {
-    return arguments.IsDynamicTypes(false, arguments.Length());
-  }
-  return arguments.Equals(other_arguments);
-}
-
-
 RawAbstractTypeArguments* AbstractTypeArguments::InstantiateFrom(
     const AbstractTypeArguments& instantiator_type_arguments,
     Error* bound_error) const {
@@ -3502,12 +3497,13 @@
 
 
 bool AbstractTypeArguments::IsDynamicTypes(bool raw_instantiated,
+                                           intptr_t from_index,
                                            intptr_t len) const {
-  ASSERT(Length() >= len);
+  ASSERT(Length() >= (from_index + len));
   AbstractType& type = AbstractType::Handle();
   Class& type_class = Class::Handle();
   for (intptr_t i = 0; i < len; i++) {
-    type = TypeAt(i);
+    type = TypeAt(from_index + i);
     ASSERT(!type.IsNull());
     if (!type.HasResolvedTypeClass()) {
       if (raw_instantiated && type.IsTypeParameter()) {
@@ -3531,17 +3527,18 @@
 
 bool AbstractTypeArguments::TypeTest(TypeTestKind test_kind,
                                      const AbstractTypeArguments& other,
+                                     intptr_t from_index,
                                      intptr_t len,
                                      Error* bound_error) const {
-  ASSERT(Length() >= len);
+  ASSERT(Length() >= (from_index + len));
   ASSERT(!other.IsNull());
-  ASSERT(other.Length() >= len);
+  ASSERT(other.Length() >= (from_index + len));
   AbstractType& type = AbstractType::Handle();
   AbstractType& other_type = AbstractType::Handle();
   for (intptr_t i = 0; i < len; i++) {
-    type = TypeAt(i);
+    type = TypeAt(from_index + i);
     ASSERT(!type.IsNull());
-    other_type = other.TypeAt(i);
+    other_type = other.TypeAt(from_index + i);
     ASSERT(!other_type.IsNull());
     if (!type.TypeTest(test_kind, other_type, bound_error)) {
       return false;
@@ -4289,7 +4286,8 @@
 RawFunction* Function::implicit_closure_function() const {
   if (IsClosureFunction() ||
       IsSignatureFunction() ||
-      IsStaticInitializerFunction()) {
+      IsStaticInitializerFunction() ||
+      IsFactory()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -4840,6 +4838,7 @@
 bool Function::HasCompatibleParametersWith(const Function& other,
                                            Error* bound_error) const {
   ASSERT(FLAG_error_on_bad_override);
+  ASSERT((bound_error != NULL) && bound_error->IsNull());
   // Check that this function's signature type is a subtype of the other
   // function's signature type.
   if (!TypeTest(kIsSubtypeOf, Object::null_abstract_type_arguments(),
@@ -5445,6 +5444,13 @@
 }
 
 
+RawString* Function::GetSource() {
+  const Script& func_script = Script::Handle(script());
+  // Without the + 1 the final "}" is not included.
+  return func_script.GetSnippet(token_pos(), end_token_pos() + 1);
+}
+
+
 // Construct fingerprint from token stream. The token stream contains also
 // arguments.
 int32_t Function::SourceFingerprint() const {
@@ -6767,13 +6773,7 @@
         Smi::Value(reinterpret_cast<RawSmi*>(obj.raw())));
     ASSERT(kind < Token::kNumTokens);
     if (Token::IsPseudoKeyword(kind) || Token::IsKeyword(kind)) {
-      Isolate* isolate = Isolate::Current();
-      ObjectStore* object_store = isolate->object_store();
-      const Array& symbols = Array::Handle(isolate,
-                                           object_store->keyword_symbols());
-      ASSERT(!symbols.IsNull());
-      ASSERT(symbols.At(kind - Token::kFirstKeyword) != Object::null());
-      return String::RawCast(symbols.At(kind - Token::kFirstKeyword));
+      return Symbols::Keyword(kind).raw();
     }
     return Symbols::New(Token::Str(kind));
   } else {
@@ -6966,6 +6966,16 @@
 }
 
 
+RawString* Script::GetSnippet(intptr_t from_token_pos,
+                              intptr_t to_token_pos) const {
+  intptr_t from_line, from_column;
+  intptr_t to_line, to_column;
+  GetTokenLocation(from_token_pos, &from_line, &from_column);
+  GetTokenLocation(to_token_pos, &to_line, &to_column);
+  return GetSnippet(from_line, from_column, to_line, to_column);
+}
+
+
 RawString* Script::GetSnippet(intptr_t from_line,
                               intptr_t from_column,
                               intptr_t to_line,
@@ -7295,7 +7305,7 @@
   Field& field = Field::Handle(GetMetadataField(metaname));
   if (field.IsNull()) {
     // There is no metadata for this object.
-    return Object::empty_array().raw();;
+    return Object::empty_array().raw();
   }
   Object& metadata = Object::Handle();
   metadata = field.value();
@@ -9581,6 +9591,9 @@
   NoGCScope no_gc;
   FindRawCodeVisitor visitor(pc);
   RawInstructions* instr;
+  if (isolate->heap() == NULL) {
+    return Code::null();
+  }
   instr = isolate->heap()->FindObjectInCodeSpace(&visitor);
   if (instr != Instructions::null()) {
     return instr->ptr()->code_;
@@ -10607,6 +10620,8 @@
 
 void Error::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
+  jsobj.AddProperty("type", JSONType(false));
+  jsobj.AddProperty("error_msg", ToErrorCString());
 }
 
 
@@ -10652,6 +10667,8 @@
 
 void ApiError::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
+  jsobj.AddProperty("type", JSONType(false));
+  jsobj.AddProperty("error_msg", ToErrorCString());
 }
 
 
@@ -10836,6 +10853,8 @@
 
 void LanguageError::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
+  jsobj.AddProperty("type", JSONType(false));
+  jsobj.AddProperty("error_msg", ToErrorCString());
 }
 
 
@@ -10910,6 +10929,8 @@
 void UnhandledException::PrintToJSONStream(JSONStream* stream,
                                            bool ref) const {
   JSONObject jsobj(stream);
+  jsobj.AddProperty("type", JSONType(false));
+  jsobj.AddProperty("error_msg", ToErrorCString());
 }
 
 
@@ -10946,6 +10967,8 @@
 
 void UnwindError::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
+  jsobj.AddProperty("type", JSONType(false));
+  jsobj.AddProperty("error_msg", ToErrorCString());
 }
 
 
@@ -11393,21 +11416,28 @@
 }
 
 
-bool AbstractType::IsMalboundedWithError(Error* bound_error) const {
+bool AbstractType::IsMalbounded() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return false;
 }
 
 
-RawError* AbstractType::malformed_error() const {
+bool AbstractType::IsMalformedOrMalbounded() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
-  return Error::null();
+  return false;
 }
 
 
-void AbstractType::set_malformed_error(const Error& value) const {
+RawLanguageError* AbstractType::error() const {
+  // AbstractType is an abstract class.
+  UNREACHABLE();
+  return LanguageError::null();
+}
+
+
+void AbstractType::set_error(const LanguageError& value) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
 }
@@ -11445,11 +11475,30 @@
 
 RawString* AbstractType::BuildName(NameVisibility name_visibility) const {
   if (IsBoundedType()) {
-    // TODO(regis): Should the bound be visible in the name for debug purposes
-    // if name_visibility is kInternalName?
     const AbstractType& type = AbstractType::Handle(
         BoundedType::Cast(*this).type());
-    return type.BuildName(name_visibility);
+    if (name_visibility == kUserVisibleName) {
+      return type.BuildName(kUserVisibleName);
+    }
+    String& type_name = String::Handle(type.BuildName(kInternalName));
+    type_name = String::Concat(type_name, Symbols::SpaceExtendsSpace());
+    // Building the bound name may lead into cycles.
+    const AbstractType& bound = AbstractType::Handle(
+        BoundedType::Cast(*this).bound());
+    String& bound_name = String::Handle();
+    if (bound.IsTypeParameter()) {
+      bound_name = TypeParameter::Cast(bound).name();
+    } else if (bound.IsType()) {
+      const Class& cls = Class::Handle(Type::Cast(bound).type_class());
+      bound_name = cls.Name();
+      if (Type::Cast(bound).arguments() != AbstractTypeArguments::null()) {
+        bound_name = String::Concat(bound_name, Symbols::OptimizedOut());
+      }
+    } else {
+      bound_name = String::New(Symbols::OptimizedOut());
+    }
+    type_name = String::Concat(type_name, bound_name);
+    return Symbols::New(type_name);
   }
   if (IsTypeParameter()) {
     return TypeParameter::Cast(*this).name();
@@ -11617,16 +11666,14 @@
   if (IsMalbounded()) {
     ASSERT(FLAG_enable_type_checks);
     if ((bound_error != NULL) && bound_error->IsNull()) {
-      const bool is_malbounded = IsMalboundedWithError(bound_error);
-      ASSERT(is_malbounded);
+      *bound_error = error();
     }
     return false;
   }
   if (other.IsMalbounded()) {
     ASSERT(FLAG_enable_type_checks);
     if ((bound_error != NULL) && bound_error->IsNull()) {
-      const bool other_is_malbounded = other.IsMalboundedWithError(bound_error);
-      ASSERT(other_is_malbounded);
+      *bound_error = other.error();
     }
     return false;
   }
@@ -11805,42 +11852,41 @@
 
 
 bool Type::IsMalformed() const {
-  return raw_ptr()->malformed_error_ != Error::null();
-}
-
-
-bool Type::IsMalboundedWithError(Error* bound_error) const {
-  if (!FLAG_enable_type_checks && !FLAG_error_on_bad_type) {
+  if (raw_ptr()->error_ == LanguageError::null()) {
     return false;
   }
-  ASSERT(IsResolved());
-  ASSERT(!IsMalformed());  // Must be checked first.
-  if (arguments() == AbstractTypeArguments::null()) {
+  const LanguageError& type_error = LanguageError::Handle(error());
+  return type_error.kind() == LanguageError::kMalformedType;
+}
+
+
+bool Type::IsMalbounded() const {
+  if (!FLAG_enable_type_checks) {
     return false;
   }
-  const AbstractTypeArguments& type_arguments =
-      AbstractTypeArguments::Handle(arguments());
-  const intptr_t num_type_args = type_arguments.Length();
-  AbstractType& type_arg = AbstractType::Handle();
-  for (intptr_t i = 0; i < num_type_args; i++) {
-    type_arg = type_arguments.TypeAt(i);
-    ASSERT(!type_arg.IsNull());
-    if (type_arg.IsMalboundedWithError(bound_error)) {
-      return true;
-    }
+  if (raw_ptr()->error_ == LanguageError::null()) {
+    return false;
   }
-  return false;
+  const LanguageError& type_error = LanguageError::Handle(error());
+  return type_error.kind() == LanguageError::kMalboundedType;
 }
 
 
-void Type::set_malformed_error(const Error& value) const {
-  StorePointer(&raw_ptr()->malformed_error_, value.raw());
+bool Type::IsMalformedOrMalbounded() const {
+  if (raw_ptr()->error_ == LanguageError::null()) {
+    return false;
+  }
+  const LanguageError& type_error = LanguageError::Handle(error());
+  if (type_error.kind() == LanguageError::kMalformedType) {
+    return true;
+  }
+  ASSERT(type_error.kind() == LanguageError::kMalboundedType);
+  return FLAG_enable_type_checks;
 }
 
 
-RawError* Type::malformed_error() const {
-  ASSERT(IsMalformed());
-  return raw_ptr()->malformed_error_;
+void Type::set_error(const LanguageError& value) const {
+  StorePointer(&raw_ptr()->error_, value.raw());
 }
 
 
@@ -11947,6 +11993,7 @@
 
 
 bool Type::Equals(const Instance& other) const {
+  ASSERT(!IsNull());
   if (raw() == other.raw()) {
     return true;
   }
@@ -11964,9 +12011,35 @@
   if (!IsFinalized() || !other_type.IsFinalized()) {
     return false;
   }
-  return AbstractTypeArguments::AreEqual(
-      AbstractTypeArguments::Handle(arguments()),
-      AbstractTypeArguments::Handle(other_type.arguments()));
+  if (arguments() == other_type.arguments()) {
+    return true;
+  }
+  const Class& cls = Class::Handle(type_class());
+  const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle(
+      arguments());
+  const AbstractTypeArguments& other_type_args = AbstractTypeArguments::Handle(
+      other_type.arguments());
+  const intptr_t num_type_args = cls.NumTypeArguments();
+  const intptr_t num_type_params = cls.NumTypeParameters();
+  const intptr_t from_index = num_type_args - num_type_params;
+  if (type_args.IsNull()) {
+    return other_type_args.IsRaw(from_index, num_type_params);
+  }
+  if (other_type_args.IsNull()) {
+    return type_args.IsRaw(from_index, num_type_params);
+  }
+  ASSERT(type_args.Length() >= (from_index + num_type_params));
+  ASSERT(other_type_args.Length() >= (from_index + num_type_params));
+  AbstractType& type_arg = AbstractType::Handle();
+  AbstractType& other_type_arg = AbstractType::Handle();
+  for (intptr_t i = 0; i < num_type_params; i++) {
+    type_arg = type_args.TypeAt(from_index + i);
+    other_type_arg = other_type_args.TypeAt(from_index + i);
+    if (!type_arg.Equals(other_type_arg)) {
+      return false;
+    }
+  }
+  return true;
 }
 
 
@@ -12016,6 +12089,7 @@
   }
   // Canonicalize the type arguments.
   AbstractTypeArguments& type_args = AbstractTypeArguments::Handle(arguments());
+  ASSERT(type_args.IsNull() || (type_args.Length() == cls.NumTypeArguments()));
   type_args = type_args.Canonicalize();
   set_arguments(type_args);
   // The type needs to be added to the list. Grow the list if it is full.
@@ -12208,64 +12282,51 @@
   if (instantiator_type_arguments.IsNull()) {
     return Type::DynamicType();
   }
-  // Bound checks may appear in the instantiator type arguments, as is the case
-  // with a pair of type parameters of the same class referring to each other
-  // via their bounds.
-  AbstractType& type_arg = AbstractType::Handle(
-      instantiator_type_arguments.TypeAt(index()));
-  if (type_arg.IsBoundedType()) {
-    const BoundedType& bounded_type = BoundedType::Cast(type_arg);
-    // Bounds checking of a type is postponed to run time if the type is still
-    // uninstantiated at compile time, or if the bound and the type are mutually
-    // recursive. In the latter case, the type may already be instantiated.
-    if (!bounded_type.IsInstantiated()) {
-      ASSERT(AbstractType::Handle(bounded_type.bound()).IsInstantiated());
-      type_arg = bounded_type.InstantiateFrom(AbstractTypeArguments::Handle(),
-                                              bound_error);
-    }
-  }
-  return type_arg.raw();
+  return instantiator_type_arguments.TypeAt(index());
 }
 
 
 bool TypeParameter::CheckBound(const AbstractType& bounded_type,
                                const AbstractType& upper_bound,
                                Error* bound_error) const {
-  ASSERT((bound_error == NULL) || bound_error->IsNull());
+  ASSERT((bound_error != NULL) && bound_error->IsNull());
   ASSERT(bounded_type.IsFinalized());
   ASSERT(upper_bound.IsFinalized());
   ASSERT(!bounded_type.IsMalformed());
   if (bounded_type.IsSubtypeOf(upper_bound, bound_error)) {
     return true;
   }
-  if ((bound_error != NULL) && bound_error->IsNull()) {
-    // Report the bound error.
-    const String& bounded_type_name = String::Handle(
-        bounded_type.UserVisibleName());
-    const String& upper_bound_name = String::Handle(
-        upper_bound.UserVisibleName());
-    const AbstractType& declared_bound = AbstractType::Handle(bound());
-    const String& declared_bound_name = String::Handle(
-        declared_bound.UserVisibleName());
-    const String& type_param_name = String::Handle(UserVisibleName());
-    const Class& cls = Class::Handle(parameterized_class());
-    const String& class_name = String::Handle(cls.Name());
-    const Script& script = Script::Handle(cls.script());
-    // Since the bound may have been canonicalized, its token index is
-    // meaningless, therefore use the token index of this type parameter.
-    *bound_error = LanguageError::NewFormatted(
-        *bound_error,
-        script,
-        token_pos(),
-        LanguageError::kMalboundedType,
-        Heap::kNew,
-        "type parameter '%s' of class '%s' must extend bound '%s', "
-        "but type argument '%s' is not a subtype of '%s'\n",
-        type_param_name.ToCString(),
-        class_name.ToCString(),
-        declared_bound_name.ToCString(),
-        bounded_type_name.ToCString(),
-        upper_bound_name.ToCString());
+  if (bound_error->IsNull()) {
+    // Report the bound error only if both the bounded type and the upper bound
+    // are instantiated. Otherwise, we cannot tell yet it is a bound error.
+    if (bounded_type.IsInstantiated() && upper_bound.IsInstantiated()) {
+      const String& bounded_type_name = String::Handle(
+          bounded_type.UserVisibleName());
+      const String& upper_bound_name = String::Handle(
+          upper_bound.UserVisibleName());
+      const AbstractType& declared_bound = AbstractType::Handle(bound());
+      const String& declared_bound_name = String::Handle(
+          declared_bound.UserVisibleName());
+      const String& type_param_name = String::Handle(UserVisibleName());
+      const Class& cls = Class::Handle(parameterized_class());
+      const String& class_name = String::Handle(cls.Name());
+      const Script& script = Script::Handle(cls.script());
+      // Since the bound may have been canonicalized, its token index is
+      // meaningless, therefore use the token index of this type parameter.
+      *bound_error = LanguageError::NewFormatted(
+          *bound_error,
+          script,
+          token_pos(),
+          LanguageError::kMalboundedType,
+          Heap::kNew,
+          "type parameter '%s' of class '%s' must extend bound '%s', "
+          "but type argument '%s' is not a subtype of '%s'\n",
+          type_param_name.ToCString(),
+          class_name.ToCString(),
+          declared_bound_name.ToCString(),
+          bounded_type_name.ToCString(),
+          upper_bound_name.ToCString());
+    }
   }
   return false;
 }
@@ -12357,24 +12418,18 @@
 }
 
 
-bool BoundedType::IsMalboundedWithError(Error* bound_error) const {
-  if (!FLAG_enable_type_checks && !FLAG_error_on_bad_type) {
-    return false;
-  }
-  const AbstractType& upper_bound = AbstractType::Handle(bound());
-  if (upper_bound.IsMalformed()) {
-    if (bound_error != NULL) {
-      *bound_error = upper_bound.malformed_error();
-      ASSERT(!bound_error->IsNull());
-    }
-    return true;
-  }
-  return false;
+bool BoundedType::IsMalbounded() const {
+  return AbstractType::Handle(type()).IsMalbounded();
 }
 
 
-RawError* BoundedType::malformed_error() const {
-  return AbstractType::Handle(type()).malformed_error();
+bool BoundedType::IsMalformedOrMalbounded() const {
+  return AbstractType::Handle(type()).IsMalformedOrMalbounded();
+}
+
+
+RawLanguageError* BoundedType::error() const {
+  return AbstractType::Handle(type()).error();
 }
 
 
@@ -12455,7 +12510,15 @@
                                                 bound_error);
     }
     if (bound_error->IsNull()) {
-      type_param.CheckBound(bounded_type, upper_bound, bound_error);
+      if (!type_param.CheckBound(bounded_type, upper_bound, bound_error) &&
+          bound_error->IsNull()) {
+        // We cannot determine yet whether the bounded_type is below the
+        // upper_bound, because one or both of them is still uninstantiated.
+        ASSERT(!bounded_type.IsInstantiated() || !upper_bound.IsInstantiated());
+        // Postpone bound check by returning a new BoundedType with partially
+        // instantiated bounded_type and upper_bound, but keeping type_param.
+        bounded_type = BoundedType::New(bounded_type, upper_bound, type_param);
+      }
     }
     set_is_being_checked(false);
   }
@@ -12513,28 +12576,20 @@
 
 
 const char* BoundedType::ToCString() const {
-  const char* format = "BoundedType: type %s; bound: %s; type param: %s%s%s";
+  const char* format = "BoundedType: type %s; bound: %s; type param: %s of %s";
   const char* type_cstr = String::Handle(AbstractType::Handle(
       type()).Name()).ToCString();
   const char* bound_cstr = String::Handle(AbstractType::Handle(
       bound()).Name()).ToCString();
   const TypeParameter& type_param = TypeParameter::Handle(type_parameter());
-  const char* type_param_cstr = "null";
-  const char* of_cstr = "";
-  const char* cls_cstr = "";
-  if (!type_param.IsNull()) {
-    type_param_cstr = String::Handle(type_param.name()).ToCString();
-    const Class& cls = Class::Handle(type_param.parameterized_class());
-    if (!cls.IsNull()) {
-      of_cstr = " of ";
-      cls_cstr = String::Handle(cls.Name()).ToCString();
-    }
-  }
-  intptr_t len = OS::SNPrint(NULL, 0, format, type_cstr, bound_cstr,
-                             type_param_cstr, of_cstr, cls_cstr) + 1;
+  const char* type_param_cstr = String::Handle(type_param.name()).ToCString();
+  const Class& cls = Class::Handle(type_param.parameterized_class());
+  const char* cls_cstr = String::Handle(cls.Name()).ToCString();
+  intptr_t len = OS::SNPrint(
+      NULL, 0, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr) + 1;
   char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
-  OS::SNPrint(chars, len, format, type_cstr, bound_cstr, type_param_cstr,
-              of_cstr, cls_cstr);
+  OS::SNPrint(
+      chars, len, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr);
   return chars;
 }
 
@@ -14839,14 +14894,17 @@
     return true;
   }
 
+  // An Array may be compared to an ImmutableArray.
   if (!other.IsArray() || other.IsNull()) {
     return false;
   }
 
-  // Must have the same type arguments.
-  if (!AbstractTypeArguments::AreEqual(
-      AbstractTypeArguments::Handle(GetTypeArguments()),
-      AbstractTypeArguments::Handle(other.GetTypeArguments()))) {
+  // Both arrays must have the same type arguments.
+  const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle(
+      GetTypeArguments());
+  const AbstractTypeArguments& other_type_args = AbstractTypeArguments::Handle(
+      other.GetTypeArguments());
+  if (!type_args.Equals(other_type_args)) {
     return false;
   }
 
@@ -15065,10 +15123,12 @@
     return false;
   }
 
-  // Both must have the same type arguments.
-  if (!AbstractTypeArguments::AreEqual(
-      AbstractTypeArguments::Handle(GetTypeArguments()),
-      AbstractTypeArguments::Handle(other.GetTypeArguments()))) {
+  // Both arrays must have the same type arguments.
+  const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle(
+      GetTypeArguments());
+  const AbstractTypeArguments& other_type_args = AbstractTypeArguments::Handle(
+      other.GetTypeArguments());
+  if (!type_args.Equals(other_type_args)) {
     return false;
   }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index d6ac20b..2334c28 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -960,10 +960,10 @@
   bool is_const() const { return ConstBit::decode(raw_ptr()->state_bits_); }
   void set_is_const() const;
 
-  bool is_mixin_typedef() const {
-    return MixinTypedefBit::decode(raw_ptr()->state_bits_);
+  bool is_mixin_app_alias() const {
+    return MixinAppAliasBit::decode(raw_ptr()->state_bits_);
   }
-  void set_is_mixin_typedef() const;
+  void set_is_mixin_app_alias() const;
 
   bool is_mixin_type_applied() const {
     return MixinTypeAppliedBit::decode(raw_ptr()->state_bits_);
@@ -1062,7 +1062,7 @@
     kPatchBit = 6,
     kSynthesizedClassBit = 7,
     kMarkedForParsingBit = 8,
-    kMixinTypedefBit = 9,
+    kMixinAppAliasBit = 9,
     kMixinTypeAppliedBit = 10,
   };
   class ConstBit : public BitField<bool, kConstBit, 1> {};
@@ -1074,7 +1074,7 @@
   class PatchBit : public BitField<bool, kPatchBit, 1> {};
   class SynthesizedClassBit : public BitField<bool, kSynthesizedClassBit, 1> {};
   class MarkedForParsingBit : public BitField<bool, kMarkedForParsingBit, 1> {};
-  class MixinTypedefBit : public BitField<bool, kMixinTypedefBit, 1> {};
+  class MixinAppAliasBit : public BitField<bool, kMixinAppAliasBit, 1> {};
   class MixinTypeAppliedBit : public BitField<bool, kMixinTypeAppliedBit, 1> {};
 
   void set_name(const String& value) const;
@@ -1187,10 +1187,6 @@
   // Returns true if all types of this vector are finalized.
   virtual bool IsFinalized() const { return true; }
 
-  // Returns true if both arguments represent vectors of equal types.
-  static bool AreEqual(const AbstractTypeArguments& arguments,
-                       const AbstractTypeArguments& other_arguments);
-
   // Return 'this' if this type argument vector is instantiated, i.e. if it does
   // not refer to type parameters. Otherwise, return a new type argument vector
   // where each reference to a type parameter is replaced with the corresponding
@@ -1220,10 +1216,10 @@
     return SubvectorName(0, Length(), kUserVisibleName);
   }
 
-  // Check if this type argument vector consists solely of DynamicType,
-  // considering only a prefix of length 'len'.
-  bool IsRaw(intptr_t len) const {
-    return IsDynamicTypes(false, len);
+  // Check if the subvector of length 'len' starting at 'from_index' of this
+  // type argument vector consists solely of DynamicType.
+  bool IsRaw(intptr_t from_index, intptr_t len) const {
+    return IsDynamicTypes(false, from_index, len);
   }
 
   // Check if this type argument vector would consist solely of DynamicType if
@@ -1231,24 +1227,28 @@
   // parameter as it would be first instantiated from a vector of dynamic types.
   // Consider only a prefix of length 'len'.
   bool IsRawInstantiatedRaw(intptr_t len) const {
-    return IsDynamicTypes(true, len);
+    return IsDynamicTypes(true, 0, len);
   }
 
-  // Check the subtype relationship, considering only a prefix of length 'len'.
+  // Check the subtype relationship, considering only a subvector of length
+  // 'len' starting at 'from_index'.
   bool IsSubtypeOf(const AbstractTypeArguments& other,
+                   intptr_t from_index,
                    intptr_t len,
                    Error* bound_error) const {
-    return TypeTest(kIsSubtypeOf, other, len, bound_error);
+    return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error);
   }
 
-  // Check the 'more specific' relationship, considering only a prefix of
-  // length 'len'.
+  // Check the 'more specific' relationship, considering only a subvector of
+  // length 'len' starting at 'from_index'.
   bool IsMoreSpecificThan(const AbstractTypeArguments& other,
+                          intptr_t from_index,
                           intptr_t len,
                           Error* bound_error) const {
-    return TypeTest(kIsMoreSpecificThan, other, len, bound_error);
+    return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error);
   }
 
+  // Check if the vectors are equal.
   bool Equals(const AbstractTypeArguments& other) const;
 
   // UNREACHABLEs as AbstractTypeArguments is an abstract class.
@@ -1265,16 +1265,19 @@
   virtual intptr_t Hash() const;
 
  private:
-  // Check if this type argument vector consists solely of DynamicType,
-  // considering only a prefix of length 'len'.
+  // Check if the subvector of length 'len' starting at 'from_index' of this
+  // type argument vector consists solely of DynamicType.
   // If raw_instantiated is true, consider each type parameter to be first
   // instantiated from a vector of dynamic types.
-  bool IsDynamicTypes(bool raw_instantiated, intptr_t len) const;
+  bool IsDynamicTypes(bool raw_instantiated,
+                      intptr_t from_index,
+                      intptr_t len) const;
 
   // Check the subtype or 'more specific' relationship, considering only a
-  // prefix of length 'len'.
+  // subvector of length 'len' starting at 'from_index'.
   bool TypeTest(TypeTestKind test_kind,
                 const AbstractTypeArguments& other,
+                intptr_t from_index,
                 intptr_t len,
                 Error* bound_error) const;
 
@@ -1443,6 +1446,8 @@
   RawString* QualifiedUserVisibleName() const;
   virtual RawString* DictionaryName() const { return name(); }
 
+  RawString* GetSource();
+
   // Build a string of the form 'C<T, R>(T, {b: B, c: C}) => R' representing the
   // internal signature of the given function. In this example, T and R are
   // type parameters of class C, the owner of the function.
@@ -2368,7 +2373,8 @@
   void Tokenize(const String& private_key) const;
 
   RawString* GetLine(intptr_t line_number) const;
-
+  RawString* GetSnippet(intptr_t from_token_pos,
+                        intptr_t to_token_pos) const;
   RawString* GetSnippet(intptr_t from_line,
                         intptr_t from_column,
                         intptr_t to_line,
@@ -3786,6 +3792,8 @@
     kMalboundedType,
   };
 
+  Kind kind() const { return static_cast<Kind>(raw_ptr()->kind_); }
+
   // Build, cache, and return formatted message.
   RawString* FormatMessage() const;
 
@@ -3826,7 +3834,6 @@
   intptr_t token_pos() const { return raw_ptr()->token_pos_; }
   void set_token_pos(intptr_t value) const;
 
-  Kind kind() const { return static_cast<Kind>(raw_ptr()->kind_); }
   void set_kind(uint8_t value) const;
 
   RawString* message() const { return raw_ptr()->message_; }
@@ -3996,10 +4003,10 @@
   virtual bool IsFinalized() const;
   virtual bool IsBeingFinalized() const;
   virtual bool IsMalformed() const;
-  virtual bool IsMalbounded() const { return IsMalboundedWithError(NULL); }
-  virtual bool IsMalboundedWithError(Error* bound_error) const;
-  virtual RawError* malformed_error() const;
-  virtual void set_malformed_error(const Error& value) const;
+  virtual bool IsMalbounded() const;
+  virtual bool IsMalformedOrMalbounded() const;
+  virtual RawLanguageError* error() const;
+  virtual void set_error(const LanguageError& value) const;
   virtual bool IsResolved() const;
   virtual bool HasResolvedTypeClass() const;
   virtual RawClass* type_class() const;
@@ -4140,10 +4147,10 @@
   }
   void set_is_being_finalized() const;
   virtual bool IsMalformed() const;
-  virtual bool IsMalbounded() const { return IsMalboundedWithError(NULL); }
-  virtual bool IsMalboundedWithError(Error* bound_error) const;
-  virtual RawError* malformed_error() const;
-  virtual void set_malformed_error(const Error& value) const;
+  virtual bool IsMalbounded() const;
+  virtual bool IsMalformedOrMalbounded() const;
+  virtual RawLanguageError* error() const { return raw_ptr()->error_; }
+  virtual void set_error(const LanguageError& value) const;
   virtual bool IsResolved() const;  // Class and all arguments classes resolved.
   virtual bool HasResolvedTypeClass() const;  // Own type class resolved.
   virtual RawClass* type_class() const;
@@ -4251,7 +4258,7 @@
   virtual bool IsBeingFinalized() const { return false; }
   virtual bool IsMalformed() const { return false; }
   virtual bool IsMalbounded() const { return false; }
-  virtual bool IsMalboundedWithError(Error* bound_error) const { return false; }
+  virtual bool IsMalformedOrMalbounded() const { return false; }
   virtual bool IsResolved() const { return true; }
   virtual bool HasResolvedTypeClass() const { return false; }
   RawClass* parameterized_class() const {
@@ -4263,7 +4270,9 @@
   RawAbstractType* bound() const { return raw_ptr()->bound_; }
   void set_bound(const AbstractType& value) const;
   // Returns true if bounded_type is below upper_bound, otherwise return false
-  // and set bound_error if not NULL.
+  // and set bound_error if both bounded_type and upper_bound are instantiated.
+  // If one or both are not instantiated, returning false only means that the
+  // bound cannot be checked yet and this is not an error.
   bool CheckBound(const AbstractType& bounded_type,
                   const AbstractType& upper_bound,
                   Error* bound_error) const;
@@ -4316,9 +4325,9 @@
     return AbstractType::Handle(type()).IsBeingFinalized();
   }
   virtual bool IsMalformed() const;
-  virtual bool IsMalbounded() const { return IsMalboundedWithError(NULL); }
-  virtual bool IsMalboundedWithError(Error* bound_error) const;
-  virtual RawError* malformed_error() const;
+  virtual bool IsMalbounded() const;
+  virtual bool IsMalformedOrMalbounded() const;
+  virtual RawLanguageError* error() const;
   virtual bool IsResolved() const { return true; }
   virtual bool HasResolvedTypeClass() const {
     return AbstractType::Handle(type()).HasResolvedTypeClass();
@@ -4341,6 +4350,10 @@
     return AbstractType::Handle(type()).token_pos();
   }
   virtual bool IsInstantiated() const {
+    // It is not possible to encounter an instantiated bounded type with an
+    // uninstantiated upper bound. Therefore, we do not need to check if the
+    // bound is instantiated. Moreover, doing so could lead into cycles, as in
+    // class C<T extends C<C>> { }.
     return AbstractType::Handle(type()).IsInstantiated();
   }
   virtual bool Equals(const Instance& other) const;
@@ -4391,6 +4404,7 @@
   // TODO(regis): Handle malformed and malbounded MixinAppType.
   virtual bool IsMalformed() const { return false; }
   virtual bool IsMalbounded() const { return false; }
+  virtual bool IsMalformedOrMalbounded() const { return false; }
   virtual bool IsResolved() const { return false; }
   virtual bool HasResolvedTypeClass() const { return false; }
   virtual RawString* Name() const;
@@ -6144,6 +6158,7 @@
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Stacktrace, Instance);
   friend class Class;
+  friend class Debugger;
 };
 
 
diff --git a/runtime/vm/object_mips_test.cc b/runtime/vm/object_mips_test.cc
index 76b9871..1c28422 100644
--- a/runtime/vm/object_mips_test.cc
+++ b/runtime/vm/object_mips_test.cc
@@ -19,13 +19,13 @@
 // This is used to test Code and Instruction object creation.
 void GenerateIncrement(Assembler* assembler) {
   __ Push(ZR);
-  __ lw(TMP1, Address(SP, 0));
-  __ addiu(TMP1, TMP1, Immediate(1));
-  __ sw(TMP1, Address(SP, 0));
-  __ lw(TMP1, Address(SP, 0));
-  __ addiu(TMP1, TMP1, Immediate(1));
+  __ lw(TMP, Address(SP, 0));
+  __ addiu(TMP, TMP, Immediate(1));
+  __ sw(TMP, Address(SP, 0));
+  __ lw(TMP, Address(SP, 0));
+  __ addiu(TMP, TMP, Immediate(1));
   __ Pop(V0);
-  __ mov(V0, TMP1);
+  __ mov(V0, TMP);
   __ Ret();
 }
 
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 4ec3410..fe389c2 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -68,7 +68,6 @@
     stack_overflow_(Instance::null()),
     out_of_memory_(Instance::null()),
     preallocated_stack_trace_(Stacktrace::null()),
-    keyword_symbols_(Array::null()),
     receive_port_create_function_(Function::null()),
     lookup_receive_port_function_(Function::null()),
     handle_message_function_(Function::null()) {
@@ -143,14 +142,4 @@
   return true;
 }
 
-
-void ObjectStore::InitKeywordTable() {
-  // Set up the keywords symbol array so that we can access it while scanning.
-  Array& keywords = Array::Handle(keyword_symbols());
-  ASSERT(keywords.IsNull());
-  keywords = Array::New(Token::numKeywords, Heap::kOld);
-  ASSERT(!keywords.IsError() && !keywords.IsNull());
-  set_keyword_symbols(keywords);
-}
-
 }  // namespace dart
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 1f51483..9e75cc4 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -379,12 +379,6 @@
     preallocated_stack_trace_ = value.raw();
   }
 
-  RawArray* keyword_symbols() const { return keyword_symbols_; }
-  void set_keyword_symbols(const Array& value) {
-    keyword_symbols_ = value.raw();
-  }
-  void InitKeywordTable();
-
   RawFunction* receive_port_create_function() const {
     return receive_port_create_function_;
   }
@@ -484,11 +478,12 @@
   RawInstance* stack_overflow_;
   RawInstance* out_of_memory_;
   RawStacktrace* preallocated_stack_trace_;
-  RawArray* keyword_symbols_;
   RawFunction* receive_port_create_function_;
   RawFunction* lookup_receive_port_function_;
   RawFunction* handle_message_function_;
-  RawObject** to() { return reinterpret_cast<RawObject**>(&keyword_symbols_); }
+  RawObject** to() {
+    return reinterpret_cast<RawObject**>(&handle_message_function_);
+  }
 
   friend class SnapshotReader;
 
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 70dd982..23cc6bd 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -17,6 +17,11 @@
 
 namespace dart {
 
+static RawLibrary* CreateDummyLibrary(const String& library_name) {
+  return Library::New(library_name);
+}
+
+
 static RawClass* CreateDummyClass(const String& class_name,
                                   const Script& script) {
   const Class& cls = Class::Handle(
@@ -2396,9 +2401,13 @@
 
 static Function* CreateFunction(const char* name) {
   const String& class_name = String::Handle(Symbols::New("ownerClass"));
+  const String& lib_name = String::Handle(Symbols::New("ownerLibrary"));
   const Script& script = Script::Handle();
   const Class& owner_class =
       Class::Handle(CreateDummyClass(class_name, script));
+  const Library& owner_library =
+      Library::Handle(CreateDummyLibrary(lib_name));
+  owner_class.set_library(owner_library);
   const String& function_name = String::ZoneHandle(Symbols::New(name));
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction,
diff --git a/runtime/vm/object_x64_test.cc b/runtime/vm/object_x64_test.cc
index f24d1e5..b8914e0 100644
--- a/runtime/vm/object_x64_test.cc
+++ b/runtime/vm/object_x64_test.cc
@@ -34,9 +34,10 @@
 void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
   const String& string_object =
       String::ZoneHandle(String::New(str, Heap::kOld));
-  __ EnterDartFrame(0);
+  __ pushq(PP);  // Save caller's pool pointer and load a new one here.
+  __ LoadPoolPointer(PP);
   __ LoadObject(RAX, string_object, PP);
-  __ LeaveFrameWithPP();
+  __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
 }
 
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index 2765953..fcb8447 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -14,6 +14,7 @@
 
 #include "platform/utils.h"
 #include "platform/assert.h"
+#include "platform/thread.h"
 
 namespace dart {
 
@@ -305,6 +306,12 @@
   init_once_called = true;
   // Do not pop up a message box when abort is called.
   _set_abort_behavior(0, _WRITE_ABORT_MSG);
+  ThreadInlineImpl::thread_id_key = Thread::CreateThreadLocal();
+  MonitorWaitData::monitor_wait_data_key_ = Thread::CreateThreadLocal();
+  MonitorData::GetMonitorWaitDataForThread();
+  ThreadId thread_id = ThreadInlineImpl::CreateThreadId();
+  Thread::SetThreadLocal(ThreadInlineImpl::thread_id_key,
+                         reinterpret_cast<DWORD>(thread_id));
 }
 
 
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 9b26bc3..e5a96c5 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -43,8 +43,9 @@
 }
 
 
-HeapPage* HeapPage::Allocate(intptr_t size, PageType type) {
-  VirtualMemory* memory = VirtualMemory::Reserve(size);
+HeapPage* HeapPage::Allocate(intptr_t size_in_words, PageType type) {
+  VirtualMemory* memory =
+      VirtualMemory::Reserve(size_in_words << kWordSizeLog2);
   return Initialize(memory, type);
 }
 
@@ -112,15 +113,15 @@
 }
 
 
-PageSpace::PageSpace(Heap* heap, intptr_t max_capacity)
+PageSpace::PageSpace(Heap* heap, intptr_t max_capacity_in_words)
     : freelist_(),
       heap_(heap),
       pages_(NULL),
       pages_tail_(NULL),
       large_pages_(NULL),
-      max_capacity_(max_capacity),
-      capacity_(0),
-      in_use_(0),
+      max_capacity_in_words_(max_capacity_in_words),
+      capacity_in_words_(0),
+      used_in_words_(0),
       sweeping_(false),
       page_space_controller_(FLAG_heap_growth_space_ratio,
                              FLAG_heap_growth_rate,
@@ -134,33 +135,33 @@
 }
 
 
-intptr_t PageSpace::LargePageSizeFor(intptr_t size) {
+intptr_t PageSpace::LargePageSizeInWordsFor(intptr_t size) {
   intptr_t page_size = Utils::RoundUp(size + HeapPage::ObjectStartOffset(),
                                       VirtualMemory::PageSize());
-  return page_size;
+  return page_size >> kWordSizeLog2;
 }
 
 
 HeapPage* PageSpace::AllocatePage(HeapPage::PageType type) {
-  HeapPage* page = HeapPage::Allocate(kPageSize, type);
+  HeapPage* page = HeapPage::Allocate(kPageSizeInWords, type);
   if (pages_ == NULL) {
     pages_ = page;
   } else {
     pages_tail_->set_next(page);
   }
   pages_tail_ = page;
-  capacity_ += kPageSize;
+  capacity_in_words_ += kPageSizeInWords;
   page->set_object_end(page->memory_->end());
   return page;
 }
 
 
 HeapPage* PageSpace::AllocateLargePage(intptr_t size, HeapPage::PageType type) {
-  intptr_t page_size = LargePageSizeFor(size);
-  HeapPage* page = HeapPage::Allocate(page_size, type);
+  intptr_t page_size_in_words = LargePageSizeInWordsFor(size);
+  HeapPage* page = HeapPage::Allocate(page_size_in_words, type);
   page->set_next(large_pages_);
   large_pages_ = page;
-  capacity_ += page_size;
+  capacity_in_words_ += page_size_in_words;
   // Only one object in this page.
   page->set_object_end(page->object_start() + size);
   return page;
@@ -168,7 +169,7 @@
 
 
 void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) {
-  capacity_ -= page->memory_->size();
+  capacity_in_words_ -= (page->memory_->size() >> kWordSizeLog2);
   // Remove the page from the list.
   if (previous_page != NULL) {
     previous_page->set_next(page->next());
@@ -184,7 +185,7 @@
 
 
 void PageSpace::FreeLargePage(HeapPage* page, HeapPage* previous_page) {
-  capacity_ -= page->memory_->size();
+  capacity_in_words_ -= (page->memory_->size() >> kWordSizeLog2);
   // Remove the page from the list.
   if (previous_page != NULL) {
     previous_page->set_next(page->next());
@@ -216,7 +217,7 @@
     if ((result == 0) &&
         (page_space_controller_.CanGrowPageSpace(size) ||
          growth_policy == kForceGrowth) &&
-        CanIncreaseCapacity(kPageSize)) {
+        CanIncreaseCapacityInWords(kPageSizeInWords)) {
       HeapPage* page = AllocatePage(type);
       ASSERT(page != NULL);
       // Start of the newly allocated page is the allocated object.
@@ -230,14 +231,14 @@
     }
   } else {
     // Large page allocation.
-    intptr_t page_size = LargePageSizeFor(size);
-    if (page_size < size) {
+    intptr_t page_size_in_words = LargePageSizeInWordsFor(size);
+    if ((page_size_in_words << kWordSizeLog2) < size) {
       // On overflow we fail to allocate.
       return 0;
     }
     if ((page_space_controller_.CanGrowPageSpace(size) ||
          growth_policy == kForceGrowth) &&
-        CanIncreaseCapacity(page_size)) {
+        CanIncreaseCapacityInWords(page_size_in_words)) {
       HeapPage* page = AllocateLargePage(size, type);
       if (page != NULL) {
         result = page->object_start();
@@ -245,7 +246,7 @@
     }
   }
   if (result != 0) {
-    in_use_ += size;
+    used_in_words_ += (size >> kWordSizeLog2);
     if (FLAG_compiler_stats && (type == HeapPage::kExecutable)) {
       CompilerStats::code_allocated += size;
     }
@@ -482,7 +483,7 @@
   int64_t mid2 = OS::GetCurrentTimeMicros();
 
   GCSweeper sweeper(heap_);
-  intptr_t in_use = 0;
+  intptr_t used_in_words = 0;
 
   HeapPage* prev_page = NULL;
   HeapPage* page = pages_;
@@ -492,7 +493,7 @@
     if (page_in_use == 0) {
       FreePage(page, prev_page);
     } else {
-      in_use += page_in_use;
+      used_in_words += (page_in_use >> kWordSizeLog2);
       prev_page = page;
     }
     // Advance to the next page.
@@ -509,7 +510,7 @@
     if (page_in_use == 0) {
       FreeLargePage(page, prev_page);
     } else {
-      in_use += page_in_use;
+      used_in_words += (page_in_use >> kWordSizeLog2);
       prev_page = page;
     }
     // Advance to the next page.
@@ -517,13 +518,14 @@
   }
 
   // Record data and print if requested.
-  intptr_t in_use_before = in_use_;
-  in_use_ = in_use;
+  intptr_t used_before_in_words = used_in_words_;
+  used_in_words_ = used_in_words;
 
   int64_t end = OS::GetCurrentTimeMicros();
 
   // Record signals for growth control.
-  page_space_controller_.EvaluateGarbageCollection(in_use_before, in_use,
+  page_space_controller_.EvaluateGarbageCollection(used_before_in_words,
+                                                   used_in_words,
                                                    start, end);
 
   heap_->RecordTime(kMarkObjects, mid1 - start);
@@ -567,8 +569,9 @@
 
 
 bool PageSpaceController::CanGrowPageSpace(intptr_t size_in_bytes) {
-  size_in_bytes = Utils::RoundUp(size_in_bytes, PageSpace::kPageSize);
-  intptr_t size_in_pages =  size_in_bytes / PageSpace::kPageSize;
+  intptr_t size_in_words = size_in_bytes >> kWordSizeLog2;
+  size_in_words = Utils::RoundUp(size_in_words, PageSpace::kPageSizeInWords);
+  intptr_t size_in_pages =  size_in_words / PageSpace::kPageSizeInWords;
   if (!is_enabled_) {
     return true;
   }
@@ -584,13 +587,15 @@
 
 
 void PageSpaceController::EvaluateGarbageCollection(
-    intptr_t in_use_before, intptr_t in_use_after, int64_t start, int64_t end) {
-  ASSERT(in_use_before >= in_use_after);
+    intptr_t used_before_in_words, intptr_t used_after_in_words,
+    int64_t start, int64_t end) {
+  // TODO(iposva): Reevaluate the growth policies.
+  ASSERT(used_before_in_words >= used_after_in_words);
   ASSERT(end >= start);
   history_.AddGarbageCollectionTime(start, end);
-  int collected_garbage_ratio =
-      static_cast<int>((static_cast<double>(in_use_before - in_use_after) /
-                        static_cast<double>(in_use_before))
+  int collected_garbage_ratio = static_cast<int>(
+      (static_cast<double>(used_before_in_words - used_after_in_words) /
+      static_cast<double>(used_before_in_words))
                        * 100.0);
   bool enough_free_space =
       (collected_garbage_ratio >= heap_growth_ratio_);
@@ -603,11 +608,13 @@
   if (enough_free_space && enough_free_time) {
     grow_heap_ = 0;
   } else {
-    intptr_t growth_target = static_cast<intptr_t>(in_use_after /
-                                                   desired_utilization_);
-    intptr_t growth_in_bytes = Utils::RoundUp(growth_target - in_use_after,
-                                              PageSpace::kPageSize);
-    int growth_in_pages = growth_in_bytes / PageSpace::kPageSize;
+    intptr_t growth_target = static_cast<intptr_t>(
+        used_after_in_words /  desired_utilization_);
+    intptr_t growth_in_words = Utils::RoundUp(
+        growth_target - used_after_in_words,
+        PageSpace::kPageSizeInWords);
+    int growth_in_pages =
+        growth_in_words / PageSpace::kPageSizeInWords;
     grow_heap_ = Utils::Maximum(growth_in_pages, heap_growth_rate_);
     heap->RecordData(PageSpace::kPageGrowth, growth_in_pages);
   }
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index 7543e3b..71707a8 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -18,8 +18,7 @@
 class Heap;
 class ObjectPointerVisitor;
 
-// An aligned page containing old generation objects. Alignment is used to be
-// able to get to a HeapPage header quickly based on a pointer to an object.
+// A page containing old generation objects.
 class HeapPage {
  public:
   enum PageType {
@@ -64,7 +63,7 @@
   }
 
   static HeapPage* Initialize(VirtualMemory* memory, PageType type);
-  static HeapPage* Allocate(intptr_t size, PageType type);
+  static HeapPage* Allocate(intptr_t size_in_words, PageType type);
 
   // Deallocate the virtual memory backing this page. The page pointer to this
   // page becomes immediately inaccessible.
@@ -121,7 +120,8 @@
   // heap_growth_ratio % of memory got deallocated by the garbage collector.
   // In this case garbage collection will be performed next time. Otherwise
   // the heap will grow.
-  void EvaluateGarbageCollection(intptr_t in_use_before, intptr_t in_use_after,
+  void EvaluateGarbageCollection(intptr_t used_before_in_words,
+                                 intptr_t used_after_in_words,
                                  int64_t start, int64_t end);
 
   int64_t last_code_collection_in_us() { return last_code_collection_in_us_; }
@@ -170,23 +170,22 @@
 class PageSpace {
  public:
   // TODO(iposva): Determine heap sizes and tune the page size accordingly.
-  static const intptr_t kPageSize = 256 * KB;
-  static const intptr_t kPageAlignment = kPageSize;
+  static const intptr_t kPageSizeInWords = 256 * KBInWords;
 
   enum GrowthPolicy {
     kControlGrowth,
     kForceGrowth
   };
 
-  PageSpace(Heap* heap, intptr_t max_capacity);
+  PageSpace(Heap* heap, intptr_t max_capacity_in_words);
   ~PageSpace();
 
   uword TryAllocate(intptr_t size,
                     HeapPage::PageType type = HeapPage::kData,
                     GrowthPolicy growth_policy = kControlGrowth);
 
-  intptr_t in_use() const { return in_use_; }
-  intptr_t capacity() const { return capacity_; }
+  intptr_t UsedInWords() const { return used_in_words_; }
+  intptr_t CapacityInWords() const { return capacity_in_words_; }
 
   bool Contains(uword addr) const;
   bool Contains(uword addr, HeapPage::PageType type) const;
@@ -242,11 +241,11 @@
   void FreeLargePage(HeapPage* page, HeapPage* previous_page);
   void FreePages(HeapPage* pages);
 
-  static intptr_t LargePageSizeFor(intptr_t size);
+  static intptr_t LargePageSizeInWordsFor(intptr_t size);
 
-  bool CanIncreaseCapacity(intptr_t increase) {
-    ASSERT(capacity_ <= max_capacity_);
-    return increase <= (max_capacity_ - capacity_);
+  bool CanIncreaseCapacityInWords(intptr_t increase_in_words) {
+    ASSERT(capacity_in_words_ <= max_capacity_in_words_);
+    return increase_in_words <= (max_capacity_in_words_ - capacity_in_words_);
   }
 
   FreeList freelist_[HeapPage::kNumPageTypes];
@@ -258,9 +257,9 @@
   HeapPage* large_pages_;
 
   // Various sizes being tracked for this generation.
-  intptr_t max_capacity_;
-  intptr_t capacity_;
-  intptr_t in_use_;
+  intptr_t max_capacity_in_words_;
+  intptr_t capacity_in_words_;
+  intptr_t used_in_words_;
 
   // Keep track whether a MarkSweep is currently running.
   bool sweeping_;
diff --git a/runtime/vm/pages_test.cc b/runtime/vm/pages_test.cc
index b11c379..d30d270 100644
--- a/runtime/vm/pages_test.cc
+++ b/runtime/vm/pages_test.cc
@@ -9,7 +9,7 @@
 namespace dart {
 
 TEST_CASE(Pages) {
-  PageSpace* space = new PageSpace(NULL, 4 * MB);
+  PageSpace* space = new PageSpace(NULL, 4 * MBInWords);
   EXPECT(!space->Contains(reinterpret_cast<uword>(&space)));
   uword block = space->TryAllocate(8 * kWordSize);
   EXPECT(block != 0);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 1ea5b70..18b58c4 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -5,7 +5,7 @@
 #include "vm/parser.h"
 
 #include "lib/invocation_mirror.h"
-#include "vm/bigint_operations.h"
+#include "platform/utils.h"
 #include "vm/bootstrap.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler.h"
@@ -14,14 +14,22 @@
 #include "vm/dart_entry.h"
 #include "vm/flags.h"
 #include "vm/growable_array.h"
+#include "vm/handles.h"
+#include "vm/heap.h"
+#include "vm/isolate.h"
 #include "vm/longjump.h"
+#include "vm/native_arguments.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
+#include "vm/os.h"
 #include "vm/resolver.h"
+#include "vm/scanner.h"
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/timer.h"
+#include "vm/zone.h"
 
 namespace dart {
 
@@ -194,11 +202,14 @@
       : try_block_(try_block),
         inlined_finally_nodes_(),
         outer_try_block_(outer_try_block),
-        try_index_(try_index) { }
+        try_index_(try_index),
+        inside_catch_(false) { }
 
   TryBlocks* outer_try_block() const { return outer_try_block_; }
   Block* try_block() const { return try_block_; }
   intptr_t try_index() const { return try_index_; }
+  bool inside_catch() const { return inside_catch_; }
+  void enter_catch() { inside_catch_ = true; }
 
   void AddNodeForFinallyInlining(AstNode* node);
   AstNode* GetNodeToInlineFinally(int index) {
@@ -213,6 +224,7 @@
   GrowableArray<AstNode*> inlined_finally_nodes_;
   TryBlocks* outer_try_block_;
   const intptr_t try_index_;
+  bool inside_catch_;
 
   DISALLOW_COPY_AND_ASSIGN(TryBlocks);
 };
@@ -864,9 +876,7 @@
 
 
 RawArray* Parser::EvaluateMetadata() {
-  if (CurrentToken() != Token::kAT) {
-    ErrorMsg("Metadata character '@' expected");
-  }
+  CheckToken(Token::kAT, "Metadata character '@' expected");
   GrowableObjectArray& meta_values =
       GrowableObjectArray::Handle(GrowableObjectArray::New());
   while (CurrentToken() == Token::kAT) {
@@ -1077,10 +1087,10 @@
     current_block_->scope->AddVariable(catch_excp_var);
   }
   LocalVariable* catch_trace_var =
-      current_block_->scope->LocalLookupVariable(Symbols::StacktraceVar());
+      current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (catch_trace_var == NULL) {
     catch_trace_var = new LocalVariable(token_pos,
-                                        Symbols::StacktraceVar(),
+                                        Symbols::StackTraceVar(),
                                         Type::ZoneHandle(Type::DynamicType()));
     current_block_->scope->AddVariable(catch_trace_var);
   }
@@ -1096,10 +1106,6 @@
   SequenceNode* try_block = CloseBlock();  // End try block.
 
   OpenBlock();  // Start catch handler list.
-  SourceLabel* end_catch_label =
-      SourceLabel::New(token_pos, NULL, SourceLabel::kCatch);
-  current_block_->scope->AddLabel(end_catch_label);
-
   OpenBlock();  // Start catch clause.
   AstNode* compare_transition_sentinel = new ComparisonNode(
       token_pos,
@@ -1120,8 +1126,6 @@
       new ThrowNode(token_pos,
                     new LoadLocalNode(token_pos, catch_excp_var),
                     new LoadLocalNode(token_pos, catch_trace_var)));
-  current_block_->statements->Add(
-      new JumpNode(token_pos, Token::kCONTINUE, end_catch_label));
   SequenceNode* catch_clause = CloseBlock();  // End catch clause.
 
   current_block_->statements->Add(catch_clause);
@@ -1138,7 +1142,6 @@
 
   AstNode* try_catch_node = new TryCatchNode(token_pos,
                                              try_block,
-                                             end_catch_label,
                                              context_var,
                                              catch_block,
                                              NULL,  // No finally block.
@@ -1601,6 +1604,10 @@
         signature_type ^= ClassFinalizer::FinalizeType(
             signature_class, signature_type, ClassFinalizer::kCanonicalize);
       }
+      // A signature type itself cannot be malformed or malbounded, only its
+      // signature function's result type or parameter types may be.
+      ASSERT(!signature_type.IsMalformed());
+      ASSERT(!signature_type.IsMalbounded());
       // The type of the parameter is now the signature type.
       parameter.type = &signature_type;
     }
@@ -1693,13 +1700,9 @@
                             evaluate_metadata,
                             params);
       if (params->has_optional_positional_parameters) {
-        if (CurrentToken() != Token::kRBRACK) {
-          ErrorMsg("',' or ']' expected");
-        }
+        CheckToken(Token::kRBRACK, "',' or ']' expected");
       } else {
-        if (CurrentToken() != Token::kRBRACE) {
-          ErrorMsg("',' or '}' expected");
-        }
+        CheckToken(Token::kRBRACE, "',' or '}' expected");
       }
       ConsumeToken();  // ']' or '}'.
     }
@@ -1719,9 +1722,7 @@
   TRACE_PARSER("ParseNativeDeclaration");
   ASSERT(IsLiteral("native"));
   ConsumeToken();
-  if (CurrentToken() != Token::kSTRING) {
-    ErrorMsg("string literal expected");
-  }
+  CheckToken(Token::kSTRING, "string literal expected");
   String& native_name = *CurrentLiteral();
   ConsumeToken();
   return native_name;
@@ -2122,9 +2123,7 @@
     ctor_name = String::Concat(ctor_name,
                                *ExpectIdentifier("constructor name expected"));
   }
-  if (CurrentToken() != Token::kLPAREN) {
-    ErrorMsg("parameter list expected");
-  }
+  CheckToken(Token::kLPAREN, "parameter list expected");
 
   ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
   // 'this' parameter is the first argument to super class constructor.
@@ -2383,9 +2382,7 @@
     ctor_name = String::Concat(ctor_name,
                                *ExpectIdentifier("constructor name expected"));
   }
-  if (CurrentToken() != Token::kLPAREN) {
-    ErrorMsg("parameter list expected");
-  }
+  CheckToken(Token::kLPAREN, "parameter list expected");
 
   ArgumentListNode* arguments = new ArgumentListNode(call_pos);
   // 'this' parameter is the first argument to constructor.
@@ -2442,7 +2439,7 @@
       current_class(), receiver, &initialized_fields);
   receiver->set_invisible(false);
 
-  // If the class of this implicit constructor is a mixin typedef class,
+  // If the class of this implicit constructor is a mixin application alias,
   // it is a forwarding constructor of the aliased mixin application class.
   // If the class of this implicit constructor is a mixin application class,
   // it is a forwarding constructor of the mixin. The forwarding
@@ -2450,7 +2447,7 @@
   // expressions and then calls the respective super constructor with
   // the same name and number of parameters.
   ArgumentListNode* forwarding_args = NULL;
-  if (current_class().is_mixin_typedef() ||
+  if (current_class().is_mixin_app_alias() ||
       current_class().IsMixinApplication()) {
     // At this point we don't support forwarding constructors
     // that have optional parameters because we don't know the default
@@ -3005,9 +3002,7 @@
         ConsumeToken();
         ExpectIdentifier("identifier expected");
       }
-      if (CurrentToken() != Token::kLPAREN) {
-        ErrorMsg("'(' expected");
-      }
+      CheckToken(Token::kLPAREN);
       SkipToMatchingParenthesis();
     } else {
       SkipIf(Token::kTHIS);
@@ -3184,7 +3179,7 @@
           method->name->ToCString(),
           String::Handle(type.UserVisibleName()).ToCString());
     } else {
-      // TODO(regis): What if the redirection type is malbounded?
+      // We handle malformed and malbounded redirection type at run time.
       redirection_type ^= type.raw();
     }
     if (CurrentToken() == Token::kPERIOD) {
@@ -3218,9 +3213,7 @@
             *ExpectIdentifier("constructor name expected"));
       }
       method->redirect_name = &redir_name;
-      if (CurrentToken() != Token::kLPAREN) {
-        ErrorMsg("'(' expected");
-      }
+      CheckToken(Token::kLPAREN);
       SkipToMatchingParenthesis();
     } else {
       SkipInitializers();
@@ -3687,9 +3680,7 @@
     // Ensure that names are symbols.
     *member.name = Symbols::New(*member.name);
 
-    if (CurrentToken() != Token::kLPAREN) {
-      ErrorMsg("left parenthesis expected");
-    }
+    CheckToken(Token::kLPAREN);
   } else if ((CurrentToken() == Token::kGET) && !member.has_var &&
              (LookaheadToken(1) != Token::kLPAREN) &&
              (LookaheadToken(1) != Token::kASSIGN) &&
@@ -3709,9 +3700,7 @@
     member.kind = RawFunction::kSetterFunction;
     member.name_pos = this->TokenPos();
     member.name = ExpectIdentifier("identifier expected");
-    if (CurrentToken() != Token::kLPAREN) {
-      ErrorMsg("'(' expected");
-    }
+    CheckToken(Token::kLPAREN);
     // The grammar allows a return type, so member.type is not always NULL here.
     // If no return type is specified, the return type of the setter is dynamic.
     if (member.type == NULL) {
@@ -3896,12 +3885,14 @@
     ConsumeToken();  // extends or =
     const intptr_t type_pos = TokenPos();
     super_type = ParseType(ClassFinalizer::kResolveTypeParameters);
-    if (super_type.IsMalformed() || super_type.IsDynamicType()) {
+    if (super_type.IsMalformedOrMalbounded()) {
+      ErrorMsg(Error::Handle(super_type.error()));
+    }
+    if (super_type.IsDynamicType()) {
       // Unlikely here, since super type is not resolved yet.
       ErrorMsg(type_pos,
-               "class '%s' may not extend %s",
-               class_name.ToCString(),
-               super_type.IsMalformed() ? "a malformed type" : "'dynamic'");
+               "class '%s' may not extend 'dynamic'",
+               class_name.ToCString());
     }
     if (super_type.IsTypeParameter()) {
       ErrorMsg(type_pos,
@@ -3914,7 +3905,7 @@
       super_type = ParseMixins(super_type);
     }
     if (is_mixin_declaration) {
-      cls.set_is_mixin_typedef();
+      cls.set_is_mixin_app_alias();
       cls.set_is_synthesized_class();
     }
   } else {
@@ -3944,9 +3935,7 @@
   if (is_mixin_declaration) {
     ExpectSemicolon();
   } else {
-    if (CurrentToken() != Token::kLBRACE) {
-      ErrorMsg("{ expected");
-    }
+    CheckToken(Token::kLBRACE);
     SkipBlock();
     ExpectToken(Token::kRBRACE);
   }
@@ -4073,13 +4062,15 @@
 }
 
 
-void Parser::ParseMixinTypedef(const GrowableObjectArray& pending_classes,
-                               intptr_t metadata_pos) {
-  TRACE_PARSER("ParseMixinTypedef");
+void Parser::ParseMixinAppAlias(
+    const GrowableObjectArray& pending_classes,
+    intptr_t metadata_pos) {
+  TRACE_PARSER("ParseMixinAppAlias");
   const intptr_t classname_pos = TokenPos();
   String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected");
   if (FLAG_trace_parser) {
-    OS::Print("toplevel parsing typedef class '%s'\n", class_name.ToCString());
+    OS::Print("toplevel parsing mixin application alias class '%s'\n",
+              class_name.ToCString());
   }
   const Object& obj = Object::Handle(library_.LookupLocalObject(class_name));
   if (!obj.IsNull()) {
@@ -4088,7 +4079,7 @@
   }
   const Class& mixin_application =
       Class::Handle(Class::New(class_name, script_, classname_pos));
-  mixin_application.set_is_mixin_typedef();
+  mixin_application.set_is_mixin_app_alias();
   library_.AddClass(mixin_application);
   set_current_class(mixin_application);
   ParseTypeParameters(mixin_application);
@@ -4110,15 +4101,13 @@
              String::Handle(type.UserVisibleName()).ToCString());
   }
 
-  if (CurrentToken() != Token::kWITH) {
-    ErrorMsg("mixin application 'with Type' expected");
-  }
+  CheckToken(Token::kWITH, "mixin application 'with Type' expected");
   type = ParseMixins(type);
 
   mixin_application.set_super_type(type);
   mixin_application.set_is_synthesized_class();
 
-  // This mixin application typedef needs an implicit constructor, but it is
+  // This mixin application alias needs an implicit constructor, but it is
   // too early to call 'AddImplicitConstructor(mixin_application)' here,
   // because this class should be lazily compiled.
   if (CurrentToken() == Token::kIMPLEMENTS) {
@@ -4155,7 +4144,7 @@
 
 // Look ahead to detect if we are seeing ident [ TypeParameters ] "=".
 // Token position remains unchanged.
-bool Parser::IsMixinTypedef() {
+bool Parser::IsMixinAppAlias() {
   if (IsIdentifier() && (LookaheadToken(1) == Token::kASSIGN)) {
     return true;
   }
@@ -4177,11 +4166,11 @@
   TRACE_PARSER("ParseTypedef");
   ExpectToken(Token::kTYPEDEF);
 
-  if (IsMixinTypedef()) {
+  if (IsMixinAppAlias()) {
     if (FLAG_warn_mixin_typedef) {
-      Warning("deprecated mixin typedef");
+      Warning("deprecated mixin application typedef");
     }
-    ParseMixinTypedef(pending_classes, metadata_pos);
+    ParseMixinAppAlias(pending_classes, metadata_pos);
     return;
   }
 
@@ -4191,7 +4180,7 @@
     ConsumeToken();
     result_type = Type::VoidType();
   } else if (!IsFunctionTypeAliasName()) {
-    // Type annotations in typedef are never ignored, even in unchecked mode.
+    // Type annotations in typedef are never ignored, even in production mode.
     // Wait until we have an owner class before resolving the result type.
     result_type = ParseType(ClassFinalizer::kDoNotResolve);
   }
@@ -4229,9 +4218,7 @@
                          &result_type);
   }
   // Parse the formal parameters of the function type.
-  if (CurrentToken() != Token::kLPAREN) {
-    ErrorMsg("formal parameter list expected");
-  }
+  CheckToken(Token::kLPAREN, "formal parameter list expected");
   ParamList func_params;
 
   // Add implicit closure object parameter.
@@ -4657,9 +4644,7 @@
   // A setter named x= may co-exist with a function named x, thus we do
   // not need to check setters.
 
-  if (CurrentToken() != Token::kLPAREN) {
-    ErrorMsg("'(' expected");
-  }
+  CheckToken(Token::kLPAREN);
   const intptr_t function_pos = TokenPos();
   ParamList params;
   const bool allow_explicit_default_values = true;
@@ -4916,9 +4901,7 @@
   ASSERT(is_import || is_export);
   const intptr_t import_pos = TokenPos();
   ConsumeToken();
-  if (CurrentToken() != Token::kSTRING) {
-    ErrorMsg("library url expected");
-  }
+  CheckToken(Token::kSTRING, "library url expected");
   AstNode* url_literal = ParseStringLiteral(false);
   ASSERT(url_literal->IsLiteralNode());
   ASSERT(url_literal->AsLiteralNode()->literal().IsString());
@@ -5007,9 +4990,7 @@
 void Parser::ParseLibraryPart() {
   const intptr_t source_pos = TokenPos();
   ConsumeToken();  // Consume "part".
-  if (CurrentToken() != Token::kSTRING) {
-    ErrorMsg("url expected");
-  }
+  CheckToken(Token::kSTRING, "url expected");
   AstNode* url_literal = ParseStringLiteral(false);
   ASSERT(url_literal->IsLiteralNode());
   ASSERT(url_literal->AsLiteralNode()->literal().IsString());
@@ -5075,9 +5056,7 @@
 
 void Parser::ParsePartHeader() {
   SkipMetadata();
-  if (CurrentToken() != Token::kPART) {
-    ErrorMsg("'part of' expected");
-  }
+  CheckToken(Token::kPART, "'part of' expected");
   ConsumeToken();
   if (!IsLiteral("of")) {
     ErrorMsg("'part of' expected");
@@ -5589,10 +5568,7 @@
                line_number);
     }
   }
-
-  if (CurrentToken() != Token::kLPAREN) {
-    ErrorMsg("'(' expected");
-  }
+  CheckToken(Token::kLPAREN);
 
   // Check whether we have parsed this closure function before, in a previous
   // compilation. If so, reuse the function object, else create a new one
@@ -5714,28 +5690,24 @@
     // The call to ClassFinalizer::FinalizeType may have
     // extended the vector of type arguments.
     signature_type_arguments = signature_type.arguments();
-    ASSERT(signature_type.IsMalformed() ||
-           signature_type_arguments.IsNull() ||
+    ASSERT(signature_type_arguments.IsNull() ||
            (signature_type_arguments.Length() ==
             signature_class.NumTypeArguments()));
 
     // The signature_class should not have changed.
-    ASSERT(signature_type.IsMalformed() ||
-           (signature_type.type_class() == signature_class.raw()));
+    ASSERT(signature_type.type_class() == signature_class.raw());
   }
 
+  // A signature type itself cannot be malformed or malbounded, only its
+  // signature function's result type or parameter types may be.
+  ASSERT(!signature_type.IsMalformed());
+  ASSERT(!signature_type.IsMalbounded());
+
   if (variable_name != NULL) {
     // Patch the function type of the variable now that the signature is known.
     function_type.set_type_class(signature_class);
     function_type.set_arguments(signature_type_arguments);
 
-    // Mark the function type as malformed if the signature type is malformed.
-    if (signature_type.IsMalformed()) {
-      const Error& error = Error::Handle(signature_type.malformed_error());
-      function_type.set_malformed_error(error);
-    }
-    // TODO(regis): What if the signature is malbounded?
-
     // The function type was initially marked as instantiated, but it may
     // actually be uninstantiated.
     function_type.ResetIsFinalized();
@@ -6689,36 +6661,39 @@
 
 struct CatchParamDesc {
   CatchParamDesc()
-      : token_pos(0), type(NULL), var(NULL) { }
+      : token_pos(0), type(NULL), name(NULL), var(NULL) { }
   intptr_t token_pos;
   const AbstractType* type;
-  const String* var;
+  const String* name;
+  LocalVariable* var;
 };
 
 
 // Populate local scope of the catch block with the catch parameters.
-void Parser::AddCatchParamsToScope(const CatchParamDesc& exception_param,
-                                   const CatchParamDesc& stack_trace_param,
+void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param,
+                                   CatchParamDesc* stack_trace_param,
                                    LocalScope* scope) {
-  if (exception_param.var != NULL) {
-    LocalVariable* var = new LocalVariable(exception_param.token_pos,
-                                           *exception_param.var,
-                                           *exception_param.type);
+  if (exception_param->name != NULL) {
+    LocalVariable* var = new LocalVariable(exception_param->token_pos,
+                                           *exception_param->name,
+                                           *exception_param->type);
     var->set_is_final();
     bool added_to_scope = scope->AddVariable(var);
     ASSERT(added_to_scope);
+    exception_param->var = var;
   }
-  if (stack_trace_param.var != NULL) {
-    LocalVariable* var = new LocalVariable(TokenPos(),
-                                           *stack_trace_param.var,
-                                           *stack_trace_param.type);
+  if (stack_trace_param->name != NULL) {
+    LocalVariable* var = new LocalVariable(stack_trace_param->token_pos,
+                                           *stack_trace_param->name,
+                                           *stack_trace_param->type);
     var->set_is_final();
     bool added_to_scope = scope->AddVariable(var);
     if (!added_to_scope) {
-      ErrorMsg(stack_trace_param.token_pos,
+      ErrorMsg(stack_trace_param->token_pos,
                "name '%s' already exists in scope",
-               stack_trace_param.var->ToCString());
+               stack_trace_param->name->ToCString());
     }
+    stack_trace_param->var = var;
   }
 }
 
@@ -6787,22 +6762,197 @@
 }
 
 
+SequenceNode* Parser::ParseCatchClauses(
+    intptr_t handler_pos,
+    LocalVariable* exception_var,
+    LocalVariable* stack_trace_var,
+    const GrowableObjectArray& handler_types,
+    bool* needs_stack_trace) {
+  // All catch blocks are merged into an if-then-else sequence of the
+  // different types specified using the 'is' operator.  While parsing
+  // record the type tests (either a ComparisonNode or else the LiteralNode
+  // true for a generic catch) and the catch bodies in a pair of parallel
+  // lists.  Afterward, construct the nested if-then-else.
+  bool generic_catch_seen = false;
+  GrowableArray<AstNode*> type_tests;
+  GrowableArray<SequenceNode*> catch_blocks;
+  while ((CurrentToken() == Token::kCATCH) || IsLiteral("on")) {
+    // Open a block that contains the if or an unconditional body.  It's
+    // closed in the loop that builds the if-then-else nest.
+    OpenBlock();
+    const intptr_t catch_pos = TokenPos();
+    CatchParamDesc exception_param;
+    CatchParamDesc stack_trace_param;
+    if (IsLiteral("on")) {
+      ConsumeToken();
+      exception_param.type = &AbstractType::ZoneHandle(
+          ParseType(ClassFinalizer::kCanonicalize));
+    } else {
+      exception_param.type = &AbstractType::ZoneHandle(Type::DynamicType());
+    }
+    if (CurrentToken() == Token::kCATCH) {
+      ConsumeToken();  // Consume the 'catch'.
+      ExpectToken(Token::kLPAREN);
+      exception_param.token_pos = TokenPos();
+      exception_param.name = ExpectIdentifier("identifier expected");
+      if (CurrentToken() == Token::kCOMMA) {
+        ConsumeToken();
+        // TODO(hausner): Make implicit type be StackTrace, not dynamic.
+        stack_trace_param.type =
+            &AbstractType::ZoneHandle(Type::DynamicType());
+        stack_trace_param.token_pos = TokenPos();
+        stack_trace_param.name = ExpectIdentifier("identifier expected");
+      }
+      ExpectToken(Token::kRPAREN);
+    }
+
+    // Create a block containing the catch clause parameters and the
+    // following code:
+    // 1) Store exception object and stack trace object into user-defined
+    //    variables (as needed).
+    // 2) Nested block with source code from catch clause block.
+    OpenBlock();
+    AddCatchParamsToScope(&exception_param, &stack_trace_param,
+                          current_block_->scope);
+
+    if (exception_param.var != NULL) {
+      // Generate code to load the exception object (:exception_var) into
+      // the exception variable specified in this block.
+      ASSERT(exception_var != NULL);
+      current_block_->statements->Add(
+          new StoreLocalNode(catch_pos, exception_param.var,
+                             new LoadLocalNode(catch_pos, exception_var)));
+    }
+    if (stack_trace_param.var != NULL) {
+      // A stack trace variable is specified in this block, so generate code
+      // to load the stack trace object (:stack_trace_var) into the stack
+      // trace variable specified in this block.
+      *needs_stack_trace = true;
+      ArgumentListNode* no_args = new ArgumentListNode(catch_pos);
+      ASSERT(stack_trace_var != NULL);
+      current_block_->statements->Add(
+          new StoreLocalNode(catch_pos, stack_trace_param.var,
+                             new LoadLocalNode(catch_pos, stack_trace_var)));
+      current_block_->statements->Add(
+          new InstanceCallNode(
+              catch_pos,
+              new LoadLocalNode(catch_pos, stack_trace_param.var),
+              Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
+              no_args));
+    }
+
+    // Add nested block with user-defined code.  This blocks allows
+    // declarations in the body to shadow the catch parameters.
+    CheckToken(Token::kLBRACE);
+    current_block_->statements->Add(ParseNestedStatement(false, NULL));
+    catch_blocks.Add(CloseBlock());
+
+    const bool is_bad_type =
+        exception_param.type->IsMalformed() ||
+        exception_param.type->IsMalbounded();
+    if (exception_param.type->IsDynamicType() || is_bad_type) {
+      // There is no exception type or else it is malformed or malbounded.
+      // In the first case, unconditionally execute the catch body.  In the
+      // second case, unconditionally throw.
+      generic_catch_seen = true;
+      type_tests.Add(new LiteralNode(catch_pos, Bool::True()));
+      if (is_bad_type) {
+        // Replace the body with one that throws.
+        SequenceNode* block = new SequenceNode(catch_pos, NULL);
+        block->Add(ThrowTypeError(catch_pos, *exception_param.type));
+        catch_blocks.Last() = block;
+      }
+      // This catch clause will handle all exceptions. We can safely forget
+      // all previous catch clause types.
+      handler_types.SetLength(0);
+      handler_types.Add(*exception_param.type);
+    } else {
+      // Has a type specification that is not malformed or malbounded.  Now
+      // form an 'if type check' to guard the catch handler code.
+      if (!exception_param.type->IsInstantiated() &&
+          (current_block_->scope->function_level() > 0)) {
+        // Make sure that the instantiator is captured.
+        CaptureInstantiator();
+      }
+      TypeNode* exception_type = new TypeNode(catch_pos, *exception_param.type);
+      AstNode* exception_value = new LoadLocalNode(catch_pos, exception_var);
+      if (!exception_type->type().IsInstantiated()) {
+        EnsureExpressionTemp();
+      }
+      type_tests.Add(new ComparisonNode(catch_pos, Token::kIS, exception_value,
+                                        exception_type));
+
+      // Do not add uninstantiated types (e.g. type parameter T or generic
+      // type List<T>), since the debugger won't be able to instantiate it
+      // when walking the stack.
+      //
+      // This means that the debugger is not able to determine whether an
+      // exception is caught if the catch clause uses generic types.  It
+      // will report the exception as uncaught when in fact it might be
+      // caught and handled when we unwind the stack.
+      if (!generic_catch_seen && exception_param.type->IsInstantiated()) {
+        handler_types.Add(*exception_param.type);
+      }
+    }
+
+    ASSERT(type_tests.length() == catch_blocks.length());
+  }
+
+  // Build the if/then/else nest from the inside out.  Keep the AST simple
+  // for the case of a single generic catch clause.  The initial value of
+  // current is the last (innermost) else block if there were any catch
+  // clauses.
+  SequenceNode* current = NULL;
+  if (!generic_catch_seen) {
+    // There isn't a generic catch clause so create a clause body that
+    // rethrows the exception.  This includes the case that there were no
+    // catch clauses.
+    current = new SequenceNode(handler_pos, NULL);
+    current->Add(
+        new ThrowNode(handler_pos,
+                      new LoadLocalNode(handler_pos, exception_var),
+                      new LoadLocalNode(handler_pos, stack_trace_var)));
+  } else if (type_tests.Last()->IsLiteralNode()) {
+    ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() ==
+           Bool::True().raw());
+    // The last body is entered unconditionally.  Start building the
+    // if/then/else nest with that body as the innermost else block.
+    // Note that it is nested inside an extra block which we opened
+    // before we knew the body was entered unconditionally.
+    type_tests.RemoveLast();
+    current_block_->statements->Add(catch_blocks.RemoveLast());
+    current = CloseBlock();
+  }
+  // If the last body was entered conditionally and there is no need to add
+  // a rethrow, use an empty else body (current = NULL above).
+
+  while (!type_tests.is_empty()) {
+    AstNode* type_test = type_tests.RemoveLast();
+    SequenceNode* catch_block = catch_blocks.RemoveLast();
+    current_block_->statements->Add(
+        new IfNode(type_test->token_pos(), type_test, catch_block, current));
+    current = CloseBlock();
+  }
+  return current;
+}
+
+
 AstNode* Parser::ParseTryStatement(String* label_name) {
   TRACE_PARSER("ParseTryStatement");
 
-  // We create three stack slots for exceptions here:
-  // ':saved_try_context_var' - Used to save the context before start of the try
-  //                            block. The context register is restored from
-  //                            this slot before processing the catch block
-  //                            handler.
+  // We create three variables for exceptions here:
+  // ':saved_try_context_var' - Used to save the context before the start of
+  //                            the try block. The context register is
+  //                            restored from this variable before
+  //                            processing the catch block handler.
   // ':exception_var' - Used to save the current exception object that was
   //                    thrown.
-  // ':stacktrace_var' - Used to save the current stack trace object into which
-  //                     the stack trace was copied into when an exception was
-  //                     thrown.
-  // :exception_var and :stacktrace_var get set with the exception object
-  // and the stacktrace object when an exception is thrown.
-  // These three implicit variables can never be captured variables.
+  // ':stack_trace_var' - Used to save the current stack trace object which
+  //                      the stack trace was copied into when an exception
+  //                      was thrown.
+  // :exception_var and :stack_trace_var get set with the exception object
+  // and the stack trace object when an exception is thrown.  These three
+  // implicit variables can never be captured.
   LocalVariable* context_var =
       current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   if (context_var == NULL) {
@@ -6811,21 +6961,21 @@
                                     Type::ZoneHandle(Type::DynamicType()));
     current_block_->scope->AddVariable(context_var);
   }
-  LocalVariable* catch_excp_var =
+  LocalVariable* exception_var =
       current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
-  if (catch_excp_var == NULL) {
-    catch_excp_var = new LocalVariable(TokenPos(),
-                                       Symbols::ExceptionVar(),
-                                       Type::ZoneHandle(Type::DynamicType()));
-    current_block_->scope->AddVariable(catch_excp_var);
+  if (exception_var == NULL) {
+    exception_var = new LocalVariable(TokenPos(),
+                                      Symbols::ExceptionVar(),
+                                      Type::ZoneHandle(Type::DynamicType()));
+    current_block_->scope->AddVariable(exception_var);
   }
-  LocalVariable* catch_trace_var =
-      current_block_->scope->LocalLookupVariable(Symbols::StacktraceVar());
-  if (catch_trace_var == NULL) {
-    catch_trace_var = new LocalVariable(TokenPos(),
-                                        Symbols::StacktraceVar(),
+  LocalVariable* stack_trace_var =
+      current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
+  if (stack_trace_var == NULL) {
+    stack_trace_var = new LocalVariable(TokenPos(),
+                                        Symbols::StackTraceVar(),
                                         Type::ZoneHandle(Type::DynamicType()));
-    current_block_->scope->AddVariable(catch_trace_var);
+    current_block_->scope->AddVariable(stack_trace_var);
   }
 
   const intptr_t try_pos = TokenPos();
@@ -6840,155 +6990,27 @@
 
   // Now parse the 'try' block.
   OpenBlock();
-  Block* current_try_block = current_block_;
-  PushTryBlock(current_try_block);
+  PushTryBlock(current_block_);
   ExpectToken(Token::kLBRACE);
   ParseStatementSequence();
   ExpectToken(Token::kRBRACE);
   SequenceNode* try_block = CloseBlock();
 
-  // Now create a label for the end of catch block processing so that we can
-  // jump over the catch block code after executing the try block.
-  SourceLabel* end_catch_label =
-      SourceLabel::New(TokenPos(), NULL, SourceLabel::kCatch);
+  if ((CurrentToken() != Token::kCATCH) && !IsLiteral("on") &&
+      (CurrentToken() != Token::kFINALLY)) {
+    ErrorMsg("catch or finally clause expected");
+  }
 
-  // Now parse the 'catch' blocks if any and merge all of them into
-  // an if-then sequence of the different types specified using the 'is'
-  // operator.
-  bool catch_seen = false;
-  bool generic_catch_seen = false;
+  // Now parse the 'catch' blocks if any.
+  try_blocks_list_->enter_catch();
   const intptr_t handler_pos = TokenPos();
-  OpenBlock();  // Start the catch block sequence.
-  current_block_->scope->AddLabel(end_catch_label);
   const GrowableObjectArray& handler_types =
       GrowableObjectArray::Handle(GrowableObjectArray::New());
-  bool needs_stacktrace = false;
-  while ((CurrentToken() == Token::kCATCH) || IsLiteral("on")) {
-    const intptr_t catch_pos = TokenPos();
-    CatchParamDesc exception_param;
-    CatchParamDesc stack_trace_param;
-    catch_seen = true;
-    if (IsLiteral("on")) {
-      ConsumeToken();
-      exception_param.type = &AbstractType::ZoneHandle(
-          ParseType(ClassFinalizer::kCanonicalize));
-    } else {
-      exception_param.type =
-          &AbstractType::ZoneHandle(Type::DynamicType());
-    }
-    if (CurrentToken() == Token::kCATCH) {
-      ConsumeToken();  // Consume the 'catch'.
-      ExpectToken(Token::kLPAREN);
-      exception_param.token_pos = TokenPos();
-      exception_param.var = ExpectIdentifier("identifier expected");
-      if (CurrentToken() == Token::kCOMMA) {
-        ConsumeToken();
-        // TODO(hausner): Make implicit type be StackTrace, not dynamic.
-        stack_trace_param.type =
-            &AbstractType::ZoneHandle(Type::DynamicType());
-        stack_trace_param.token_pos = TokenPos();
-        stack_trace_param.var = ExpectIdentifier("identifier expected");
-      }
-      ExpectToken(Token::kRPAREN);
-    }
+  bool needs_stack_trace = false;
+  SequenceNode* catch_handler_list =
+      ParseCatchClauses(handler_pos, exception_var, stack_trace_var,
+                        handler_types, &needs_stack_trace);
 
-    OpenBlock();
-    AddCatchParamsToScope(exception_param,
-                          stack_trace_param,
-                          current_block_->scope);
-
-    // Parse the individual catch handler code and add an unconditional
-    // JUMP to the end of the try block.
-    ExpectToken(Token::kLBRACE);
-    OpenBlock();
-
-    if (exception_param.var != NULL) {
-      // Generate code to load the exception object (:exception_var) into
-      // the exception variable specified in this block.
-      LocalVariable* var = LookupLocalScope(*exception_param.var);
-      ASSERT(var != NULL);
-      ASSERT(catch_excp_var != NULL);
-      current_block_->statements->Add(
-          new StoreLocalNode(catch_pos, var,
-                             new LoadLocalNode(catch_pos, catch_excp_var)));
-    }
-    if (stack_trace_param.var != NULL) {
-      // A stack trace variable is specified in this block, so generate code
-      // to load the stack trace object (:stacktrace_var) into the stack trace
-      // variable specified in this block.
-      needs_stacktrace = true;
-      ArgumentListNode* no_args = new ArgumentListNode(catch_pos);
-      LocalVariable* trace = LookupLocalScope(*stack_trace_param.var);
-      ASSERT(catch_trace_var != NULL);
-      current_block_->statements->Add(
-          new StoreLocalNode(catch_pos, trace,
-                             new LoadLocalNode(catch_pos, catch_trace_var)));
-      current_block_->statements->Add(
-          new InstanceCallNode(
-              catch_pos,
-              new LoadLocalNode(catch_pos, trace),
-              Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
-              no_args));
-    }
-
-    ParseStatementSequence();  // Parse the catch handler code.
-    current_block_->statements->Add(
-        new JumpNode(catch_pos, Token::kCONTINUE, end_catch_label));
-    SequenceNode* catch_handler = CloseBlock();
-    ExpectToken(Token::kRBRACE);
-
-    const bool is_bad_type = exception_param.type->IsMalformed() ||
-                             exception_param.type->IsMalbounded();
-    if (!is_bad_type && !exception_param.type->IsDynamicType()) {
-      // Has a type specification that is not malformed or malbounded.
-      // Now form an 'if type check' as an exception type exists in the
-      // catch specifier.
-      if (!exception_param.type->IsInstantiated() &&
-          (current_block_->scope->function_level() > 0)) {
-        // Make sure that the instantiator is captured.
-        CaptureInstantiator();
-      }
-      TypeNode* exception_type = new TypeNode(catch_pos, *exception_param.type);
-      AstNode* exception_var = new LoadLocalNode(catch_pos, catch_excp_var);
-      if (!exception_type->type().IsInstantiated()) {
-        EnsureExpressionTemp();
-      }
-      AstNode* type_cond_expr = new ComparisonNode(
-          catch_pos, Token::kIS, exception_var, exception_type);
-      current_block_->statements->Add(
-          new IfNode(catch_pos, type_cond_expr, catch_handler, NULL));
-
-      // Do not add uninstantiated types (e.g. type parameter T or
-      // generic type List<T>), since the debugger won't be able to
-      // instantiate it when walking the stack.
-      // This means that the debugger is not able to determine whether
-      // an exception is caught if the catch clause uses generic types.
-      // It will report the exception as uncaught when in fact it might
-      // be caught and handled when we unwind the stack.
-      if (exception_param.type->IsInstantiated()) {
-        handler_types.Add(*exception_param.type);
-      }
-    } else {
-      if (is_bad_type) {
-        current_block_->statements->Add(ThrowTypeError(catch_pos,
-                                                       *exception_param.type));
-        // We still add the dead code below to satisfy the code generator.
-      }
-      // No exception type exists in the catch specifier so execute the
-      // catch handler code unconditionally.
-      current_block_->statements->Add(catch_handler);
-      generic_catch_seen = true;
-      // This catch clause will handle all exceptions. We can safely forget
-      // all previous catch clause types.
-      handler_types.SetLength(0);
-      handler_types.Add(*exception_param.type);
-    }
-    SequenceNode* catch_clause = CloseBlock();
-
-    // Add this individual catch handler to the catch handlers list.
-    current_block_->statements->Add(catch_clause);
-  }
-  SequenceNode* catch_handler_list = CloseBlock();
   TryBlocks* inner_try_block = PopTryBlock();
   const intptr_t try_index = inner_try_block->try_index();
   TryBlocks* outer_try_block = try_blocks_list_;
@@ -7018,38 +7040,26 @@
       tokens_iterator_.SetCurrentPosition(finally_pos);
     }
     finally_block = ParseFinallyBlock();
-  } else {
-    if (!catch_seen) {
-      ErrorMsg("catch or finally clause expected");
-    }
   }
 
-  if (!generic_catch_seen) {
-    // No generic catch handler exists so rethrow the exception so that
-    // the next catch handler can deal with it.
-    catch_handler_list->Add(
-        new ThrowNode(handler_pos,
-                      new LoadLocalNode(handler_pos, catch_excp_var),
-                      new LoadLocalNode(handler_pos, catch_trace_var)));
-  }
-  CatchClauseNode* catch_block =
+  CatchClauseNode* catch_clause =
       new CatchClauseNode(handler_pos,
                           catch_handler_list,
                           Array::ZoneHandle(Array::MakeArray(handler_types)),
                           context_var,
-                          catch_excp_var,
-                          catch_trace_var,
+                          exception_var,
+                          stack_trace_var,
                           (finally_block != NULL)
                               ? AllocateTryIndex()
                               : CatchClauseNode::kInvalidTryIndex,
-                          needs_stacktrace);
+                          needs_stack_trace);
 
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
   // and attach the label to it.
   AstNode* try_catch_node =
-      new TryCatchNode(try_pos, try_block, end_catch_label,
-                       context_var, catch_block, finally_block, try_index);
+      new TryCatchNode(try_pos, try_block, context_var, catch_clause,
+                       finally_block, try_index);
 
   if (try_label != NULL) {
     current_block_->statements->Add(try_catch_node);
@@ -7206,19 +7216,18 @@
     ConsumeToken();
     ExpectSemicolon();
     // Check if it is ok to do a rethrow.
-    SourceLabel* label = current_block_->scope->LookupInnermostCatchLabel();
-    if (label == NULL ||
-        label->FunctionLevel() != current_block_->scope->function_level()) {
+    if ((try_blocks_list_ == NULL) || !try_blocks_list_->inside_catch()) {
       ErrorMsg(statement_pos, "rethrow of an exception is not valid here");
     }
-    ASSERT(label->owner() != NULL);
-    LocalScope* scope = label->owner()->parent();
+    // The exception and stack trace variables are bound in the block
+    // containing the try.
+    LocalScope* scope = try_blocks_list_->try_block()->scope->parent();
     ASSERT(scope != NULL);
     LocalVariable* excp_var =
         scope->LocalLookupVariable(Symbols::ExceptionVar());
     ASSERT(excp_var != NULL);
     LocalVariable* trace_var =
-        scope->LocalLookupVariable(Symbols::StacktraceVar());
+        scope->LocalLookupVariable(Symbols::StackTraceVar());
     ASSERT(trace_var != NULL);
     statement = new ThrowNode(statement_pos,
                               new LoadLocalNode(statement_pos, excp_var),
@@ -7319,6 +7328,17 @@
 }
 
 
+void Parser::CheckToken(Token::Kind token_expected, const char* msg) {
+  if (CurrentToken() != token_expected) {
+    if (msg != NULL) {
+      ErrorMsg("%s", msg);
+    } else {
+      ErrorMsg("'%s' expected", Token::Str(token_expected));
+    }
+  }
+}
+
+
 void Parser::ExpectToken(Token::Kind token_expected) {
   if (CurrentToken() != token_expected) {
     ErrorMsg("'%s' expected", Token::Str(token_expected));
@@ -7409,13 +7429,8 @@
   // Dst name argument.
   arguments->Add(new LiteralNode(type_pos, Symbols::Empty()));
   // Malformed type error or malbounded type error.
-  Error& error = Error::Handle();
-  if (type.IsMalformed()) {
-    error = type.malformed_error();
-  } else {
-    const bool is_malbounded = type.IsMalboundedWithError(&error);
-    ASSERT(is_malbounded);
-  }
+  const Error& error = Error::Handle(type.error());
+  ASSERT(!error.IsNull());
   arguments->Add(new LiteralNode(type_pos, String::ZoneHandle(
       Symbols::New(error.ToErrorCString()))));
   return MakeStaticCall(Symbols::TypeError(),
@@ -7539,7 +7554,7 @@
         // In checked mode, the type may be malformed or malbounded.
         if (((op_kind == Token::kIS) || (op_kind == Token::kISNOT) ||
              (op_kind == Token::kAS)) &&
-            (type.IsMalformed() || type.IsMalbounded())) {
+            type.IsMalformedOrMalbounded()) {
           // Note that a type error is thrown even if the tested value is null
           // in a type test or in a type cast.
           return ThrowTypeError(type_pos, type);
@@ -8120,9 +8135,7 @@
 AstNode* Parser::ParseInstanceCall(AstNode* receiver, const String& func_name) {
   TRACE_PARSER("ParseInstanceCall");
   const intptr_t call_pos = TokenPos();
-  if (CurrentToken() != Token::kLPAREN) {
-    ErrorMsg(call_pos, "left parenthesis expected");
-  }
+  CheckToken(Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
   return new InstanceCallNode(call_pos, receiver, func_name, arguments);
 }
@@ -9212,9 +9225,7 @@
 RawAbstractType* Parser::ParseType(
     ClassFinalizer::FinalizationKind finalization) {
   TRACE_PARSER("ParseType");
-  if (CurrentToken() != Token::kIDENT) {
-    ErrorMsg("type name expected");
-  }
+  CheckToken(Token::kIDENT, "type name expected");
   QualIdent type_name;
   if (finalization == ClassFinalizer::kIgnore) {
     if (!is_top_level_ && (current_block_ != NULL)) {
@@ -9309,7 +9320,9 @@
       element_type = list_type_arguments.TypeAt(0);
       ASSERT(!element_type.IsMalformed());  // Would be mapped to dynamic.
       ASSERT(!element_type.IsMalbounded());  // No declared bound in List.
-      if (is_const && !element_type.IsInstantiated()) {
+      if (element_type.IsDynamicType()) {
+        list_type_arguments = AbstractTypeArguments::null();
+      } else if (is_const && !element_type.IsInstantiated()) {
         ErrorMsg(type_pos,
                  "the type argument of a constant list literal cannot include "
                  "a type variable");
@@ -9505,7 +9518,9 @@
       ASSERT(!key_type.IsMalformed() && !value_type.IsMalformed());
       // No declared bounds in Map.
       ASSERT(!key_type.IsMalbounded() && !value_type.IsMalbounded());
-      if (is_const && !type_arguments.IsInstantiated()) {
+      if (key_type.IsDynamicType() && value_type.IsDynamicType()) {
+        map_type_arguments = AbstractTypeArguments::null();
+      } else if (is_const && !type_arguments.IsInstantiated()) {
         ErrorMsg(type_pos,
                  "the type arguments of a constant map literal cannot include "
                  "a type variable");
@@ -9795,29 +9810,16 @@
       ParseType(ClassFinalizer::kCanonicalizeWellFormed));
   // In case the type is malformed, throw a dynamic type error after finishing
   // parsing the instance creation expression.
-  if (!type.IsMalformed()) {
-    if (type.IsTypeParameter() || type.IsDynamicType()) {
-      // Replace the type with a malformed type.
-      type = ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(),  // No previous error.
-          script_,
-          type_pos,
-          "%s'%s' cannot be instantiated",
-          type.IsTypeParameter() ? "type parameter " : "",
-          type.IsTypeParameter() ?
-              String::Handle(type.UserVisibleName()).ToCString() : "dynamic");
-    } else if (FLAG_enable_type_checks || FLAG_error_on_bad_type) {
-      Error& bound_error = Error::Handle();
-      if (type.IsMalboundedWithError(&bound_error)) {
-        // Replace the type with a malformed type.
-        type = ClassFinalizer::NewFinalizedMalformedType(
-            bound_error,
-            script_,
-            type_pos,
-            "malbounded type '%s' cannot be instantiated",
-            String::Handle(type.UserVisibleName()).ToCString());
-      }
-    }
+  if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
+    // Replace the type with a malformed type.
+    type = ClassFinalizer::NewFinalizedMalformedType(
+        Error::Handle(),  // No previous error.
+        script_,
+        type_pos,
+        "%s'%s' cannot be instantiated",
+        type.IsTypeParameter() ? "type parameter " : "",
+        type.IsTypeParameter() ?
+            String::Handle(type.UserVisibleName()).ToCString() : "dynamic");
   }
 
   // The grammar allows for an optional ('.' identifier)? after the type, which
@@ -9831,17 +9833,15 @@
   }
 
   // Parse constructor parameters.
-  if (CurrentToken() != Token::kLPAREN) {
-    ErrorMsg("'(' expected");
-  }
+  CheckToken(Token::kLPAREN);
   intptr_t call_pos = TokenPos();
   ArgumentListNode* arguments = ParseActualParameters(NULL, is_const);
 
-  // Parsing is complete, so we can return a throw in case of a malformed type
-  // or report a compile-time error if the constructor is const.
-  if (type.IsMalformed()) {
+  // Parsing is complete, so we can return a throw in case of a malformed or
+  // malbounded type or report a compile-time error if the constructor is const.
+  if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      const Error& error = Error::Handle(type.malformed_error());
+      const Error& error = Error::Handle(type.error());
       ErrorMsg(error);
     }
     return ThrowTypeError(type_pos, type);
@@ -9882,8 +9882,7 @@
             "class '%s' has no constructor or factory named '%s'",
             String::Handle(type_class.Name()).ToCString(),
             external_constructor_name.ToCString());
-        const Error& error = Error::Handle(type.malformed_error());
-        ErrorMsg(error);
+        ErrorMsg(Error::Handle(type.error()));
       }
       return ThrowNoSuchMethodError(call_pos,
                                     type_class,
@@ -9895,19 +9894,24 @@
     } else if (constructor.IsRedirectingFactory()) {
       ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
       Type& redirect_type = Type::Handle(constructor.RedirectionType());
-      if (!redirect_type.IsMalformed() && !redirect_type.IsInstantiated()) {
+      if (!redirect_type.IsMalformedOrMalbounded() &&
+          !redirect_type.IsInstantiated()) {
         // The type arguments of the redirection type are instantiated from the
         // type arguments of the parsed type of the 'new' or 'const' expression.
-        Error& malformed_error = Error::Handle();
-        redirect_type ^= redirect_type.InstantiateFrom(type_arguments,
-                                                       &malformed_error);
-        if (!malformed_error.IsNull()) {
-          redirect_type.set_malformed_error(malformed_error);
+        Error& error = Error::Handle();
+        redirect_type ^= redirect_type.InstantiateFrom(type_arguments, &error);
+        if (!error.IsNull()) {
+          redirect_type = ClassFinalizer::NewFinalizedMalformedType(
+              error,
+              script_,
+              call_pos,
+              "redirecting factory type '%s' cannot be instantiated",
+              String::Handle(redirect_type.UserVisibleName()).ToCString());
         }
       }
-      if (redirect_type.IsMalformed()) {
+      if (redirect_type.IsMalformedOrMalbounded()) {
         if (is_const) {
-          ErrorMsg(Error::Handle(redirect_type.malformed_error()));
+          ErrorMsg(Error::Handle(redirect_type.error()));
         }
         return ThrowTypeError(redirect_type.token_pos(), redirect_type);
       }
@@ -9972,12 +9976,11 @@
                                   &constructor);
   }
 
-  // Return a throw in case of a malformed type or report a compile-time error
-  // if the constructor is const.
-  if (type.IsMalformed()) {
+  // Return a throw in case of a malformed or malbounded type or report a
+  // compile-time error if the constructor is const.
+  if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      const Error& error = Error::Handle(type.malformed_error());
-      ErrorMsg(error);
+      ErrorMsg(Error::Handle(type.error()));
     }
     return ThrowTypeError(type_pos, type);
   }
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 7be1bc0..d1f891e 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -7,29 +7,33 @@
 
 #include "include/dart_api.h"
 
+#include "platform/assert.h"
+#include "platform/globals.h"
 #include "lib/invocation_mirror.h"
+#include "vm/allocation.h"
 #include "vm/ast.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler_stats.h"
-#include "vm/scanner.h"
+#include "vm/object.h"
+#include "vm/raw_object.h"
+#include "vm/token.h"
 
 namespace dart {
 
 // Forward declarations.
 class ArgumentsDescriptor;
-class Function;
 class Isolate;
-class LiteralToken;
-class Script;
-class TokenStream;
+class LocalScope;
+class LocalVariable;
+class SourceLabel;
+template <typename T> class GrowableArray;
 
-struct TopLevel;
+struct CatchParamDesc;
 class ClassDesc;
 struct MemberDesc;
 struct ParamList;
 struct QualIdent;
-struct CatchParamDesc;
-struct FieldInitExpression;
+struct TopLevel;
 
 // The class ParsedFunction holds the result of parsing a function.
 class ParsedFunction : public ZoneAllocated {
@@ -243,6 +247,7 @@
     CompilerStats::num_tokens_consumed++;
   }
   void ConsumeRightAngleBracket();
+  void CheckToken(Token::Kind token_expected, const char* msg = NULL);
   void ExpectToken(Token::Kind token_expected);
   void ExpectSemicolon();
   void UnexpectedToken();
@@ -323,8 +328,8 @@
   void ParseClassDeclaration(const GrowableObjectArray& pending_classes,
                              intptr_t metadata_pos);
   void ParseClassDefinition(const Class& cls);
-  void ParseMixinTypedef(const GrowableObjectArray& pending_classes,
-                         intptr_t metadata_pos);
+  void ParseMixinAppAlias(const GrowableObjectArray& pending_classes,
+                          intptr_t metadata_pos);
   void ParseTypedef(const GrowableObjectArray& pending_classes,
                     intptr_t metadata_pos);
   void ParseTopLevelVariable(TopLevel* top_level, intptr_t metadata_pos);
@@ -477,9 +482,15 @@
   AstNode* ParseSwitchStatement(String* label_name);
 
   // try/catch/finally parsing.
-  void AddCatchParamsToScope(const CatchParamDesc& exception_param,
-                             const CatchParamDesc& stack_trace_param,
+  void AddCatchParamsToScope(CatchParamDesc* exception_param,
+                             CatchParamDesc* stack_trace_param,
                              LocalScope* scope);
+  // Parse all the catch clause of a try.
+  SequenceNode* ParseCatchClauses(intptr_t handler_pos,
+                                  LocalVariable* exception_var,
+                                  LocalVariable* stack_trace_var,
+                                  const GrowableObjectArray& handler_types,
+                                  bool* needs_stack_trace);
   // Parse finally block and create an AST for it.
   SequenceNode* ParseFinallyBlock();
   // Adds try block to the list of try blocks seen so far.
@@ -506,7 +517,7 @@
   bool IsIdentifier();
   bool IsSimpleLiteral(const AbstractType& type, Instance* value);
   bool IsFunctionTypeAliasName();
-  bool IsMixinTypedef();
+  bool IsMixinAppAlias();
   bool TryParseTypeParameters();
   bool TryParseOptionalType();
   bool TryParseReturnType();
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
new file mode 100644
index 0000000..95601ba
--- /dev/null
+++ b/runtime/vm/profiler.cc
@@ -0,0 +1,592 @@
+// 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.
+
+#include <cstdio>
+
+#include "platform/utils.h"
+
+#include "vm/isolate.h"
+#include "vm/json_stream.h"
+#include "vm/native_symbol.h"
+#include "vm/object.h"
+#include "vm/os.h"
+#include "vm/profiler.h"
+
+namespace dart {
+
+// Notes on locking and signal handling:
+//
+// The ProfilerManager has a single monitor (monitor_). This monitor guards
+// access to the schedule list of isolates (isolates_, isolates_size_, etc).
+//
+// Each isolate has a mutex (profiler_data_mutex_) which protects access
+// to the isolate's profiler data.
+//
+// Locks can be taken in this order:
+//   1. ProfilerManager::monitor_
+//   2. isolate->profiler_data_mutex_
+// In other words, it is not acceptable to take ProfilerManager::monitor_
+// after grabbing isolate->profiler_data_mutex_.
+//
+// ProfileManager::monitor_ taking entry points:
+//   InitOnce, Shutdown
+//       ProfilerManager::monitor_
+//   ScheduleIsolate, DescheduleIsolate.
+//       ProfilerManager::monitor_, isolate->profiler_data_mutex_
+//   ThreadMain
+// isolate->profiler_data_mutex_ taking entry points:
+//     SetupIsolateForProfiling, FreeIsolateForProfiling.
+//       ProfilerManager::monitor_, isolate->profiler_data_mutex_
+//     ScheduleIsolate, DescheduleIsolate.
+//       ProfilerManager::monitor_, isolate->profiler_data_mutex_
+//     ProfileSignalAction
+//       isolate->profiler_data_mutex_
+//       ProfilerManager::monitor_, isolate->profiler_data_mutex_
+//
+// Signal handling and locking:
+// On OSes with pthreads (Android, Linux, and Mac) we use signal delivery
+// to interrupt the isolate running thread for sampling. After a thread
+// is sent the SIGPROF, it is removed from the scheduled isolate list.
+// Inside the signal handler, after the sample is taken, the isolate is
+// added to the scheduled isolate list again. The side effect of this is
+// that the signal handler must be able to acquire the isolate profiler data
+// mutex and the profile manager monitor. When an isolate running thread
+// (potential signal target) calls into an entry point which acquires
+// ProfileManager::monitor_ signal delivery must be blocked. An example is
+// Isolate::SetCurrent which blocks signal delivery while removing the old
+// current isolate from the scheduled list and adding the new current isolate
+// to the scheduled list.
+//
+
+// Notes on stack frame walking:
+//
+// The sampling profiler will collect up to Sample::kNumStackFrames stack frames
+// The stack frame walking code uses the frame pointer to traverse the stack.
+// If the VM is compiled without frame pointers (which is the default on
+// recent GCC versions with optimizing enabled) the stack walking code will
+// fail (sometimes leading to a crash).
+//
+
+
+DEFINE_FLAG(bool, profile, false, "Enable Sampling Profiler");
+
+bool ProfilerManager::initialized_ = false;
+bool ProfilerManager::shutdown_ = false;
+Monitor* ProfilerManager::monitor_ = NULL;
+Isolate** ProfilerManager::isolates_ = NULL;
+intptr_t ProfilerManager::isolates_capacity_ = 0;
+intptr_t ProfilerManager::isolates_size_ = 0;
+
+
+void ProfilerManager::InitOnce() {
+  if (!FLAG_profile) {
+    return;
+  }
+  NativeSymbolResolver::InitOnce();
+  ASSERT(!initialized_);
+  monitor_ = new Monitor();
+  initialized_ = true;
+  ResizeIsolates(16);
+  Thread::Start(ThreadMain, 0);
+}
+
+
+void ProfilerManager::Shutdown() {
+  if (!FLAG_profile) {
+    return;
+  }
+  ASSERT(initialized_);
+  ScopedMonitor lock(monitor_);
+  shutdown_ = true;
+  for (intptr_t i = 0; i < isolates_size_; i++) {
+    Isolate* isolate = isolates_[i];
+    ASSERT(isolate != NULL);
+    FreeIsolateProfilingData(isolate);
+  }
+  isolates_size_ = 0;
+  free(isolates_);
+  isolates_ = NULL;
+  lock.Notify();
+  NativeSymbolResolver::ShutdownOnce();
+}
+
+
+void ProfilerManager::SetupIsolateForProfiling(Isolate* isolate) {
+  if (!FLAG_profile) {
+    return;
+  }
+  ASSERT(isolate != NULL);
+  ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+  SampleBuffer* sample_buffer = new SampleBuffer();
+  IsolateProfilerData* profiler_data =
+      new IsolateProfilerData(isolate, sample_buffer);
+  profiler_data->set_sample_interval_micros(1000);
+  isolate->set_profiler_data(profiler_data);
+}
+
+
+void ProfilerManager::FreeIsolateProfilingData(Isolate* isolate) {
+  ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+  IsolateProfilerData* profiler_data = isolate->profiler_data();
+  if (profiler_data == NULL) {
+    // Already freed.
+    return;
+  }
+  isolate->set_profiler_data(NULL);
+  SampleBuffer* sample_buffer = profiler_data->sample_buffer();
+  ASSERT(sample_buffer != NULL);
+  delete sample_buffer;
+  delete profiler_data;
+}
+
+
+void ProfilerManager::ShutdownIsolateForProfiling(Isolate* isolate) {
+  ASSERT(isolate != NULL);
+  if (!FLAG_profile) {
+    return;
+  }
+  FreeIsolateProfilingData(isolate);
+}
+
+
+void ProfilerManager::ScheduleIsolate(Isolate* isolate) {
+  if (!FLAG_profile) {
+    return;
+  }
+  ASSERT(initialized_);
+  ASSERT(isolate != NULL);
+  ScopedMonitor lock(monitor_);
+  ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+  IsolateProfilerData* profiler_data = isolate->profiler_data();
+  if (profiler_data == NULL) {
+    return;
+  }
+  profiler_data->Scheduled(OS::GetCurrentTimeMicros(),
+                           Thread::GetCurrentThreadId());
+  AddIsolate(isolate);
+  lock.Notify();
+}
+
+
+void ProfilerManager::DescheduleIsolate(Isolate* isolate) {
+  if (!FLAG_profile) {
+    return;
+  }
+  ASSERT(initialized_);
+  ASSERT(isolate != NULL);
+  ScopedMonitor lock(monitor_);
+  intptr_t i = FindIsolate(isolate);
+  if (i < 0) {
+    // Not scheduled.
+    return;
+  }
+  {
+    ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    ASSERT(profiler_data != NULL);
+    profiler_data->Descheduled();
+  }
+  RemoveIsolate(i);
+  lock.Notify();
+}
+
+
+void PrintToJSONStream(Isolate* isolate, JSONStream* stream) {
+  ASSERT(isolate == Isolate::Current());
+  {
+    // We can't get signals here.
+  }
+  UNIMPLEMENTED();
+}
+
+
+void ProfilerManager::ResizeIsolates(intptr_t new_capacity) {
+  ASSERT(new_capacity < kMaxProfiledIsolates);
+  ASSERT(new_capacity > isolates_capacity_);
+  Isolate* isolate = NULL;
+  isolates_ = reinterpret_cast<Isolate**>(
+      realloc(isolates_, sizeof(isolate) * new_capacity));
+  isolates_capacity_ = new_capacity;
+}
+
+
+void ProfilerManager::AddIsolate(Isolate* isolate) {
+  if (isolates_ == NULL) {
+    // We are shutting down.
+    return;
+  }
+  // Must be called with monitor_ locked.
+  if (isolates_size_ == isolates_capacity_) {
+    ResizeIsolates(isolates_capacity_ == 0 ? 16 : isolates_capacity_ * 2);
+  }
+  isolates_[isolates_size_] = isolate;
+  isolates_size_++;
+}
+
+
+intptr_t ProfilerManager::FindIsolate(Isolate* isolate) {
+  // Must be called with monitor_ locked.
+  for (intptr_t i = 0; i < isolates_size_; i++) {
+    if (isolates_[i] == isolate) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+
+void ProfilerManager::RemoveIsolate(intptr_t i) {
+  // Must be called with monitor_ locked.
+  ASSERT(i < isolates_size_);
+  intptr_t last = isolates_size_ - 1;
+  if (i != last) {
+    isolates_[i] = isolates_[last];
+  }
+  // Mark last as NULL.
+  isolates_[last] = NULL;
+  // Pop.
+  isolates_size_--;
+}
+
+
+static char* FindSymbolName(uintptr_t pc, bool* native_symbol) {
+  // TODO(johnmccutchan): Differentiate between symbols which can't be found
+  // and symbols which were GCed. (Heap::CodeContains).
+  ASSERT(native_symbol != NULL);
+  const char* symbol_name = "Unknown";
+  *native_symbol = false;
+  const Code& code = Code::Handle(Code::LookupCode(pc));
+  if (code.IsNull()) {
+    // Possibly a native symbol.
+    char* native_name = NativeSymbolResolver::LookupSymbolName(pc);
+    if (native_name != NULL) {
+      symbol_name = native_name;
+      *native_symbol = true;
+    }
+  } else {
+    const Function& function = Function::Handle(code.function());
+    if (!function.IsNull()) {
+      const String& name = String::Handle(function.QualifiedUserVisibleName());
+      if (!name.IsNull()) {
+        symbol_name = name.ToCString();
+      }
+    }
+  }
+  return const_cast<char*>(symbol_name);
+}
+
+
+void ProfilerManager::WriteTracing(Isolate* isolate, const char* name,
+                                   Dart_Port port) {
+  ASSERT(isolate == Isolate::Current());
+  ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+  IsolateProfilerData* profiler_data = isolate->profiler_data();
+  if (profiler_data == NULL) {
+    return;
+  }
+  SampleBuffer* sample_buffer = profiler_data->sample_buffer();
+  ASSERT(sample_buffer != NULL);
+  JSONStream stream(10 * MB);
+  intptr_t tid = reinterpret_cast<intptr_t>(sample_buffer);
+  intptr_t pid = 1;
+  {
+    JSONArray events(&stream);
+    {
+      JSONObject thread_name(&events);
+      thread_name.AddProperty("name", "thread_name");
+      thread_name.AddProperty("ph", "M");
+      thread_name.AddProperty("tid", tid);
+      thread_name.AddProperty("pid", pid);
+      {
+        JSONObject args(&thread_name, "args");
+        args.AddProperty("name", name);
+      }
+    }
+    {
+      JSONObject process_name(&events);
+      process_name.AddProperty("name", "process_name");
+      process_name.AddProperty("ph", "M");
+      process_name.AddProperty("tid", tid);
+      process_name.AddProperty("pid", pid);
+      {
+        JSONObject args(&process_name, "args");
+        args.AddProperty("name", "Dart VM");
+      }
+    }
+    uint64_t last_time = 0;
+    for (Sample* i = sample_buffer->FirstSample();
+         i != sample_buffer->LastSample();
+         i = sample_buffer->NextSample(i)) {
+      if (last_time == 0) {
+        last_time = i->timestamp;
+      }
+      intptr_t delta = i->timestamp - last_time;
+      {
+        double percentage = static_cast<double>(i->cpu_usage) /
+                            static_cast<double>(delta) * 100.0;
+        if (percentage != percentage) {
+          percentage = 0.0;
+        }
+        percentage = percentage < 0.0 ? 0.0 : percentage;
+        percentage = percentage > 100.0 ? 100.0 : percentage;
+        {
+          JSONObject cpu_usage(&events);
+          cpu_usage.AddProperty("name", "CPU Usage");
+          cpu_usage.AddProperty("ph", "C");
+          cpu_usage.AddProperty("tid", tid);
+          cpu_usage.AddProperty("pid", pid);
+          cpu_usage.AddProperty("ts", static_cast<double>(last_time));
+          {
+            JSONObject args(&cpu_usage, "args");
+            args.AddProperty("CPU", percentage);
+          }
+        }
+        {
+          JSONObject cpu_usage(&events);
+          cpu_usage.AddProperty("name", "CPU Usage");
+          cpu_usage.AddProperty("ph", "C");
+          cpu_usage.AddProperty("tid", tid);
+          cpu_usage.AddProperty("pid", pid);
+          cpu_usage.AddProperty("ts", static_cast<double>(i->timestamp));
+          {
+            JSONObject args(&cpu_usage, "args");
+            args.AddProperty("CPU", percentage);
+          }
+        }
+      }
+      for (int j = 0; j < Sample::kNumStackFrames; j++) {
+        if (i->pcs[j] == 0) {
+          continue;
+        }
+        bool native_symbol = false;
+        char* symbol_name = FindSymbolName(i->pcs[j], &native_symbol);
+        {
+          JSONObject begin(&events);
+          begin.AddProperty("ph", "B");
+          begin.AddProperty("tid", tid);
+          begin.AddProperty("pid", pid);
+          begin.AddProperty("name", symbol_name);
+          begin.AddProperty("ts", static_cast<double>(last_time));
+        }
+        if (native_symbol) {
+          NativeSymbolResolver::FreeSymbolName(symbol_name);
+        }
+      }
+      for (int j = Sample::kNumStackFrames-1; j >= 0; j--) {
+        if (i->pcs[j] == 0) {
+          continue;
+        }
+        bool native_symbol = false;
+        char* symbol_name = FindSymbolName(i->pcs[j], &native_symbol);
+        {
+          JSONObject end(&events);
+          end.AddProperty("ph", "E");
+          end.AddProperty("tid", tid);
+          end.AddProperty("pid", pid);
+          end.AddProperty("name", symbol_name);
+          end.AddProperty("ts", static_cast<double>(i->timestamp));
+        }
+        if (native_symbol) {
+          NativeSymbolResolver::FreeSymbolName(symbol_name);
+        }
+      }
+      last_time = i->timestamp;
+    }
+  }
+  char fname[1024];
+#if defined(TARGET_OS_WINDOWS)
+  snprintf(fname, sizeof(fname)-1, "c:\\tmp\\isolate-%d.prof",
+           static_cast<int>(port));
+#else
+  snprintf(fname, sizeof(fname)-1, "/tmp/isolate-%d.prof",
+           static_cast<int>(port));
+#endif
+  printf("%s\n", fname);
+  FILE* f = fopen(fname, "wb");
+  ASSERT(f != NULL);
+  fputs(stream.ToCString(), f);
+  fclose(f);
+}
+
+
+
+
+
+IsolateProfilerData::IsolateProfilerData(Isolate* isolate,
+                                         SampleBuffer* sample_buffer) {
+  isolate_ = isolate;
+  sample_buffer_ = sample_buffer;
+  timer_expiration_micros_ = kNoExpirationTime;
+  last_sampled_micros_ = 0;
+  thread_id_ = 0;
+}
+
+
+IsolateProfilerData::~IsolateProfilerData() {
+}
+
+
+void IsolateProfilerData::SampledAt(int64_t current_time) {
+  last_sampled_micros_ = current_time;
+}
+
+
+void IsolateProfilerData::Scheduled(int64_t current_time, ThreadId thread_id) {
+  timer_expiration_micros_ = current_time + sample_interval_micros_;
+  Thread::GetThreadCpuUsage(thread_id, &cpu_usage_);
+  thread_id_ = thread_id;
+}
+
+
+void IsolateProfilerData::Descheduled() {
+  // TODO(johnmccutchan): Track when we ran for a fraction of our sample
+  // interval and incorporate the time difference when scheduling the
+  // isolate again.
+  cpu_usage_ = kDescheduledCpuUsage;
+  timer_expiration_micros_ = kNoExpirationTime;
+  thread_id_ = 0;
+  Sample* sample = sample_buffer_->ReserveSample();
+  ASSERT(sample != NULL);
+  sample->timestamp = OS::GetCurrentTimeMicros();
+  sample->cpu_usage = 0;
+  sample->vm_tags = Sample::kIdle;
+}
+
+
+const char* Sample::kLookupSymbol = "Symbol Not Looked Up";
+const char* Sample::kNoSymbol = "No Symbol Found";
+
+Sample::Sample()  {
+  timestamp = 0;
+  cpu_usage = 0;
+  for (int i = 0; i < kNumStackFrames; i++) {
+    pcs[i] = 0;
+  }
+  vm_tags = kIdle;
+  runtime_tags = 0;
+}
+
+
+SampleBuffer::SampleBuffer(intptr_t capacity) {
+  start_ = 0;
+  end_ = 0;
+  capacity_ = capacity;
+  samples_ = reinterpret_cast<Sample*>(calloc(capacity, sizeof(Sample)));
+}
+
+
+SampleBuffer::~SampleBuffer() {
+  if (samples_ != NULL) {
+    free(samples_);
+    samples_ = NULL;
+  }
+}
+
+
+Sample* SampleBuffer::ReserveSample() {
+  intptr_t index = end_;
+  end_ = WrapIncrement(end_);
+  if (end_ == start_) {
+    start_ = WrapIncrement(start_);
+  }
+  // Reset.
+  samples_[index] = Sample();
+  return &samples_[index];
+}
+
+
+Sample* SampleBuffer::FirstSample() const {
+  return &samples_[start_];
+}
+
+
+Sample* SampleBuffer::NextSample(Sample* sample) const {
+  ASSERT(sample >= &samples_[0]);
+  ASSERT(sample < &samples_[capacity_]);
+  intptr_t index = sample - samples_;
+  index = WrapIncrement(index);
+  return &samples_[index];
+}
+
+
+Sample* SampleBuffer::LastSample() const {
+  return &samples_[end_];
+}
+
+
+intptr_t SampleBuffer::WrapIncrement(intptr_t i) const {
+  return (i + 1) % capacity_;
+}
+
+
+ProfilerSampleStackWalker::ProfilerSampleStackWalker(Sample* sample,
+                                                     uintptr_t stack_lower,
+                                                     uintptr_t stack_upper,
+                                                     uintptr_t pc,
+                                                     uintptr_t fp,
+                                                     uintptr_t sp) :
+    sample_(sample),
+    stack_lower_(stack_lower),
+    stack_upper_(stack_upper),
+    original_pc_(pc),
+    original_fp_(fp),
+    original_sp_(sp),
+    lower_bound_(stack_lower) {
+  ASSERT(sample_ != NULL);
+}
+
+
+int ProfilerSampleStackWalker::walk() {
+  uword* pc = reinterpret_cast<uword*>(original_pc_);
+  uword* fp = reinterpret_cast<uword*>(original_fp_);
+  uword* previous_fp = fp;
+  if (original_sp_ < lower_bound_) {
+    // The stack pointer gives us a better lower bound than
+    // the isolates stack limit.
+    lower_bound_ = original_sp_;
+  }
+  int i = 0;
+  for (; i < Sample::kNumStackFrames; i++) {
+    sample_->pcs[i] = reinterpret_cast<uintptr_t>(pc);
+    if (!ValidFramePointer(fp)) {
+      break;
+    }
+    pc = CallerPC(fp);
+    previous_fp = fp;
+    fp = CallerFP(fp);
+    if ((fp <= previous_fp) || !ValidFramePointer(fp)) {
+      // Frame pointers should only move to higher addresses.
+      break;
+    }
+    // Move the lower bound up.
+    lower_bound_ = reinterpret_cast<uintptr_t>(fp);
+  }
+  return i;
+}
+
+
+uword* ProfilerSampleStackWalker::CallerPC(uword* fp) {
+  ASSERT(fp != NULL);
+  return reinterpret_cast<uword*>(*(fp + 1));
+}
+
+
+uword* ProfilerSampleStackWalker::CallerFP(uword* fp) {
+  ASSERT(fp != NULL);
+  return reinterpret_cast<uword*>(*fp);
+}
+
+
+bool ProfilerSampleStackWalker::ValidFramePointer(uword* fp) {
+  if (fp == NULL) {
+    return false;
+  }
+  uintptr_t cursor = reinterpret_cast<uintptr_t>(fp);
+  cursor += sizeof(fp);
+  bool r = cursor >= lower_bound_ && cursor < stack_upper_;
+  return r;
+}
+
+
+}  // namespace dart
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
new file mode 100644
index 0000000..ba25c43
--- /dev/null
+++ b/runtime/vm/profiler.h
@@ -0,0 +1,199 @@
+// 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.
+
+#ifndef VM_PROFILER_H_
+#define VM_PROFILER_H_
+
+#include "platform/hashmap.h"
+#include "platform/thread.h"
+#include "vm/allocation.h"
+#include "vm/code_observers.h"
+#include "vm/globals.h"
+
+namespace dart {
+
+// Forward declarations.
+class JSONStream;
+
+// Profiler manager.
+class ProfilerManager : public AllStatic {
+ public:
+  static void InitOnce();
+  static void Shutdown();
+
+  static void SetupIsolateForProfiling(Isolate* isolate);
+  static void ShutdownIsolateForProfiling(Isolate* isolate);
+  static void ScheduleIsolate(Isolate* isolate);
+  static void DescheduleIsolate(Isolate* isolate);
+
+  static void PrintToJSONStream(Isolate* isolate, JSONStream* stream);
+
+  static void WriteTracing(Isolate* isolate, const char* name, Dart_Port port);
+
+ private:
+  static const intptr_t kMaxProfiledIsolates = 4096;
+  static bool initialized_;
+  static bool shutdown_;
+  static Monitor* monitor_;
+
+  static Isolate** isolates_;
+  static intptr_t isolates_capacity_;
+  static intptr_t isolates_size_;
+
+  static void ResizeIsolates(intptr_t new_capacity);
+  static void AddIsolate(Isolate* isolate);
+  static intptr_t FindIsolate(Isolate* isolate);
+  static void RemoveIsolate(intptr_t i);
+
+  // Returns the microseconds until the next live timer fires.
+  static int64_t SampleAndRescheduleIsolates(int64_t current_time);
+  static void FreeIsolateProfilingData(Isolate* isolate);
+  static void ThreadMain(uword parameters);
+};
+
+
+class IsolateProfilerData {
+ public:
+  static const int64_t kDescheduledCpuUsage = -1;
+  static const int64_t kNoExpirationTime = -2;
+
+  IsolateProfilerData(Isolate* isolate, SampleBuffer* sample_buffer);
+  ~IsolateProfilerData();
+
+  int64_t sample_interval_micros() const { return sample_interval_micros_; }
+
+  void set_sample_interval_micros(int64_t sample_interval) {
+    sample_interval_micros_ = sample_interval;
+  }
+
+  bool CanExpire() const {
+    return timer_expiration_micros_ != kNoExpirationTime;
+  }
+
+  bool ShouldSample(int64_t current_time) const {
+    return CanExpire() && TimeUntilExpiration(current_time) <= 0;
+  }
+
+  int64_t TimeUntilExpiration(int64_t current_time_micros) const {
+    ASSERT(CanExpire());
+    return timer_expiration_micros_ - current_time_micros;
+  }
+
+  void set_cpu_usage(int64_t cpu_usage) {
+    cpu_usage_ = cpu_usage;
+  }
+
+  void SampledAt(int64_t current_time);
+
+  void Scheduled(int64_t current_time, ThreadId thread);
+
+  void Descheduled();
+
+  int64_t cpu_usage() const { return cpu_usage_; }
+
+  int64_t ComputeDeltaAndSetCpuUsage(int64_t cpu_usage) {
+    int64_t delta = 0;
+    if (cpu_usage_ != kDescheduledCpuUsage) {
+      // Only compute the real delta if we are being sampled regularly.
+      delta = cpu_usage - cpu_usage_;
+    }
+    set_cpu_usage(cpu_usage);
+    return delta;
+  }
+
+  ThreadId thread_id() const { return thread_id_; }
+
+  Isolate* isolate() const { return isolate_; }
+
+  SampleBuffer* sample_buffer() const { return sample_buffer_; }
+
+ private:
+  int64_t last_sampled_micros_;
+  int64_t timer_expiration_micros_;
+  int64_t sample_interval_micros_;
+  int64_t cpu_usage_;
+  ThreadId thread_id_;
+  Isolate* isolate_;
+  SampleBuffer* sample_buffer_;
+  DISALLOW_COPY_AND_ASSIGN(IsolateProfilerData);
+};
+
+
+// Profile sample.
+struct Sample {
+  static const char* kLookupSymbol;
+  static const char* kNoSymbol;
+  static const intptr_t kNumStackFrames = 4;
+  enum SampleState {
+    kIdle = 0,
+    kExecuting = 1,
+    kNumSampleStates
+  };
+  int64_t timestamp;
+  int64_t cpu_usage;
+  uintptr_t pcs[kNumStackFrames];
+  uint16_t vm_tags;
+  uint16_t runtime_tags;
+  Sample();
+};
+
+
+// Ring buffer of samples. One per isolate.
+class SampleBuffer {
+ public:
+  static const intptr_t kDefaultBufferCapacity = 1000000;
+
+  explicit SampleBuffer(intptr_t capacity = kDefaultBufferCapacity);
+  ~SampleBuffer();
+
+  intptr_t capacity() const { return capacity_; }
+
+  Sample* ReserveSample();
+
+  Sample* FirstSample() const;
+  Sample* NextSample(Sample* sample) const;
+  Sample* LastSample() const;
+ private:
+  Sample* samples_;
+  intptr_t capacity_;
+  intptr_t start_;
+  intptr_t end_;
+
+  intptr_t WrapIncrement(intptr_t i) const;
+  DISALLOW_COPY_AND_ASSIGN(SampleBuffer);
+};
+
+
+class ProfilerSampleStackWalker : public ValueObject {
+ public:
+  ProfilerSampleStackWalker(Sample* sample,
+                            uintptr_t stack_lower,
+                            uintptr_t stack_upper,
+                            uintptr_t pc,
+                            uintptr_t fp,
+                            uintptr_t sp);
+
+  int walk();
+
+ private:
+  uword* CallerPC(uword* fp);
+  uword* CallerFP(uword* fp);
+
+  bool ValidInstructionPointer(uword* pc);
+
+  bool ValidFramePointer(uword* fp);
+
+  Sample* sample_;
+  const uintptr_t stack_lower_;
+  const uintptr_t stack_upper_;
+  const uintptr_t original_pc_;
+  const uintptr_t original_fp_;
+  const uintptr_t original_sp_;
+  uintptr_t lower_bound_;
+};
+
+
+}  // namespace dart
+
+#endif  // VM_PROFILER_H_
diff --git a/runtime/vm/profiler_android.cc b/runtime/vm/profiler_android.cc
new file mode 100644
index 0000000..d8d6747
--- /dev/null
+++ b/runtime/vm/profiler_android.cc
@@ -0,0 +1,99 @@
+// 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.
+
+#include "platform/globals.h"
+#if defined(TARGET_OS_ANDROID)
+
+#include "vm/isolate.h"
+#include "vm/json_stream.h"
+#include "vm/profiler.h"
+#include "vm/signal_handler.h"
+
+namespace dart {
+
+DECLARE_FLAG(bool, profile);
+
+
+static void ProfileSignalAction(int signal, siginfo_t* info, void* context_) {
+  if (signal != SIGPROF) {
+    return;
+  }
+  Isolate* isolate = Isolate::Current();
+  if (isolate == NULL) {
+    return;
+  }
+  // Thread owns no profiler locks at this point.
+  {
+    // Thread owns isolate profiler data mutex.
+    ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    if (profiler_data == NULL) {
+      return;
+    }
+  }
+  // Thread owns no profiler locks at this point.
+  // This call will acquire both ProfilerManager::monitor and the
+  // isolate's profiler data mutex.
+  ProfilerManager::ScheduleIsolate(isolate);
+}
+
+
+int64_t ProfilerManager::SampleAndRescheduleIsolates(int64_t current_time) {
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  static const int64_t max_time = 0x7fffffffffffffffLL;
+  int64_t lowest = max_time;
+  intptr_t i = 0;
+  while (i < isolates_size_) {
+    Isolate* isolate = isolates_[i];
+    ScopedMutex isolate_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    ASSERT(profiler_data != NULL);
+    if (profiler_data->ShouldSample(current_time)) {
+      pthread_kill(profiler_data->thread_id(), SIGPROF);
+      RemoveIsolate(i);
+      // Remove moves the last element into i, do not increment i.
+      continue;
+    }
+    if (profiler_data->CanExpire()) {
+      int64_t isolate_time_left =
+          profiler_data->TimeUntilExpiration(current_time);
+      if (isolate_time_left < 0) {
+        continue;
+      }
+      if (isolate_time_left < lowest) {
+        lowest = isolate_time_left;
+      }
+    }
+    i++;
+  }
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  if (lowest == max_time) {
+    return 0;
+  }
+  ASSERT(lowest != max_time);
+  ASSERT(lowest > 0);
+  return lowest;
+}
+
+
+void ProfilerManager::ThreadMain(uword parameters) {
+  ASSERT(initialized_);
+  ASSERT(FLAG_profile);
+  SignalHandler::Install(ProfileSignalAction);
+  ScopedMonitor lock(monitor_);
+  while (!shutdown_) {
+    int64_t current_time = OS::GetCurrentTimeMicros();
+    int64_t next_sample = SampleAndRescheduleIsolates(current_time);
+    lock.WaitMicros(next_sample);
+  }
+}
+
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_ANDROID)
diff --git a/runtime/vm/profiler_linux.cc b/runtime/vm/profiler_linux.cc
new file mode 100644
index 0000000..a58821d
--- /dev/null
+++ b/runtime/vm/profiler_linux.cc
@@ -0,0 +1,133 @@
+// 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.
+
+#include "platform/globals.h"
+#if defined(TARGET_OS_LINUX)
+
+#include "vm/isolate.h"
+#include "vm/json_stream.h"
+#include "vm/profiler.h"
+#include "vm/signal_handler.h"
+
+namespace dart {
+
+DECLARE_FLAG(bool, profile);
+
+static void CollectSample(IsolateProfilerData* profiler_data,
+                          uintptr_t pc,
+                          uintptr_t fp,
+                          uintptr_t sp,
+                          uintptr_t stack_lower,
+                          uintptr_t stack_upper) {
+  SampleBuffer* sample_buffer = profiler_data->sample_buffer();
+  Sample* sample = sample_buffer->ReserveSample();
+  ASSERT(sample != NULL);
+  sample->timestamp = OS::GetCurrentTimeMicros();
+  // TODO(johnmccutchan): Make real use of vm_tags and runtime_tags.
+  // Issue # 14777
+  sample->vm_tags = Sample::kExecuting;
+  sample->runtime_tags = 0;
+  int64_t cpu_usage;
+  Thread::GetThreadCpuUsage(profiler_data->thread_id(), &cpu_usage);
+  sample->cpu_usage = profiler_data->ComputeDeltaAndSetCpuUsage(cpu_usage);
+  ProfilerSampleStackWalker stackWalker(sample, stack_lower, stack_upper,
+                                        pc, fp, sp);
+  stackWalker.walk();
+}
+
+
+static void ProfileSignalAction(int signal, siginfo_t* info, void* context_) {
+  if (signal != SIGPROF) {
+    return;
+  }
+  ucontext_t* context = reinterpret_cast<ucontext_t*>(context_);
+  mcontext_t mcontext = context->uc_mcontext;
+  Isolate* isolate = Isolate::Current();
+  if (isolate == NULL) {
+    return;
+  }
+  // Thread owns no profiler locks at this point.
+  {
+    // Thread owns isolate profiler data mutex.
+    ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    if (profiler_data == NULL) {
+      return;
+    }
+
+    uintptr_t stack_lower = 0;
+    uintptr_t stack_upper = 0;
+    isolate->GetStackBounds(&stack_lower, &stack_upper);
+    uintptr_t PC = SignalHandler::GetProgramCounter(mcontext);
+    uintptr_t FP = SignalHandler::GetFramePointer(mcontext);
+    uintptr_t SP = SignalHandler::GetStackPointer(mcontext);
+    int64_t sample_time = OS::GetCurrentTimeMicros();
+    profiler_data->SampledAt(sample_time);
+    CollectSample(profiler_data, PC, FP, SP, stack_lower, stack_upper);
+  }
+  // Thread owns no profiler locks at this point.
+  // This call will acquire both ProfilerManager::monitor and the
+  // isolate's profiler data mutex.
+  ProfilerManager::ScheduleIsolate(isolate);
+}
+
+
+int64_t ProfilerManager::SampleAndRescheduleIsolates(int64_t current_time) {
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  static const int64_t max_time = 0x7fffffffffffffffLL;
+  int64_t lowest = max_time;
+  intptr_t i = 0;
+  while (i < isolates_size_) {
+    Isolate* isolate = isolates_[i];
+    ScopedMutex isolate_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    ASSERT(profiler_data != NULL);
+    if (profiler_data->ShouldSample(current_time)) {
+      pthread_kill(profiler_data->thread_id(), SIGPROF);
+      RemoveIsolate(i);
+      // Remove moves the last element into i, do not increment i.
+      continue;
+    }
+    if (profiler_data->CanExpire()) {
+      int64_t isolate_time_left =
+          profiler_data->TimeUntilExpiration(current_time);
+      if (isolate_time_left < 0) {
+        continue;
+      }
+      if (isolate_time_left < lowest) {
+        lowest = isolate_time_left;
+      }
+    }
+    i++;
+  }
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  if (lowest == max_time) {
+    return 0;
+  }
+  ASSERT(lowest != max_time);
+  ASSERT(lowest > 0);
+  return lowest;
+}
+
+
+void ProfilerManager::ThreadMain(uword parameters) {
+  ASSERT(initialized_);
+  ASSERT(FLAG_profile);
+  SignalHandler::Install(ProfileSignalAction);
+  ScopedMonitor lock(monitor_);
+  while (!shutdown_) {
+    int64_t current_time = OS::GetCurrentTimeMicros();
+    int64_t next_sample = SampleAndRescheduleIsolates(current_time);
+    lock.WaitMicros(next_sample);
+  }
+}
+
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_LINUX)
diff --git a/runtime/vm/profiler_macos.cc b/runtime/vm/profiler_macos.cc
new file mode 100644
index 0000000..2cb31c6
--- /dev/null
+++ b/runtime/vm/profiler_macos.cc
@@ -0,0 +1,133 @@
+// 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.
+
+#include "platform/globals.h"
+#if defined(TARGET_OS_MACOS)
+
+#include "vm/isolate.h"
+#include "vm/json_stream.h"
+#include "vm/profiler.h"
+#include "vm/signal_handler.h"
+
+namespace dart {
+
+DECLARE_FLAG(bool, profile);
+
+static void CollectSample(IsolateProfilerData* profiler_data,
+                          uintptr_t pc,
+                          uintptr_t fp,
+                          uintptr_t sp,
+                          uintptr_t stack_lower,
+                          uintptr_t stack_upper) {
+  SampleBuffer* sample_buffer = profiler_data->sample_buffer();
+  Sample* sample = sample_buffer->ReserveSample();
+  ASSERT(sample != NULL);
+  sample->timestamp = OS::GetCurrentTimeMicros();
+  // TODO(johnmccutchan): Make real use of vm_tags and runtime_tags.
+  // Issue # 14777
+  sample->vm_tags = Sample::kExecuting;
+  sample->runtime_tags = 0;
+  int64_t cpu_usage = 0;
+  Thread::GetThreadCpuUsage(profiler_data->thread_id(), &cpu_usage);
+  sample->cpu_usage = profiler_data->ComputeDeltaAndSetCpuUsage(cpu_usage);
+  ProfilerSampleStackWalker stackWalker(sample, stack_lower, stack_upper,
+                                        pc, fp, sp);
+  stackWalker.walk();
+}
+
+
+static void ProfileSignalAction(int signal, siginfo_t* info, void* context_) {
+  if (signal != SIGPROF) {
+    return;
+  }
+  ucontext_t* context = reinterpret_cast<ucontext_t*>(context_);
+  mcontext_t mcontext = context->uc_mcontext;
+  Isolate* isolate = Isolate::Current();
+  if (isolate == NULL) {
+    return;
+  }
+  // Thread owns no profiler locks at this point.
+  {
+    // Thread owns isolate profiler data mutex.
+    ScopedMutex profiler_data_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    if (profiler_data == NULL) {
+      return;
+    }
+
+    uintptr_t stack_lower = 0;
+    uintptr_t stack_upper = 0;
+    isolate->GetStackBounds(&stack_lower, &stack_upper);
+    uintptr_t PC = SignalHandler::GetProgramCounter(mcontext);
+    uintptr_t FP = SignalHandler::GetFramePointer(mcontext);
+    uintptr_t SP = SignalHandler::GetStackPointer(mcontext);
+    int64_t sample_time = OS::GetCurrentTimeMicros();
+    profiler_data->SampledAt(sample_time);
+    CollectSample(profiler_data, PC, FP, SP, stack_lower, stack_upper);
+  }
+  // Thread owns no profiler locks at this point.
+  // This call will acquire both ProfilerManager::monitor and the
+  // isolate's profiler data mutex.
+  ProfilerManager::ScheduleIsolate(isolate);
+}
+
+
+int64_t ProfilerManager::SampleAndRescheduleIsolates(int64_t current_time) {
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  static const int64_t max_time = 0x7fffffffffffffffLL;
+  int64_t lowest = max_time;
+  intptr_t i = 0;
+  while (i < isolates_size_) {
+    Isolate* isolate = isolates_[i];
+    ScopedMutex isolate_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    ASSERT(profiler_data != NULL);
+    if (profiler_data->ShouldSample(current_time)) {
+      pthread_kill(profiler_data->thread_id(), SIGPROF);
+      RemoveIsolate(i);
+      // Remove moves the last element into i, do not increment i.
+      continue;
+    }
+    if (profiler_data->CanExpire()) {
+      int64_t isolate_time_left =
+          profiler_data->TimeUntilExpiration(current_time);
+      if (isolate_time_left < 0) {
+        continue;
+      }
+      if (isolate_time_left < lowest) {
+        lowest = isolate_time_left;
+      }
+    }
+    i++;
+  }
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  if (lowest == max_time) {
+    return 0;
+  }
+  ASSERT(lowest != max_time);
+  ASSERT(lowest > 0);
+  return lowest;
+}
+
+
+void ProfilerManager::ThreadMain(uword parameters) {
+  ASSERT(initialized_);
+  ASSERT(FLAG_profile);
+  SignalHandler::Install(ProfileSignalAction);
+  ScopedMonitor lock(monitor_);
+  while (!shutdown_) {
+    int64_t current_time = OS::GetCurrentTimeMicros();
+    int64_t next_sample = SampleAndRescheduleIsolates(current_time);
+    lock.WaitMicros(next_sample);
+  }
+}
+
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_MACOS)
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
new file mode 100644
index 0000000..a974b85
--- /dev/null
+++ b/runtime/vm/profiler_test.cc
@@ -0,0 +1,74 @@
+// 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.
+
+#include "platform/assert.h"
+
+#include "vm/dart_api_impl.h"
+#include "vm/dart_api_state.h"
+#include "vm/globals.h"
+#include "vm/profiler.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+class ProfileSampleBufferTestHelper {
+ public:
+  static intptr_t IterateCount(const SampleBuffer& sample_buffer) {
+    intptr_t c = 0;
+    for (Sample* i = sample_buffer.FirstSample();
+         i != sample_buffer.LastSample();
+         i = sample_buffer.NextSample(i)) {
+      c++;
+    }
+    return c;
+  }
+
+
+  static intptr_t IterateSumPC(const SampleBuffer& sample_buffer) {
+    intptr_t c = 0;
+    for (Sample* i = sample_buffer.FirstSample();
+         i != sample_buffer.LastSample();
+         i = sample_buffer.NextSample(i)) {
+      c += i->pcs[0];
+    }
+    return c;
+  }
+};
+
+
+TEST_CASE(ProfilerSampleBufferWrapTest) {
+  SampleBuffer* sample_buffer = new SampleBuffer(3);
+  EXPECT_EQ(0, ProfileSampleBufferTestHelper::IterateSumPC(*sample_buffer));
+  Sample* s;
+  s = sample_buffer->ReserveSample();
+  s->pcs[0] = 2;
+  EXPECT_EQ(2, ProfileSampleBufferTestHelper::IterateSumPC(*sample_buffer));
+  s = sample_buffer->ReserveSample();
+  s->pcs[0] = 4;
+  EXPECT_EQ(6, ProfileSampleBufferTestHelper::IterateSumPC(*sample_buffer));
+  s = sample_buffer->ReserveSample();
+  s->pcs[0] = 6;
+  EXPECT_EQ(10, ProfileSampleBufferTestHelper::IterateSumPC(*sample_buffer));
+  s = sample_buffer->ReserveSample();
+  s->pcs[0] = 8;
+  EXPECT_EQ(14, ProfileSampleBufferTestHelper::IterateSumPC(*sample_buffer));
+  delete sample_buffer;
+}
+
+
+TEST_CASE(ProfilerSampleBufferIterateTest) {
+  SampleBuffer* sample_buffer = new SampleBuffer(3);
+  EXPECT_EQ(0, ProfileSampleBufferTestHelper::IterateCount(*sample_buffer));
+  sample_buffer->ReserveSample();
+  EXPECT_EQ(1, ProfileSampleBufferTestHelper::IterateCount(*sample_buffer));
+  sample_buffer->ReserveSample();
+  EXPECT_EQ(2, ProfileSampleBufferTestHelper::IterateCount(*sample_buffer));
+  sample_buffer->ReserveSample();
+  EXPECT_EQ(2, ProfileSampleBufferTestHelper::IterateCount(*sample_buffer));
+  sample_buffer->ReserveSample();
+  EXPECT_EQ(2, ProfileSampleBufferTestHelper::IterateCount(*sample_buffer));
+  delete sample_buffer;
+}
+
+}  // namespace dart
diff --git a/runtime/vm/profiler_win.cc b/runtime/vm/profiler_win.cc
new file mode 100644
index 0000000..61aa28b
--- /dev/null
+++ b/runtime/vm/profiler_win.cc
@@ -0,0 +1,145 @@
+// 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.
+
+#include "platform/globals.h"
+#if defined(TARGET_OS_WINDOWS)
+
+#include "vm/isolate.h"
+#include "vm/profiler.h"
+
+namespace dart {
+
+#define kThreadError -1
+
+DECLARE_FLAG(bool, profile);
+
+static void CollectSample(IsolateProfilerData* profiler_data,
+                          uintptr_t pc,
+                          uintptr_t fp,
+                          uintptr_t stack_lower,
+                          uintptr_t stack_upper) {
+  uintptr_t sp = stack_lower;
+  SampleBuffer* sample_buffer = profiler_data->sample_buffer();
+  Sample* sample = sample_buffer->ReserveSample();
+  ASSERT(sample != NULL);
+  sample->timestamp = OS::GetCurrentTimeMicros();
+  // TODO(johnmccutchan): Make real use of vm_tags and runtime_tags.
+  // Issue # 14777
+  sample->vm_tags = Sample::kExecuting;
+  sample->runtime_tags = 0;
+  int64_t cpu_usage;
+  Thread::GetThreadCpuUsage(profiler_data->thread_id(), &cpu_usage);
+  sample->cpu_usage = profiler_data->ComputeDeltaAndSetCpuUsage(cpu_usage);
+  ProfilerSampleStackWalker stackWalker(sample, stack_lower, stack_upper,
+                                        pc, fp, sp);
+  stackWalker.walk();
+}
+
+
+static bool GrabRegisters(ThreadId thread, uintptr_t* pc, uintptr_t* fp,
+                          uintptr_t* sp) {
+  CONTEXT context;
+  memset(&context, 0, sizeof(context));
+  context.ContextFlags = CONTEXT_FULL;
+  if (GetThreadContext(thread, &context) != 0) {
+#if defined(TARGET_ARCH_IA32)
+    *pc = static_cast<uintptr_t>(context.Eip);
+    *fp = static_cast<uintptr_t>(context.Ebp);
+    *sp = static_cast<uintptr_t>(context.Esp);
+#elif defined(TARGET_ARCH_X64)
+    *pc = reinterpret_cast<uintptr_t>(context.Rip);
+    *fp = reinterpret_cast<uintptr_t>(context.Rbp);
+    *sp = reinterpret_cast<uintptr_t>(context.Rsp);
+#else
+    UNIMPLEMENTED();
+#endif
+    return true;
+  }
+  return false;
+}
+
+
+static void SuspendAndSample(Isolate* isolate,
+                             IsolateProfilerData* profiler_data) {
+  ASSERT(GetCurrentThread() != profiler_data->thread_id());
+  DWORD result = SuspendThread(profiler_data->thread_id());
+  if (result == kThreadError) {
+    return;
+  }
+  uintptr_t PC;
+  uintptr_t FP;
+  uintptr_t stack_lower;
+  uintptr_t stack_upper;
+  bool r = isolate->GetStackBounds(&stack_lower, &stack_upper);
+  if (r) {
+    r = GrabRegisters(profiler_data->thread_id(), &PC, &FP, &stack_lower);
+    if (r) {
+      int64_t sample_time = OS::GetCurrentTimeMicros();
+      profiler_data->SampledAt(sample_time);
+      CollectSample(profiler_data, PC, FP, stack_lower, stack_upper);
+    }
+  }
+
+  ResumeThread(profiler_data->thread_id());
+}
+
+
+static void Reschedule(IsolateProfilerData* profiler_data) {
+  profiler_data->Scheduled(OS::GetCurrentTimeMicros(),
+                           profiler_data->thread_id());
+}
+
+
+int64_t ProfilerManager::SampleAndRescheduleIsolates(int64_t current_time) {
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  static const int64_t max_time = 0x7fffffffffffffffLL;
+  int64_t lowest = max_time;
+  for (intptr_t i = 0; i < isolates_size_; i++) {
+    Isolate* isolate = isolates_[i];
+    ScopedMutex isolate_lock(isolate->profiler_data_mutex());
+    IsolateProfilerData* profiler_data = isolate->profiler_data();
+    ASSERT(profiler_data != NULL);
+    if (profiler_data->ShouldSample(current_time)) {
+      SuspendAndSample(isolate, profiler_data);
+      Reschedule(profiler_data);
+    }
+    if (profiler_data->CanExpire()) {
+      int64_t isolate_time_left =
+          profiler_data->TimeUntilExpiration(current_time);
+      if (isolate_time_left < 0) {
+        continue;
+      }
+      if (isolate_time_left < lowest) {
+        lowest = isolate_time_left;
+      }
+    }
+  }
+  if (isolates_size_ == 0) {
+    return 0;
+  }
+  if (lowest == max_time) {
+    return 0;
+  }
+  ASSERT(lowest != max_time);
+  ASSERT(lowest > 0);
+  return lowest;
+}
+
+
+void ProfilerManager::ThreadMain(uword parameters) {
+  ASSERT(initialized_);
+  ASSERT(FLAG_profile);
+  ScopedMonitor lock(monitor_);
+  while (!shutdown_) {
+    int64_t current_time = OS::GetCurrentTimeMicros();
+    int64_t next_sample = SampleAndRescheduleIsolates(current_time);
+    lock.WaitMicros(next_sample);
+  }
+}
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_WINDOWS)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 31cd343..89f4690 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -68,7 +68,7 @@
     V(WeakProperty)                                                            \
     V(MirrorReference)                                                         \
     V(Float32x4)                                                               \
-    V(Int32x4)                                                                \
+    V(Int32x4)                                                                 \
 
 #define CLASS_LIST_ARRAYS(V)                                                   \
   V(Array)                                                                     \
@@ -94,7 +94,7 @@
   V(Float32Array)                                                              \
   V(Float64Array)                                                              \
   V(Float32x4Array)                                                            \
-  V(Int32x4Array)                                                             \
+  V(Int32x4Array)                                                              \
 
 #define CLASS_LIST_FOR_HANDLES(V)                                              \
   CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V)                                 \
@@ -1163,9 +1163,9 @@
   }
   RawObject* type_class_;  // Either resolved class or unresolved class.
   RawAbstractTypeArguments* arguments_;
-  RawError* malformed_error_;  // Error object if type is malformed.
+  RawLanguageError* error_;  // Error object if type is malformed or malbounded.
   RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->malformed_error_);
+    return reinterpret_cast<RawObject**>(&ptr()->error_);
   }
   intptr_t token_pos_;
   int8_t type_state_;
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 56e8386..0a1763d 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -5,6 +5,7 @@
 #include "vm/scanner.h"
 
 #include "platform/assert.h"
+#include "vm/dart.h"
 #include "vm/flags.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
@@ -17,28 +18,8 @@
 
 DEFINE_FLAG(bool, print_tokens, false, "Print scanned tokens.");
 
-void Scanner::InitKeywordTable() {
-  ObjectStore* object_store = Isolate::Current()->object_store();
-  keyword_symbol_table_ = object_store->keyword_symbols();
-  if (keyword_symbol_table_.IsNull()) {
-    object_store->InitKeywordTable();
-    keyword_symbol_table_ = object_store->keyword_symbols();
-    ASSERT(!keyword_symbol_table_.IsNull());
-    String& symbol = String::Handle();
-    for (int i = 0; i < Token::numKeywords; i++) {
-      Token::Kind token = static_cast<Token::Kind>(Token::kFirstKeyword + i);
-      symbol = Symbols::New(Token::Str(token));
-      keyword_symbol_table_.SetAt(i, symbol);
-    }
-  }
-  for (int i = 0; i < Token::numKeywords; i++) {
-    Token::Kind token = static_cast<Token::Kind>(Token::kFirstKeyword + i);
-    keywords_[i].kind = token;
-    keywords_[i].keyword_chars = Token::Str(token);
-    keywords_[i].keyword_len = strlen(Token::Str(token));
-    keywords_[i].keyword_symbol = NULL;
-  }
-}
+
+Scanner::KeywordTable Scanner::keywords_[Token::numKeywords];
 
 
 void Scanner::Reset() {
@@ -76,10 +57,8 @@
     : source_(src),
       source_length_(src.Length()),
       saved_context_(NULL),
-      private_key_(String::ZoneHandle(private_key.raw())),
-      keyword_symbol_table_(Array::ZoneHandle()) {
+      private_key_(String::ZoneHandle(private_key.raw())) {
   Reset();
-  InitKeywordTable();
 }
 
 Scanner::~Scanner() {
@@ -321,12 +300,6 @@
         char_pos++;
       }
       if (char_pos == ident_length) {
-        if (keywords_[i].keyword_symbol == NULL) {
-          String& symbol = String::ZoneHandle();
-          symbol ^= keyword_symbol_table_.At(i);
-          ASSERT(!symbol.IsNull());
-          keywords_[i].keyword_symbol = &symbol;
-        }
         current_token_.literal = keywords_[i].keyword_symbol;
         current_token_.kind = keywords_[i].kind;
         return;
@@ -974,6 +947,14 @@
 
 
 void Scanner::InitOnce() {
+  ASSERT(Isolate::Current() == Dart::vm_isolate());
+  for (int i = 0; i < Token::numKeywords; i++) {
+    Token::Kind token = static_cast<Token::Kind>(Token::kFirstKeyword + i);
+    keywords_[i].kind = token;
+    keywords_[i].keyword_chars = Token::Str(token);
+    keywords_[i].keyword_len = strlen(Token::Str(token));
+    keywords_[i].keyword_symbol = &Symbols::Keyword(token);
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index dbbbfbd..c4dd90a 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -105,15 +105,12 @@
     Token::Kind kind;
     const char* keyword_chars;
     int keyword_len;
-    String* keyword_symbol;
+    const String* keyword_symbol;
   };
 
   // Rewind scanner position to token 0.
   void Reset();
 
-  // Initialize Scanner tables.
-  void InitKeywordTable();
-
   // Reads next lookahead character.
   void ReadChar();
 
@@ -216,8 +213,8 @@
   const String& private_key_;
 
   SourcePosition c0_pos_;      // Source position of lookahead character c0_.
-  KeywordTable keywords_[Token::numKeywords];
-  Array& keyword_symbol_table_;  // Access to keyword symbols in object store.
+
+  static KeywordTable keywords_[Token::numKeywords];
 };
 
 
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index d6f108d..dd63408 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -303,7 +303,9 @@
 };
 
 
-Scavenger::Scavenger(Heap* heap, intptr_t max_capacity, uword object_alignment)
+Scavenger::Scavenger(Heap* heap,
+                     intptr_t max_capacity_in_words,
+                     uword object_alignment)
     : heap_(heap),
       object_alignment_(object_alignment),
       scavenging_(false) {
@@ -312,7 +314,7 @@
   ASSERT(Object::tags_offset() == 0);
 
   // Allocate the virtual memory for this scavenge heap.
-  space_ = VirtualMemory::Reserve(max_capacity);
+  space_ = VirtualMemory::Reserve(max_capacity_in_words << kWordSizeLog2);
   if (space_ == NULL) {
     FATAL("Out of memory.\n");
   }
@@ -439,7 +441,7 @@
   IterateStoreBuffers(isolate, visitor);
   IterateObjectIdTable(isolate, visitor);
   int64_t end = OS::GetCurrentTimeMicros();
-  heap_->RecordData(kToKBAfterStoreBuffer, (in_use() + (KB >> 1)) >> KBLog2);
+  heap_->RecordData(kToKBAfterStoreBuffer, RoundWordsToKB(UsedInWords()));
   heap_->RecordTime(kVisitIsolateRoots, middle - start);
   heap_->RecordTime(kIterateStoreBuffers, end - middle);
 }
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index d5263ab..d1405ff 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -24,7 +24,7 @@
 
 class Scavenger {
  public:
-  Scavenger(Heap* heap, intptr_t max_capacity, uword object_alignment);
+  Scavenger(Heap* heap, intptr_t max_capacity_in_words, uword object_alignment);
   ~Scavenger();
 
   // Check whether this Scavenger contains this address.
@@ -43,7 +43,7 @@
     ASSERT(Utils::IsAligned(size, kObjectAlignment));
 #if defined(DEBUG)
     if (FLAG_gc_at_alloc && !scavenging_) {
-      Scavenge("debugging");
+      Scavenge();
     }
 #endif
     uword result = top_;
@@ -69,8 +69,10 @@
   static intptr_t top_offset() { return OFFSET_OF(Scavenger, top_); }
   static intptr_t end_offset() { return OFFSET_OF(Scavenger, end_); }
 
-  intptr_t in_use() const { return (top_ - FirstObjectStart()); }
-  intptr_t capacity() const { return space_->size(); }
+  intptr_t UsedInWords() const {
+    return (top_ - FirstObjectStart()) >> kWordSizeLog2;
+  }
+  intptr_t CapacityInWords() const { return space_->size() >> kWordSizeLog2; }
 
   void VisitObjects(ObjectVisitor* visitor) const;
   void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index baa8f96..ba9d031 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -4,10 +4,7 @@
 
 #include "vm/scopes.h"
 
-#include "vm/ast.h"
-#include "vm/bit_vector.h"
 #include "vm/object.h"
-#include "vm/parser.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 
@@ -442,21 +439,6 @@
 }
 
 
-SourceLabel* LocalScope::LookupInnermostCatchLabel() {
-  LocalScope* current_scope = this;
-  while (current_scope != NULL) {
-    for (intptr_t i = 0; i < current_scope->labels_.length(); i++) {
-      SourceLabel* label = current_scope->labels_[i];
-      if (label->kind() == SourceLabel::kCatch) {
-        return label;
-      }
-    }
-    current_scope = current_scope->parent();
-  }
-  return NULL;
-}
-
-
 LocalScope* LocalScope::LookupSwitchScope() {
   LocalScope* current_scope = this->parent();
   int this_level = this->function_level();
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 9227dea..89851e9 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -5,18 +5,18 @@
 #ifndef VM_SCOPES_H_
 #define VM_SCOPES_H_
 
+#include "platform/assert.h"
+#include "platform/globals.h"
 #include "vm/allocation.h"
-#include "vm/assembler.h"
 #include "vm/growable_array.h"
+#include "vm/object.h"
+#include "vm/raw_object.h"
 #include "vm/symbols.h"
+#include "vm/token.h"
 
 namespace dart {
 
-class BitVector;
-class JoinEntryInstr;
 class LocalScope;
-class LocalVariable;
-class SourceLabel;
 
 
 class LocalVariable : public ZoneAllocated {
@@ -150,12 +150,7 @@
     : token_pos_(token_pos),
       name_(name),
       owner_(NULL),
-      kind_(kind),
-      continue_label_(),
-      break_label_(),
-      join_for_break_(NULL),
-      join_for_continue_(NULL),
-      is_continue_target_(false) {
+      kind_(kind) {
   }
 
   static SourceLabel* New(intptr_t token_pos, String* name, Kind kind) {
@@ -177,29 +172,6 @@
   }
 
   Kind kind() const { return kind_; }
-  Label* break_label() { return &break_label_; }
-  Label* continue_label() { return &continue_label_; }
-
-  void set_join_for_continue(JoinEntryInstr* join) {
-    ASSERT(join_for_continue_ == NULL);
-    join_for_continue_ = join;
-  }
-
-  JoinEntryInstr* join_for_continue() const {
-    return join_for_continue_;
-  }
-
-  bool is_continue_target() const { return is_continue_target_; }
-  void set_is_continue_target(bool value) { is_continue_target_ = value; }
-
-  void set_join_for_break(JoinEntryInstr* join) {
-    ASSERT(join_for_break_ == NULL);
-    join_for_break_ = join;
-  }
-
-  JoinEntryInstr* join_for_break() const {
-    return join_for_break_;
-  }
 
   // Returns the function level of the scope in which the label is defined.
   int FunctionLevel() const;
@@ -207,20 +179,11 @@
   void ResolveForwardReference() { kind_ = kCase; }
 
  private:
-  // TODO(zerny): Remove this hack when the builder no longer stores state in
-  // the ast/scopes.
-  friend class SourceLabelResetter;
-
   const intptr_t token_pos_;
   const String& name_;
   LocalScope* owner_;  // Local scope declaring this label.
 
   Kind kind_;
-  Label continue_label_;
-  Label break_label_;
-  JoinEntryInstr* join_for_break_;
-  JoinEntryInstr* join_for_continue_;
-  bool is_continue_target_;  // Needed for CaseNode.
 
   DISALLOW_COPY_AND_ASSIGN(SourceLabel);
 };
@@ -292,9 +255,6 @@
   // statement.
   SourceLabel* LookupInnermostLabel(Token::Kind jump_kind);
 
-  // Lookup the label for the "innermost" catch block if one exists.
-  SourceLabel* LookupInnermostCatchLabel();
-
   // Lookup scope of outer switch statement at same function level.
   // Returns NULL if this scope is not embedded in a switch.
   LocalScope* LookupSwitchScope();
diff --git a/runtime/vm/signal_handler.h b/runtime/vm/signal_handler.h
new file mode 100644
index 0000000..67e1cfa
--- /dev/null
+++ b/runtime/vm/signal_handler.h
@@ -0,0 +1,55 @@
+// 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.
+
+#ifndef VM_SIGNAL_HANDLER_H_
+#define VM_SIGNAL_HANDLER_H_
+
+#include "vm/allocation.h"
+#include "vm/globals.h"
+
+#if defined(TARGET_OS_LINUX)
+#include <signal.h>  // NOLINT
+#include <ucontext.h>  // NOLINT
+#elif defined(TARGET_OS_ANDROID)
+#include <signal.h>  // NOLINT
+struct mcontext_t;
+#elif defined(TARGET_OS_MACOS)
+#include <signal.h>  // NOLINT
+#include <sys/ucontext.h>  // NOLINT
+#elif defined(TARGET_OS_WINDOWS)
+// Stub out for windows.
+struct siginfo_t;
+struct mcontext_t;
+struct sigset_t {
+};
+#endif
+
+namespace dart {
+
+typedef void (*SignalAction)(int signal, siginfo_t* info,
+                             void* context);
+
+class SignalHandler : public AllStatic {
+ public:
+  static void Install(SignalAction action);
+  static uintptr_t GetProgramCounter(const mcontext_t& mcontext);
+  static uintptr_t GetFramePointer(const mcontext_t& mcontext);
+  static uintptr_t GetStackPointer(const mcontext_t& mcontext);
+ private:
+};
+
+
+class ScopedSignalBlocker {
+ public:
+  ScopedSignalBlocker();
+  ~ScopedSignalBlocker();
+
+ private:
+  sigset_t old_;
+};
+
+
+}  // namespace dart
+
+#endif  // VM_SIGNAL_HANDLER_H_
diff --git a/runtime/vm/signal_handler_android.cc b/runtime/vm/signal_handler_android.cc
new file mode 100644
index 0000000..11adfc7
--- /dev/null
+++ b/runtime/vm/signal_handler_android.cc
@@ -0,0 +1,46 @@
+// 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.
+
+#include "platform/thread.h"
+#include "vm/globals.h"
+#include "vm/signal_handler.h"
+#if defined(TARGET_OS_ANDROID)
+
+namespace dart {
+
+uintptr_t SignalHandler::GetProgramCounter(const mcontext_t& mcontext) {
+  UNIMPLEMENTED();
+}
+
+
+uintptr_t SignalHandler::GetFramePointer(const mcontext_t& mcontext) {
+  UNIMPLEMENTED();
+}
+
+
+uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+  UNIMPLEMENTED();
+}
+
+
+void SignalHandler::Install(SignalAction action) {
+  UNIMPLEMENTED();
+}
+
+
+ScopedSignalBlocker::ScopedSignalBlocker() {
+  sigset_t set;
+  sigemptyset(&set);
+  sigaddset(&set, SIGPROF);
+  pthread_sigmask(SIG_SETMASK, &set, &old_);
+}
+
+
+ScopedSignalBlocker::~ScopedSignalBlocker() {
+  pthread_sigmask(SIG_SETMASK, &old_, NULL);
+}
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_ANDROID)
diff --git a/runtime/vm/signal_handler_linux.cc b/runtime/vm/signal_handler_linux.cc
new file mode 100644
index 0000000..d4021cf
--- /dev/null
+++ b/runtime/vm/signal_handler_linux.cc
@@ -0,0 +1,94 @@
+// 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.
+
+#include "vm/globals.h"
+#include "vm/simulator.h"
+#include "vm/signal_handler.h"
+#if defined(TARGET_OS_LINUX)
+
+namespace dart {
+
+uintptr_t SignalHandler::GetProgramCounter(const mcontext_t& mcontext) {
+  uintptr_t pc = 0;
+
+#if defined(TARGET_ARCH_IA32)
+  pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]);
+#elif defined(TARGET_ARCH_X64)
+  pc = static_cast<uintptr_t>(mcontext.gregs[REG_RIP]);
+#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR)
+  pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]);
+#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
+  pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]);
+#else
+  UNIMPLEMENTED();
+#endif  // TARGET_ARCH_...
+  return pc;
+}
+
+
+uintptr_t SignalHandler::GetFramePointer(const mcontext_t& mcontext) {
+  uintptr_t fp = 0;
+
+#if defined(TARGET_ARCH_IA32)
+  fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]);
+#elif defined(TARGET_ARCH_X64)
+  fp = static_cast<uintptr_t>(mcontext.gregs[REG_RBP]);
+#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR)
+  fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]);
+#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
+  fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]);
+#else
+  UNIMPLEMENTED();
+#endif  // TARGET_ARCH_...
+
+  return fp;
+}
+
+
+uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+  uintptr_t sp = 0;
+
+#if defined(TARGET_ARCH_IA32)
+  sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]);
+#elif defined(TARGET_ARCH_X64)
+  sp = static_cast<uintptr_t>(mcontext.gregs[REG_RSP]);
+#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR)
+  sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]);
+#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
+  sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]);
+#else
+  UNIMPLEMENTED();
+#endif  // TARGET_ARCH_...
+  return sp;
+}
+
+
+void SignalHandler::Install(SignalAction action) {
+  struct sigaction act;
+  act.sa_handler = NULL;
+  act.sa_sigaction = action;
+  sigemptyset(&act.sa_mask);
+  act.sa_flags = SA_RESTART | SA_SIGINFO;
+  // TODO(johnmccutchan): Do we care about restoring the signal handler?
+  struct sigaction old_act;
+  int r = sigaction(SIGPROF, &act, &old_act);
+  ASSERT(r == 0);
+}
+
+
+ScopedSignalBlocker::ScopedSignalBlocker() {
+  sigset_t set;
+  sigemptyset(&set);
+  sigaddset(&set, SIGPROF);
+  pthread_sigmask(SIG_SETMASK, &set, &old_);
+}
+
+
+ScopedSignalBlocker::~ScopedSignalBlocker() {
+  pthread_sigmask(SIG_SETMASK, &old_, NULL);
+}
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_LINUX)
diff --git a/runtime/vm/signal_handler_macos.cc b/runtime/vm/signal_handler_macos.cc
new file mode 100644
index 0000000..f0e5b15
--- /dev/null
+++ b/runtime/vm/signal_handler_macos.cc
@@ -0,0 +1,96 @@
+// 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.
+
+#include "vm/globals.h"
+#include "vm/simulator.h"
+#include "vm/signal_handler.h"
+#if defined(TARGET_OS_MACOS)
+
+namespace dart {
+
+uintptr_t SignalHandler::GetProgramCounter(const mcontext_t& mcontext) {
+  uintptr_t pc = 0;
+
+#if defined(TARGET_ARCH_IA32)
+  pc = static_cast<uintptr_t>(mcontext->__ss.__eip);
+#elif defined(TARGET_ARCH_X64)
+  pc = static_cast<uintptr_t>(mcontext->__ss.__rip);
+#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR)
+  pc = static_cast<uintptr_t>(mcontext->__ss.__eip);
+#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
+  pc = static_cast<uintptr_t>(mcontext->__ss.__eip);
+#else
+  UNIMPLEMENTED();
+#endif  // TARGET_ARCH_...
+
+  return pc;
+}
+
+
+uintptr_t SignalHandler::GetFramePointer(const mcontext_t& mcontext) {
+  uintptr_t fp = 0;
+
+#if defined(TARGET_ARCH_IA32)
+  fp = static_cast<uintptr_t>(mcontext->__ss.__ebp);
+#elif defined(TARGET_ARCH_X64)
+  fp = static_cast<uintptr_t>(mcontext->__ss.__rbp);
+#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR)
+  fp = static_cast<uintptr_t>(mcontext->__ss.__ebp);
+#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
+  fp = static_cast<uintptr_t>(mcontext->__ss.__ebp);
+#else
+  UNIMPLEMENTED();
+#endif  // TARGET_ARCH_...
+
+  return fp;
+}
+
+
+uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+  uintptr_t sp = 0;
+
+#if defined(TARGET_ARCH_IA32)
+  sp = static_cast<uintptr_t>(mcontext->__ss.__esp);
+#elif defined(TARGET_ARCH_X64)
+  sp = static_cast<uintptr_t>(mcontext->__ss.__rsp);
+#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR)
+  sp = static_cast<uintptr_t>(mcontext->__ss.__esp);
+#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
+  sp = static_cast<uintptr_t>(mcontext->__ss.__esp);
+#else
+  UNIMPLEMENTED();
+#endif  // TARGET_ARCH_...
+
+  return sp;
+}
+
+
+void SignalHandler::Install(SignalAction action) {
+  struct sigaction act;
+  act.sa_handler = NULL;
+  act.sa_sigaction = action;
+  sigemptyset(&act.sa_mask);
+  act.sa_flags = SA_RESTART | SA_SIGINFO;
+  // TODO(johnmccutchan): Do we care about restoring the signal handler?
+  struct sigaction old_act;
+  int r = sigaction(SIGPROF, &act, &old_act);
+  ASSERT(r == 0);
+}
+
+
+ScopedSignalBlocker::ScopedSignalBlocker() {
+  sigset_t set;
+  sigemptyset(&set);
+  sigaddset(&set, SIGPROF);
+  pthread_sigmask(SIG_SETMASK, &set, &old_);
+}
+
+
+ScopedSignalBlocker::~ScopedSignalBlocker() {
+  pthread_sigmask(SIG_SETMASK, &old_, NULL);
+}
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_MACOS)
diff --git a/runtime/vm/signal_handler_win.cc b/runtime/vm/signal_handler_win.cc
new file mode 100644
index 0000000..8a4b86c
--- /dev/null
+++ b/runtime/vm/signal_handler_win.cc
@@ -0,0 +1,43 @@
+// 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.
+
+#include "vm/globals.h"
+#include "vm/signal_handler.h"
+#if defined(TARGET_OS_WINDOWS)
+
+namespace dart {
+
+uintptr_t SignalHandler::GetProgramCounter(const mcontext_t& mcontext) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+uintptr_t SignalHandler::GetFramePointer(const mcontext_t& mcontext) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void SignalHandler::Install(SignalAction action) {
+  UNIMPLEMENTED();
+}
+
+
+ScopedSignalBlocker::ScopedSignalBlocker() {
+}
+
+
+ScopedSignalBlocker::~ScopedSignalBlocker() {
+}
+
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_WINDOWS)
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 7486a1b..5888239 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -3201,7 +3201,7 @@
                (instr->Bit(7) == 0) && (instr->Bits(16, 4) == 9)) {
       // Format(instr, "vabsqs 'qd, 'qm");
       for (int i = 0; i < 4; i++) {
-        s8d.data_[i].f = abs(s8m.data_[i].f);
+        s8d.data_[i].f = fabsf(s8m.data_[i].f);
       }
     } else if ((instr->Bits(8, 4) == 7) && (instr->Bit(4) == 0) &&
                (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 4f70a5f..33c8238 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -61,21 +61,24 @@
   // helper functions to the raw object interface.
   ASSERT(visitor != NULL);
   NoGCScope no_gc;
-  RawObject** first = reinterpret_cast<RawObject**>(sp());
-  RawObject** last = reinterpret_cast<RawObject**>(
-      fp() + (kFirstLocalSlotFromFp * kWordSize));
   Code code;
   code = LookupDartCode();
   if (!code.IsNull()) {
     // Visit the code object.
     RawObject* raw_code = code.raw();
     visitor->VisitPointer(&raw_code);
-    // Visit stack based on stack maps.
+
+    // Optimized frames have a stack map. We need to visit the frame based
+    // on the stack map.
     Array maps;
     maps = Array::null();
     Stackmap map;
     map = code.GetStackmap(pc(), &maps, &map);
     if (!map.IsNull()) {
+      RawObject** first = reinterpret_cast<RawObject**>(sp());
+      RawObject** last = reinterpret_cast<RawObject**>(
+          fp() + (kFirstLocalSlotFromFp * kWordSize));
+
       // A stack map is present in the code object, use the stack map to
       // visit frame slots which are marked as having objects.
       //
@@ -94,23 +97,40 @@
       // Spill slots are at the 'bottom' of the frame.
       intptr_t spill_slot_count = length - map.RegisterBitCount();
       for (intptr_t bit = 0; bit < spill_slot_count; ++bit) {
-        if (map.IsObject(bit)) visitor->VisitPointer(last);
+        if (map.IsObject(bit)) {
+          visitor->VisitPointer(last);
+        }
         --last;
       }
 
       // The live registers at the 'top' of the frame comprise the rest of the
       // stack map.
       for (intptr_t bit = length - 1; bit >= spill_slot_count; --bit) {
-        if (map.IsObject(bit)) visitor->VisitPointer(first);
+        if (map.IsObject(bit)) {
+          visitor->VisitPointer(first);
+        }
         ++first;
       }
 
       // The last slot can be one slot (but not more) past the last slot
       // in the case that all slots were covered by the stack map.
       ASSERT((last + 1) >= first);
+      visitor->VisitPointers(first, last);
+
+      // Now visit other slots which might be part of the calling convention.
+      first = reinterpret_cast<RawObject**>(
+          fp() + ((kFirstLocalSlotFromFp + 1) * kWordSize));
+      last = reinterpret_cast<RawObject**>(
+          fp() + (kFirstObjectSlotFromFp * kWordSize));
+      visitor->VisitPointers(first, last);
+      return;
     }
   }
-  // Each slot between the first and last included are tagged objects.
+  // For normal unoptimized Dart frames and Stub frames each slot
+  // between the first and last included are tagged objects.
+  RawObject** first = reinterpret_cast<RawObject**>(sp());
+  RawObject** last = reinterpret_cast<RawObject**>(
+      fp() + (kFirstObjectSlotFromFp * kWordSize));
   visitor->VisitPointers(first, last);
 }
 
diff --git a/runtime/vm/stack_frame_arm.h b/runtime/vm/stack_frame_arm.h
index 3bae90f..f2949adf 100644
--- a/runtime/vm/stack_frame_arm.h
+++ b/runtime/vm/stack_frame_arm.h
@@ -16,19 +16,24 @@
                | saved LR           |    (PC of current frame)
                | callee's PC marker |
                +--------------------+
-Current frame  | ...                | <- SP of current frame
-               | first local        |
-               | caller's PP        |
+Current frame  | ...               T| <- SP of current frame
+               | first local       T|
+               | caller's PP       T|
                | caller's FP        | <- FP of current frame
                | caller's LR        |    (PC of caller frame)
                | PC marker          |    (current frame's code entry + offset)
                +--------------------+
 Caller frame   | last parameter     | <- SP of caller frame
                |  ...               |
+
+               T against a slot indicates it needs to be traversed during GC.
 */
 
 static const int kDartFrameFixedSize = 4;  // PP, FP, LR, PC marker.
 static const int kSavedPcSlotFromSp = -2;
+
+static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
+
 static const int kFirstLocalSlotFromFp = -2;
 static const int kSavedCallerPpSlotFromFp = -1;
 static const int kSavedCallerFpSlotFromFp = 0;
@@ -44,4 +49,3 @@
 }  // namespace dart
 
 #endif  // VM_STACK_FRAME_ARM_H_
-
diff --git a/runtime/vm/stack_frame_ia32.h b/runtime/vm/stack_frame_ia32.h
index 4ef81ae..f36863b 100644
--- a/runtime/vm/stack_frame_ia32.h
+++ b/runtime/vm/stack_frame_ia32.h
@@ -14,18 +14,23 @@
                | saved EBP          |    (EBP of current frame)
                | saved PC           |    (PC of current frame)
                +--------------------+
-Current frame  | ...                | <- ESP of current frame
-               | first local        |
+Current frame  | ...               T| <- ESP of current frame
+               | first local       T|
                | PC marker          |    (current frame's code entry + offset)
                | caller's EBP       | <- EBP of current frame
                | caller's ret addr  |    (PC of caller frame)
                +--------------------+
 Caller frame   | last parameter     | <- ESP of caller frame
                |  ...               |
+
+               T against a slot indicates it needs to be traversed during GC.
 */
 
 static const int kDartFrameFixedSize = 3;  // PC marker, EBP, PC.
 static const int kSavedPcSlotFromSp = -1;
+
+static const int kFirstObjectSlotFromFp = -2;  // Used by GC to traverse stack.
+
 static const int kFirstLocalSlotFromFp = -2;
 static const int kPcMarkerSlotFromFp = -1;
 static const int kSavedCallerFpSlotFromFp = 0;
@@ -43,4 +48,3 @@
 }  // namespace dart
 
 #endif  // VM_STACK_FRAME_IA32_H_
-
diff --git a/runtime/vm/stack_frame_mips.h b/runtime/vm/stack_frame_mips.h
index caeed8d..84f8dc7 100644
--- a/runtime/vm/stack_frame_mips.h
+++ b/runtime/vm/stack_frame_mips.h
@@ -14,19 +14,24 @@
                | current RA         |    (PC of current frame)
                | callee's PC marker |
                +--------------------+
-Current frame  | ...                | <- SP of current frame
-               | first local        |
-               | caller's PP        |
+Current frame  | ...               T| <- SP of current frame
+               | first local       T|
+               | caller's PP       T|
                | caller's FP        | <- FP of current frame
                | caller's RA        |    (PC of caller frame)
                | PC marker          |    (current frame's code entry + offset)
                +--------------------+
 Caller frame   | last parameter     | <- SP of caller frame
                |  ...               |
+
+               T against a slot indicates it needs to be traversed during GC.
 */
 
 static const int kDartFrameFixedSize = 4;  // PP, FP, RA, PC marker.
 static const int kSavedPcSlotFromSp = -2;
+
+static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
+
 static const int kFirstLocalSlotFromFp = -2;
 static const int kSavedCallerPpSlotFromFp = -1;
 static const int kSavedCallerFpSlotFromFp = 0;
@@ -42,4 +47,3 @@
 }  // namespace dart
 
 #endif  // VM_STACK_FRAME_MIPS_H_
-
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index 33c87b6..dcd964a 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -16,20 +16,24 @@
                | saved RBP          |    (RBP of current frame)
                | saved PC           |    (PC of current frame)
                +--------------------+
-Current frame  | ...                | <- RSP of current frame
-               | first local        |
-               | caller's PP        |
+Current frame  | ...               T| <- RSP of current frame
+               | first local       T|
+               | caller's PP       T|
                | PC marker          |    (current frame's code entry + offset)
                | caller's RBP       | <- RBP of current frame
                | caller's ret addr  |    (PC of caller frame)
                +--------------------+
 Caller frame   | last parameter     | <- RSP of caller frame
                |  ...               |
+
+               T against a slot indicates it needs to be traversed during GC.
 */
 
 static const int kDartFrameFixedSize = 4;  // PC marker, RBP, PP, PC.
 static const int kSavedPcSlotFromSp = -1;
 
+static const int kFirstObjectSlotFromFp = -2;  // Used by GC to traverse stack.
+
 static const int kFirstLocalSlotFromFp = -3;
 static const int kSavedCallerPpSlotFromFp = -2;
 static const int kPcMarkerSlotFromFp = -1;
@@ -41,10 +45,9 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -10;
-static const int kExitLinkSlotFromEntryFp = -9;
+static const int kSavedContextSlotFromEntryFp = -9;
+static const int kExitLinkSlotFromEntryFp = -8;
 
 }  // namespace dart
 
 #endif  // VM_STACK_FRAME_X64_H_
-
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 46dfb04..d921151 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -39,8 +39,11 @@
   const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
+  const intptr_t exitframe_last_param_slot_from_fp = 2;
 
-  __ EnterStubFrame();
+  __ mov(IP, ShifterOperand(0));
+  __ Push(IP);  // Push 0 for the PC marker.
+  __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Load current Isolate pointer from Context structure into R0.
   __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
@@ -74,7 +77,7 @@
   ASSERT(argv_offset == 2 * kWordSize);
   __ add(R2, FP, ShifterOperand(R4, LSL, 2));  // Compute argv.
   // Set argv in NativeArguments.
-  __ AddImmediate(R2, kParamEndSlotFromFp * kWordSize);
+  __ AddImmediate(R2, exitframe_last_param_slot_from_fp * kWordSize);
 
   ASSERT(retval_offset == 3 * kWordSize);
   __ add(R3, R2, ShifterOperand(kWordSize));  // Retval is next to 1st argument.
@@ -96,7 +99,9 @@
   // Cache Context pointer into CTX while executing Dart code.
   __ mov(CTX, ShifterOperand(R2));
 
-  __ LeaveStubFrame();
+  __ LeaveFrame((1 << FP) | (1 << LR));
+  // Adjust SP for the empty PC marker.
+  __ AddImmediate(SP, kWordSize);
   __ Ret();
 }
 
@@ -132,6 +137,8 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
+  __ mov(IP, ShifterOperand(0));
+  __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Load current Isolate pointer from Context structure into R0.
@@ -167,7 +174,7 @@
   // Set argv in NativeArguments: R2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ add(R3, FP, ShifterOperand(2 * kWordSize));  // Set retval in NativeArgs.
+  __ add(R3, FP, ShifterOperand(3 * kWordSize));  // Set retval in NativeArgs.
 
   // TODO(regis): Should we pass the structure by value as in runtime calls?
   // It would require changing Dart API for native functions.
@@ -202,6 +209,8 @@
   __ mov(CTX, ShifterOperand(R2));
 
   __ LeaveFrame((1 << FP) | (1 << LR));
+  // Adjust SP for the empty PC marker.
+  __ AddImmediate(SP, kWordSize);
   __ Ret();
 }
 
@@ -218,6 +227,8 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
+  __ mov(IP, ShifterOperand(0));
+  __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Load current Isolate pointer from Context structure into R0.
@@ -253,7 +264,7 @@
   // Set argv in NativeArguments: R2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ add(R3, FP, ShifterOperand(2 * kWordSize));  // Set retval in NativeArgs.
+  __ add(R3, FP, ShifterOperand(3 * kWordSize));  // Set retval in NativeArgs.
 
   // TODO(regis): Should we pass the structure by value as in runtime calls?
   // It would require changing Dart API for native functions.
@@ -279,6 +290,8 @@
   __ mov(CTX, ShifterOperand(R2));
 
   __ LeaveFrame((1 << FP) | (1 << LR));
+  // Adjust SP for the empty PC marker.
+  __ AddImmediate(SP, kWordSize);
   __ Ret();
 }
 
@@ -780,7 +793,7 @@
 //   R3 : new context containing the current isolate pointer.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
   // Save frame pointer coming in.
-  __ EnterStubFrame();
+  __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Save new context and C++ ABI callee-saved registers.
   const intptr_t kNewContextOffsetFromFp =
@@ -792,6 +805,11 @@
   // Save FPU registers. 2 D registers per Q register.
   __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
 
+  // We now load the pool pointer(PP) as we are about to invoke dart code and we
+  // could potentially invoke some intrinsic functions which need the PP to be
+  // set up.
+  __ LoadPoolPointer();
+
   // The new Context structure contains a pointer to the current Isolate
   // structure. Cache the Context pointer in the CTX register so that it is
   // available in generated code and calls to Isolate::Current() need not be
@@ -877,7 +895,7 @@
   __ PopList((1 << R3) | kAbiPreservedCpuRegs);  // Ignore restored R3.
 
   // Restore the frame pointer and return.
-  __ LeaveStubFrame();
+  __ LeaveFrame((1 << FP) | (1 << LR));
   __ Ret();
 }
 
@@ -1223,7 +1241,7 @@
   __ Pop(R0);  // Pop result (newly allocated object).
   // R0: new object
   // Restore the frame pointer.
-  __ LeaveStubFrame(true);
+  __ LeaveStubFrame();
   __ Ret();
 }
 
@@ -1332,7 +1350,7 @@
     // R2: new object still missing its heap tag.
     __ add(R0, R2, ShifterOperand(kHeapObjectTag));
     // R0: new object.
-    __ LeaveStubFrame(true);
+    __ LeaveStubFrame();
     __ Ret();
 
     __ Bind(&slow_case);
@@ -1362,7 +1380,7 @@
   __ Pop(R0);
   // R0: new object
   // Restore the frame pointer.
-  __ LeaveStubFrame(true);
+  __ LeaveStubFrame();
   __ Ret();
 }
 
@@ -2081,7 +2099,7 @@
   __ b(&reference_compare, NE);
   __ CompareClassId(right, kBigintCid, temp);
   __ b(&done, NE);
-  __ EnterStubFrame(0);
+  __ EnterStubFrame();
   __ ReserveAlignedFrameSpace(2 * kWordSize);
   __ stm(IA, SP,  (1 << R0) | (1 << R1));
   __ CallRuntime(kBigintCompareRuntimeEntry, 2);
@@ -2124,8 +2142,7 @@
 }
 
 
-// Called from otpimzied code only. Must preserve any registers that are
-// destroyed.
+// Called from optimized code only.
 // LR: return address.
 // SP + 4: left operand.
 // SP + 0: right operand.
@@ -2135,12 +2152,9 @@
   const Register temp = R2;
   const Register left = R1;
   const Register right = R0;
-  // Preserve left, right and temp.
-  __ PushList((1 << R0) | (1 << R1) | (1 << R2));
-  __ ldr(left, Address(SP, 4 * kWordSize));
-  __ ldr(right, Address(SP, 3 * kWordSize));
+  __ ldr(left, Address(SP, 1 * kWordSize));
+  __ ldr(right, Address(SP, 0 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
-  __ PopList((1 << R0) | (1 << R1) | (1 << R2));
   __ Ret();
 }
 
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 4bea65e..70db148 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -28,6 +28,8 @@
   const Script& script = Script::Handle();
   const Class& owner_class =
       Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+  const Library& lib = Library::Handle(Library::New(class_name));
+  owner_class.set_library(lib);
   const String& function_name = String::ZoneHandle(Symbols::New(name));
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction,
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index a0cd794..49df45c 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -2188,8 +2188,7 @@
 }
 
 
-// Called from otpimzied code only. Must preserve any registers that are
-// destroyed.
+// Called from optimized code only.
 // TOS + 0: return address
 // TOS + 1: right argument.
 // TOS + 2: left argument.
@@ -2199,16 +2198,9 @@
   const Register left = EAX;
   const Register right = EDX;
   const Register temp = ECX;
-  // Preserve left, right and temp.
-  __ pushl(left);
-  __ pushl(right);
-  __ pushl(temp);
-  __ movl(left, Address(ESP, 5 * kWordSize));
-  __ movl(right, Address(ESP, 4 * kWordSize));
+  __ movl(left, Address(ESP, 2 * kWordSize));
+  __ movl(right, Address(ESP, 1 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
-  __ popl(temp);
-  __ popl(right);
-  __ popl(left);
   __ ret();
 }
 
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 2966be2..20f6a23 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -28,6 +28,8 @@
   const Script& script = Script::Handle();
   const Class& owner_class =
       Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+  const Library& lib = Library::Handle(Library::New(class_name));
+  owner_class.set_library(lib);
   const String& function_name = String::ZoneHandle(Symbols::New(name));
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction,
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index f4eb818..dbec240 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -39,10 +39,15 @@
   const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
+  const intptr_t exitframe_last_param_slot_from_fp = 2;
 
   __ SetPrologueOffset();
   __ TraceSimMsg("CallToRuntimeStub");
-  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-3 * kWordSize));
+  __ sw(ZR, Address(SP, 2 * kWordSize));  // Push 0 for the PC marker
+  __ sw(RA, Address(SP, 1 * kWordSize));
+  __ sw(FP, Address(SP, 0 * kWordSize));
+  __ mov(FP, SP);
 
   // Load current Isolate pointer from Context structure into A0.
   __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
@@ -77,12 +82,11 @@
   __ sll(A2, S4, 2);
   __ addu(A2, FP, A2);  // Compute argv.
   // Set argv in NativeArguments.
-  __ addiu(A2, A2, Immediate(kParamEndSlotFromFp * kWordSize));
-
-  ASSERT(retval_offset == 3 * kWordSize);
+  __ addiu(A2, A2, Immediate(exitframe_last_param_slot_from_fp * kWordSize));
 
   // Call runtime or redirection via simulator.
   __ jalr(S5);
+    ASSERT(retval_offset == 3 * kWordSize);
   // Retval is next to 1st argument.
   __ delay_slot()->addiu(A3, A2, Immediate(kWordSize));
   __ TraceSimMsg("CallToRuntimeStub return");
@@ -102,7 +106,11 @@
   // Cache Context pointer into CTX while executing Dart code.
   __ mov(CTX, A2);
 
-  __ LeaveStubFrameAndReturn();
+  __ mov(SP, FP);
+  __ lw(RA, Address(SP, 1 * kWordSize));
+  __ lw(FP, Address(SP, 0 * kWordSize));
+  __ Ret();
+  __ delay_slot()->addiu(SP, SP, Immediate(3 * kWordSize));
 }
 
 
@@ -139,7 +147,8 @@
 
   __ SetPrologueOffset();
   __ TraceSimMsg("CallNativeCFunctionStub");
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ addiu(SP, SP, Immediate(-3 * kWordSize));
+  __ sw(ZR, Address(SP, 2 * kWordSize));  // Push 0 for the PC marker
   __ sw(RA, Address(SP, 1 * kWordSize));
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
@@ -172,7 +181,7 @@
   // Set argv in NativeArguments: A2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ addiu(A3, FP, Immediate(2 * kWordSize));  // Set retval in NativeArgs.
+  __ addiu(A3, FP, Immediate(3 * kWordSize));  // Set retval in NativeArgs.
 
   // TODO(regis): Should we pass the structure by value as in runtime calls?
   // It would require changing Dart API for native functions.
@@ -218,7 +227,7 @@
   __ lw(RA, Address(SP, 1 * kWordSize));
   __ lw(FP, Address(SP, 0 * kWordSize));
   __ Ret();
-  __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
+  __ delay_slot()->addiu(SP, SP, Immediate(3 * kWordSize));
 }
 
 
@@ -236,7 +245,8 @@
 
   __ SetPrologueOffset();
   __ TraceSimMsg("CallNativeCFunctionStub");
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ addiu(SP, SP, Immediate(-3 * kWordSize));
+  __ sw(ZR, Address(SP, 2 * kWordSize));  // Push 0 for the PC marker
   __ sw(RA, Address(SP, 1 * kWordSize));
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
@@ -269,7 +279,7 @@
   // Set argv in NativeArguments: A2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ addiu(A3, FP, Immediate(2 * kWordSize));  // Set retval in NativeArgs.
+  __ addiu(A3, FP, Immediate(3 * kWordSize));  // Set retval in NativeArgs.
 
   // TODO(regis): Should we pass the structure by value as in runtime calls?
   // It would require changing Dart API for native functions.
@@ -306,7 +316,7 @@
   __ lw(RA, Address(SP, 1 * kWordSize));
   __ lw(FP, Address(SP, 0 * kWordSize));
   __ Ret();
-  __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
+  __ delay_slot()->addiu(SP, SP, Immediate(3 * kWordSize));
 }
 
 
@@ -413,13 +423,13 @@
 
   // Load the receiver.
   __ lw(A1, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
-  __ sll(TMP1, A1, 1);  // A1 is Smi.
-  __ addu(TMP1, FP, TMP1);
-  __ lw(T1, Address(TMP1, kParamEndSlotFromFp * kWordSize));
+  __ sll(TMP, A1, 1);  // A1 is Smi.
+  __ addu(TMP, FP, TMP);
+  __ lw(T1, Address(TMP, kParamEndSlotFromFp * kWordSize));
 
   // Push space for the return value.
   // Push the receiver.
-  // Push TMP1 data object.
+  // Push TMP data object.
   // Push arguments descriptor array.
   __ addiu(SP, SP, Immediate(-4 * kWordSize));
   __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
@@ -648,11 +658,11 @@
     // and is computed as:
     // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
     // Assert that length is a Smi.
-    __ andi(CMPRES, A1, Immediate(kSmiTagMask));
+    __ andi(CMPRES1, A1, Immediate(kSmiTagMask));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
     } else {
-      __ bne(CMPRES, ZR, &slow_case);
+      __ bne(CMPRES1, ZR, &slow_case);
     }
     __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
     __ lw(T0, Address(T0, Isolate::heap_offset()));
@@ -666,11 +676,11 @@
     __ lw(V0, Address(T0, Scavenger::top_offset()));
     intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
     __ LoadImmediate(T3, fixed_size);
-    __ sll(TMP1, A1, 1);  // A1 is Smi.
-    __ addu(T3, T3, TMP1);
+    __ sll(TMP, A1, 1);  // A1 is Smi.
+    __ addu(T3, T3, TMP);
     ASSERT(kSmiTagShift == 1);
-    __ LoadImmediate(TMP1, ~(kObjectAlignment - 1));
-    __ and_(T3, T3, TMP1);
+    __ LoadImmediate(TMP, ~(kObjectAlignment - 1));
+    __ and_(T3, T3, TMP);
     __ addu(T2, T3, V0);
 
     // Check if the allocation fits into the remaining space.
@@ -716,14 +726,14 @@
     const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
     // If no size tag overflow, shift T3 left, else set T3 to zero.
     __ LoadImmediate(T4, RawObject::SizeTag::kMaxSizeTag);
-    __ sltu(CMPRES, T4, T3);  // CMPRES = T4 < T3 ? 1 : 0
-    __ sll(TMP1, T3, shift);  // TMP1 = T3 << shift;
-    __ movz(T3, TMP1, CMPRES);  // T3 = T4 >= T3 ? 0 : T3
-    __ movn(T3, ZR, CMPRES);  // T3 = T4 < T3 ? TMP1 : T3
+    __ sltu(CMPRES1, T4, T3);  // CMPRES1 = T4 < T3 ? 1 : 0
+    __ sll(TMP, T3, shift);  // TMP = T3 << shift;
+    __ movz(T3, TMP, CMPRES1);  // T3 = T4 >= T3 ? 0 : T3
+    __ movn(T3, ZR, CMPRES1);  // T3 = T4 < T3 ? TMP : T3
 
     // Get the class index and insert it into the tags.
-    __ LoadImmediate(TMP1, RawObject::ClassIdTag::encode(kArrayCid));
-    __ or_(T3, T3, TMP1);
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(kArrayCid));
+    __ or_(T3, T3, TMP);
     __ sw(T3, FieldAddress(V0, Array::tags_offset()));
 
     // Initialize all array elements to raw_null.
@@ -786,8 +796,8 @@
   // Load num_args.
   __ TraceSimMsg("GenerateCallClosureFunctionStub");
   __ lw(T0, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
-  __ LoadImmediate(TMP1, Smi::RawValue(1));
-  __ subu(T0, T0, TMP1);
+  __ LoadImmediate(TMP, Smi::RawValue(1));
+  __ subu(T0, T0, TMP);
 
   // Load closure object in T1.
   __ sll(T1, T0, 1);  // T0 (num_args - 1) is a Smi.
@@ -802,8 +812,8 @@
   // See if it is not a closure, but null object.
   __ beq(T1, T7, &not_closure);
 
-  __ andi(CMPRES, T1, Immediate(kSmiTagMask));
-  __ beq(CMPRES, ZR, &not_closure);  // Not a closure, but a smi.
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
+  __ beq(CMPRES1, ZR, &not_closure);  // Not a closure, but a smi.
 
   // Verify that the class of the object is a closure class by checking that
   // class.signature_function() is not null.
@@ -901,7 +911,7 @@
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
   // Save frame pointer coming in.
   __ TraceSimMsg("InvokeDartCodeStub");
-  __ EnterStubFrame();
+  __ EnterFrame();
 
   // Save new context and C++ ABI callee-saved registers.
 
@@ -931,6 +941,11 @@
 
   __ sw(A3, Address(SP, 2 * kWordSize));
 
+  // We now load the pool pointer(PP) as we are about to invoke dart code and we
+  // could potentially invoke some intrinsic functions which need the PP to be
+  // set up.
+  __ LoadPoolPointer();
+
   // The new Context structure contains a pointer to the current Isolate
   // structure. Cache the Context pointer in the CTX register so that it is
   // available in generated code and calls to Isolate::Current() need not be
@@ -1034,7 +1049,7 @@
   __ addiu(SP, SP, Immediate(kPreservedRegSpace));
 
   // Restore the frame pointer and return.
-  __ LeaveStubFrameAndReturn();
+  __ LeaveFrameAndReturn();
 }
 
 
@@ -1071,8 +1086,8 @@
     // T1: number of context variables.
     // T2: object size.
     // T3: potential next object start.
-    __ LoadImmediate(TMP1, heap->EndAddress());
-    __ lw(CMPRES1, Address(TMP1, 0));
+    __ LoadImmediate(TMP, heap->EndAddress());
+    __ lw(CMPRES1, Address(TMP, 0));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
     } else {
@@ -1093,16 +1108,16 @@
     // T1: number of context variables.
     // T2: object size.
     const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
-    __ LoadImmediate(TMP1, RawObject::SizeTag::kMaxSizeTag);
-    __ sltu(CMPRES, TMP1, T2);  // CMPRES = T2 > TMP1 ? 1 : 0.
-    __ movn(T2, ZR, CMPRES);  // T2 = CMPRES != 0 ? 0 : T2.
-    __ sll(TMP1, T2, shift);  // TMP1 = T2 << shift.
-    __ movz(T2, TMP1, CMPRES);  // T2 = CMPRES == 0 ? TMP1 : T2.
+    __ LoadImmediate(TMP, RawObject::SizeTag::kMaxSizeTag);
+    __ sltu(CMPRES1, TMP, T2);  // CMPRES1 = T2 > TMP ? 1 : 0.
+    __ movn(T2, ZR, CMPRES1);  // T2 = CMPRES1 != 0 ? 0 : T2.
+    __ sll(TMP, T2, shift);  // TMP = T2 << shift.
+    __ movz(T2, TMP, CMPRES1);  // T2 = CMPRES1 == 0 ? TMP : T2.
 
     // Get the class index and insert it into the tags.
     // T2: size and bit tags.
-    __ LoadImmediate(TMP1, RawObject::ClassIdTag::encode(context_class.id()));
-    __ or_(T2, T2, TMP1);
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(context_class.id()));
+    __ or_(T2, T2, TMP);
     __ sw(T2, FieldAddress(V0, Context::tags_offset()));
 
     // Setup up number of context variables field.
@@ -1181,8 +1196,8 @@
   // Spilled: T1, T2, T3.
   // T0: Address being stored.
   __ lw(T2, FieldAddress(T0, Object::tags_offset()));
-  __ andi(CMPRES, T2, Immediate(1 << RawObject::kRememberedBit));
-  __ beq(CMPRES, ZR, &add_to_buffer);
+  __ andi(CMPRES1, T2, Immediate(1 << RawObject::kRememberedBit));
+  __ beq(CMPRES1, ZR, &add_to_buffer);
   __ lw(T1, Address(SP, 0 * kWordSize));
   __ lw(T2, Address(SP, 1 * kWordSize));
   __ lw(T3, Address(SP, 2 * kWordSize));
@@ -1213,12 +1228,12 @@
   Label L;
   __ addiu(T2, T2, Immediate(1));
   __ sw(T2, Address(T1, StoreBufferBlock::top_offset()));
-  __ addiu(CMPRES, T2, Immediate(-StoreBufferBlock::kSize));
+  __ addiu(CMPRES1, T2, Immediate(-StoreBufferBlock::kSize));
   // Restore values.
   __ lw(T1, Address(SP, 0 * kWordSize));
   __ lw(T2, Address(SP, 1 * kWordSize));
   __ lw(T3, Address(SP, 2 * kWordSize));
-  __ beq(CMPRES, ZR, &L);
+  __ beq(CMPRES1, ZR, &L);
   __ delay_slot()->addiu(SP, SP, Immediate(3 * kWordSize));
   __ Ret();
 
@@ -1280,8 +1295,8 @@
     // Check if the allocation fits into the remaining space.
     // T2: potential new object start.
     // T3: potential next object start.
-    __ LoadImmediate(TMP1, heap->EndAddress());
-    __ lw(CMPRES1, Address(TMP1));
+    __ LoadImmediate(TMP, heap->EndAddress());
+    __ lw(CMPRES1, Address(TMP));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
     } else {
@@ -1383,13 +1398,13 @@
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame(true);  // Uses pool pointer to pass cls to runtime.
-  __ LoadObject(TMP1, cls);
+  __ LoadObject(TMP, cls);
 
   __ addiu(SP, SP, Immediate(-4 * kWordSize));
   // Space on stack for return value.
   __ LoadImmediate(T7, reinterpret_cast<intptr_t>(Object::null()));
   __ sw(T7, Address(SP, 3 * kWordSize));
-  __ sw(TMP1, Address(SP, 2 * kWordSize));  // Class of object to be allocated.
+  __ sw(TMP, Address(SP, 2 * kWordSize));  // Class of object to be allocated.
 
   if (is_cls_parameterized) {
     // Push type arguments of object to be allocated and of instantiator.
@@ -1408,7 +1423,7 @@
   __ addiu(SP, SP, Immediate(4 * kWordSize));  // Pop arguments.
   // V0: new object
   // Restore the frame pointer and return.
-  __ LeaveStubFrameAndReturn(RA, true);
+  __ LeaveStubFrameAndReturn(RA);
 }
 
 
@@ -1447,8 +1462,8 @@
     // T2: potential new closure object.
     // T3: address of top of heap.
     // T4: potential new context object (only if is_implicit_closure).
-    __ LoadImmediate(TMP1, heap->EndAddress());
-    __ lw(CMPRES1, Address(TMP1));
+    __ LoadImmediate(TMP, heap->EndAddress());
+    __ lw(CMPRES1, Address(TMP));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
     } else {
@@ -1516,7 +1531,7 @@
     // V0: new object.
     __ addiu(V0, T2, Immediate(kHeapObjectTag));
 
-    __ LeaveStubFrameAndReturn(RA, true);
+    __ LeaveStubFrameAndReturn(RA);
 
     __ Bind(&slow_case);
   }
@@ -1527,8 +1542,8 @@
   // Setup space on stack for return value.
   __ LoadImmediate(T7, reinterpret_cast<intptr_t>(Object::null()));
   __ sw(T7, Address(SP, (num_slots - 1) * kWordSize));
-  __ LoadObject(TMP1, func);
-  __ sw(TMP1, Address(SP, (num_slots - 2) * kWordSize));
+  __ LoadObject(TMP, func);
+  __ sw(TMP, Address(SP, (num_slots - 2) * kWordSize));
   __ mov(T2, T7);
   if (is_implicit_instance_closure) {
     __ lw(T1, Address(FP, kReceiverFPOffset));
@@ -1552,7 +1567,7 @@
 
   // V0: new object
   // Restore the frame pointer.
-  __ LeaveStubFrameAndReturn(RA, true);
+  __ LeaveStubFrameAndReturn(RA);
 }
 
 
@@ -1693,8 +1708,8 @@
   // Get the receiver's class ID (first read number of arguments from
   // arguments descriptor array and then access the receiver from the stack).
   __ lw(T1, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
-  __ LoadImmediate(TMP1, Smi::RawValue(1));
-  __ subu(T1, T1, TMP1);
+  __ LoadImmediate(TMP, Smi::RawValue(1));
+  __ subu(T1, T1, TMP);
   __ sll(T3, T1, 1);  // T1 (argument_count - 1) is smi.
   __ addu(T3, T3, SP);
   __ bal(&get_class_id_as_smi);
@@ -1768,8 +1783,8 @@
   __ sw(TMP, Address(SP, (num_slots - 3) * kWordSize));
   // Push call arguments.
   for (intptr_t i = 0; i < num_args; i++) {
-    __ lw(TMP1, Address(T1, -i * kWordSize));
-    __ sw(TMP1, Address(SP, (num_slots - i - 4) * kWordSize));
+    __ lw(TMP, Address(T1, -i * kWordSize));
+    __ sw(TMP, Address(SP, (num_slots - i - 4) * kWordSize));
   }
   // Pass IC data object.
   __ sw(S5, Address(SP, (num_slots - num_args - 4) * kWordSize));
@@ -2295,7 +2310,7 @@
 
 // Does identical check (object references are equal or not equal) with special
 // checks for boxed numbers.
-// Returns: CMPRES is zero if equal, non-zero otherwise.
+// Returns: CMPRES1 is zero if equal, non-zero otherwise.
 // Note: A Mint cannot contain a value that would fit in Smi, a Bigint
 // cannot contain a value that fits in Mint or Smi.
 void StubCode::GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
@@ -2317,43 +2332,43 @@
   __ LoadClassId(temp2, left);
   __ bne(temp1, temp2, &check_mint);
   __ LoadClassId(temp2, right);
-  __ subu(CMPRES, temp1, temp2);
-  __ bne(CMPRES, ZR, &done);
+  __ subu(CMPRES1, temp1, temp2);
+  __ bne(CMPRES1, ZR, &done);
 
   // Double values bitwise compare.
   __ lw(temp1, FieldAddress(left, Double::value_offset() + 0 * kWordSize));
   __ lw(temp2, FieldAddress(right, Double::value_offset() + 0 * kWordSize));
-  __ subu(CMPRES, temp1, temp2);
-  __ bne(CMPRES, ZR, &done);
+  __ subu(CMPRES1, temp1, temp2);
+  __ bne(CMPRES1, ZR, &done);
   __ lw(temp1, FieldAddress(left, Double::value_offset() + 1 * kWordSize));
   __ lw(temp2, FieldAddress(right, Double::value_offset() + 1 * kWordSize));
   __ b(&done);
-  __ delay_slot()->subu(CMPRES, temp1, temp2);
+  __ delay_slot()->subu(CMPRES1, temp1, temp2);
 
   __ Bind(&check_mint);
   __ LoadImmediate(temp1, kMintCid);
   __ LoadClassId(temp2, left);
   __ bne(temp1, temp2, &check_bigint);
   __ LoadClassId(temp2, right);
-  __ subu(CMPRES, temp1, temp2);
-  __ bne(CMPRES, ZR, &done);
+  __ subu(CMPRES1, temp1, temp2);
+  __ bne(CMPRES1, ZR, &done);
 
   __ lw(temp1, FieldAddress(left, Mint::value_offset() + 0 * kWordSize));
   __ lw(temp2, FieldAddress(right, Mint::value_offset() + 0 * kWordSize));
-  __ subu(CMPRES, temp1, temp2);
-  __ bne(CMPRES, ZR, &done);
+  __ subu(CMPRES1, temp1, temp2);
+  __ bne(CMPRES1, ZR, &done);
   __ lw(temp1, FieldAddress(left, Mint::value_offset() + 1 * kWordSize));
   __ lw(temp2, FieldAddress(right, Mint::value_offset() + 1 * kWordSize));
   __ b(&done);
-  __ delay_slot()->subu(CMPRES, temp1, temp2);
+  __ delay_slot()->subu(CMPRES1, temp1, temp2);
 
   __ Bind(&check_bigint);
   __ LoadImmediate(temp1, kBigintCid);
   __ LoadClassId(temp2, left);
   __ bne(temp1, temp2, &reference_compare);
   __ LoadClassId(temp2, right);
-  __ subu(CMPRES, temp1, temp2);
-  __ bne(CMPRES, ZR, &done);
+  __ subu(CMPRES1, temp1, temp2);
+  __ bne(CMPRES1, ZR, &done);
 
   __ EnterStubFrame();
   __ ReserveAlignedFrameSpace(2 * kWordSize);
@@ -2366,10 +2381,10 @@
   // Result in V0, 0 means equal.
   __ LeaveStubFrame();
   __ b(&done);
-  __ delay_slot()->mov(CMPRES, V0);
+  __ delay_slot()->mov(CMPRES1, V0);
 
   __ Bind(&reference_compare);
-  __ subu(CMPRES, left, right);
+  __ subu(CMPRES1, left, right);
   __ Bind(&done);
   // A branch or test after this comparison will check CMPRES1 == CMPRES2.
   __ mov(CMPRES2, ZR);
@@ -2380,7 +2395,7 @@
 // RA: return address.
 // SP + 4: left operand.
 // SP + 0: right operand.
-// Returns: CMPRES is zero if equal, non-zero otherwise.
+// Returns: CMPRES1 is zero if equal, non-zero otherwise.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
   // Check single stepping.
@@ -2400,7 +2415,6 @@
   const Register temp2 = T3;
   const Register left = T1;
   const Register right = T0;
-  // Preserve left, right.
   __ lw(left, Address(SP, 1 * kWordSize));
   __ lw(right, Address(SP, 0 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp1, temp2);
@@ -2408,32 +2422,20 @@
 }
 
 
-// Called from otpimzied code only. Must preserve any registers that are
-// destroyed.
+// Called from optimized code only.
 // SP + 4: left operand.
 // SP + 0: right operand.
-// Returns: CMPRES is zero if equal, non-zero otherwise.
+// Returns: CMPRES1 is zero if equal, non-zero otherwise.
 void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
   const Register temp1 = T2;
   const Register temp2 = T3;
   const Register left = T1;
   const Register right = T0;
-  // Preserve left, right.
-  __ addiu(SP, SP, Immediate(-4 * kWordSize));
-  __ sw(temp1, Address(SP, 3 * kWordSize));
-  __ sw(temp2, Address(SP, 2 * kWordSize));
-  __ sw(left, Address(SP, 1 * kWordSize));
-  __ sw(right, Address(SP, 0 * kWordSize));
-  __ lw(left, Address(SP, 5 * kWordSize));
-  __ lw(right, Address(SP, 4 * kWordSize));
-  GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp1, temp2);
-  __ lw(right, Address(SP, 0 * kWordSize));
   __ lw(left, Address(SP, 1 * kWordSize));
-  __ lw(temp2, Address(SP, 2 * kWordSize));
-  __ lw(temp1, Address(SP, 3 * kWordSize));
+  __ lw(right, Address(SP, 0 * kWordSize));
+  GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp1, temp2);
   __ Ret();
-  __ delay_slot()->addiu(SP, SP, Immediate(4 * kWordSize));
 }
 
 }  // namespace dart
diff --git a/runtime/vm/stub_code_mips_test.cc b/runtime/vm/stub_code_mips_test.cc
index 20a425b..71bcecf 100644
--- a/runtime/vm/stub_code_mips_test.cc
+++ b/runtime/vm/stub_code_mips_test.cc
@@ -28,6 +28,8 @@
   const Script& script = Script::Handle();
   const Class& owner_class =
       Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+  const Library& lib = Library::Handle(Library::New(class_name));
+  owner_class.set_library(lib);
   const String& function_name = String::ZoneHandle(Symbols::New(name));
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction,
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 84c562e..5e0b9af 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -260,7 +260,7 @@
   __ popq(RAX);  // Get Code object result.
   __ popq(R10);  // Restore arguments descriptor array.
   // Remove the stub frame as we are about to jump to the dart function.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
 
   __ movq(RBX, FieldAddress(RAX, Code::instructions_offset()));
   __ addq(RBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
@@ -281,7 +281,7 @@
   __ popq(R10);  // Restore arguments descriptor array.
   __ movq(RAX, FieldAddress(RAX, Code::instructions_offset()));
   __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ jmp(RAX);
   __ int3();
 }
@@ -323,7 +323,7 @@
 //       called, the stub accesses the receiver from this location directly
 //       when trying to resolve the call.
 void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
-  __ EnterStubFrameWithPP();
+  __ EnterStubFrame();
   __ PushObject(Object::null_object(), PP);  // Space for the return value.
 
   // Push the receiver as an argument.  Load the smi-tagged argument
@@ -345,7 +345,7 @@
   // Remove arguments.
   __ Drop(4);
   __ popq(RAX);  // Get result into RAX.
-  __ LeaveFrameWithPP();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -418,9 +418,8 @@
     __ movq(RBX, Address(RBP, saved_result_slot_from_fp * kWordSize));
   }
 
-  // There is a Dart Frame on the stack. We just need the PP.
-  __ movq(PP, Address(RBP, -2 * kWordSize));
-  __ LeaveFrame();
+  // There is a Dart Frame on the stack. We must restore PP and leave frame.
+  __ LeaveDartFrame();
 
   __ popq(RCX);   // Preserve return address.
   __ movq(RSP, RBP);  // Discard optimized frame.
@@ -444,9 +443,8 @@
     __ movq(RBX, Address(RBP, kFirstLocalSlotFromFp * kWordSize));
   }
   // Code above cannot cause GC.
-  // There is a Dart Frame on the stack. We just need the PP.
-  __ movq(PP, Address(RBP, -2 * kWordSize));
-  __ LeaveFrame();
+  // 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
@@ -466,7 +464,7 @@
     __ popq(RAX);  // Restore result.
     __ Drop(1);  // Workaround for dropped stack slot during GC.
   }
-  __ LeaveFrame();
+  __ LeaveStubFrame();
 
   __ popq(RCX);  // Pop return address.
   __ addq(RSP, RBX);  // Remove materialization arguments.
@@ -493,7 +491,7 @@
 
 
 void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
-  __ EnterStubFrameWithPP();
+  __ EnterStubFrame();
   // Load the receiver into RAX.  The argument count in the arguments
   // descriptor in R10 is a smi.
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
@@ -518,7 +516,7 @@
   __ popq(RAX);  // Return value from the runtime call (instructions).
   __ popq(R10);  // Restore arguments descriptor.
   __ popq(RBX);  // Restore IC data.
-  __ LeaveFrameWithPP();
+  __ LeaveStubFrame();
 
   Label lookup;
   __ CompareObject(RAX, Object::null_object(), PP);
@@ -659,7 +657,7 @@
   __ popq(RAX);  // Pop element type argument.
   __ popq(R10);  // Pop array length argument.
   __ popq(RAX);  // Pop return value from return slot.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -717,7 +715,7 @@
   __ movq(RAX, FieldAddress(RBX, Function::code_offset()));
 
   // Remove the stub frame as we are about to jump to the closure function.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
 
   __ Bind(&function_compiled);
   // RAX: Code.
@@ -753,7 +751,7 @@
   __ popq(RAX);  // Get result into RAX.
 
   // Remove the stub frame as we are about to return.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -767,16 +765,13 @@
 //   RCX : new context containing the current isolate pointer.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
   // Save frame pointer coming in.
-  __ EnterStubFrameWithPP();
+  __ EnterFrame(0);
 
   // At this point, the stack looks like:
-  // | saved RC15/PP                                  | <-- RSP / TOS
-  // | "saved PC area" = 0                            |
   // | saved RBP                                      | <-- RBP
   // | saved PC (return to DartEntry::InvokeFunction) |
 
-  // The old frame pointer, the return address, the old R15 (for PP).
-  const intptr_t kInitialOffset = 3;
+  const intptr_t kInitialOffset = 1;
   // Save arguments descriptor array and new context.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
   __ pushq(RSI);
@@ -788,7 +783,12 @@
   __ pushq(R12);
   __ pushq(R13);
   __ pushq(R14);
-  // R15 is already saved above by EnterStubFrameWithPP.
+  __ pushq(R15);
+
+  // We now load the pool pointer(PP) as we are about to invoke dart code and we
+  // could potentially invoke some intrinsic functions which need the PP to be
+  // set up.
+  __ LoadPoolPointer(PP);
 
   // If any additional (or fewer) values are pushed, the offsets in
   // kExitLinkSlotFromEntryFp and kSavedContextSlotFromEntryFp will need to be
@@ -810,7 +810,7 @@
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -9);
+  ASSERT(kExitLinkSlotFromEntryFp == -8);
   __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
   __ pushq(RAX);
   __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -822,7 +822,7 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -10);
+  ASSERT(kSavedContextSlotFromEntryFp == -9);
   __ movq(RAX, Address(R8, Isolate::top_context_offset()));
   __ pushq(RAX);
 
@@ -880,14 +880,14 @@
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX);
 
   // Restore C++ ABI callee-saved registers.
-  // R15 will be restored below by LeaveFrameWithPP.
+  __ popq(R15);
   __ popq(R14);
   __ popq(R13);
   __ popq(R12);
   __ popq(RBX);
 
   // Restore the frame pointer.
-  __ LeaveFrameWithPP();
+  __ LeaveFrame();
 
   __ ret();
 }
@@ -1011,7 +1011,7 @@
   __ popq(RAX);  // Pop the new context object.
   // RAX: new object
   // Restore the frame pointer.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -1228,7 +1228,7 @@
     __ movq(RDX, Address(RSP, kInstantiatorTypeArgumentsOffset));
   }
   // Create a stub frame.
-  __ EnterStubFrameWithPP();
+  __ EnterStubFrame(true);  // Uses PP to access class object.
   __ pushq(R12);  // Setup space on stack for return value.
   __ PushObject(cls, PP);  // Push class of object to be allocated.
   if (is_cls_parameterized) {
@@ -1245,7 +1245,7 @@
   __ popq(RAX);  // Pop result (newly allocated object).
   // RAX: new object
   // Restore the frame pointer.
-  __ LeaveFrameWithPP();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -1264,7 +1264,7 @@
   const Class& cls = Class::ZoneHandle(func.signature_class());
   const bool has_type_arguments = cls.NumTypeArguments() > 0;
 
-  __ EnterStubFrameWithPP();  // Uses pool pointer to refer to function.
+  __ EnterStubFrame(true);  // Uses pool pointer to refer to function.
   __ LoadObject(R12, Object::null_object(), PP);
   const intptr_t kTypeArgumentsOffset = 4 * kWordSize;
   const intptr_t kReceiverOffset = 5 * kWordSize;
@@ -1353,7 +1353,7 @@
     // Done allocating and initializing the instance.
     // RAX: new object.
     __ addq(RAX, Immediate(kHeapObjectTag));
-    __ LeaveFrameWithPP();
+    __ LeaveStubFrame();
     __ ret();
 
     __ Bind(&slow_case);
@@ -1388,7 +1388,7 @@
   __ popq(RAX);  // Pop the result.
   // RAX: New closure object.
   // Restore the calling frame.
-  __ LeaveFrameWithPP();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -1424,7 +1424,7 @@
   __ popq(RAX);  // Get result into RAX.
 
   // Remove the stub frame as we are about to return.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -1445,7 +1445,7 @@
     __ popq(RAX);          // Discard argument;
     __ popq(ic_reg);       // Restore.
     __ popq(func_reg);     // Restore.
-    __ LeaveFrame();
+    __ LeaveStubFrame();
   }
   __ incq(FieldAddress(func_reg, Function::usage_counter_offset()));
 }
@@ -1499,7 +1499,7 @@
   __ pushq(RBX);
   __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ popq(RBX);
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ Bind(&not_stepping);
 
   // Load arguments descriptor into R10.
@@ -1580,7 +1580,7 @@
   __ popq(RAX);  // Pop returned code object into RAX (null if not found).
   __ popq(RBX);  // Restore IC data array.
   __ popq(R10);  // Restore arguments descriptor array.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   Label call_target_function;
   __ cmpq(RAX, R12);
   __ j(NOT_EQUAL, &call_target_function, Assembler::kNearJump);
@@ -1616,7 +1616,7 @@
     __ popq(RAX);  // Restore function.
     __ popq(RBX);  // Restore IC data array.
     __ popq(R10);  // Restore arguments descriptor array.
-    __ LeaveFrame();
+    __ LeaveStubFrame();
     __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
     __ Bind(&is_compiled);
   }
@@ -1746,7 +1746,7 @@
   __ pushq(RBX);  // Preserve IC data object.
   __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ popq(RBX);
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ Bind(&not_stepping);
 
   // RBX: IC data object (preserved).
@@ -1781,7 +1781,7 @@
   __ popq(RAX);  // Discard argument.
   __ popq(RBX);  // Restore IC data object.
   __ popq(R13);  // Restore target function.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ movq(RAX, FieldAddress(R13, Function::code_offset()));
 
   __ Bind(&target_is_compiled);
@@ -1814,7 +1814,7 @@
   __ popq(RAX);  // Restore function.
   __ popq(RCX);  // Restore IC data array.
   __ popq(RDX);  // Restore arguments descriptor array.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ ret();
 }
 
@@ -1822,7 +1822,7 @@
 //  RBX, R10: May contain arguments to runtime stub.
 //  TOS(0): return address (Dart code).
 void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
-  __ EnterStubFrameWithPP();
+  __ EnterStubFrame();
   // Preserve runtime args.
   __ pushq(RBX);
   __ pushq(R10);
@@ -1834,7 +1834,7 @@
   __ popq(RAX);  // Address of original.
   __ popq(R10);  // Restore arguments.
   __ popq(RBX);
-  __ LeaveFrameWithPP();
+  __ LeaveStubFrame();
   __ jmp(RAX);   // Jump to original stub.
 }
 
@@ -1849,7 +1849,7 @@
   __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry, 0);
   __ popq(RAX);  // Code object.
   __ popq(RBX);  // Restore IC data.
-  __ LeaveFrame();
+  __ LeaveStubFrame();
 
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
@@ -1863,14 +1863,13 @@
 
 //  TOS(0): return address (Dart code).
 void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
-  __ EnterStubFrameWithPP();
+  __ EnterStubFrame();
   __ pushq(RAX);
   __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry, 0);
   __ popq(RAX);
-  __ LeaveFrameWithPP();
-
+  __ LeaveStubFrame();
   __ popq(R11);  // discard return address of call to this stub.
-  __ LeaveFrameWithPP();
+  __ LeaveDartFrame();
   __ ret();
 }
 
@@ -1882,7 +1881,7 @@
   __ pushq(RBX);
   __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry, 0);
   __ popq(RBX);
-  __ LeaveFrame();
+  __ LeaveStubFrame();
 
   // Find out which dispatch stub to call.
   Label test_two, test_three, test_four;
@@ -2044,7 +2043,7 @@
 // RDI: function to be reoptimized.
 // R10: argument descriptor (preserved).
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
-  __ EnterStubFrameWithPP();
+  __ EnterStubFrame();
   __ LoadObject(R12, Object::null_object(), PP);
   __ pushq(R10);
   __ pushq(R12);  // Setup space on stack for return value.
@@ -2055,7 +2054,7 @@
   __ popq(R10);  // Restore argument descriptor.
   __ movq(RAX, FieldAddress(RAX, Code::instructions_offset()));
   __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ LeaveFrameWithPP();
+  __ LeaveStubFrame();
   __ jmp(RAX);
   __ int3();
 }
@@ -2141,7 +2140,7 @@
   __ j(EQUAL, &not_stepping, Assembler::kNearJump);
   __ EnterStubFrame();
   __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ LeaveFrame();
+  __ LeaveStubFrame();
   __ Bind(&not_stepping);
 
   const Register left = RAX;
@@ -2154,8 +2153,7 @@
 }
 
 
-// Called from otpimzied code only. Must preserve any registers that are
-// destroyed.
+// Called from optimized code only.
 // TOS + 0: return address
 // TOS + 1: right argument.
 // TOS + 2: left argument.
@@ -2164,14 +2162,10 @@
     Assembler* assembler) {
   const Register left = RAX;
   const Register right = RDX;
-  // Preserve left and right.
-  __ pushq(left);
-  __ pushq(right);
-  __ movq(left, Address(RSP, 4 * kWordSize));
-  __ movq(right, Address(RSP, 3 * kWordSize));
+
+  __ movq(left, Address(RSP, 2 * kWordSize));
+  __ movq(right, Address(RSP, 1 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right);
-  __ popq(right);
-  __ popq(left);
   __ ret();
 }
 
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index cc0e3fb..09fb677 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -28,6 +28,8 @@
   const Script& script = Script::Handle();
   const Class& owner_class =
       Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
+  const Library& lib = Library::Handle(Library::New(class_name));
+  owner_class.set_library(lib);
   const String& function_name = String::ZoneHandle(Symbols::New(name));
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction,
@@ -45,7 +47,7 @@
   const Object& result = Object::ZoneHandle();
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   ASSERT(context.isolate() == Isolate::Current());
-  __ EnterStubFrameWithPP();
+  __ EnterStubFrame(true);
   __ LoadObject(CTX, context, PP);
   __ PushObject(result, PP);  // Push Null object for return value.
   __ PushObject(smi1, PP);  // Push argument 1 smi1.
@@ -54,7 +56,7 @@
   __ CallRuntime(kTestSmiSubRuntimeEntry, argc);  // Call SmiSub runtime func.
   __ AddImmediate(RSP, Immediate(argc * kWordSize), PP);
   __ popq(RAX);  // Pop return value from return slot.
-  __ LeaveFrameWithPP();
+  __ LeaveStubFrame();
   __ ret();
 }
 
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index b93d9c1..bd7a43d 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -26,6 +26,13 @@
   literal,
 PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_LITERAL)
 #undef DEFINE_SYMBOL_LITERAL
+
+  "",  // matches kKwTableStart.
+
+#define DEFINE_KEYWORD_SYMBOL_INDEX(token, chars, ignore1, ignore2)            \
+  chars,
+  DART_KEYWORD_LIST(DEFINE_KEYWORD_SYMBOL_INDEX)
+#undef DEFINE_KEYWORD_SYMBOL_INDEX
 };
 
 intptr_t Symbols::num_of_grows_;
@@ -40,6 +47,16 @@
 }
 
 
+const String& Symbols::Keyword(Token::Kind keyword) {
+  const int kw_index = keyword - Token::kFirstKeyword;
+  ASSERT((0 <= kw_index) && (kw_index < Token::numKeywords));
+  // First keyword symbol is in symbol_handles_[kKwTableStart + 1].
+  const intptr_t keyword_id = Symbols::kKwTableStart + 1 + kw_index;
+  ASSERT(symbol_handles_[keyword_id] != NULL);
+  return *symbol_handles_[keyword_id];
+}
+
+
 void Symbols::InitOnce(Isolate* isolate) {
   // Should only be run by the vm isolate.
   ASSERT(isolate == Dart::vm_isolate());
@@ -61,7 +78,7 @@
 
 
   // First set up all the predefined string symbols.
-  for (intptr_t i = 1; i < Symbols::kNullCharId; i++) {
+  for (intptr_t i = 1; i < Symbols::kKwTableStart; i++) {
     // The symbol_table needs to be reloaded as it might have grown in the
     // previous iteration.
     symbol_table = object_store->symbol_table();
@@ -72,6 +89,15 @@
   }
   Object::RegisterSingletonClassNames();
 
+  // Create symbols for language keywords. Some keywords are equal to
+  // symbols we already created, so use New() instead of Add() to ensure
+  // that the symbols are canonicalized.
+  for (intptr_t i = Symbols::kKwTableStart; i < Symbols::kNullCharId; i++) {
+    String* str = String::ReadOnlyHandle();
+    *str = New(names[i]);
+    symbol_handles_[i] = str;
+  }
+
   // Add Latin1 characters as Symbols, so that Symbols::FromCharCode is fast.
   for (intptr_t c = 0; c < kNumberOfOneCharCodeSymbols; c++) {
     // The symbol_table needs to be reloaded as it might have grown in the
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index fbafada..5401651 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -24,6 +24,7 @@
   V(TopLevel, "::")                                                            \
   V(DefaultLabel, ":L")                                                        \
   V(This, "this")                                                              \
+  V(Other, "other")                                                            \
   V(Super, "super")                                                            \
   V(Call, "call")                                                              \
   V(Current, "current")                                                        \
@@ -59,7 +60,7 @@
   V(SavedEntryContextVar, ":saved_entry_context_var")                          \
   V(SavedTryContextVar, ":saved_try_context_var")                              \
   V(ExceptionVar, ":exception_var")                                            \
-  V(StacktraceVar, ":stacktrace_var")                                          \
+  V(StackTraceVar, ":stack_trace_var")                                         \
   V(ListLiteralElement, "list literal element")                                \
   V(ForInIter, ":for-in-iter")                                                 \
   V(ClosureFunctionField, ":function")                                         \
@@ -281,17 +282,17 @@
   V(_state, "_state")                                                          \
   V(_A, "_A")                                                                  \
   V(_stackTrace, "_stackTrace")                                                \
-  V(_SpecialTypeMirrorImpl, "_SpecialTypeMirrorImpl")                          \
-  V(_LocalClassMirrorImpl, "_LocalClassMirrorImpl")                            \
-  V(_LocalFunctionTypeMirrorImpl, "_LocalFunctionTypeMirrorImpl")              \
-  V(_LocalLibraryMirrorImpl, "_LocalLibraryMirrorImpl")                        \
-  V(_LocalMethodMirrorImpl, "_LocalMethodMirrorImpl")                          \
-  V(_LocalVariableMirrorImpl, "_LocalVariableMirrorImpl")                      \
-  V(_LocalParameterMirrorImpl, "_LocalParameterMirrorImpl")                    \
-  V(_LocalIsolateMirrorImpl, "_LocalIsolateMirrorImpl")                        \
-  V(_LocalMirrorSystemImpl, "_LocalMirrorSystemImpl")                          \
-  V(_LocalTypedefMirrorImpl, "_LocalTypedefMirrorImpl")                        \
-  V(_LocalTypeVariableMirrorImpl, "_LocalTypeVariableMirrorImpl")              \
+  V(_SpecialTypeMirror, "_SpecialTypeMirror")                                  \
+  V(_LocalClassMirror, "_LocalClassMirror")                                    \
+  V(_LocalFunctionTypeMirror, "_LocalFunctionTypeMirror")                      \
+  V(_LocalLibraryMirror, "_LocalLibraryMirror")                                \
+  V(_LocalMethodMirror, "_LocalMethodMirror")                                  \
+  V(_LocalVariableMirror, "_LocalVariableMirror")                              \
+  V(_LocalParameterMirror, "_LocalParameterMirror")                            \
+  V(_LocalIsolateMirror, "_LocalIsolateMirror")                                \
+  V(_LocalMirrorSystem, "_LocalMirrorSystem")                                  \
+  V(_LocalTypedefMirror, "_LocalTypedefMirror")                                \
+  V(_LocalTypeVariableMirror, "_LocalTypeVariableMirror")                      \
   V(hashCode, "get:hashCode")                                                  \
   V(_leftShiftWithMask32, "_leftShiftWithMask32")                              \
   V(OptimizedOut, "<optimized out>")                                           \
@@ -314,6 +315,13 @@
 PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_INDEX)
 #undef DEFINE_SYMBOL_INDEX
 
+    kKwTableStart,  // First keyword at kKwTableStart + 1.
+
+#define DEFINE_KEYWORD_SYMBOL_INDEX(token, chars, ignore1, ignore2)            \
+    token##Id,
+    DART_KEYWORD_LIST(DEFINE_KEYWORD_SYMBOL_INDEX)
+#undef DEFINE_KEYWORD_SYMBOL_INDEX
+
     kNullCharId,  // One char code symbol starts here and takes up 256 entries.
     kMaxPredefinedId = kNullCharId + kMaxOneCharCodeSymbol + 1,
   };
@@ -396,6 +404,9 @@
 PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_HANDLE_ACCESSOR)
 #undef DEFINE_SYMBOL_HANDLE_ACCESSOR
 
+  // Get symbol for scanner keyword.
+  static const String& Keyword(Token::Kind keyword);
+
   // Initialize frequently used symbols in the vm isolate.
   static void InitOnce(Isolate* isolate);
 
diff --git a/runtime/vm/token.h b/runtime/vm/token.h
index 00c90bf..9c96c73 100644
--- a/runtime/vm/token.h
+++ b/runtime/vm/token.h
@@ -131,6 +131,9 @@
                                                                                \
   /* Support for Dart scripts. */                                              \
   TOK(kSCRIPTTAG, "#!", 0, kNoAttribute)                                       \
+                                                                               \
+  /* Support for optimized code */                                             \
+  TOK(kREM, "", 0, kNoAttribute)                                               \
 
 // List of keywords. The list must be alphabetically ordered. The
 // keyword recognition code depends on the ordering.
diff --git a/runtime/vm/trace_buffer.cc b/runtime/vm/trace_buffer.cc
new file mode 100644
index 0000000..831e95d
--- /dev/null
+++ b/runtime/vm/trace_buffer.cc
@@ -0,0 +1,121 @@
+// 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.
+
+#include "vm/json_stream.h"
+#include "vm/os.h"
+#include "vm/trace_buffer.h"
+
+namespace dart {
+
+TraceBuffer::TraceBuffer(intptr_t capacity) : ring_capacity_(capacity) {
+  ring_cursor_ = 0;
+  Init();
+}
+
+
+TraceBuffer::~TraceBuffer() {
+  ASSERT(ring_ != NULL);
+  Clear();
+  free(ring_);
+}
+
+
+void TraceBuffer::Init() {
+  ring_ = reinterpret_cast<TraceBufferEntry*>(
+      calloc(ring_capacity_, sizeof(TraceBufferEntry)));  // NOLINT
+}
+
+
+void TraceBuffer::Clear() {
+  for (intptr_t i = 0; i < ring_capacity_; i++) {
+    TraceBufferEntry& entry = ring_[i];
+    entry.micros = 0;
+    free(entry.message);
+    entry.message = NULL;
+  }
+  ring_cursor_ = 0;
+}
+
+
+void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros, char* msg) {
+  if (entry->message != NULL) {
+    // Recycle TraceBufferEntry.
+    free(entry->message);
+  }
+  entry->message = msg;
+  entry->micros = micros;
+}
+
+
+void TraceBuffer::AppendTrace(int64_t micros, char* message) {
+  const intptr_t index = ring_cursor_;
+  TraceBufferEntry* trace_entry = &ring_[index];
+  Fill(trace_entry, micros, message);
+  ring_cursor_ = RingIndex(ring_cursor_ + 1);
+}
+
+
+void TraceBuffer::Trace(int64_t micros, const char* message) {
+  ASSERT(message != NULL);
+  char* message_copy = strdup(message);
+  AppendTrace(micros, message_copy);
+}
+
+
+void TraceBuffer::Trace(const char* message) {
+  Trace(OS::GetCurrentTimeMicros(), message);
+}
+
+
+void TraceBuffer::TraceF(const char* format, ...) {
+  int64_t micros = OS::GetCurrentTimeMicros();
+  va_list args;
+  va_start(args, format);
+  intptr_t len = OS::VSNPrint(NULL, 0, format, args);
+  va_end(args);
+  char* p = reinterpret_cast<char*>(malloc(len+1));
+  va_start(args, format);
+  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  va_end(args);
+  ASSERT(len == len2);
+  AppendTrace(micros, p);
+}
+
+
+void TraceBuffer::PrintToJSONStream(JSONStream* stream) const {
+  JSONObject json_trace_buffer(stream);
+  json_trace_buffer.AddProperty("type", "TraceBuffer");
+  // TODO(johnmccutchan): Send cursor position in response.
+  JSONArray json_trace_buffer_array(&json_trace_buffer, "members");
+  // Scan forward until we find the first entry which isn't empty.
+  // TODO(johnmccutchan): Accept cursor start position as input.
+  intptr_t start = -1;
+  for (intptr_t i = 0; i < ring_capacity_; i++) {
+    intptr_t index = RingIndex(i + ring_cursor_);
+    if (!ring_[index].empty()) {
+      start = index;
+      break;
+    }
+  }
+  // No messages in trace buffer.
+  if (start == -1) {
+    return;
+  }
+  for (intptr_t i = 0; i < ring_capacity_; i++) {
+    intptr_t index = RingIndex(start + i);
+    const TraceBufferEntry& entry = ring_[index];
+    if (entry.empty()) {
+      // Empty entry, stop.
+      break;
+    }
+    JSONObject trace_entry(&json_trace_buffer_array);
+    trace_entry.AddProperty("type", "TraceBufferEntry");
+    double seconds = static_cast<double>(entry.micros) /
+                     static_cast<double>(kMicrosecondsPerSecond);
+    trace_entry.AddProperty("time", seconds);
+    trace_entry.AddProperty("message", entry.message);
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/trace_buffer.h b/runtime/vm/trace_buffer.h
new file mode 100644
index 0000000..f8b1c78
--- /dev/null
+++ b/runtime/vm/trace_buffer.h
@@ -0,0 +1,61 @@
+// 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.
+
+#ifndef VM_TRACE_BUFFER_H_
+#define VM_TRACE_BUFFER_H_
+
+#include "platform/assert.h"
+#include "platform/globals.h"
+#include "vm/json_stream.h"
+
+namespace dart {
+
+class JSONStream;
+
+struct TraceBufferEntry {
+  int64_t micros;
+  char* message;
+  bool empty() const {
+    return message == NULL;
+  }
+};
+
+class TraceBuffer {
+ public:
+  static const intptr_t kDefaultCapacity = 1024;
+
+  explicit TraceBuffer(intptr_t capacity = kDefaultCapacity);
+  ~TraceBuffer();
+
+  void Clear();
+
+  // Internally message is copied.
+  void Trace(int64_t micros, const char* message);
+  // Internally message is copied.
+  void Trace(const char* message);
+  void TraceF(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
+
+  void PrintToJSONStream(JSONStream* stream) const;
+
+ private:
+  void Init();
+  void Cleanup();
+  void Fill(TraceBufferEntry* entry, int64_t micros, char* msg);
+  void AppendTrace(int64_t micros, char* message);
+
+  TraceBufferEntry* ring_;
+  const intptr_t ring_capacity_;
+  intptr_t ring_cursor_;
+
+  intptr_t RingIndex(intptr_t i) const {
+    return i % ring_capacity_;
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(TraceBuffer);
+};
+
+
+}  // namespace dart
+
+#endif  // VM_TRACE_BUFFER_H_
diff --git a/runtime/vm/trace_buffer_test.cc b/runtime/vm/trace_buffer_test.cc
new file mode 100644
index 0000000..1284876
--- /dev/null
+++ b/runtime/vm/trace_buffer_test.cc
@@ -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.
+
+#include "platform/assert.h"
+#include "vm/globals.h"
+#include "vm/json_stream.h"
+#include "vm/trace_buffer.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+
+UNIT_TEST_CASE(TraceBufferEmpty) {
+  TraceBuffer* trace_buffer = new TraceBuffer(3);
+  {
+    JSONStream js;
+    trace_buffer->PrintToJSONStream(&js);
+    EXPECT_STREQ("{\"type\":\"TraceBuffer\",\"members\":[]}", js.ToCString());
+  }
+  delete trace_buffer;
+}
+
+
+UNIT_TEST_CASE(TraceBufferClear) {
+  TraceBuffer* trace_buffer = new TraceBuffer(3);
+  trace_buffer->Trace(kMicrosecondsPerSecond * 1, "abc");
+  trace_buffer->Clear();
+  {
+    JSONStream js;
+    trace_buffer->PrintToJSONStream(&js);
+    EXPECT_STREQ("{\"type\":\"TraceBuffer\",\"members\":[]}", js.ToCString());
+  }
+  delete trace_buffer;
+}
+
+
+UNIT_TEST_CASE(TraceBufferTrace) {
+  TraceBuffer* trace_buffer = new TraceBuffer(3);
+
+  trace_buffer->Trace(kMicrosecondsPerSecond * 1, "abc");
+  {
+    JSONStream js;
+    trace_buffer->PrintToJSONStream(&js);
+    EXPECT_STREQ("{\"type\":\"TraceBuffer\",\"members\":["
+                 "{\"type\":\"TraceBufferEntry\",\"time\":1.000000,"
+                 "\"message\":\"abc\"}]}", js.ToCString());
+  }
+  trace_buffer->Trace(kMicrosecondsPerSecond * 2, "def");
+  {
+    JSONStream js;
+    trace_buffer->PrintToJSONStream(&js);
+    EXPECT_STREQ("{\"type\":\"TraceBuffer\",\"members\":["
+                 "{\"type\":\"TraceBufferEntry\",\"time\":1.000000,"
+                 "\"message\":\"abc\"},"
+                 "{\"type\":\"TraceBufferEntry\",\"time\":2.000000,"
+                 "\"message\":\"def\"}]}", js.ToCString());
+  }
+  trace_buffer->Trace(kMicrosecondsPerSecond * 3, "ghi");
+  {
+    JSONStream js;
+    trace_buffer->PrintToJSONStream(&js);
+    EXPECT_STREQ("{\"type\":\"TraceBuffer\",\"members\":["
+                 "{\"type\":\"TraceBufferEntry\",\"time\":1.000000,"
+                 "\"message\":\"abc\"},"
+                 "{\"type\":\"TraceBufferEntry\",\"time\":2.000000,"
+                 "\"message\":\"def\"},"
+                 "{\"type\":\"TraceBufferEntry\",\"time\":3.000000,"
+                 "\"message\":\"ghi\"}]}", js.ToCString());
+  }
+  // This will overwrite the first Trace.
+  trace_buffer->Trace(kMicrosecondsPerSecond * 4, "jkl");
+  {
+    JSONStream js;
+    trace_buffer->PrintToJSONStream(&js);
+    EXPECT_STREQ("{\"type\":\"TraceBuffer\",\"members\":["
+                 "{\"type\":\"TraceBufferEntry\",\"time\":2.000000,"
+                 "\"message\":\"def\"},"
+                 "{\"type\":\"TraceBufferEntry\",\"time\":3.000000,"
+                 "\"message\":\"ghi\"},"
+                 "{\"type\":\"TraceBufferEntry\",\"time\":4.000000,"
+                 "\"message\":\"jkl\"}]}", js.ToCString());
+  }
+  delete trace_buffer;
+}
+
+
+UNIT_TEST_CASE(TraceBufferTraceF) {
+  TraceBuffer* trace_buffer = new TraceBuffer(3);
+  trace_buffer->TraceF("foo %d %s", 99, "bar");
+  {
+    JSONStream js;
+    trace_buffer->PrintToJSONStream(&js);
+    EXPECT_SUBSTRING("foo 99 bar", js.ToCString());
+  }
+  delete trace_buffer;
+}
+
+
+}  // namespace dart
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 03bf628..cca7e1a 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -146,7 +146,9 @@
 void AssemblerTest::Assemble() {
   const String& function_name = String::ZoneHandle(Symbols::New(name_));
   const Class& cls = Class::ZoneHandle(
-       Class::New(function_name, Script::Handle(), Scanner::kDummyTokenIndex));
+      Class::New(function_name, Script::Handle(), Scanner::kDummyTokenIndex));
+  const Library& lib = Library::ZoneHandle(Library::New(function_name));
+  cls.set_library(lib);
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction,
                     true, false, false, false, cls, 0));
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 1c3a8bb..3173ded 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -241,6 +241,11 @@
     'native_entry_test.h',
     'native_message_handler.cc',
     'native_message_handler.h',
+    'native_symbol.h',
+    'native_symbol_android.cc',
+    'native_symbol_linux.cc',
+    'native_symbol_macos.cc',
+    'native_symbol_win.cc',
     'object.cc',
     'object.h',
     'object_arm_test.cc',
@@ -269,6 +274,13 @@
     'port.cc',
     'port.h',
     'port_test.cc',
+    'profiler.cc',
+    'profiler.h',
+    'profiler_android.cc',
+    'profiler_linux.cc',
+    'profiler_macos.cc',
+    'profiler_test.cc',
+    'profiler_win.cc',
     'random.cc',
     'random.h',
     'raw_object.cc',
@@ -294,6 +306,11 @@
     'scopes_test.cc',
     'service.cc',
     'service.h',
+    'signal_handler_android.cc',
+    'signal_handler_linux.cc',
+    'signal_handler_macos.cc',
+    'signal_handler_win.cc',
+    'signal_handler.h',
     'simulator.h',
     'simulator_arm.cc',
     'simulator_arm.h',
@@ -333,6 +350,9 @@
     'timer.h',
     'token.cc',
     'token.h',
+    'trace_buffer.cc',
+    'trace_buffer.h',
+    'trace_buffer_test.cc',
     'unicode.cc',
     'unicode.h',
     'unicode_data.cc',
diff --git a/sdk/bin/dart b/sdk/bin/dart
index 22abed8..675963f 100755
--- a/sdk/bin/dart
+++ b/sdk/bin/dart
@@ -3,20 +3,31 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# Setting CUR_DIR this way is ugly, but is needed to handle the case where
-# sdk/bin has been symlinked to. On MacOS, readlink doesn't work with this case.
-CUR_DIR="$(cd "${0%/*}" ; pwd -P)"
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+CUR_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
 
 if [ -z "$DART_CONFIGURATION" ];
 then
   DART_CONFIGURATION="ReleaseIA32"
 fi
 
-if [[ `uname` == 'Darwin' ]]; 
+if [[ `uname` == 'Darwin' ]];
 then
   BIN_DIR="$CUR_DIR"/../../xcodebuild/$DART_CONFIGURATION
 else
   BIN_DIR="$CUR_DIR"/../../out/$DART_CONFIGURATION
-fi 
+fi
 
 exec "$BIN_DIR"/dart "$@"
diff --git a/sdk/bin/dart2js b/sdk/bin/dart2js
index 084df7e..79a857b 100755
--- a/sdk/bin/dart2js
+++ b/sdk/bin/dart2js
@@ -4,18 +4,19 @@
 # BSD-style license that can be found in the LICENSE file.
 
 function follow_links() {
-  while [ -h "$1" ]; do
+  file="$1"
+  while [ -h "$file" ]; do
     # On Mac OS, readlink -f doesn't work.
-    1="$(readlink "$1")"
+    file="$(readlink "$file")"
   done
-  echo "$1"
+  echo "$file"
 }
 
 # Unlike $0, $BASH_SOURCE points to the absolute path of this file.
 PROG_NAME="$(follow_links "$BASH_SOURCE")"
 
 # Handle the case where dart-sdk/bin has been symlinked to.
-BIN_DIR="$(follow_links "$(cd "${PROG_NAME%/*}" ; pwd -P)")"
+BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
 
 SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
 
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index 8a6a072..740332f 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -5,10 +5,21 @@
 
 set -e
 
-# Setting SCRIPT_DIR this way is ugly, but is needed to handle the case where
-# dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
-# with this case.
-SCRIPT_DIR="$(cd "${0%/*}" ; pwd -P)"
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+SCRIPT_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+
 DART_ANALYZER_HOME="$(cd "${SCRIPT_DIR%/*}" ; pwd -P)"
 
 FOUND_BATCH=0
diff --git a/sdk/bin/dartanalyzer_developer b/sdk/bin/dartanalyzer_developer
index 5639355..dcafe0c 100755
--- a/sdk/bin/dartanalyzer_developer
+++ b/sdk/bin/dartanalyzer_developer
@@ -8,14 +8,6 @@
 # the testing infrastructure.
 set -e
 
-function follow_links() {
-  while [ -h "$1" ]; do
-    # On Mac OS, readlink -f doesn't work.
-    1="$(readlink "$1")"
-  done
-  echo "$1"
-}
-
 FOUND_BATCH=0
 for ARG in "$@"
 do
@@ -28,11 +20,20 @@
   esac
 done
 
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
 # Unlike $0, $BASH_SOURCE points to the absolute path of this file.
 PROG_NAME="$(follow_links "$BASH_SOURCE")"
 
-# Handle the case where the binary dir has been symlinked to.
-CUR_DIR="$(follow_links "$(cd "${PROG_NAME%/*}" ; pwd -P)")"
+# Handle the case where dart-sdk/bin has been symlinked to.
+CUR_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
 
 SDK_DIR="$(cd "${CUR_DIR}/.." ; pwd -P)"
 
diff --git a/sdk/bin/dartdoc b/sdk/bin/dartdoc
index f95cb16..45ba512 100755
--- a/sdk/bin/dartdoc
+++ b/sdk/bin/dartdoc
@@ -3,10 +3,20 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# Setting BIN_DIR this way is ugly, but is needed to handle the case where
-# dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
-# with this case.
-BIN_DIR="$(cd "${0%/*}" ; pwd -P)"
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
 
 unset COLORS
 if test -t 1; then
diff --git a/sdk/bin/pub b/sdk/bin/pub
index 231da3e..42f84fc 100755
--- a/sdk/bin/pub
+++ b/sdk/bin/pub
@@ -6,10 +6,21 @@
 # Run pub.dart on the Dart VM. This script assumes the Dart SDK's directory
 # structure.
 
-# Setting BIN_DIR this way is ugly, but is needed to handle the case where
-# dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
-# with this case.
-BIN_DIR="$(cd "${0%/*}" ; pwd -P)"
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+
 SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
 
 SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
@@ -40,4 +51,4 @@
   PUB="$SDK_DIR/lib/_internal/pub/bin/pub.dart"
 
   exec "$DART" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
-fi
\ No newline at end of file
+fi
diff --git a/sdk/bin/pub_developer b/sdk/bin/pub_developer
index be0510d9..287bb7d 100755
--- a/sdk/bin/pub_developer
+++ b/sdk/bin/pub_developer
@@ -6,10 +6,21 @@
 # Run pub.dart on the Dart VM. This script assumes the Dart SDK's directory
 # structure.
 
-# Setting BIN_DIR this way is ugly, but is needed to handle the case where
-# dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
-# with this case.
-BIN_DIR="$(cd "${0%/*}" ; pwd -P)"
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+
 SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
 
 SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
@@ -40,4 +51,4 @@
   PUB="$SDK_DIR/lib/_internal/pub/bin/pub.dart"
 
   exec "$DART" "--checked" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
-fi
\ No newline at end of file
+fi
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 5141109..0cadcae 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -43,10 +43,13 @@
         translator.translateFunction(element, node);
       } else if (element.isSynthesized) {
         return new ClosureClassMap(null, null, null, new ThisElement(element));
-      } else {
-        // Must be the lazy initializer of a static.
-        assert(node is SendSet);
+      } else if (node is SendSet) {
+        // The lazy initializer of a static.
         translator.translateLazyInitializer(element, node);
+      } else {
+        assert(element.isInstanceMember() && element.isField());
+        closureMappingCache[node] =
+            new ClosureClassMap(null, null, null, new ThisElement(element));
       }
       assert(closureMappingCache[node] != null);
       return closureMappingCache[node];
@@ -89,10 +92,6 @@
 
   bool isInstanceMember() => true;
   bool isAssignable() => false;
-  // The names of closure variables don't need renaming, since their use is very
-  // simple and they have 1-character names in the minified mode.
-  bool hasFixedBackendName() => true;
-  String fixedBackendName() => name;
 
   DartType computeType(Compiler compiler) {
     return variableElement.computeType(compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 121193a..4117c78 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -722,13 +722,10 @@
   Constant makeConstructedConstant(
       Spannable node, InterfaceType type, FunctionElement constructor,
       List<Constant> getArguments(FunctionElement constructor)) {
-    if (constructor.isRedirectingFactory) {
-      type = constructor.computeTargetType(compiler, type);
-    }
-
     // The redirection chain of this element may not have been resolved through
     // a post-process action, so we have to make sure it is done here.
     compiler.resolver.resolveRedirectionChain(constructor, node);
+    InterfaceType constructedType = constructor.computeTargetType(type);
     constructor = constructor.redirectionTarget;
     ClassElement classElement = constructor.getEnclosingClass();
     // The constructor must be an implementation to ensure that field
@@ -742,7 +739,7 @@
     evaluator.evaluateConstructorFieldValues(arguments);
     List<Constant> jsNewArguments = evaluator.buildJsNewArguments(classElement);
 
-    return new ConstructedConstant(type, jsNewArguments);
+    return new ConstructedConstant(constructedType, jsNewArguments);
   }
 
   Constant visitParenthesizedExpression(ParenthesizedExpression node) {
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index e0de9ff..ecfe995 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -290,6 +290,9 @@
   /// This is used, for example, by the JS backend to enqueue additional
   /// elements needed for reflection.
   void onQueueEmpty(Enqueuer enqueuer) {}
+
+  /// Called after [element] has been resolved.
+  void onElementResolved(Element element, TreeElements elements) {}
 }
 
 /**
@@ -1285,6 +1288,7 @@
     TreeElements result = world.getCachedElements(element);
     if (result != null) return result;
     result = analyzeElement(element);
+    backend.onElementResolved(element, result);
     return result;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index d530651..6e9281c 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -240,7 +240,7 @@
   bool hasFixedBackendName();
   String fixedBackendName();
 
-  bool isAbstract(Compiler compiler);
+  bool get isAbstract;
   bool isForeign(Compiler compiler);
 
   void addMetadata(MetadataAnnotation annotation);
@@ -793,14 +793,10 @@
   bool get isRedirectingFactory;
 
   /**
-   * Compute the type of the target of a redirecting constructor or factory
-   * for an instantiation site with type [:newType:].
-   *
-   * TODO(karlklose): get rid of this method and resolve the target type
-   * during resolution when we correctly resolve chains of redirections.
+   * Compute the type of the target of a constructor for an instantiation site
+   * with type [:newType:].
    */
-  InterfaceType computeTargetType(Compiler compiler,
-                                  InterfaceType newType);
+  InterfaceType computeTargetType(InterfaceType newType);
 
   // TODO(kasperl): These are bit fishy. Do we really need them?
   void set patch(FunctionElement value);
@@ -881,7 +877,7 @@
   bool isObject(Compiler compiler);
   bool isSubclassOf(ClassElement cls);
   bool implementsInterface(ClassElement intrface);
-  bool isShadowedByField(Element fieldMember);
+  bool hasFieldShadowedBy(Element fieldMember);
 
   ClassElement ensureResolved(Compiler compiler);
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 0b6c4c2..8859321 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -178,11 +178,18 @@
   Token position() => null;
 
   Token findMyName(Token token) {
+    return findNameToken(token, isConstructor(), name, enclosingElement.name);
+  }
+
+  static Token findNameToken(Token token, bool isConstructor, String name,
+                             String enclosingClassName) {
     // We search for the token that has the name of this element.
     // For constructors, that doesn't work because they may have
     // named formed out of multiple tokens (named constructors) so
     // for those we search for the class name instead.
-    String needle = isConstructor() ? enclosingElement.name : name;
+    String needle = isConstructor ? enclosingClassName : name;
+    // The unary '-' operator has a special element name (specified).
+    if (needle == 'unary-') needle = '-';
     for (Token t = token; EOF_TOKEN != t.kind; t = t.next) {
       if (needle == t.value) return t;
     }
@@ -279,7 +286,7 @@
 
   static bool isInvalid(Element e) => e == null || e.isErroneous();
 
-  bool isAbstract(Compiler compiler) => modifiers.isAbstract();
+  bool get isAbstract => modifiers.isAbstract();
   bool isForeign(Compiler compiler) => getLibrary() == compiler.foreignLibrary;
 
   FunctionElement get targetConstructor => null;
@@ -343,7 +350,7 @@
 
   getLibrary() => enclosingElement.getLibrary();
 
-  computeTargetType(Compiler compiler, InterfaceType newType) => unsupported();
+  computeTargetType(InterfaceType newType) => unsupported();
 
   String get message => '${messageKind.message(messageArguments)}';
 
@@ -1240,7 +1247,7 @@
     throw "internal error: AbstractFieldElement has no node";
   }
 
-  position() {
+  Token position() {
     // The getter and setter may be defined in two different
     // compilation units.  However, we know that one of them is
     // non-null and defined in the same compilation unit as the
@@ -1389,6 +1396,8 @@
   FunctionElement patch = null;
   FunctionElement origin = null;
 
+  final bool _hasNoBody;
+
   /**
    * If this is a redirecting factory, [defaultImplementation] will be
    * changed by the resolver to point to the redirection target.
@@ -1400,30 +1409,36 @@
   FunctionElementX(String name,
                    ElementKind kind,
                    Modifiers modifiers,
-                   Element enclosing)
-      : this.tooMuchOverloading(name, null, kind, modifiers, enclosing, null);
+                   Element enclosing,
+                   bool hasNoBody)
+      : this.tooMuchOverloading(name, null, kind, modifiers, enclosing, null,
+                                hasNoBody);
 
   FunctionElementX.node(String name,
                         FunctionExpression node,
                         ElementKind kind,
                         Modifiers modifiers,
                         Element enclosing)
-      : this.tooMuchOverloading(name, node, kind, modifiers, enclosing, null);
+      : this.tooMuchOverloading(name, node, kind, modifiers, enclosing, null,
+                                false);
 
   FunctionElementX.from(String name,
                         FunctionElement other,
                         Element enclosing)
       : this.tooMuchOverloading(name, other.cachedNode, other.kind,
                                 other.modifiers, enclosing,
-                                other.functionSignature);
+                                other.functionSignature,
+                                false);
 
   FunctionElementX.tooMuchOverloading(String name,
                                       FunctionExpression this.cachedNode,
                                       ElementKind kind,
-                                      Modifiers this.modifiers,
+                                      this.modifiers,
                                       Element enclosing,
-                                      FunctionSignature this.functionSignature)
-      : super(name, kind, enclosing) {
+                                      this.functionSignature,
+                                      bool hasNoBody)
+      : super(name, kind, enclosing),
+        _hasNoBody = hasNoBody {
     assert(modifiers != null);
     defaultImplementation = this;
   }
@@ -1435,13 +1450,14 @@
 
   /// This field is set by the post process queue when checking for cycles.
   FunctionElement internalRedirectionTarget;
+  DartType redirectionTargetType;
 
   set redirectionTarget(FunctionElement constructor) {
     assert(constructor != null && internalRedirectionTarget == null);
     internalRedirectionTarget = constructor;
   }
 
-  get redirectionTarget {
+  FunctionElement get redirectionTarget {
     if (Elements.isErroneousElement(defaultImplementation)) {
       return defaultImplementation;
     }
@@ -1449,17 +1465,13 @@
     return isRedirectingFactory ? internalRedirectionTarget : this;
   }
 
-  InterfaceType computeTargetType(Compiler compiler,
-                                  InterfaceType newType) {
+  InterfaceType computeTargetType(InterfaceType newType) {
     if (!isRedirectingFactory) return newType;
-    ClassElement targetClass = getEnclosingClass();
-    TreeElements treeElements =
-        compiler.enqueuer.resolution.getCachedElements(
-            declaration);
-    FunctionExpression functionNode = parseNode(compiler);
-    Return redirectionNode = functionNode.body;
-    return treeElements.getType(redirectionNode.expression)
-        .subst(newType.typeArguments, targetClass.typeVariables);
+    assert(invariant(this, redirectionTargetType != null,
+        message: 'Redirection target type has not yet been computed for '
+                 '$this.'));
+    return redirectionTargetType.subst(newType.typeArguments,
+                                       newType.element.typeVariables);
   }
 
   /**
@@ -1531,14 +1543,10 @@
     }
   }
 
-  bool isAbstract(Compiler compiler) {
-    if (super.isAbstract(compiler)) return true;
-    if (modifiers.isExternal()) return false;
-    if (isFunction() || isAccessor()) {
-      return compiler.withCurrentElement(this,
-          () => !parseNode(compiler).hasBody());
-    }
-    return false;
+  bool get isAbstract {
+    return !modifiers.isExternal() &&
+           (isFunction() || isAccessor()) &&
+           _hasNoBody;
   }
 }
 
@@ -1551,7 +1559,7 @@
         super(constructor.name,
               ElementKind.GENERATIVE_CONSTRUCTOR_BODY,
               Modifiers.EMPTY,
-              constructor.enclosingElement) {
+              constructor.enclosingElement, false) {
     functionSignature = constructor.functionSignature;
   }
 
@@ -1589,7 +1597,7 @@
       : super(name,
               ElementKind.GENERATIVE_CONSTRUCTOR,
               Modifiers.EMPTY,
-              enclosing);
+              enclosing, false);
 
   SynthesizedConstructorElementX.forDefault(superMember, Element enclosing)
       : this('', superMember, enclosing, true);
@@ -1882,13 +1890,13 @@
         FunctionElement setter = field.setter;
         if (selector.isSetter()) {
           // Abstract members can be defined in a super class.
-          if (setter != null && !setter.isAbstract(compiler)) return setter;
+          if (setter != null && !setter.isAbstract) return setter;
         } else {
           assert(selector.isGetter() || selector.isCall());
-          if (getter != null && !getter.isAbstract(compiler)) return getter;
+          if (getter != null && !getter.isAbstract) return getter;
         }
       // Abstract members can be defined in a super class.
-      } else if (!member.isAbstract(compiler)) {
+      } else if (!member.isAbstract) {
         return member;
       }
     }
@@ -1907,25 +1915,25 @@
   }
 
   /**
-   * Returns true if the [fieldMember] is shadowed by another field. The given
-   * [fieldMember] must be a member of this class.
+   * Returns true if the [fieldMember] shadows another field.  The given
+   * [fieldMember] must be a member of this class, i.e. if there is a field of
+   * the same name in the superclass chain.
    *
    * This method also works if the [fieldMember] is private.
    */
-  bool isShadowedByField(Element fieldMember) {
+  bool hasFieldShadowedBy(Element fieldMember) {
     assert(fieldMember.isField());
     String fieldName = fieldMember.name;
     bool isPrivate = isPrivateName(fieldName);
     LibraryElement memberLibrary = fieldMember.getLibrary();
-    ClassElement lookupClass = this;
+    ClassElement lookupClass = this.superclass;
     while (lookupClass != null) {
       Element foundMember = lookupClass.lookupLocalMember(fieldName);
       if (foundMember != null) {
-        if (foundMember == fieldMember) return false;
         if (foundMember.isField()) {
           if (!isPrivate || memberLibrary == foundMember.getLibrary()) {
-            // Private fields can only be shadowed by a field declared
-            // in the same library.
+            // Private fields can only be shadowed by a field declared in the
+            // same library.
             return true;
           }
         }
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index e97f3dcb..986ebec 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -118,7 +118,7 @@
       elements.registerDependency(cls);
       cls.ensureResolved(compiler);
       universe.instantiatedTypes.add(type);
-      if (!cls.isAbstract(compiler)
+      if (!cls.isAbstract
           // We can't use the closed-world assumption with native abstract
           // classes; a native abstract class may have non-abstract subclasses
           // not declared to the program.  Instances of these classes are
@@ -729,15 +729,20 @@
         queue = new Queue<CodegenWorkItem>();
 
   bool isProcessed(Element member) =>
-      member.isAbstract(compiler) || generatedCode.containsKey(member);
+      member.isAbstract || generatedCode.containsKey(member);
 
   void internalAddToWorkList(Element element) {
     // Don't generate code for foreign elements.
     if (element.isForeign(compiler)) return;
 
-    // Codegen inlines field initializers, so it does not need to add
-    // individual fields in the work list.
-    if (element.isField() && element.isInstanceMember()) return;
+    // Codegen inlines field initializers. It only needs to generate
+    // code for checked setters.
+    if (element.isField() && element.isInstanceMember()) {
+      if (!compiler.enableTypeAssertions
+          || element.enclosingElement.isClosure()) {
+        return;
+      }
+    }
 
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index d433dd5..020c597c 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -135,6 +135,7 @@
   final Compiler compiler;
   final V types;
   final Map<Node, T> concreteTypes = new Map<Node, T>();
+  final Set<Element> generativeConstructorsExposingThis = new Set<Element>();
 
   InferrerEngine(this.compiler, this.types);
 
@@ -372,6 +373,20 @@
         && element.getEnclosingClass().isNative()
         && element.isField();
   }
+
+  void analyze(Element element);
+
+  bool checkIfExposesThis(Element element) {
+    element = element.implementation;
+    return generativeConstructorsExposingThis.contains(element);
+  }
+
+  void recordExposesThis(Element element, bool exposesThis) {
+    element = element.implementation;
+    if (exposesThis) {
+      generativeConstructorsExposingThis.add(element);
+    }
+  }
 }
 
 class SimpleTypeInferrerVisitor<T>
@@ -379,6 +394,7 @@
   T returnType;
   bool visitingInitializers = false;
   bool isConstructorRedirect = false;
+  bool seenSuperConstructorCall = false;
   SideEffects sideEffects = new SideEffects.empty();
   final Element outermostElement;
   final InferrerEngine<T, TypeSystem<T>> inferrer;
@@ -403,6 +419,11 @@
         element, outermostElement, inferrer, compiler, handler);
   }
 
+  void analyzeSuperConstructorCall(Element target) {
+    inferrer.analyze(target);
+    isThisExposed = isThisExposed || inferrer.checkIfExposesThis(target);
+  }
+
   T run() {
     var node = analyzedElement.parseNode(compiler);
     if (analyzedElement.isField() && node.asSendSet() == null) {
@@ -460,6 +481,7 @@
         }
         locals.update(element, parameterType, node);
       });
+      ClassElement cls = analyzedElement.getEnclosingClass();
       if (analyzedElement.isSynthesized) {
         node = analyzedElement;
         synthesizeForwardingCall(node, analyzedElement.targetConstructor);
@@ -467,9 +489,22 @@
         visitingInitializers = true;
         visit(node.initializers);
         visitingInitializers = false;
+        // For a generative constructor like: `Foo();`, we synthesize
+        // a call to the default super constructor (the one that takes
+        // no argument). Resolution ensures that such a constructor
+        // exists.
+        if (!isConstructorRedirect
+            && !seenSuperConstructorCall
+            && !cls.isObject(compiler)) {
+          Selector selector =
+              new Selector.callDefaultConstructor(analyzedElement.getLibrary());
+          FunctionElement target = cls.superclass.lookupConstructor(selector);
+          analyzeSuperConstructorCall(target);
+          synthesizeForwardingCall(analyzedElement, target);
+        }
         visit(node.body);
+        inferrer.recordExposesThis(analyzedElement, isThisExposed);
       }
-      ClassElement cls = analyzedElement.getEnclosingClass();
       if (!isConstructorRedirect) {
         // Iterate over all instance fields, and give a null type to
         // fields that we haven't initialized for sure.
@@ -571,13 +606,18 @@
 
   bool isThisOrSuper(Node node) => node.isThis() || node.isSuper();
 
+  bool isInClassOrSubclass(Element element) {
+    ClassElement cls = outermostElement.getEnclosingClass();
+    ClassElement enclosing = element.getEnclosingClass();
+    return (enclosing == cls) || compiler.world.isSubclass(cls, enclosing);
+  }
+
   void checkIfExposesThis(Selector selector) {
     if (isThisExposed) return;
     inferrer.forEachElementMatching(selector, (element) {
       if (element.isField()) {
         if (!selector.isSetter()
-            && element.getEnclosingClass() ==
-                    outermostElement.getEnclosingClass()
+            && isInClassOrSubclass(element)
             && !element.modifiers.isFinal()
             && locals.fieldScope.readField(element) == null
             && element.parseNode(compiler).asSendSet() == null) {
@@ -761,6 +801,22 @@
     } else if (Elements.isStaticOrTopLevelField(element)) {
       handleStaticSend(node, setterSelector, element, arguments);
     } else if (Elements.isUnresolved(element) || element.isSetter()) {
+      if (analyzedElement.isGenerativeConstructor()
+          && (node.asSendSet() != null)
+          && (node.asSendSet().receiver != null)
+          && node.asSendSet().receiver.isThis()) {
+        Iterable<Element> targets = compiler.world.allFunctions.filter(
+            types.newTypedSelector(thisType, setterSelector));
+        // We just recognized a field initialization of the form:
+        // `this.foo = 42`. If there is only one target, we can update
+        // its type.
+        if (targets.length == 1) {
+          Element single = targets.first;
+          if (single.isField()) {
+            locals.updateField(single, rhsType);
+          }
+        }
+      }
       handleDynamicSend(
           node, setterSelector, receiverType, arguments);
     } else if (element.isField()) {
@@ -786,6 +842,10 @@
 
   T visitSuperSend(Send node) {
     Element element = elements[node];
+    if (visitingInitializers) {
+      seenSuperConstructorCall = true;
+      analyzeSuperConstructorCall(element);
+    }
     Selector selector = elements.getSelector(node);
     // TODO(ngeoffray): We could do better here if we knew what we
     // are calling does not expose this.
@@ -809,11 +869,36 @@
     }
   }
 
-  T visitStaticSend(Send node) {
-    if (visitingInitializers && Initializers.isConstructorRedirect(node)) {
-      isConstructorRedirect = true;
+  // Try to find the length given to a fixed array constructor call.
+  int findLength(Send node) {
+    Node firstArgument = node.arguments.head;
+    Element element = elements[firstArgument];
+    LiteralInt length = firstArgument.asLiteralInt();
+    if (length != null) {
+      return length.value;
+    } else if (element != null
+               && element.isField()
+               && Elements.isStaticOrTopLevelField(element)
+               && compiler.world.fieldNeverChanges(element)) {
+      var constant =
+          compiler.constantHandler.getConstantForVariable(element);
+      if (constant != null && constant.isInt()) {
+        return constant.value;
+      }
     }
+    return null;
+  }
+
+  T visitStaticSend(Send node) {
     Element element = elements[node];
+    if (visitingInitializers) {
+      if (Initializers.isConstructorRedirect(node)) {
+        isConstructorRedirect = true;
+      } else if (Initializers.isSuperConstructorCall(node)) {
+        seenSuperConstructorCall = true;
+        analyzeSuperConstructorCall(element);
+      }
+    }
     if (element.isForeign(compiler)) {
       return handleForeignSend(node);
     }
@@ -830,38 +915,24 @@
     } else if (Elements.isFixedListConstructorCall(element, node, compiler)
         || Elements.isFilledListConstructorCall(element, node, compiler)) {
 
-      int initialLength;
-      T elementType;
-      if (Elements.isFixedListConstructorCall(element, node, compiler)) {
-        LiteralInt length = node.arguments.head.asLiteralInt();
-        if (length != null) {
-          initialLength = length.value;
-        }
-        elementType = types.nullType;
-      } else {
-        LiteralInt length = node.arguments.head.asLiteralInt();
-        if (length != null) {
-          initialLength = length.value;
-        }
-        elementType = arguments.positional[1];
-      }
+      int length = findLength(node);
+      T elementType =
+          Elements.isFixedListConstructorCall(element, node, compiler)
+              ? types.nullType
+              : arguments.positional[1];
 
       return inferrer.concreteTypes.putIfAbsent(
           node, () => types.allocateContainer(
               types.fixedListType, node, outermostElement,
-              elementType, initialLength));
+              elementType, length));
     } else if (Elements.isConstructorOfTypedArraySubclass(element, compiler)) {
-      int initialLength;
-      LiteralInt length = node.arguments.head.asLiteralInt();
-      if (length != null) {
-        initialLength = length.value;
-      }
+      int length = findLength(node);
       T elementType = inferrer.returnTypeOfElement(
           element.getEnclosingClass().lookupMember('[]'));
       return inferrer.concreteTypes.putIfAbsent(
         node, () => types.allocateContainer(
           types.nonNullExact(element.getEnclosingClass()), node,
-          outermostElement, elementType, initialLength));
+          outermostElement, elementType, length));
     } else if (element.isFunction() || element.isConstructor()) {
       return returnType;
     } else {
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index 6b39f4c..833080c 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -390,6 +390,7 @@
       <CallSiteTypeInformation>[];
   final WorkQueue workQueue = new WorkQueue();
   final Element mainElement;
+  final Set<Element> analyzedElements = new Set<Element>();
 
   /// The maximum number of times we allow a node in the graph to
   /// change types. If a node reaches that limit, we give up
@@ -397,13 +398,13 @@
   final int MAX_CHANGE_COUNT = 5;
 
   int overallRefineCount = 0;
+  int addedInGraph = 0;
 
   TypeGraphInferrerEngine(Compiler compiler, this.mainElement)
         : super(compiler, new TypeInformationSystem(compiler));
 
   void runOverAllElements() {
     if (compiler.disableTypeInference) return;
-    int addedInGraph = 0;
     compiler.progress.reset();
 
     sortResolvedElements().forEach((Element element) {
@@ -414,48 +415,7 @@
       // Force the creation of the [ElementTypeInformation] to ensure it is
       // in the graph.
       types.getInferredTypeOf(element);
-
-      SimpleTypeInferrerVisitor visitor =
-          new SimpleTypeInferrerVisitor(element, compiler, this);
-      TypeInformation type;
-      compiler.withCurrentElement(element, () {
-        type = visitor.run();
-      });
-      addedInGraph++;
-
-      if (element.isField()) {
-        Node node = element.parseNode(compiler);
-        if (element.modifiers.isFinal() || element.modifiers.isConst()) {
-          // If [element] is final and has an initializer, we record
-          // the inferred type.
-          if (node.asSendSet() != null) {
-            recordType(element, type);
-          } else if (!element.isInstanceMember()) {
-            recordType(element, types.nullType);
-          }
-        } else if (node.asSendSet() == null) {
-          // Only update types of static fields if there is no
-          // assignment. Instance fields are dealt with in the constructor.
-          if (Elements.isStaticOrTopLevelField(element)) {
-            recordTypeOfNonFinalField(node, element, type);
-          }
-        } else {
-          recordTypeOfNonFinalField(node, element, type);
-        }
-        if (Elements.isStaticOrTopLevelField(element)
-            && node.asSendSet() != null
-            && !element.modifiers.isConst()) {
-          var argument = node.asSendSet().arguments.head;
-          // TODO(13429): We could do better here by using the
-          // constant handler to figure out if it's a lazy field or not.
-          if (argument.asSend() != null
-              || (argument.asNewExpression() != null && !argument.isConst())) {
-            recordType(element, types.nullType);
-          }
-        }
-      } else {
-        recordReturnType(element, type);
-      }
+      analyze(element);
     });
     compiler.log('Added $addedInGraph elements in inferencing graph.');
 
@@ -503,6 +463,54 @@
     processLoopInformation();
   }
 
+  void analyze(Element element) {
+    element = element.implementation;
+    if (analyzedElements.contains(element)) return;
+    analyzedElements.add(element);
+
+    SimpleTypeInferrerVisitor visitor =
+        new SimpleTypeInferrerVisitor(element, compiler, this);
+    TypeInformation type;
+    compiler.withCurrentElement(element, () {
+      type = visitor.run();
+    });
+    addedInGraph++;
+
+    if (element.isField()) {
+      Node node = element.parseNode(compiler);
+      if (element.modifiers.isFinal() || element.modifiers.isConst()) {
+        // If [element] is final and has an initializer, we record
+        // the inferred type.
+        if (node.asSendSet() != null) {
+          recordType(element, type);
+        } else if (!element.isInstanceMember()) {
+          recordType(element, types.nullType);
+        }
+      } else if (node.asSendSet() == null) {
+        // Only update types of static fields if there is no
+        // assignment. Instance fields are dealt with in the constructor.
+        if (Elements.isStaticOrTopLevelField(element)) {
+          recordTypeOfNonFinalField(node, element, type);
+        }
+      } else {
+        recordTypeOfNonFinalField(node, element, type);
+      }
+      if (Elements.isStaticOrTopLevelField(element)
+          && node.asSendSet() != null
+          && !element.modifiers.isConst()) {
+        var argument = node.asSendSet().arguments.head;
+        // TODO(13429): We could do better here by using the
+        // constant handler to figure out if it's a lazy field or not.
+        if (argument.asSend() != null
+            || (argument.asNewExpression() != null && !argument.isConst())) {
+          recordType(element, types.nullType);
+        }
+      }
+    } else {
+      recordReturnType(element, type);
+    }
+  }
+
   void processLoopInformation() {
     allocatedCalls.forEach((info) {
       if (!info.inLoop) return;
@@ -766,7 +774,7 @@
         // TODO(ngeoffray): Not sure why the resolver would put a null
         // mapping.
         if (mapping == null) return;
-        if (element.isAbstract(compiler)) return;
+        if (element.isAbstract) return;
         // Put the other operators in buckets by length, later to be added in
         // length order.
         int length = mapping.selectors.length;
@@ -790,6 +798,8 @@
     types.typeInformations.values.forEach((info) => info.clear());
     types.allocatedTypes.clear();
     types.concreteTypes.clear();
+    analyzedElements.clear();
+    generativeConstructorsExposingThis.clear();
   }
 
   Iterable<Element> getCallersOf(Element element) {
@@ -905,6 +915,18 @@
     return inferrer.getCallersOf(element);
   }
 
+  bool isCalledOnce(Element element) {
+    if (compiler.disableTypeInference) return false;
+
+    int count = 0;
+    ElementTypeInformation info = inferrer.types.getInferredTypeOf(element);
+    for (var set in info.callers.values) {
+      count += set.length;
+      if (count > 1) return false;
+    }
+    return count == 1;
+  }
+
   void clear() {
     inferrer.clear();
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js/builder.dart b/sdk/lib/_internal/compiler/implementation/js/builder.dart
index 36433e8..e02bd00 100644
--- a/sdk/lib/_internal/compiler/implementation/js/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/builder.dart
@@ -47,6 +47,8 @@
 
   LiteralString string(String value) => new LiteralString('"$value"');
 
+  LiteralNumber number(num value) => new LiteralNumber('$value');
+
   If if_(condition, thenPart, [elsePart]) {
     condition = toExpression(condition);
     return (elsePart == null)
diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
index c102b39..afc27de 100644
--- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -859,6 +859,13 @@
 class LiteralString extends Literal {
   final String value;
 
+  /**
+   * Constructs a LiteralString from a string value.
+   *
+   * The constructor does not add the required quotes.  If [value] is
+   * not surrounded by quotes, the resulting object is invalid as a JS
+   * value.
+   */
   LiteralString(this.value);
 
   accept(NodeVisitor visitor) => visitor.visitLiteralString(this);
@@ -918,8 +925,16 @@
 
 class ObjectInitializer extends Expression {
   List<Property> properties;
+  bool isOneLiner;
 
-  ObjectInitializer(this.properties);
+  /**
+   * Constructs a new object-initializer containing the given [properties].
+   *
+   * [isOneLiner] describes the behaviour when pretty-printing (non-minified).
+   * If true print all properties on the same line.
+   * If false print each property on a seperate line.
+   */
+  ObjectInitializer(this.properties, {this.isOneLiner: true});
 
   accept(NodeVisitor visitor) => visitor.visitObjectInitializer(this);
 
diff --git a/sdk/lib/_internal/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
index 1cf97a3..bc29bfe 100644
--- a/sdk/lib/_internal/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -802,25 +802,26 @@
     // Print all the properties on one line until we see a function-valued
     // property.  Ideally, we would use a proper pretty-printer to make the
     // decision based on layout.
-    bool onePerLine = false;
     List<Property> properties = node.properties;
     out("{");
     ++indentLevel;
     for (int i = 0; i < properties.length; i++) {
       Expression value = properties[i].value;
-      if (value is Fun || value is NamedFunction) onePerLine = true;
       if (i != 0) {
         out(",");
-        if (!onePerLine) spaceOut();
+        if (node.isOneLiner) spaceOut();
       }
-      if (onePerLine) {
+      if (!node.isOneLiner) {
         forceLine();
         indent();
       }
       visitProperty(properties[i]);
     }
     --indentLevel;
-    if (onePerLine) lineOut();
+    if (!node.isOneLiner && !properties.isEmpty) {
+      lineOut();
+      indent();
+    }
     out("}");
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 3651a03..02e78b7 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -4,6 +4,8 @@
 
 part of js_backend;
 
+const VERBOSE_OPTIMIZER_HINTS = false;
+
 class JavaScriptItemCompilationContext extends ItemCompilationContext {
   final Set<HInstruction> boundsChecked = new Set<HInstruction>();
   final Set<HInstruction> allocatedFixedLists = new Set<HInstruction>();
@@ -147,7 +149,7 @@
   }
 
   void markAsNonInlinable(FunctionElement element, {bool insideLoop}) {
-    if (insideLoop) {
+    if (insideLoop == null || insideLoop) {
       // If we can't inline a function inside a loop, then we should not inline
       // it outside a loop either.
       canBeInlined[element] = false;
@@ -193,6 +195,7 @@
   ClassElement jsExtendableArrayClass;
 
   Element jsIndexableLength;
+  Element jsArrayTypedConstructor;
   Element jsArrayRemoveLast;
   Element jsArrayAdd;
   Element jsStringSplit;
@@ -205,6 +208,10 @@
   ClassElement constMapLiteralClass;
   ClassElement typeVariableClass;
 
+  ClassElement noSideEffectsClass;
+  ClassElement noThrowsClass;
+  ClassElement noInlineClass;
+
   Element getInterceptorMethod;
   Element interceptedNames;
 
@@ -610,6 +617,7 @@
     }
 
     jsArrayClass.ensureResolved(compiler);
+    jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed');
     jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast');
     jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add');
 
@@ -642,6 +650,10 @@
     fixedArrayType = new TypeMask.nonNullExact(jsFixedArrayClass);
     extendableArrayType = new TypeMask.nonNullExact(jsExtendableArrayClass);
     nonNullType = compiler.typesTask.dynamicType.nonNullable();
+
+    noSideEffectsClass = compiler.findHelper('NoSideEffects');
+    noThrowsClass = compiler.findHelper('NoThrows');
+    noInlineClass = compiler.findHelper('NoInline');
   }
 
   void validateInterceptorImplementsAllObjectMethods(
@@ -662,6 +674,12 @@
     if (enqueuer.isResolutionQueue) {
       cls.ensureResolved(compiler);
       cls.forEachMember((ClassElement classElement, Element member) {
+        if (member.name == Compiler.CALL_OPERATOR_NAME) {
+          compiler.reportError(
+              member,
+              MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS);
+          return;
+        }
         if (member.isSynthesized) return;
         // All methods on [Object] are shadowed by [Interceptor].
         if (classElement == compiler.objectClass) return;
@@ -800,6 +818,9 @@
         // of the map.
         enqueueClass(enqueuer, compiler.listClass, elements);
         enqueueClass(enqueuer, mapLiteralClass, elements);
+        // For map literals, the dependency between the implementation class
+        // and [Map] is not visible, so we have to add it manually.
+        rti.registerRtiDependency(mapLiteralClass, cls);
         enqueueInResolution(getMapMaker(), elements);
       } else if (cls == compiler.boundClosureClass) {
         // TODO(ngeoffray): Move the bound closure class in the
@@ -942,6 +963,8 @@
 
   void registerGetRuntimeTypeArgument(TreeElements elements) {
     enqueueInResolution(getGetRuntimeTypeArgument(), elements);
+    enqueueInResolution(getGetTypeArgumentByIndex(), elements);
+    enqueueInResolution(getCopyTypeArguments(), elements);
   }
 
   void registerGenericCallMethod(Element callMethod,
@@ -1016,7 +1039,7 @@
     if (!type.treatAsRaw || type.containsTypeVariables) {
       enqueueInResolution(getSetRuntimeTypeInfo(), elements);
       enqueueInResolution(getGetRuntimeTypeInfo(), elements);
-      enqueueInResolution(getGetRuntimeTypeArgument(), elements);
+      registerGetRuntimeTypeArgument(elements);
       if (inCheckedMode) {
         enqueueInResolution(getAssertSubtype(), elements);
       }
@@ -1225,7 +1248,10 @@
         registerCompileTimeConstant(initialValue, work.resolutionTree);
         compiler.constantHandler.addCompileTimeConstantForEmission(
             initialValue);
-        return;
+        // We don't need to generate code for static or top-level
+        // variables. For instance variables, we may need to generate
+        // the checked setter.
+        if (Elements.isStaticOrTopLevel(element)) return;
       } else {
         // If the constant-handler was not able to produce a result we have to
         // go through the builder (below) to generate the lazy initializer for
@@ -1531,6 +1557,14 @@
     return compiler.findHelper('getRuntimeTypeInfo');
   }
 
+  Element getGetTypeArgumentByIndex() {
+    return compiler.findHelper('getTypeArgumentByIndex');
+  }
+
+  Element getCopyTypeArguments() {
+    return compiler.findHelper('copyTypeArguments');
+  }
+
   Element getComputeSignature() {
     return compiler.findHelper('computeSignature');
   }
@@ -1810,6 +1844,13 @@
         && mask.satisfies(jsIndexingBehaviorInterface, compiler);
   }
 
+  bool couldBeTypedArray(TypeMask mask) {
+    TypeMask indexing = new TypeMask.subtype(jsIndexingBehaviorInterface);
+    // Checking if [mask] contains [indexing] means that we want to
+    // know if [mask] is not a more specific type than [indexing].
+    return isTypedArray(mask) || mask.containsMask(indexing, compiler);
+  }
+
   /// Called when [enqueuer] is empty, but before it is closed.
   void onQueueEmpty(Enqueuer enqueuer) {
     if (!enqueuer.isResolutionQueue && preMirrorsMethodCount == 0) {
@@ -1840,6 +1881,53 @@
     }
     customElementsAnalysis.onQueueEmpty(enqueuer);
   }
+
+  void onElementResolved(Element element, TreeElements elements) {
+    LibraryElement library = element.getLibrary();
+    if (!library.isPlatformLibrary && !library.canUseNative) return;
+    bool hasNoInline = false;
+    bool hasNoThrows = false;
+    bool hasNoSideEffects = false;
+    for (MetadataAnnotation metadata in element.metadata) {
+      metadata.ensureResolved(compiler);
+      if (!metadata.value.isConstructedObject()) continue;
+      ObjectConstant value = metadata.value;
+      ClassElement cls = value.type.element;
+      if (cls == noInlineClass) {
+        hasNoInline = true;
+        if (VERBOSE_OPTIMIZER_HINTS) {
+          compiler.reportHere(element, "Cannot inline");
+        }
+        inlineCache.markAsNonInlinable(element);
+      } else if (cls == noThrowsClass) {
+        hasNoThrows = true;
+        if (!Elements.isStaticOrTopLevelFunction(element)) {
+          compiler.internalErrorOnElement(
+              element,
+              "@NoThrows() is currently limited to top-level"
+              " or static functions");
+        }
+        if (VERBOSE_OPTIMIZER_HINTS) {
+          compiler.reportHere(element, "Cannot throw");
+        }
+        compiler.world.registerCannotThrow(element);
+      } else if (cls == noSideEffectsClass) {
+        hasNoSideEffects = true;
+        if (VERBOSE_OPTIMIZER_HINTS) {
+          compiler.reportHere(element, "Has no side effects");
+        }
+        compiler.world.registerSideEffectsFree(element);
+      }
+    }
+    if (hasNoThrows && !hasNoInline) {
+      compiler.internalErrorOnElement(
+          element, "@NoThrows() should always be combined with @NoInline");
+    }
+    if (hasNoSideEffects && !hasNoInline) {
+      compiler.internalErrorOnElement(
+          element, "@NoSideEffects() should always be combined with @NoInline");
+    }
+  }
 }
 
 /// Records that [constant] is used by [user.element].
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index e22454b..40209b2 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -226,6 +226,9 @@
   // Name of property in a class description for the native dispatch metadata.
   final String nativeSpecProperty = '%';
 
+  static final RegExp IDENTIFIER = new RegExp(r'^[A-Za-z_$][A-Za-z0-9_$]*$');
+  static final RegExp NON_IDENTIFIER_CHAR = new RegExp(r'[^A-Za-z_0-9$]');
+
   /**
    * Map from top-level or static elements to their unique identifiers provided
    * by [getName].
@@ -440,29 +443,64 @@
   String invocationMirrorInternalName(Selector selector)
       => invocationName(selector);
 
-  String instanceFieldName(Element element) {
+  /**
+   * Returns name of accessor (root to getter and setter) for a static or
+   * instance field.
+   */
+  String fieldAccessorName(Element element) {
+    return element.isInstanceMember()
+        ? instanceFieldAccessorName(element)
+        : getNameOfField(element);
+  }
+
+  /**
+   * Returns name of the JavaScript property used to store a static or instance
+   * field.
+   */
+  String fieldPropertyName(Element element) {
+    return element.isInstanceMember()
+        ? instanceFieldPropertyName(element)
+        : getNameOfField(element);
+  }
+
+  /**
+   * Returns name of accessor (root to getter and setter) for an instance field.
+   */
+  String instanceFieldAccessorName(Element element) {
     String proposedName = privateName(element.getLibrary(), element.name);
     return getMappedInstanceName(proposedName);
   }
 
-  // Construct a new name for the element based on the library and class it is
-  // in.  The name here is not important, we just need to make sure it is
-  // unique.  If we are minifying, we actually construct the name from the
-  // minified versions of the class and instance names, but the result is
-  // minified once again, so that is not visible in the end result.
-  String shadowedFieldName(Element fieldElement) {
-    // Check for following situation: Native field ${fieldElement.name} has
-    // fixed JSName ${fieldElement.nativeName()}, but a subclass shadows this
-    // name.  We normally handle that by renaming the superclass field, but we
-    // can't do that because native fields have fixed JavaScript names.
-    // In practice this can't happen because we can't inherit from native
-    // classes.
-    assert (!fieldElement.hasFixedBackendName());
+  /**
+   * Returns name of the JavaScript property used to store an instance field.
+   */
+  String instanceFieldPropertyName(Element element) {
+    if (element.hasFixedBackendName()) {
+      return element.fixedBackendName();
+    }
+    // If a class is used anywhere as a mixin, we must make the name unique so
+    // that it does not accidentally shadow.  Also, the mixin name must be
+    // constant over all mixins.
+    if (compiler.world.isUsedAsMixin(element.getEnclosingClass()) ||
+        shadowingAnotherField(element)) {
+      // Construct a new name for the element based on the library and class it
+      // is in.  The name here is not important, we just need to make sure it is
+      // unique.  If we are minifying, we actually construct the name from the
+      // minified version of the class name, but the result is minified once
+      // again, so that is not visible in the end result.
+      String libraryName = getNameOfLibrary(element.getLibrary());
+      String className = getNameOfClass(element.getEnclosingClass());
+      String instanceName = privateName(element.getLibrary(), element.name);
+      return getMappedInstanceName('$libraryName\$$className\$$instanceName');
+    }
 
-    String libraryName = getNameOfLibrary(fieldElement.getLibrary());
-    String className = getNameOfClass(fieldElement.getEnclosingClass());
-    String instanceName = instanceFieldName(fieldElement);
-    return getMappedInstanceName('$libraryName\$$className\$$instanceName');
+    String proposedName = privateName(element.getLibrary(), element.name);
+    return getMappedInstanceName(proposedName);
+  }
+
+
+  bool shadowingAnotherField(Element element) {
+    return element.getEnclosingClass().hasFieldShadowedBy(element);
   }
 
   String setterName(Element element) {
@@ -592,6 +630,15 @@
             ? name.substring(name.lastIndexOf('.') + 1)
             : name.substring(0, name.indexOf('.'));
       }
+      // The filename based name can contain all kinds of nasty characters. Make
+      // sure it is an identifier.
+      if (!IDENTIFIER.hasMatch(name)) {
+        name = name.replaceAllMapped(NON_IDENTIFIER_CHAR,
+            (match) => match[0].codeUnitAt(0).toRadixString(16));
+        if (!IDENTIFIER.hasMatch(name)) {  // e.g. starts with digit.
+          name = 'lib_$name';
+        }
+      }
     } else {
       name = element.name;
     }
@@ -718,7 +765,9 @@
       } else if (element.kind == ElementKind.SETTER) {
         return setterName(element);
       } else if (element.kind == ElementKind.FIELD) {
-        return instanceFieldName(element);
+        compiler.internalError(
+            'use instanceFieldPropertyName or instanceFieldAccessorName',
+            node: element.parseNode(compiler));
       } else {
         compiler.internalError('getName for bad kind: ${element.kind}',
                                node: element.parseNode(compiler));
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 0ddad2a6..175c932 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -288,7 +288,7 @@
         emitter.classEmitter.emitClassBuilderWithReflectionData(
             backend.namer.getNameOfClass(classElement),
             classElement, builders[classElement],
-            emitter.bufferForElement(classElement, mainBuffer));
+            emitter.getElementDecriptor(classElement));
         emitter.needsDefineClass = true;
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
index 0380bed..7ffe862 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
@@ -151,6 +151,10 @@
   }
 
   List<int> typeVariablesOf(ClassElement classElement) {
-    return typeVariables[classElement];
+    List<int> result = typeVariables[classElement];
+    if (result == null) {
+      result = const <int>[];
+    }
+    return result;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
index 626de96..86befd2 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
@@ -8,6 +8,8 @@
  * A data structure for collecting fragments of a class definition.
  */
 class ClassBuilder {
+  // TODO (sigurdm) this is just a bag of properties, rename this class
+
   final List<jsAst.Property> properties = <jsAst.Property>[];
 
   /// Set to true by user if class is indistinguishable from its superclass.
@@ -19,17 +21,7 @@
   }
 
   jsAst.Expression toObjectInitializer() {
-    return new jsAst.ObjectInitializer(properties);
+    return new jsAst.ObjectInitializer(properties, isOneLiner: false);
   }
 
-  /// This method is temporary. Do not use it unless you're working on
-  /// transforming code to build jsAst.Nodes.
-  void writeOn_DO_NOT_USE(CodeBuffer buffer,
-                          Compiler compiler,
-                          String separatedBy) {
-    for (jsAst.Property property in properties) {
-      if (!buffer.isEmpty) buffer.write(separatedBy);
-      buffer.write(jsAst.prettyPrint(property, compiler));
-    }
-  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index 888447e..97caf52 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -11,7 +11,7 @@
    * Invariant: [classElement] must be a declaration element.
    */
   void generateClass(ClassElement classElement,
-                     CodeBuffer buffer,
+                     ClassBuilder properties,
                      Map<String, jsAst.Expression> additionalProperties) {
     final onlyForRti =
         task.typeTestEmitter.rtiNeededClasses.contains(classElement);
@@ -48,7 +48,7 @@
     }
 
     emitClassBuilderWithReflectionData(
-        className, classElement, builder, buffer);
+        className, classElement, builder, properties);
   }
 
   void emitClassConstructor(ClassElement classElement,
@@ -160,8 +160,6 @@
             buffer.write(accessorName);
             if (name != accessorName) {
               buffer.write(':$name');
-              // Only the native classes can have renaming accessors.
-              assert(classIsNative);
             }
 
             int getterCode = 0;
@@ -212,7 +210,11 @@
             }
           }
           if (backend.isAccessibleByReflection(field)) {
-            buffer.write(new String.fromCharCode(REFLECTION_MARKER));
+            buffer.write('-');
+            if (backend.isNeededForReflection(field)) {
+              DartType type = field.computeType(compiler);
+              buffer.write('${task.metadataEmitter.reifyType(type)}');
+            }
           }
         }
       });
@@ -293,77 +295,66 @@
 
   void emitClassBuilderWithReflectionData(String className,
                                           ClassElement classElement,
-                                          ClassBuilder builder,
-                                          CodeBuffer buffer) {
+                                          ClassBuilder classBuilder,
+                                          ClassBuilder enclosingBuilder) {
     var metadata = task.metadataEmitter.buildMetadataFunction(classElement);
     if (metadata != null) {
-      builder.addProperty("@", metadata);
+      classBuilder.addProperty("@", metadata);
     }
 
     if (backend.isNeededForReflection(classElement)) {
       Link typeVars = classElement.typeVariables;
-      Iterable properties = [];
-      if (task.typeVariableHandler.typeVariablesOf(classElement) != null) {
-        properties = task.typeVariableHandler.typeVariablesOf(classElement)
-            .map(js.toExpression);
-      }
+      Iterable typeVariableProperties = task.typeVariableHandler
+          .typeVariablesOf(classElement).map(js.toExpression);
 
       ClassElement superclass = classElement.superclass;
       bool hasSuper = superclass != null;
-      if ((!properties.isEmpty && !hasSuper) ||
+      if ((!typeVariableProperties.isEmpty && !hasSuper) ||
           (hasSuper && superclass.typeVariables != typeVars)) {
-        builder.addProperty('<>', new jsAst.ArrayInitializer.from(properties));
+        classBuilder.addProperty('<>',
+            new jsAst.ArrayInitializer.from(typeVariableProperties));
       }
     }
-    List<CodeBuffer> classBuffers = task.elementBuffers[classElement];
-    if (classBuffers == null) {
-      classBuffers = [];
-    } else {
-      task.elementBuffers.remove(classElement);
-    }
-    CodeBuffer statics = new CodeBuffer();
-    statics.write('{$n');
-    bool hasStatics = false;
+
+    List<jsAst.Property> statics = new List<jsAst.Property>();
     ClassBuilder staticsBuilder = new ClassBuilder();
     if (emitFields(classElement, staticsBuilder, null, emitStatics: true)) {
-      hasStatics = true;
-      statics.write('"":$_');
-      statics.write(
-          jsAst.prettyPrint(staticsBuilder.properties.single.value, compiler));
-      statics.write(',$n');
+      statics.add(staticsBuilder.properties.single);
     }
-    for (CodeBuffer classBuffer in classBuffers) {
-      // TODO(ahe): What about deferred?
-      if (classBuffer != null) {
-        hasStatics = true;
-        statics.addBuffer(classBuffer);
+
+    Map<String, ClassBuilder> classPropertyLists =
+        task.elementDecriptors.remove(classElement);
+    if (classPropertyLists != null) {
+      for (ClassBuilder classProperties in classPropertyLists.values) {
+        // TODO(ahe): What about deferred?
+        if (classProperties != null) {
+          statics.addAll(classProperties.properties);
+        }
       }
     }
-    statics.write('}$n');
-    if (hasStatics) {
-      builder.addProperty('static', new jsAst.Blob(statics));
+
+    if (!statics.isEmpty) {
+      classBuilder.addProperty('static', new jsAst.ObjectInitializer(statics));
     }
 
     // TODO(ahe): This method (generateClass) should return a jsAst.Expression.
-    if (!buffer.isEmpty) {
-      buffer.write(',$n$n');
-    }
-    buffer.write('$className:$_');
-    buffer.write(jsAst.prettyPrint(builder.toObjectInitializer(), compiler));
+    enclosingBuilder.addProperty(className, classBuilder.toObjectInitializer());
+
     String reflectionName = task.getReflectionName(classElement, className);
     if (reflectionName != null) {
       if (!backend.isNeededForReflection(classElement)) {
-        buffer.write(',$n$n"+$reflectionName": 0');
+        enclosingBuilder.addProperty("+$reflectionName", js.number(0));
       } else {
-        List<int> types = <int>[];
+        List<int> types = new List<int>();
         if (classElement.supertype != null) {
-          types.add(
-              task.metadataEmitter.reifyType(classElement.supertype));
+          types.add(task.metadataEmitter.reifyType(classElement.supertype));
         }
         for (DartType interface in classElement.interfaces) {
           types.add(task.metadataEmitter.reifyType(interface));
         }
-        buffer.write(',$n$n"+$reflectionName": $types');
+        enclosingBuilder.addProperty("+$reflectionName",
+            new jsAst.ArrayInitializer.from(types.map((typeNumber) =>
+                js.number(typeNumber))));
       }
     }
   }
@@ -419,30 +410,20 @@
       // setters.
       bool needsGetter = false;
       bool needsSetter = false;
-      // We need to name shadowed fields differently, so they don't clash with
-      // the non-shadowed field.
-      bool isShadowed = false;
       if (isLibrary || isMixinNativeField || holder == element) {
         needsGetter = fieldNeedsGetter(field);
         needsSetter = fieldNeedsSetter(field);
-      } else {
-        ClassElement cls = element;
-        isShadowed = cls.isShadowedByField(field);
       }
 
       if ((isInstantiated && !holder.isNative())
           || needsGetter
           || needsSetter) {
-        String accessorName = isShadowed
-            ? namer.shadowedFieldName(field)
-            : namer.getNameOfField(field);
-        String fieldName = field.hasFixedBackendName()
-            ? field.fixedBackendName()
-            : (isMixinNativeField ? name : accessorName);
+        String accessorName = namer.fieldAccessorName(field);
+        String fieldName = namer.fieldPropertyName(field);
         bool needsCheckedSetter = false;
         if (compiler.enableTypeAssertions
             && needsSetter
-            && canGenerateCheckedSetter(field)) {
+            && !canAvoidGeneratedCheckedSetter(field)) {
           needsCheckedSetter = true;
           needsSetter = false;
         }
@@ -516,49 +497,21 @@
     return field is ClosureFieldElement;
   }
 
-  bool canGenerateCheckedSetter(VariableElement field) {
+  bool canAvoidGeneratedCheckedSetter(Element member) {
     // We never generate accessors for top-level/static fields.
-    if (!field.isInstanceMember()) return false;
-    DartType type = field.computeType(compiler).unalias(compiler);
-    if (type.element.isTypeVariable() ||
-        (type is FunctionType && type.containsTypeVariables) ||
-        type.treatAsDynamic ||
-        type.element == compiler.objectClass) {
-      // TODO(ngeoffray): Support type checks on type parameters.
-      return false;
-    }
-    return true;
+    if (!member.isInstanceMember()) return true;
+    DartType type = member.computeType(compiler);
+    return type.treatAsDynamic || (type.element == compiler.objectClass);
   }
 
   void generateCheckedSetter(Element member,
                              String fieldName,
                              String accessorName,
                              ClassBuilder builder) {
-    assert(canGenerateCheckedSetter(member));
-    DartType type = member.computeType(compiler);
-    // TODO(ahe): Generate a dynamic type error here.
-    if (type.element.isErroneous()) return;
-    type = type.unalias(compiler);
-    // TODO(11273): Support complex subtype checks.
-    type = type.asRaw();
-    CheckedModeHelper helper =
-        backend.getCheckedModeHelper(type, typeCast: false);
-    FunctionElement helperElement = helper.getElement(compiler);
-    String helperName = namer.isolateAccess(helperElement);
-    List<jsAst.Expression> arguments = <jsAst.Expression>[js('v')];
-    if (helperElement.computeSignature(compiler).parameterCount != 1) {
-      arguments.add(js.string(namer.operatorIsType(type)));
-    }
-
+    jsAst.Expression code = backend.generatedCode[member];
+    assert(code != null);
     String setterName = namer.setterNameFromAccessorName(accessorName);
-    String receiver = backend.isInterceptorClass(member.getEnclosingClass())
-        ? 'receiver' : 'this';
-    List<String> args = backend.isInterceptedMethod(member)
-        ? ['receiver', 'v']
-        : ['v'];
-    builder.addProperty(setterName,
-        js.fun(args,
-            js('$receiver.$fieldName = #', js(helperName)(arguments))));
+    builder.addProperty(setterName, code);
     generateReflectionDataForFieldGetterOrSetter(
         member, setterName, builder, isGetter: false);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index dd2d293..156e0de 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -25,7 +25,7 @@
   ConstantEmitter constantEmitter;
   NativeEmitter nativeEmitter;
   CodeBuffer mainBuffer;
-  final CodeBuffer deferredLibraries = new CodeBuffer();
+  final CodeBuffer deferredLibrariesBuffer = new CodeBuffer();
   final CodeBuffer deferredConstants = new CodeBuffer();
   /** Shorter access to [isolatePropertiesName]. Both here in the code, as
       well as in the generated code. */
@@ -70,14 +70,20 @@
   bool hasMakeConstantList = false;
 
   /**
-   * For classes and libraries, record code for static/top-level members.
-   * Later, this code is emitted when the class or library is emitted.
-   * See [bufferForElement].
+   * Accumulate properties for classes and libraries, describing their
+   * static/top-level members.
+   * Later, these members are emitted when the class or library is emitted.
+   *
+   * For supporting deferred loading we keep one list per output unit.
+   *
+   * The String determines the outputUnit, either "main" or "deferred"
+   *
+   * See [getElementDecriptor].
    */
   // TODO(ahe): Generate statics with their class, and store only libraries in
   // this map.
-  final Map<Element, List<CodeBuffer>> elementBuffers =
-      new Map<Element, List<CodeBuffer>>();
+  final Map<Element, Map<String, ClassBuilder>> elementDecriptors
+      = new Map<Element, Map<String, ClassBuilder>>();
 
   final bool generateSourceMap;
 
@@ -123,6 +129,7 @@
       => '${namer.isolateName}.${namer.isolatePropertiesName}';
   String get lazyInitializerName
       => '${namer.isolateName}.\$lazy';
+  String get initName => 'init';
 
   jsAst.FunctionDeclaration get generateAccessorFunction {
     const RANGE1_SIZE = RANGE1_LAST - RANGE1_FIRST + 1;
@@ -137,16 +144,14 @@
     String reflectableField = namer.reflectableField;
 
     // function generateAccessor(field, prototype, cls) {
-    jsAst.Fun fun = js.fun(['field', 'accessors', 'cls'], [
+    jsAst.Fun fun = js.fun(['fieldDescriptor', 'accessors', 'cls'], [
+      js('var fieldInformation = fieldDescriptor.split("-")'),
+      js('var field = fieldInformation[0]'),
       js('var len = field.length'),
       js('var code = field.charCodeAt(len - 1)'),
-      js('var reflectable = false'),
-      js.if_('code == $REFLECTION_MARKER', [
-          js('len--'),
-          js('code = field.charCodeAt(len - 1)'),
-          js('field = field.substring(0, len)'),
-          js('reflectable = true')
-      ]),
+      js('var reflectable'),
+      js.if_('fieldInformation.length > 1', js('reflectable = true'),
+             js('reflectable = false')),
       js('code = ((code >= $RANGE1_FIRST) && (code <= $RANGE1_LAST))'
           '    ? code - $RANGE1_ADJUST'
           '    : ((code >= $RANGE2_FIRST) && (code <= $RANGE2_LAST))'
@@ -738,9 +743,9 @@
         js.fun([r'$collectedClasses'], precompiledFunction));
   }
 
-  void generateClass(ClassElement classElement, CodeBuffer buffer) {
+  void generateClass(ClassElement classElement, ClassBuilder properties) {
     classEmitter.generateClass(
-        classElement, buffer, additionalProperties[classElement]);
+        classElement, properties, additionalProperties[classElement]);
   }
 
   int _selectorRank(Selector selector) {
@@ -803,7 +808,7 @@
     }
   }
 
-  void emitStaticFunctions(CodeBuffer eagerBuffer) {
+  void emitStaticFunctions() {
     bool isStaticFunction(Element element) =>
         !element.isInstanceMember() && !element.isField();
 
@@ -813,8 +818,7 @@
     for (Element element in Elements.sortedByPosition(elements)) {
       ClassBuilder builder = new ClassBuilder();
       containerBuilder.addMember(element, builder);
-      builder.writeOn_DO_NOT_USE(
-          bufferForElement(element, eagerBuffer), compiler, ',$n$n');
+      getElementDecriptor(element).properties.addAll(builder.properties);
     }
   }
 
@@ -924,9 +928,9 @@
     hasMakeConstantList = true;
     buffer
         ..write(namer.isolateName)
-        ..write(r'''.makeConstantList = function(list) {
-  list.immutable$list = true;
-  list.fixed$length = true;
+        ..write('''.makeConstantList = function(list) {
+  list.immutable\$list = $initName;
+  list.fixed\$length = $initName;
   return list;
 };
 ''');
@@ -1139,6 +1143,46 @@
 ''');
   }
 
+  void writeLibraryDescriptors(LibraryElement library) {
+    var uri = library.canonicalUri;
+    if (uri.scheme == 'file' && compiler.sourceMapUri != null) {
+      // TODO(ahe): It is a hack to use compiler.sourceMapUri
+      // here.  It should be relative to the main JavaScript
+      // output file.
+      uri = relativize(
+          compiler.sourceMapUri, library.canonicalUri, false);
+    }
+    Map<String, ClassBuilder> descriptors =
+        elementDecriptors[library];
+
+    Map<String, CodeBuffer> outputBuffers =
+      {"main": mainBuffer,
+       "deferred": deferredLibrariesBuffer};
+
+    for (String outputUnit in outputBuffers.keys) {
+      ClassBuilder descriptor =
+          descriptors.putIfAbsent(outputUnit, ()
+              => new ClassBuilder());
+      if (descriptor.properties.isEmpty) continue;
+      bool isDeferred = outputUnit != "main";
+      jsAst.Fun metadata = metadataEmitter.buildMetadataFunction(library);
+
+      jsAst.ObjectInitializer initializers =
+          descriptor.toObjectInitializer();
+      outputBuffers[outputUnit]
+          ..write('["${library.getLibraryName()}",$_')
+          ..write('"${uri}",$_')
+          ..write(metadata == null ? "" : jsAst.prettyPrint(metadata, compiler))
+          ..write(isDeferred ? '[]' : '')
+          ..write(',$_')
+          ..write(namer.globalObjectFor(library))
+          ..write(',$_')
+          ..write(jsAst.prettyPrint(initializers, compiler))
+          ..write(library == compiler.mainApp ? ',${n}1' : "")
+          ..write('],$n');
+    }
+  }
+
   String assembleProgram() {
     measure(() {
       // Compute the required type checks to know which classes need a
@@ -1172,7 +1216,7 @@
       mainBuffer.add(
           '$isolateProperties$_=$_$isolatePropertiesName$N');
 
-      emitStaticFunctions(mainBuffer);
+      emitStaticFunctions();
 
       if (!regularClasses.isEmpty ||
           !deferredClasses.isEmpty ||
@@ -1201,7 +1245,7 @@
       // Might create methodClosures.
       if (!regularClasses.isEmpty) {
         for (ClassElement element in regularClasses) {
-          generateClass(element, bufferForElement(element, mainBuffer));
+          generateClass(element, getElementDecriptor(element));
         }
       }
 
@@ -1211,7 +1255,7 @@
       // Might create methodClosures.
       if (!deferredClasses.isEmpty) {
         for (ClassElement element in deferredClasses) {
-          generateClass(element, bufferForElement(element, mainBuffer));
+          generateClass(element, getElementDecriptor(element));
         }
       }
 
@@ -1232,14 +1276,14 @@
       // the classesCollector variable.
       classesCollector = 'classesCollector should not be used from now on';
 
-      if (!elementBuffers.isEmpty) {
+      if (!elementDecriptors.isEmpty) {
         var oldClassesCollector = classesCollector;
         classesCollector = r"$$";
         if (compiler.enableMinification) {
           mainBuffer.write(';');
         }
 
-        for (Element element in elementBuffers.keys) {
+        for (Element element in elementDecriptors.keys) {
           // TODO(ahe): Should iterate over all libraries.  Otherwise, we will
           // not see libraries that only have fields.
           if (element.isLibrary()) {
@@ -1247,15 +1291,8 @@
             ClassBuilder builder = new ClassBuilder();
             if (classEmitter.emitFields(
                     library, builder, null, emitStatics: true)) {
-              List<CodeBuffer> buffers = elementBuffers[library];
-              var buffer = buffers[0];
-              if (buffer == null) {
-                buffers[0] = buffer = new CodeBuffer();
-              }
-              for (jsAst.Property property in builder.properties) {
-                if (!buffer.isEmpty) buffer.write(',$n');
-                buffer.addBuffer(jsAst.prettyPrint(property, compiler));
-              }
+              getElementDescriptorForOutputUnit(library, "main")
+                  .properties.addAll(builder.properties);
             }
           }
         }
@@ -1298,64 +1335,24 @@
             ..write('([$n');
 
         List<Element> sortedElements =
-            Elements.sortedByPosition(elementBuffers.keys);
-        bool hasPendingStatics = false;
-        for (Element element in sortedElements) {
-          if (!element.isLibrary()) {
-            for (CodeBuffer b in elementBuffers[element]) {
-              if (b != null) {
-                hasPendingStatics = true;
-                compiler.reportInfo(
-                    element, MessageKind.GENERIC, {'text': 'Pending statics.'});
-                print(b.getText());
-              }
-            }
-            continue;
-          }
-          LibraryElement library = element;
-          List<CodeBuffer> buffers = elementBuffers[library];
-          var buffer = buffers[0];
-          var uri = library.canonicalUri;
-          if (uri.scheme == 'file' && compiler.sourceMapUri != null) {
-            // TODO(ahe): It is a hack to use compiler.sourceMapUri
-            // here.  It should be relative to the main JavaScript
-            // output file.
-            uri = relativize(
-                compiler.sourceMapUri, library.canonicalUri, false);
-          }
-          if (buffer != null) {
-            var metadata = metadataEmitter.buildMetadataFunction(library);
-            mainBuffer
-                ..write('["${library.getLibraryName()}",$_')
-                ..write('"${uri}",$_')
-                ..write(metadata == null
-                        ? "" : jsAst.prettyPrint(metadata, compiler))
-                ..write(',$_')
-                ..write(namer.globalObjectFor(library))
-                ..write(',$_')
-                ..write('{$n')
-                ..addBuffer(buffer)
-                ..write('}');
-            if (library == compiler.mainApp) {
-              mainBuffer.write(',${n}1');
-            }
-            mainBuffer.write('],$n');
-          }
-          buffer = buffers[1];
-          if (buffer != null) {
-            deferredLibraries
-                ..write('["${library.getLibraryName()}",$_')
-                ..write('"${uri}",$_')
-                ..write('[],$_')
-                ..write(namer.globalObjectFor(library))
-                ..write(',$_')
-                ..write('{$n')
-                ..addBuffer(buffer)
-                ..write('}],$n');
-          }
-          elementBuffers[library] = const [];
+            Elements.sortedByPosition(elementDecriptors.keys);
+
+        Iterable<Element> pendingStatics = sortedElements.where((element) {
+            return !element.isLibrary() &&
+                elementDecriptors[element].values.any((descriptor) =>
+                    descriptor != null);
+        });
+
+        pendingStatics.forEach((element) =>
+            compiler.reportInfo(
+                element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
+
+        for (LibraryElement library in sortedElements.where((element) =>
+            element.isLibrary())) {
+          writeLibraryDescriptors(library);
+          elementDecriptors[library] = const {};
         }
-        if (hasPendingStatics) {
+        if (!pendingStatics.isEmpty) {
           compiler.internalError('Pending statics (see above).');
         }
         mainBuffer.write('])$N');
@@ -1368,14 +1365,15 @@
 
       typeTestEmitter.emitRuntimeTypeSupport(mainBuffer);
       interceptorEmitter.emitGetInterceptorMethods(mainBuffer);
+      interceptorEmitter.emitOneShotInterceptors(mainBuffer);
       // Constants in checked mode call into RTI code to set type information
-      // which may need getInterceptor methods, so we have to make sure that
-      // [emitGetInterceptorMethods] has been called.
+      // which may need getInterceptor (and one-shot interceptor) methods, so
+      // we have to make sure that [emitGetInterceptorMethods] and
+      // [emitOneShotInterceptors] have been called.
       emitCompileTimeConstants(mainBuffer);
       // Static field initializations require the classes and compile-time
       // constants to be set up.
       emitStaticNonFinalFieldInitializations(mainBuffer);
-      interceptorEmitter.emitOneShotInterceptors(mainBuffer);
       interceptorEmitter.emitInterceptedNames(mainBuffer);
       interceptorEmitter.emitMapTypeToInterceptor(mainBuffer);
       emitLazilyInitializedStaticFields(mainBuffer);
@@ -1467,7 +1465,16 @@
     return compiler.assembledCode;
   }
 
-  CodeBuffer bufferForElement(Element element, CodeBuffer eagerBuffer) {
+  ClassBuilder getElementDescriptorForOutputUnit(Element element,
+      String outputUnit) {
+    Map<String, ClassBuilder> descriptors =
+        elementDecriptors.putIfAbsent(
+            element, () => new Map<String, ClassBuilder>());
+    return descriptors.putIfAbsent(outputUnit,
+        () => new ClassBuilder());
+  }
+
+  ClassBuilder getElementDecriptor(Element element) {
     Element owner = element.getLibrary();
     if (!element.isTopLevel() && !element.isNative()) {
       // For static (not top level) elements, record their code in a buffer
@@ -1483,15 +1490,8 @@
     if (owner == null) {
       compiler.internalErrorOnElement(element, 'Owner is null');
     }
-    List<CodeBuffer> buffers = elementBuffers.putIfAbsent(
-        owner, () => <CodeBuffer>[null, null]);
-    bool deferred = isDeferred(element);
-    int index = deferred ? 1 : 0;
-    CodeBuffer buffer = buffers[index];
-    if (buffer == null) {
-      buffer = buffers[index] = new CodeBuffer();
-    }
-    return buffer;
+    String outputUnit = isDeferred(element) ? "deferred" : "main";
+    return getElementDescriptorForOutputUnit(owner, outputUnit);
   }
 
   /**
@@ -1516,14 +1516,14 @@
 
 
   void emitDeferredCode() {
-    if (deferredLibraries.isEmpty && deferredConstants.isEmpty) return;
+    if (deferredLibrariesBuffer.isEmpty && deferredConstants.isEmpty) return;
 
     var oldClassesCollector = classesCollector;
     classesCollector = r"$$";
 
     // It does not make sense to defer constants if there are no
     // deferred elements.
-    assert(!deferredLibraries.isEmpty);
+    assert(!deferredLibrariesBuffer.isEmpty);
 
     var buffer = new CodeBuffer()
         ..write(buildGeneratedBy())
@@ -1539,7 +1539,7 @@
                 '$classesCollector$_=$_{};$n')
         ..write(getReflectionDataParser(classesCollector, namer))
         ..write('([$n')
-        ..addBuffer(deferredLibraries)
+        ..addBuffer(deferredLibrariesBuffer)
         ..write('])$N');
 
     if (!deferredClasses.isEmpty) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 882e0aa..276d339 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -402,7 +402,7 @@
     bool inInterceptor = backend.isInterceptedMethod(member);
     List<String> fieldNames = <String>[];
     compiler.boundClosureClass.forEachInstanceField((_, Element field) {
-      fieldNames.add(namer.getNameOfInstanceMember(field));
+      fieldNames.add(namer.instanceFieldPropertyName(field));
     });
 
     ClassElement classElement = member.getEnclosingClass();
@@ -525,9 +525,7 @@
                 ? <jsAst.Expression>[js(receiverArgumentName)]
                 : <jsAst.Expression>[]);
       } else {
-        String fieldName = member.hasFixedBackendName()
-            ? member.fixedBackendName()
-            : namer.instanceFieldName(member);
+        String fieldName = namer.instanceFieldPropertyName(member);
         return js('this')[fieldName];
       }
     }
@@ -604,7 +602,7 @@
   }
 
   void addMemberMethod(FunctionElement member, ClassBuilder builder) {
-    if (member.isAbstract(compiler)) return;
+    if (member.isAbstract) return;
     jsAst.Expression code = backend.generatedCode[member];
     if (code == null) return;
     String name = namer.getNameOfMember(member);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
index f21d3d8..fb2cf01 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
@@ -82,4 +82,3 @@
 const RANGE2_LAST = 0x7e;
 const RANGE3_FIRST = 0x25;   //  %&'()*+  encodes 10..16
 const RANGE3_LAST = 0x2b;
-const REFLECTION_MARKER = 0x2d;
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
index 0a578ef..955acd0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
@@ -68,8 +68,7 @@
         Element thisElement =
             closureData.freeVariableMapping[closureData.thisElement];
         if (thisElement != null) {
-          assert(thisElement.hasFixedBackendName());
-          String thisName = thisElement.fixedBackendName();
+          String thisName = namer.instanceFieldPropertyName(thisElement);
           thisAccess = js('this')[js.string(thisName)];
         }
       }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 86ef658..4bb7c50 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -455,7 +455,8 @@
 
   Map<Uri, LibraryMirror> get libraries {
     _ensureLibraries();
-    return new ImmutableMapWrapper<Uri, LibraryMirror>(_libraries);
+    return new FilteredImmutableMap<Uri, LibraryMirror>(_libraries,
+        (library) => !library._element.isInternalLibrary);
   }
 
   Dart2JsLibraryMirror _getLibrary(LibraryElement element) =>
@@ -518,6 +519,8 @@
 class Dart2JsLibraryMirror extends Dart2JsContainerMirror
     implements LibraryMirror {
   Map<String, ClassMirror> _classes;
+  List<LibraryDependencyMirror> _libraryDependencies;
+
 
   Dart2JsLibraryMirror(Dart2JsMirrorSystem system, LibraryElement library)
       : super(system, library);
@@ -617,6 +620,89 @@
     }
     return null;
   }
+
+  void _ensureLibraryDependenciesAnalyzed() {
+    if (_libraryDependencies == null) {
+      _libraryDependencies = <LibraryDependencyMirror>[];
+      for (LibraryTag node in _library.tags.reverse()) {
+        LibraryDependency libraryDependency = node.asLibraryDependency();
+        if (libraryDependency != null) {
+          LibraryElement targetLibraryElement =
+              _library.getLibraryFromTag(libraryDependency);
+          assert(targetLibraryElement != null);
+          LibraryMirror targetLibrary =
+              mirrors._getLibrary(targetLibraryElement);
+          _libraryDependencies.add(new Dart2JsLibraryDependencyMirror(
+              libraryDependency, this, targetLibrary));
+        }
+      }
+    }
+  }
+
+  List<LibraryDependencyMirror> get libraryDependencies {
+    _ensureLibraryDependenciesAnalyzed();
+    return _libraryDependencies;
+  }
+}
+
+class Dart2JsLibraryDependencyMirror implements LibraryDependencyMirror {
+  final LibraryDependency _node;
+  final Dart2JsLibraryMirror _sourceLibrary;
+  final Dart2JsLibraryMirror _targetLibrary;
+  List<CombinatorMirror> _combinators;
+
+  Dart2JsLibraryDependencyMirror(this._node,
+                                 this._sourceLibrary,
+                                 this._targetLibrary);
+
+  SourceLocation get location {
+    return new Dart2JsSourceLocation(
+      _sourceLibrary._library.entryCompilationUnit.script,
+      _sourceLibrary.mirrors.compiler.spanFromNode(_node));
+  }
+
+  List<CombinatorMirror> get combinators {
+    if (_combinators == null) {
+      _combinators = <CombinatorMirror>[];
+      if (_node.combinators != null) {
+        for (Combinator combinator in _node.combinators.nodes) {
+          List<String> identifiers = <String>[];
+          for (Identifier identifier in combinator.identifiers.nodes) {
+            identifiers.add(identifier.source);
+          }
+          _combinators.add(new Dart2JsCombinatorMirror(
+              identifiers, isShow: combinator.isShow));
+        }
+      }
+    }
+    return _combinators;
+  }
+
+  LibraryMirror get sourceLibrary => _sourceLibrary;
+
+  LibraryMirror get targetLibrary => _targetLibrary;
+
+  String get prefix {
+    Import import = _node.asImport();
+    if (import != null && import.prefix != null) {
+      return import.prefix.source;
+    }
+    return null;
+  }
+
+  bool get isImport => _node.asImport() != null;
+
+  bool get isExport => _node.asExport() != null;
+}
+
+class Dart2JsCombinatorMirror implements CombinatorMirror {
+  final List<String> identifiers;
+  final bool isShow;
+
+  Dart2JsCombinatorMirror(this.identifiers, {bool isShow: true})
+      : this.isShow = isShow;
+
+  bool get isHide => !isShow;
 }
 
 class Dart2JsSourceLocation implements SourceLocation {
@@ -1410,7 +1496,7 @@
       mirrors, _function.computeSignature(mirrors.compiler).returnType,
       mirrors.compiler.types.dynamicType);
 
-  bool get isAbstract => _function.isAbstract(mirrors.compiler);
+  bool get isAbstract => _function.isAbstract;
 
   bool get isRegularMethod => !(isGetter || isSetter || isConstructor);
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
index 8e83643..5acdfa0 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
@@ -303,6 +303,49 @@
    * Returns the canonical URI for this library.
    */
   Uri get uri;
+
+  /**
+   * Returns a list of the imports and exports in this library;
+   */
+  List<LibraryDependencyMirror> get libraryDependencies;
+}
+
+/// A mirror on an import or export declaration.
+abstract class LibraryDependencyMirror {
+  /// Is `true` if this dependency is an import.
+  bool get isImport;
+
+  /// Is `true` if this dependency is an export.
+  bool get isExport;
+
+  /// Returns the library mirror of the library that imports or exports the
+  /// [targetLibrary].
+  LibraryMirror get sourceLibrary;
+
+  /// Returns the library mirror of the library that is imported or exported.
+  LibraryMirror get targetLibrary;
+
+  /// Returns the prefix if this is a prefixed import and `null` otherwise.
+  String get prefix;
+
+  /// Returns the list of show/hide combinators on the import/export
+  /// declaration.
+  List<CombinatorMirror> get combinators;
+
+  /// Returns the source location for this import/export declaration.
+  SourceLocation get location;
+}
+
+/// A mirror on a show/hide combinator declared on a library dependency.
+abstract class CombinatorMirror {
+  /// The list of identifiers on the combinator.
+  List<String> get identifiers;
+
+  /// Is `true` if this is a 'show' combinator.
+  bool get isShow;
+
+  /// Is `true` if this is a 'hide' combinator.
+  bool get isHide;
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
index 4336d05..1c7323f 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
@@ -172,6 +172,14 @@
   }
 }
 
+/// Returns `true` if [cls] is declared in a private dart library.
+bool isFromPrivateDartLibrary(ClassMirror cls) {
+  if (isMixinApplication(cls)) cls = cls.mixin;
+  var uri = cls.library.uri;
+  return uri.scheme == 'dart' && uri.path.startsWith('_');
+}
+
+/// Returns `true` if [mirror] reflects a mixin application.
 bool isMixinApplication(Mirror mirror) {
   return mirror is ClassMirror && mirror.mixin != mirror;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 699f026..aa8b76a 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -604,29 +604,54 @@
   }
 
   void resolveRedirectionChain(FunctionElement constructor, Spannable node) {
-    FunctionElementX current = constructor;
+    FunctionElementX target = constructor;
+    InterfaceType targetType;
     List<Element> seen = new List<Element>();
     // Follow the chain of redirections and check for cycles.
-    while (current != current.defaultImplementation) {
-      if (current.internalRedirectionTarget != null) {
+    while (target != target.defaultImplementation) {
+      if (target.internalRedirectionTarget != null) {
         // We found a constructor that already has been processed.
-        current = current.internalRedirectionTarget;
+        targetType = target.redirectionTargetType;
+        assert(invariant(target, targetType != null,
+            message: 'Redirection target type has not been computed for '
+                     '$target'));
+        target = target.internalRedirectionTarget;
         break;
       }
-      Element target = current.defaultImplementation;
-      if (seen.contains(target)) {
+
+      Element nextTarget = target.defaultImplementation;
+      if (seen.contains(nextTarget)) {
         error(node, MessageKind.CYCLIC_REDIRECTING_FACTORY);
         break;
       }
-      seen.add(current);
-      current = target;
+      seen.add(target);
+      target = nextTarget;
     }
-    // [current] is now the actual target of the redirections.  Run through
+
+    if (targetType == null) {
+      assert(!target.isRedirectingFactory);
+      targetType = target.getEnclosingClass().thisType;
+    }
+
+    // [target] is now the actual target of the redirections.  Run through
     // the constructors again and set their [redirectionTarget], so that we
-    // do not have to run the loop for these constructors again.
+    // do not have to run the loop for these constructors again. Furthermore,
+    // compute [redirectionTargetType] for each factory by computing the
+    // substitution of the target type with respect to the factory type.
     while (!seen.isEmpty) {
       FunctionElementX factory = seen.removeLast();
-      factory.redirectionTarget = current;
+
+      TreeElements treeElements =
+          compiler.enqueuer.resolution.getCachedElements(factory);
+      FunctionExpression functionNode = factory.parseNode(compiler);
+      Return redirectionNode = functionNode.body;
+      InterfaceType factoryType =
+          treeElements.getType(redirectionNode.expression);
+
+      targetType = targetType.subst(factoryType.typeArguments,
+                                    factoryType.element.typeVariables);
+      factory.redirectionTarget = target;
+      factory.redirectionTargetType = targetType;
     }
   }
 
@@ -962,7 +987,7 @@
   }
 
   void checkOverrideHashCode(FunctionElement operatorEquals) {
-    if (operatorEquals.isAbstract(compiler)) return;
+    if (operatorEquals.isAbstract) return;
     ClassElement cls = operatorEquals.getEnclosingClass();
     Element hashCodeImplementation =
         cls.lookupLocalMember('hashCode');
@@ -3019,7 +3044,7 @@
     if (constructor.isFactoryConstructor() && !type.typeArguments.isEmpty) {
       world.registerFactoryWithTypeArguments(mapping);
     }
-    if (constructor.isGenerativeConstructor() && cls.isAbstract(compiler)) {
+    if (constructor.isGenerativeConstructor() && cls.isAbstract) {
       warning(node, MessageKind.ABSTRACT_CLASS_INSTANTIATION);
       compiler.backend.registerAbstractClassInstantiation(mapping);
     }
@@ -3387,7 +3412,7 @@
           MessageKind.TYPE_VARIABLE_IN_CONSTANT);
     }
     mapping.setType(node, mapType);
-    world.registerInstantiatedClass(compiler.mapClass, mapping);
+    world.registerInstantiatedType(mapType, mapping);
     if (node.isConst()) {
       compiler.backend.registerConstantMap(mapping);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
index 689f844..eaf9feb 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
@@ -128,9 +128,11 @@
       kind = (identical(getOrSet.stringValue, 'get'))
              ? ElementKind.GETTER : ElementKind.SETTER;
     }
+    bool hasNoBody = !isConstructor && !method.hasBody();
     Element memberElement =
         new PartialFunctionElement(name, beginToken, getOrSet, endToken,
-                                   kind, method.modifiers, enclosingElement);
+                                   kind, method.modifiers, enclosingElement,
+                                   hasNoBody);
     addMember(memberElement);
   }
 
@@ -149,8 +151,8 @@
     }
     ElementKind kind = ElementKind.FUNCTION;
     Element memberElement =
-        new PartialFunctionElement(name, beginToken, null, endToken,
-                                   kind, method.modifiers, enclosingElement);
+        new PartialFunctionElement(name, beginToken, null, endToken, kind,
+                                   method.modifiers, enclosingElement, false);
     addMember(memberElement);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index be3ca45..a35be99 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -136,6 +136,9 @@
   void handleNoFunctionBody(Token token) {
   }
 
+  void skippedFunctionBody(Token token) {
+  }
+
   void beginFunctionName(Token token) {
   }
 
@@ -538,8 +541,9 @@
     return skipToEof(token);
   }
 
-  void expectedIdentifier(Token token) {
+  Token expectedIdentifier(Token token) {
     error("expected identifier, but got '${token.value}'", token);
+    return skipToEof(token);
   }
 
   Token expectedType(Token token) {
@@ -842,8 +846,8 @@
       kind = ElementKind.SETTER;
     }
     pushElement(new PartialFunctionElement(name.source, beginToken, getOrSet,
-                                           endToken, kind,
-                                           modifiers, compilationUnitElement));
+                                           endToken, kind, modifiers,
+                                           compilationUnitElement, false));
   }
 
   void endTopLevelFields(int count, Token beginToken, Token endToken) {
@@ -948,10 +952,16 @@
     return skipToEof(token);
   }
 
-  void expectedIdentifier(Token token) {
-    listener.cancel("expected identifier, but got '${token.value}'",
-                    token: token);
-    pushNode(null);
+  Token expectedIdentifier(Token token) {
+    if (token is KeywordToken) {
+      reportError(
+          token, MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
+          {'keyword': token.value});
+    } else {
+      listener.cancel(
+          "Error: Expected identifier, but got '${token.value}'", token: token);
+    }
+    return token;
   }
 
   Token expectedType(Token token) {
@@ -1233,8 +1243,8 @@
       kind = ElementKind.SETTER;
     }
     pushElement(new PartialFunctionElement(name.source, beginToken, getOrSet,
-                                           endToken, kind,
-                                           modifiers, compilationUnitElement));
+                                           endToken, kind, modifiers,
+                                           compilationUnitElement, false));
   }
 
   void endFormalParameter(Token thisKeyword) {
@@ -1456,8 +1466,12 @@
     }
   }
 
+  void skippedFunctionBody(Token token) {
+    pushNode(new Block(new NodeList.empty()));
+  }
+
   void handleNoFunctionBody(Token token) {
-    pushNode(null);
+    pushNode(new EmptyStatement(token));
   }
 
   void endFunction(Token getOrSet, Token endToken) {
@@ -1885,14 +1899,27 @@
   final Token getOrSet;
   final Token endToken;
 
+  /**
+   * The position is computed in the constructor using [findMyName]. Computing
+   * it on demand fails in case tokens are GC'd.
+   */
+  final Token _position;
+
   PartialFunctionElement(String name,
-                         Token this.beginToken,
-                         Token this.getOrSet,
-                         Token this.endToken,
+                         Token beginToken,
+                         this.getOrSet,
+                         this.endToken,
                          ElementKind kind,
                          Modifiers modifiers,
-                         Element enclosing)
-    : super(name, kind, modifiers, enclosing);
+                         Element enclosing,
+                         bool hasNoBody)
+    : super(name, kind, modifiers, enclosing, hasNoBody),
+      beginToken = beginToken,
+      _position = ElementX.findNameToken(
+          beginToken,
+          modifiers.isFactory() ||
+            identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR),
+          name, enclosing.name);
 
   FunctionExpression parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
@@ -1907,19 +1934,7 @@
     return cachedNode;
   }
 
-  Token position() {
-    return findMyName(beginToken);
-  }
-
-  PartialFunctionElement cloneTo(Element enclosing,
-                                 DiagnosticListener listener) {
-    if (patch != null) {
-      listener.cancel("Cloning a patched function.", element: this);
-    }
-    PartialFunctionElement result = new PartialFunctionElement(
-        name, beginToken, getOrSet, endToken, kind, modifiers, enclosing);
-    return result;
-  }
+  Token position() => _position;
 }
 
 class PartialFieldListElement extends VariableListElementX {
@@ -1949,13 +1964,6 @@
   }
 
   Token position() => beginToken; // findMyName doesn't work. I'm nameless.
-
-  PartialFieldListElement cloneTo(Element enclosing,
-                                  DiagnosticListener listener) {
-    PartialFieldListElement result = new PartialFieldListElement(
-        beginToken, endToken, modifiers, enclosing);
-    return result;
-  }
 }
 
 class PartialTypedefElement extends TypedefElementX {
@@ -1972,14 +1980,7 @@
     return cachedNode;
   }
 
-  position() => findMyName(token);
-
-  PartialTypedefElement cloneTo(Element enclosing,
-                                DiagnosticListener listener) {
-    PartialTypedefElement result =
-        new PartialTypedefElement(name, enclosing, token);
-    return result;
-  }
+  Token position() => findMyName(token);
 }
 
 /// A [MetadataAnnotation] which is constructed on demand.
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index 0750ff3..af56bf9 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -543,11 +543,10 @@
   }
 
   Token parseIdentifier(Token token) {
-    if (token.isIdentifier()) {
-      listener.handleIdentifier(token);
-    } else {
-      listener.expectedIdentifier(token);
+    if (!token.isIdentifier()) {
+      token = listener.expectedIdentifier(token);
     }
+    listener.handleIdentifier(token);
     return token.next;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
index 8054487..0181c88 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
@@ -102,19 +102,19 @@
       if (!allowAbstract) {
         listener.reportError(token, MessageKind.BODY_EXPECTED);
       }
-      // No body.
-    } else if (identical(value, '=>')) {
-      token = parseExpression(token.next);
-      expectSemicolon(token);
-    } else if (value == '=') {
-      token = parseRedirectingFactoryBody(token);
-      expectSemicolon(token);
+      listener.handleNoFunctionBody(token);
     } else {
-      token = skipBlock(token);
+      if (identical(value, '=>')) {
+        token = parseExpression(token.next);
+        expectSemicolon(token);
+      } else if (value == '=') {
+        token = parseRedirectingFactoryBody(token);
+        expectSemicolon(token);
+      } else {
+        token = skipBlock(token);
+      }
+      listener.skippedFunctionBody(token);
     }
-    // There is no "skipped function body event", so we use
-    // handleNoFunctionBody instead.
-    listener.handleNoFunctionBody(token);
     return token;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
index 9e3815b..68aea9f 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
@@ -8,7 +8,8 @@
 
 import '../elements/elements.dart';
 import '../elements/modelx.dart'
-    show FunctionElementX,
+    show ElementX,
+         FunctionElementX,
          TypedefElementX,
          VariableElementX,
          VariableListElementX,
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 6bd3a04..3635a62 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -45,8 +45,12 @@
                    kind == ElementKind.SETTER) {
           graph = builder.buildMethod(element);
         } else if (kind == ElementKind.FIELD) {
-          assert(!element.isInstanceMember());
-          graph = builder.buildLazyInitializer(element);
+          if (element.isInstanceMember()) {
+            assert(compiler.enableTypeAssertions);
+            graph = builder.buildCheckedSetter(element);
+          } else {
+            graph = builder.buildLazyInitializer(element);
+          }
         } else {
           compiler.internalErrorOnElement(element,
                                           'unexpected element kind $kind');
@@ -945,6 +949,13 @@
     }
   }
 
+  /**
+   * Returns whether this builder is building code for [element].
+   */
+  bool isBuildingFor(Element element) {
+    return work.element == element;
+  }
+
   /// A stack of [DartType]s the have been seen during inlining of factory
   /// constructors.  These types are preserved in [HInvokeStatic]s and
   /// [HForeignNews] inside the inline code and registered during code
@@ -1073,6 +1084,22 @@
     return closeFunction();
   }
 
+  HGraph buildCheckedSetter(VariableElement field) {
+    openFunction(field, field.parseNode(compiler));
+    HInstruction thisInstruction = localsHandler.readThis();
+    // Use dynamic type because the type computed by the inferrer is
+    // narrowed to the type annotation.
+    HInstruction parameter = new HParameterValue(field, backend.dynamicType);
+    // Add the parameter as the last instruction of the entry block.
+    // If the method is intercepted, we want the actual receiver
+    // to be the first parameter.
+    graph.entry.addBefore(graph.entry.last, parameter);
+    HInstruction value =
+        potentiallyCheckType(parameter, field.computeType(compiler));
+    add(new HFieldSet(field, thisInstruction, value));
+    return closeFunction();
+  }
+
   HGraph buildLazyInitializer(VariableElement variable) {
     SendSet node = variable.parseNode(compiler);
     openFunction(variable, node);
@@ -1337,6 +1364,7 @@
 
       int numParameters = function.functionSignature.parameterCount;
       int maxInliningNodes;
+      bool useMaxInliningNodes = true;
       if (insideLoop) {
         maxInliningNodes = InlineWeeder.INLINING_NODES_INSIDE_LOOP +
             InlineWeeder.INLINING_NODES_INSIDE_LOOP_ARG_FACTOR * numParameters;
@@ -1344,8 +1372,18 @@
         maxInliningNodes = InlineWeeder.INLINING_NODES_OUTSIDE_LOOP +
             InlineWeeder.INLINING_NODES_OUTSIDE_LOOP_ARG_FACTOR * numParameters;
       }
+
+      // If a method is called only once, and all the methods in the
+      // inlining stack are called only once as well, we know we will
+      // save on output size by inlining this method.
+      TypesInferrer inferrer = compiler.typesTask.typesInferrer;
+      if (inferrer.isCalledOnce(element)
+          && (inliningStack.every(
+                  (entry) => inferrer.isCalledOnce(entry.function)))) {
+        useMaxInliningNodes = false;
+      }
       bool canBeInlined = InlineWeeder.canBeInlined(
-          functionExpression, maxInliningNodes);
+          functionExpression, maxInliningNodes, useMaxInliningNodes);
       if (canBeInlined) {
         backend.inlineCache.markAsInlinable(element, insideLoop: insideLoop);
       } else {
@@ -1746,11 +1784,72 @@
     removeInlinedInstantiation(type);
     // Create the runtime type information, if needed.
     if (backend.classNeedsRti(classElement)) {
-      List<HInstruction> rtiInputs = <HInstruction>[];
+      // Read the values of the type arguments and create a list to set on the
+      // newly create object.  We can identify the case where the new list
+      // would be of the form:
+      //  [getTypeArgumentByIndex(this, 0), .., getTypeArgumentByIndex(this, k)]
+      // and k is the number of type arguments of this.  If this is the case,
+      // we can simply copy the list from this.
+
+      // These locals are modified by [isIndexedTypeArgumentGet].
+      HInstruction source;  // The source of the type arguments.
+      bool allIndexed = true;
+      int expectedIndex = 0;
+      ClassElement contextClass;  // The class of `this`.
+      Link typeVariables;  // The list of 'remaining type variables' of `this`.
+
+      /// Helper to identify instructions that read a type variable without
+      /// substitution (that is, directly use the index). These instructions
+      /// are of the form:
+      ///   HInvokeStatic(getTypeArgumentByIndex, this, index)
+      ///
+      /// Return `true` if [instruction] is of that form and the index is the
+      /// next index in the sequence (held in [expectedIndex]).
+      bool isIndexedTypeArgumentGet(HInstruction instruction) {
+        if (instruction is! HInvokeStatic) return false;
+        HInvokeStatic invoke = instruction;
+        if (invoke.element != backend.getGetTypeArgumentByIndex()) {
+          return false;
+        }
+        HConstant index = invoke.inputs[1];
+        HInstruction newSource = invoke.inputs[0];
+        if (newSource is! HThis) {
+          return false;
+        }
+        if (source == null) {
+          // This is the first match. Extract the context class for the type
+          // variables and get the list of type variables to keep track of how
+          // many arguments we need to process.
+          source = newSource;
+          contextClass = source.sourceElement.getEnclosingClass();
+          typeVariables = contextClass.typeVariables;
+        } else {
+          assert(source == newSource);
+        }
+        // If there are no more type variables, then there are more type
+        // arguments for the new object than the source has, and it can't be
+        // a copy.  Otherwise remove one argument.
+        if (typeVariables.isEmpty) return false;
+        typeVariables = typeVariables.tail;
+        // Check that the index is the one we expect.
+        IntConstant constant = index.constant;
+        return constant.value == expectedIndex++;
+      }
+
+      List<HInstruction> typeArguments = <HInstruction>[];
       classElement.typeVariables.forEach((TypeVariableType typeVariable) {
-        rtiInputs.add(localsHandler.readLocal(typeVariable.element));
+        HInstruction argument = localsHandler.readLocal(typeVariable.element);
+        if (allIndexed && !isIndexedTypeArgumentGet(argument)) {
+          allIndexed = false;
+        }
+        typeArguments.add(argument);
       });
-      callSetRuntimeTypeInfo(classElement, rtiInputs, newObject);
+
+      if (source != null && allIndexed && typeVariables.isEmpty) {
+        copyRuntimeTypeInfo(source, newObject);
+      } else {
+        callSetRuntimeTypeInfo(classElement, typeArguments, newObject);
+      }
     }
 
     // Generate calls to the constructor bodies.
@@ -3533,6 +3632,15 @@
     }
   }
 
+  bool needsSubstitutionForTypeVariableAccess(ClassElement cls) {
+    if (compiler.world.isUsedAsMixin(cls)) return true;
+
+    Set<ClassElement> subclasses = compiler.world.subclassesOf(cls);
+    return subclasses != null && subclasses.any((ClassElement subclass) {
+      return !backend.rti.isTrivialSubstitution(subclass, cls);
+    });
+  }
+
   /**
    * Generate code to extract the type arguments from the object, substitute
    * them as an instance of the type we are testing against (if necessary), and
@@ -3542,20 +3650,28 @@
   HInstruction readTypeVariable(ClassElement cls,
                                 TypeVariableElement variable) {
     assert(currentElement.isInstanceMember());
-    int index = RuntimeTypes.getTypeVariableIndex(variable);
-    // TODO(ahe): Creating a string here is unfortunate. It is slow (due to
-    // string concatenation in the implementation), and may prevent
-    // segmentation of '$'.
-    String substitutionNameString = backend.namer.getNameForRti(cls);
-    HInstruction substitutionName = graph.addConstantString(
-        new LiteralDartString(substitutionNameString), null, compiler);
+
     HInstruction target = localsHandler.readThis();
-    pushInvokeStatic(null,
-                     backend.getGetRuntimeTypeArgument(),
-                     [target,
-                      substitutionName,
-                      graph.addConstantInt(index, compiler)],
-                      backend.dynamicType);
+    HConstant index = graph.addConstantInt(
+        RuntimeTypes.getTypeVariableIndex(variable),
+        compiler);
+
+    if (needsSubstitutionForTypeVariableAccess(cls)) {
+      // TODO(ahe): Creating a string here is unfortunate. It is slow (due to
+      // string concatenation in the implementation), and may prevent
+      // segmentation of '$'.
+      String substitutionNameString = backend.namer.getNameForRti(cls);
+      HInstruction substitutionName = graph.addConstantString(
+          new LiteralDartString(substitutionNameString), null, compiler);
+      pushInvokeStatic(null,
+                       backend.getGetRuntimeTypeArgument(),
+                       [target, substitutionName, index],
+                        backend.dynamicType);
+    } else {
+      pushInvokeStatic(null, backend.getGetTypeArgumentByIndex(),
+          [target, index],
+          backend.dynamicType);
+    }
     return pop();
   }
 
@@ -3599,7 +3715,13 @@
         // The type variable is stored in a parameter of the method.
         return localsHandler.readLocal(type.element);
       }
-    } else if (isInConstructorContext || member.isField()) {
+    } else if (isInConstructorContext ||
+               // When [member] is a field, we can be either
+               // generating a checked setter or inlining its
+               // initializer in a constructor. An initializer is
+               // never built standalone, so [isBuildingFor] will
+               // always return true when seeing one.
+               (member.isField() && !isBuildingFor(member))) {
       // The type variable is stored in a parameter of the method.
       return localsHandler.readLocal(type.element);
     } else if (member.isInstanceMember()) {
@@ -3620,6 +3742,10 @@
       return graph.addConstantNull(compiler);
     }
 
+    if (argument.kind == TypeKind.TYPE_VARIABLE) {
+      return addTypeVariableReference(argument);
+    }
+
     List<HInstruction> inputs = <HInstruction>[];
 
     String template = rti.getTypeRepresentationWithHashes(argument, (variable) {
@@ -3645,6 +3771,12 @@
     }
   }
 
+  void copyRuntimeTypeInfo(HInstruction source, HInstruction target) {
+    Element copyHelper = backend.getCopyTypeArguments();
+    pushInvokeStatic(null, copyHelper, [source, target]);
+    pop();
+  }
+
   void callSetRuntimeTypeInfo(ClassElement element,
                               List<HInstruction> rtiInputs,
                               HInstruction newObject) {
@@ -3667,7 +3799,6 @@
 
   handleNewSend(NewExpression node) {
     Send send = node.send;
-    bool isListConstructor = false;
     bool isFixedList = false;
 
     TypeMask computeType(element) {
@@ -3675,7 +3806,6 @@
       if (Elements.isFixedListConstructorCall(originalElement, send, compiler)
           || Elements.isFilledListConstructorCall(
                   originalElement, send, compiler)) {
-        isListConstructor = true;
         isFixedList = true;
         TypeMask inferred =
             TypeMaskFactory.inferredForNode(currentElement, send, compiler);
@@ -3684,7 +3814,6 @@
             : inferred;
       } else if (Elements.isGrowableListConstructorCall(
                     originalElement, send, compiler)) {
-        isListConstructor = true;
         TypeMask inferred =
             TypeMaskFactory.inferredForNode(currentElement, send, compiler);
         return inferred.containsAll(compiler)
@@ -3715,6 +3844,8 @@
 
     final bool isSymbolConstructor =
         functionElement == compiler.symbolConstructor;
+    final bool isJSArrayTypedConstructor =
+        functionElement == backend.jsArrayTypedConstructor;
 
     if (isSymbolConstructor) {
       constructor = compiler.symbolValidatedConstructor;
@@ -3727,10 +3858,7 @@
 
     bool isRedirected = functionElement.isRedirectingFactory;
     InterfaceType type = elements.getType(node);
-    DartType expectedType = type;
-    if (isRedirected) {
-      type = functionElement.computeTargetType(compiler, type);
-    }
+    InterfaceType expectedType = functionElement.computeTargetType(type);
 
     if (checkTypeVariableBounds(node, type)) return;
 
@@ -3751,20 +3879,21 @@
     }
 
     ClassElement cls = constructor.getEnclosingClass();
-    if (cls.isAbstract(compiler) && constructor.isGenerativeConstructor()) {
+    if (cls.isAbstract && constructor.isGenerativeConstructor()) {
       generateAbstractClassInstantiationError(send, cls.name);
       return;
     }
     if (backend.classNeedsRti(cls)) {
       Link<DartType> typeVariable = cls.typeVariables;
-      type.typeArguments.forEach((DartType argument) {
+      expectedType.typeArguments.forEach((DartType argument) {
         inputs.add(analyzeTypeArgument(argument));
         typeVariable = typeVariable.tail;
       });
       assert(typeVariable.isEmpty);
     }
 
-    if (constructor.isFactoryConstructor() && !type.typeArguments.isEmpty) {
+    if (constructor.isFactoryConstructor() &&
+        !expectedType.typeArguments.isEmpty) {
       compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
     }
     TypeMask elementType = computeType(constructor);
@@ -3782,13 +3911,14 @@
     // not know about the type argument. Therefore we special case
     // this constructor to have the setRuntimeTypeInfo called where
     // the 'new' is done.
-    if (isListConstructor && backend.classNeedsRti(compiler.listClass)) {
+    if (isJSArrayTypedConstructor &&
+        backend.classNeedsRti(compiler.listClass)) {
       handleListConstructor(type, send, newInstance);
     }
 
     // Finally, if we called a redirecting factory constructor, check the type.
     if (isRedirected) {
-      HInstruction checked = potentiallyCheckType(newInstance, expectedType);
+      HInstruction checked = potentiallyCheckType(newInstance, type);
       if (checked != newInstance) {
         pop();
         stack.add(checked);
@@ -4129,14 +4259,12 @@
     inputs.addAll(arguments);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
     if (selector.isGetter()) {
-      bool hasGetter = compiler.world.hasAnyUserDefinedGetter(selector);
       pushWithPosition(
-          new HInvokeDynamicGetter(selector, null, inputs, type, !hasGetter),
+          new HInvokeDynamicGetter(selector, null, inputs, type),
           location);
     } else if (selector.isSetter()) {
-      bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector);
       pushWithPosition(
-          new HInvokeDynamicSetter(selector, null, inputs, type, !hasSetter),
+          new HInvokeDynamicSetter(selector, null, inputs, type),
           location);
     } else {
       pushWithPosition(
@@ -4148,7 +4276,7 @@
   void pushInvokeStatic(Node location,
                         Element element,
                         List<HInstruction> arguments,
-                        [TypeMask type = null]) {
+                        [TypeMask type]) {
     if (tryInlineMethod(element, null, arguments, location)) {
       return;
     }
@@ -4156,10 +4284,11 @@
     if (type == null) {
       type = TypeMaskFactory.inferredReturnTypeForElement(element, compiler);
     }
+    bool targetCanThrow = !compiler.world.getCannotThrow(element);
     // TODO(5346): Try to avoid the need for calling [declaration] before
     // creating an [HInvokeStatic].
-    HInvokeStatic instruction =
-        new HInvokeStatic(element.declaration, arguments, type);
+    HInvokeStatic instruction = new HInvokeStatic(
+        element.declaration, arguments, type, targetCanThrow: targetCanThrow);
     if (!currentInlinedInstantiations.isEmpty) {
       instruction.instantiatedTypes = new List<DartType>.from(
           currentInlinedInstantiations);
@@ -4200,7 +4329,7 @@
         inputs,
         type,
         isSetter: selector.isSetter() || selector.isIndexSet());
-    instruction.sideEffects = compiler.world.getSideEffectsOfElement(element);
+    instruction.sideEffects = compiler.world.getSideEffectsOfSelector(selector);
     return instruction;
   }
 
@@ -5430,18 +5559,22 @@
   bool tooDifficult = false;
   int nodeCount = 0;
   final int maxInliningNodes;
+  final bool useMaxInliningNodes;
 
-  InlineWeeder(this.maxInliningNodes);
+  InlineWeeder(this.maxInliningNodes, this.useMaxInliningNodes);
 
   static bool canBeInlined(FunctionExpression functionExpression,
-                           int maxInliningNodes) {
-    InlineWeeder weeder = new InlineWeeder(maxInliningNodes);
+                           int maxInliningNodes,
+                           bool useMaxInliningNodes) {
+    InlineWeeder weeder =
+        new InlineWeeder(maxInliningNodes, useMaxInliningNodes);
     weeder.visit(functionExpression.initializers);
     weeder.visit(functionExpression.body);
     return !weeder.tooDifficult;
   }
 
   bool registerNode() {
+    if (!useMaxInliningNodes) return true;
     if (nodeCount++ > maxInliningNodes) {
       tooDifficult = true;
       return false;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index d77bd2b..68646d9 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1617,11 +1617,7 @@
     world.registerStaticUse(superMethod);
     ClassElement superClass = superMethod.getEnclosingClass();
     if (superMethod.kind == ElementKind.FIELD) {
-      String fieldName = superMethod.hasFixedBackendName()
-          ? superMethod.fixedBackendName()
-          : node.caller.isShadowedByField(superMethod)
-              ? backend.namer.shadowedFieldName(superMethod)
-              : backend.namer.instanceFieldName(superMethod);
+      String fieldName = backend.namer.instanceFieldPropertyName(superMethod);
       use(node.inputs[0]);
       js.PropertyAccess access =
           new js.PropertyAccess.field(pop(), fieldName);
@@ -1664,32 +1660,9 @@
       // We're accessing a native JavaScript property called 'length'
       // on a JS String or a JS array. Therefore, the name of that
       // property should not be mangled.
-      if (backend.isTypedArray(node.receiver.instructionType)) {
-        // TODO(12929): Remove this custom code for typed arrays once V8
-        // optimizes their length access.
-        // Do a call to `fetchLength` instead of accessing `length`
-        // directly. Because `fetchLength` is a constant we use its
-        // constant value instead.
-        if (node.usedBy.isEmpty) {
-          // The length access has not been removed because it is
-          // acting as a null check. For a faster null check, we use
-          // toString.
-          push(new js.PropertyAccess.field(pop(), 'toString'), node);
-        } else {
-          Element element = compiler.findRequiredElement(
-              compiler.typedDataLibrary, 'fetchLength');
-          Constant constant =
-              compiler.constantHandler.getConstantForVariable(element);
-          assert(invariant(element, constant != null,
-              message: 'No constant computed for $element'));
-          var jsConstant = backend.emitter.constantReference(constant);
-          push(new js.Call(jsConstant, [pop()]), node);
-        }
-      } else {
-        push(new js.PropertyAccess.field(pop(), 'length'), node);
-      }
+      push(new js.PropertyAccess.field(pop(), 'length'), node);
     } else {
-      String name = _fieldPropertyName(element);
+      String name = backend.namer.instanceFieldPropertyName(element);
       push(new js.PropertyAccess.field(pop(), name), node);
       world.registerFieldGetter(element);
     }
@@ -1698,7 +1671,7 @@
   visitFieldSet(HFieldSet node) {
     Element element = node.element;
     world.registerFieldSetter(element);
-    String name = _fieldPropertyName(element);
+    String name = backend.namer.instanceFieldPropertyName(element);
     use(node.receiver);
     js.Expression receiver = pop();
     use(node.value);
@@ -1706,10 +1679,6 @@
         node);
   }
 
-  String _fieldPropertyName(Element element) => element.hasFixedBackendName()
-      ? element.fixedBackendName()
-      : backend.namer.getNameOfInstanceMember(element);
-
   visitLocalGet(HLocalGet node) {
     use(node.receiver);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index a0bfc14..b193fa2 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -261,23 +261,19 @@
     if (constant == null) return false;
 
     Selector selector = node.selector;
-    // TODO(ngeoffray): make one shot interceptors know whether
-    // they have side effects.
     HInstruction instruction;
     if (selector.isGetter()) {
       instruction = new HInvokeDynamicGetter(
           selector,
           node.element,
           <HInstruction>[constant, node.inputs[1]],
-          node.instructionType,
-          false);
+          node.instructionType);
     } else if (node.selector.isSetter()) {
       instruction = new HInvokeDynamicSetter(
           selector,
           node.element,
           <HInstruction>[constant, node.inputs[1], node.inputs[2]],
-          node.instructionType,
-          false);
+          node.instructionType);
     } else {
       List<HInstruction> inputs = new List<HInstruction>.from(node.inputs);
       inputs[0] = constant;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
index b0ed907..87088e8 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -17,13 +17,11 @@
                                      Compiler compiler) {
     Selector selector = instruction.selector;
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
-    // TODO(ngeoffray): Because we don't know yet the side effects of
-    // a JS call, we sometimes know more in the compiler about the
-    // side effects of an element (for example operator% on the int
-    // class). We should remove this check once we analyze JS calls.
-    if (!instruction.useGvn()) {
-      instruction.sideEffects =
-          compiler.world.getSideEffectsOfSelector(selector);
+    instruction.sideEffects = compiler.world.getSideEffectsOfSelector(selector);
+    if (!instruction.sideEffects.hasSideEffects()) {
+      instruction.setUseGvn();
+    } else {
+      instruction.clearUseGvn();
     }
     return type;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 426d329..c319986 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -811,6 +811,7 @@
 
   bool useGvn() => _useGvn;
   void setUseGvn() { _useGvn = true; }
+  void clearUseGvn() { _useGvn = false; }
 
   void updateInput(int i, HInstruction insn) {
     assert(insn != null);
@@ -1390,41 +1391,23 @@
 }
 
 abstract class HInvokeDynamicField extends HInvokeDynamic {
-  final bool isSideEffectFree;
   HInvokeDynamicField(
       Selector selector, Element element, List<HInstruction> inputs,
-      TypeMask type, this.isSideEffectFree)
+      TypeMask type)
       : super(selector, element, inputs, type);
   toString() => 'invoke dynamic field: $selector';
 }
 
 class HInvokeDynamicGetter extends HInvokeDynamicField {
-  HInvokeDynamicGetter(selector, element, inputs, type, isSideEffectFree)
-    : super(selector, element, inputs, type, isSideEffectFree) {
-    sideEffects.clearAllSideEffects();
-    if (isSideEffectFree) {
-      setUseGvn();
-      sideEffects.setDependsOnInstancePropertyStore();
-    } else {
-      sideEffects.setDependsOnSomething();
-      sideEffects.setAllSideEffects();
-    }
-  }
+  HInvokeDynamicGetter(selector, element, inputs, type)
+    : super(selector, element, inputs, type);
   toString() => 'invoke dynamic getter: $selector';
   accept(HVisitor visitor) => visitor.visitInvokeDynamicGetter(this);
 }
 
 class HInvokeDynamicSetter extends HInvokeDynamicField {
-  HInvokeDynamicSetter(selector, element, inputs, type, isSideEffectFree)
-    : super(selector, element, inputs, type, isSideEffectFree) {
-    sideEffects.clearAllSideEffects();
-    if (isSideEffectFree) {
-      sideEffects.setChangesInstanceProperty();
-    } else {
-      sideEffects.setAllSideEffects();
-      sideEffects.setDependsOnSomething();
-    }
-  }
+  HInvokeDynamicSetter(selector, element, inputs, type)
+    : super(selector, element, inputs, type);
   toString() => 'invoke dynamic setter: $selector';
   accept(HVisitor visitor) => visitor.visitInvokeDynamicSetter(this);
 }
@@ -1432,6 +1415,10 @@
 class HInvokeStatic extends HInvoke {
   final Element element;
 
+  final bool targetCanThrow;
+
+  bool canThrow() => targetCanThrow;
+
   /// If this instruction is a call to a constructor, [instantiatedTypes]
   /// contains the type(s) used in the (Dart) `New` expression(s).
   /// The [instructionType] of this node is not enough, because we also need
@@ -1439,7 +1426,9 @@
   List<DartType> instantiatedTypes;
 
   /** The first input must be the target. */
-  HInvokeStatic(this.element, inputs, TypeMask type) : super(inputs, type);
+  HInvokeStatic(this.element, inputs, TypeMask type,
+                {this.targetCanThrow: true})
+    : super(inputs, type);
 
   toString() => 'invoke static: ${element.name}';
   accept(HVisitor visitor) => visitor.visitInvokeStatic(this);
@@ -1501,6 +1490,7 @@
             : element.isAssignable(),
         super(element, <HInstruction>[receiver], type) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     setUseGvn();
     if (this.isAssignable) {
       sideEffects.setDependsOnInstancePropertyStore();
@@ -1539,6 +1529,7 @@
       : super(element, <HInstruction>[receiver, value],
               const TypeMask.nonNullEmpty()) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     sideEffects.setChangesInstanceProperty();
   }
 
@@ -1631,6 +1622,7 @@
   HInvokeBinary(HInstruction left, HInstruction right, this.selector, type)
       : super(<HInstruction>[left, right], type) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     setUseGvn();
   }
 
@@ -1767,6 +1759,7 @@
   HInvokeUnary(HInstruction input, this.selector, type)
       : super(<HInstruction>[input], type) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     setUseGvn();
   }
 
@@ -2110,6 +2103,7 @@
     assert(element != null);
     assert(invariant(this, element.isDeclaration));
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     if (element.isAssignable()) {
       sideEffects.setDependsOnStaticPropertyStore();
     }
@@ -2132,6 +2126,7 @@
   HInterceptor(HInstruction receiver, TypeMask type)
       : super(<HInstruction>[receiver], type) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     setUseGvn();
   }
   String toString() => 'interceptor on $interceptedClasses';
@@ -2197,6 +2192,7 @@
   HStaticStore(this.element, HInstruction value)
       : super(<HInstruction>[value], const TypeMask.nonNullEmpty()) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     sideEffects.setChangesStaticProperty();
   }
   toString() => 'static store ${element.name}';
@@ -2223,6 +2219,7 @@
   HIndex(HInstruction receiver, HInstruction index, this.selector, type)
       : super(<HInstruction>[receiver, index], type) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     sideEffects.setDependsOnIndexStore();
     setUseGvn();
   }
@@ -2235,6 +2232,7 @@
 
   HInstruction getDartReceiver(Compiler compiler) => receiver;
   bool onlyThrowsNSM() => true;
+  bool canThrow() => receiver.canBeNull();
 
   int typeCode() => HInstruction.INDEX_TYPECODE;
   bool typeEquals(HInstruction other) => other is HIndex;
@@ -2254,6 +2252,7 @@
       : super(<HInstruction>[receiver, index, value],
               const TypeMask.nonNullEmpty()) {
     sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
     sideEffects.setChangesIndex();
   }
   String toString() => 'index assign operator';
@@ -2265,6 +2264,7 @@
 
   HInstruction getDartReceiver(Compiler compiler) => receiver;
   bool onlyThrowsNSM() => true;
+  bool canThrow() => receiver.canBeNull();
 }
 
 class HIs extends HInstruction {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 1a16f4c..364fdc5 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -57,6 +57,9 @@
           // updated because they now have different inputs.
           new SsaTypePropagator(compiler),
           new SsaCodeMotion(),
+          new SsaLoadElimination(compiler),
+          new SsaDeadPhiEliminator(),
+          new SsaTypePropagator(compiler),
           new SsaValueRangeAnalyzer(compiler, constantSystem, work),
           // Previous optimizations may have generated new
           // opportunities for instruction simplification.
@@ -79,6 +82,19 @@
   }
 }
 
+bool isFixedLength(mask, Compiler compiler) {
+  JavaScriptBackend backend = compiler.backend;
+  if (mask.isContainer && mask.length != null) {
+    // A container on which we have inferred the length.
+    return true;
+  } else if (mask.containsOnly(backend.jsFixedArrayClass)
+             || mask.containsOnlyString(compiler)
+             || backend.isTypedArray(mask)) {
+    return true;
+  }
+  return false;
+}
+
 /**
  * If both inputs to known operations are available execute the operation at
  * compile-time.
@@ -196,19 +212,10 @@
         return graph.addConstantInt(constant.length, compiler);
       }
       Element element = backend.jsIndexableLength;
-      var mask = actualReceiver.instructionType;
-      bool isFixedLength = false;
-      if (mask.isContainer && mask.length != null) {
-        // A container on which we have inferred the length.
-        isFixedLength = true;
-      } else if (mask.containsOnly(backend.jsFixedArrayClass)
-                 || mask.containsOnlyString(compiler)
-                 || backend.isTypedArray(mask)) {
-        isFixedLength = true;
-      }
+      bool isFixed = isFixedLength(actualReceiver.instructionType, compiler);
       HFieldGet result = new HFieldGet(
           element, actualReceiver, backend.intType,
-          isAssignable: !isFixedLength);
+          isAssignable: !isFixed);
       return result;
     } else if (actualReceiver.isConstantMap()) {
       HConstant constantInput = actualReceiver;
@@ -688,19 +695,7 @@
 
   HInstruction directFieldGet(HInstruction receiver, Element field) {
     Modifiers modifiers = field.modifiers;
-    bool isAssignable = !(modifiers.isFinal() || modifiers.isConst());
-    if (!compiler.resolverWorld.hasInvokedSetter(field, compiler)) {
-      // If no setter is ever used for this field it is only initialized in the
-      // initializer list.
-      isAssignable = false;
-    }
-    if (field.isNative()) {
-      // Some native fields are views of data that may be changed by operations.
-      // E.g. node.firstChild depends on parentNode.removeBefore(n1, n2).
-      // TODO(sra): Refine the effect classification so that native effects are
-      // distinct from ordinary Dart effects.
-      isAssignable = true;
-    }
+    bool isAssignable = !compiler.world.fieldNeverChanges(field);
 
     TypeMask type;
     if (field.getEnclosingClass().isNative()) {
@@ -835,11 +830,9 @@
                                  HInstruction array,
                                  HInstruction indexArgument) {
     Compiler compiler = backend.compiler;
-    bool isAssignable =
-        !array.isFixedArray(compiler) && !array.isString(compiler);
     HFieldGet length = new HFieldGet(
         backend.jsIndexableLength, array, backend.intType,
-        isAssignable: isAssignable);
+        isAssignable: !isFixedLength(array.instructionType, compiler));
     indexNode.block.addBefore(indexNode, length);
 
     HBoundsCheck check = new HBoundsCheck(
@@ -1524,3 +1517,416 @@
     }
   }
 }
+
+/**
+ * Optimization phase that tries to eliminate memory loads (for
+ * example [HFieldGet]), when it knows the value stored in that memory
+ * location.
+ */
+class SsaLoadElimination extends HBaseVisitor implements OptimizationPhase {
+  final Compiler compiler;
+  final String name = "SsaLoadElimination";
+  MemorySet memorySet;
+  List<MemorySet> memories;
+
+  SsaLoadElimination(this.compiler);
+
+  visitGraph(HGraph graph) {
+    memories = new List<MemorySet>(graph.blocks.length);
+    visitDominatorTree(graph);
+  }
+
+  visitBasicBlock(HBasicBlock block) {
+    if (block.predecessors.length == 0) {
+      // Entry block.
+      memorySet = new MemorySet(compiler);
+    } else if (block.predecessors.length == 1
+               && block.predecessors[0].successors.length == 1) {
+      // No need to clone, there is no other successor for
+      // `block.predecessors[0]`, and this block has only one
+      // predecessor. Since we are not going to visit
+      // `block.predecessors[0]` again, we can just re-use its
+      // [memorySet].
+      memorySet = memories[block.predecessors[0].id];
+    } else if (block.isLoopHeader()) {
+      // We currently do not handle loops.
+      memorySet = new MemorySet(compiler);
+    } else if (block.predecessors.length == 1) {
+      // Clone the memorySet of the predecessor, because it is also used
+      // by other successors of it.
+      memorySet = memories[block.predecessors[0].id].clone();
+    } else {
+      // Compute the intersection of all predecessors.
+      memorySet = memories[block.predecessors[0].id];
+      for (int i = 1; i < block.predecessors.length; i++) {
+        memorySet = memorySet.intersectionFor(
+          memories[block.predecessors[i].id], block, i);
+      }
+    }
+    memories[block.id] = memorySet;
+    HInstruction instruction = block.first;
+    while (instruction != null) {
+      HInstruction next = instruction.next;
+      instruction.accept(this);
+      instruction = next;
+    }
+  }
+
+  void visitFieldGet(HFieldGet instruction) {
+    if (instruction.isNullCheck) return;
+    Element element = instruction.element;
+    HInstruction receiver =
+        instruction.getDartReceiver(compiler).nonCheck();
+    HInstruction existing = memorySet.lookupFieldValue(element, receiver);
+    if (existing != null) {
+      instruction.block.rewriteWithBetterUser(instruction, existing);
+      instruction.block.remove(instruction);
+    } else {
+      memorySet.registerFieldValue(element, receiver, instruction);
+    }
+  }
+
+  void visitFieldSet(HFieldSet instruction) {
+    HInstruction receiver =
+        instruction.getDartReceiver(compiler).nonCheck();
+    memorySet.registerFieldValueUpdate(
+        instruction.element, receiver, instruction.inputs.last);
+  }
+
+  void visitForeignNew(HForeignNew instruction) {
+    memorySet.registerAllocation(instruction);
+    int argumentIndex = 0;
+    instruction.element.forEachInstanceField((_, Element member) {
+      memorySet.registerFieldValue(
+          member, instruction, instruction.inputs[argumentIndex++]);
+    }, includeSuperAndInjectedMembers: true);
+    // In case this instruction has as input non-escaping objects, we
+    // need to mark these objects as escaping.
+    memorySet.killAffectedBy(instruction);
+  }
+
+  void visitInstruction(HInstruction instruction) {
+    memorySet.killAffectedBy(instruction);
+  }
+
+  void visitLazyStatic(HLazyStatic instruction) {
+    handleStaticLoad(instruction.element, instruction);
+  }
+
+  void handleStaticLoad(Element element, HInstruction instruction) {
+    HInstruction existing = memorySet.lookupFieldValue(element, null);
+    if (existing != null) {
+      instruction.block.rewriteWithBetterUser(instruction, existing);
+      instruction.block.remove(instruction);
+    } else {
+      memorySet.registerFieldValue(element, null, instruction);
+    }
+  }
+
+  void visitStatic(HStatic instruction) {
+    handleStaticLoad(instruction.element, instruction);
+  }
+
+  void visitStaticStore(HStaticStore instruction) {
+    memorySet.registerFieldValueUpdate(
+        instruction.element, null, instruction.inputs.last);
+  }
+
+  void visitLiteralList(HLiteralList instruction) {
+    memorySet.registerAllocation(instruction);
+    memorySet.killAffectedBy(instruction);
+  }
+
+  void visitIndex(HIndex instruction) {
+    HInstruction receiver = instruction.receiver.nonCheck();
+    HInstruction existing =
+        memorySet.lookupKeyedValue(receiver, instruction.index);
+    if (existing != null) {
+      instruction.block.rewriteWithBetterUser(instruction, existing);
+      instruction.block.remove(instruction);
+    } else {
+      memorySet.registerKeyedValue(receiver, instruction.index, instruction);
+    }
+  }
+
+  void visitIndexAssign(HIndexAssign instruction) {
+    HInstruction receiver = instruction.receiver.nonCheck();
+    memorySet.registerKeyedValueUpdate(
+        receiver, instruction.index, instruction.value);
+  }
+}
+
+/**
+ * Holds values of memory places.
+ */
+class MemorySet {
+  final Compiler compiler;
+
+  /**
+   * Maps a field to a map of receiver to value.
+   */
+  final Map<Element, Map<HInstruction, HInstruction>> fieldValues =
+      <Element, Map<HInstruction, HInstruction>> {};
+
+  /**
+   * Maps a receiver to a map of keys to value.
+   */
+  final Map<HInstruction, Map<HInstruction, HInstruction>> keyedValues =
+      <HInstruction, Map<HInstruction, HInstruction>> {};
+
+  /**
+   * Set of objects that we know don't escape the current function.
+   */
+  final Setlet<HInstruction> nonEscapingReceivers = new Setlet<HInstruction>();
+
+  MemorySet(this.compiler);
+
+  /**
+   * Returns whether [first] and [second] may alias to the same
+   * object.
+   */
+  bool mayAlias(HInstruction first, HInstruction second) {
+    if (first == second) return true;
+    if (isConcrete(first) && isConcrete(second)) return false;
+    if (nonEscapingReceivers.contains(first)) return false;
+    if (nonEscapingReceivers.contains(second)) return false;
+    TypeMask intersection = first.instructionType.intersection(
+        second.instructionType, compiler);
+    if (intersection.isEmpty) return false;
+    return true;
+  }
+
+  bool isFinal(Element element) {
+    return compiler.world.fieldNeverChanges(element);
+  }
+
+  bool isConcrete(HInstruction instruction) {
+    return instruction is HForeignNew
+        || instruction is HConstant
+        || instruction is HLiteralList;
+  }
+
+  /**
+   * Returns whether [receiver] escapes the current function.
+   */
+  bool escapes(HInstruction receiver) {
+    return !nonEscapingReceivers.contains(receiver);
+  }
+
+  void registerAllocation(HInstruction instruction) {
+    nonEscapingReceivers.add(instruction);
+  }
+
+  /**
+   * Sets `receiver.element` to contain [value]. Kills all potential
+   * places that may be affected by this update.
+   */
+  void registerFieldValueUpdate(Element element,
+                                HInstruction receiver,
+                                HInstruction value) {
+    if (element.isNative()) return; // TODO(14955): Remove this restriction?
+    // [value] is being set in some place in memory, we remove it from
+    // the non-escaping set.
+    nonEscapingReceivers.remove(value);
+    Map<HInstruction, HInstruction> map = fieldValues.putIfAbsent(
+        element, () => <HInstruction, HInstruction> {});
+    map.forEach((key, value) {
+      if (mayAlias(receiver, key)) map[key] = null;
+    });
+    map[receiver] = value;
+  }
+
+  /**
+   * Registers that `receiver.element` is now [value].
+   */
+  void registerFieldValue(Element element,
+                          HInstruction receiver,
+                          HInstruction value) {
+    if (element.isNative()) return; // TODO(14955): Remove this restriction?
+    Map<HInstruction, HInstruction> map = fieldValues.putIfAbsent(
+        element, () => <HInstruction, HInstruction> {});
+    map[receiver] = value;
+  }
+
+  /**
+   * Returns the value stored in `receiver.element`. Returns null if
+   * we don't know.
+   */
+  HInstruction lookupFieldValue(Element element, HInstruction receiver) {
+    Map<HInstruction, HInstruction> map = fieldValues[element];
+    return (map == null) ? null : map[receiver];
+  }
+
+  /**
+   * Kill all places that may be affected by this [instruction]. Also
+   * update the set of non-escaping objects in case [instruction] has
+   * non-escaping objects in its inputs.
+   */
+  void killAffectedBy(HInstruction instruction) {
+    // Even if [instruction] does not have side effects, it may use
+    // non-escaping objects and store them in a new object, which
+    // make these objects escaping.
+    // TODO(ngeoffray): We need a new side effect flag to know whether
+    // an instruction allocates an object.
+    instruction.inputs.forEach((input) {
+      nonEscapingReceivers.remove(input);
+    });
+
+    if (instruction.sideEffects.changesInstanceProperty()
+        || instruction.sideEffects.changesStaticProperty()) {
+      fieldValues.forEach((element, map) {
+        if (isFinal(element)) return;
+        map.forEach((receiver, value) {
+          if (escapes(receiver)) {
+            map[receiver] = null;
+          }
+        });
+      });
+    }
+
+    if (instruction.sideEffects.changesIndex()) {
+      keyedValues.forEach((receiver, map) {
+        if (escapes(receiver)) {
+          map.forEach((index, value) {
+            map[index] = null;
+          });
+        }
+      });
+    }
+  }
+
+  /**
+   * Returns the value stored in `receiver[index]`. Returns null if
+   * we don't know.
+   */
+  HInstruction lookupKeyedValue(HInstruction receiver, HInstruction index) {
+    Map<HInstruction, HInstruction> map = keyedValues[receiver];
+    return (map == null) ? null : map[index];
+  }
+
+  /**
+   * Registers that `receiver[index]` is now [value].
+   */
+  void registerKeyedValue(HInstruction receiver,
+                          HInstruction index,
+                          HInstruction value) {
+    Map<HInstruction, HInstruction> map = keyedValues.putIfAbsent(
+        receiver, () => <HInstruction, HInstruction> {});
+    map[index] = value;
+  }
+
+  /**
+   * Sets `receiver[index]` to contain [value]. Kills all potential
+   * places that may be affected by this update.
+   */
+  void registerKeyedValueUpdate(HInstruction receiver,
+                                HInstruction index,
+                                HInstruction value) {
+    nonEscapingReceivers.remove(value);
+    keyedValues.forEach((key, values) {
+      if (mayAlias(receiver, key)) {
+        values.forEach((otherIndex, otherValue) {
+          if (mayAlias(index, otherIndex)) values[otherIndex] = null;
+        });
+      }
+    });
+
+    JavaScriptBackend backend = compiler.backend;
+    // Typed arrays may narrow incoming values.
+    if (backend.couldBeTypedArray(receiver.instructionType)) return;
+
+    Map<HInstruction, HInstruction> map = keyedValues.putIfAbsent(
+        receiver, () => <HInstruction, HInstruction> {});
+    map[index] = value;
+  }
+
+  /**
+   * Returns null if either [first] or [second] is null. Otherwise
+   * returns [first] if [first] and [second] are equal. Otherwise
+   * creates or re-uses a phi in [block] that holds [first] and [second].
+   */
+  HInstruction findCommonInstruction(HInstruction first,
+                                     HInstruction second,
+                                     HBasicBlock block,
+                                     int predecessorIndex) {
+    if (first == null || second == null) return null;
+    if (first == second) return first;
+    TypeMask phiType = second.instructionType.union(
+          first.instructionType, compiler);
+    if (first is HPhi && first.block == block) {
+      HPhi phi = first;
+      phi.addInput(second);
+      phi.instructionType = phiType;
+      return phi;
+    } else {
+      HPhi phi = new HPhi.noInputs(null, phiType);
+      block.addPhi(phi);
+      // Previous predecessors had the same input. A phi must have
+      // the same number of inputs as its block has predecessors.
+      for (int i = 0; i < predecessorIndex; i++) {
+        phi.addInput(first);
+      }
+      phi.addInput(second);
+      return phi;
+    }
+  }
+
+  /**
+   * Returns the intersection between [this] and [other].
+   */
+  MemorySet intersectionFor(MemorySet other,
+                            HBasicBlock block,
+                            int predecessorIndex) {
+    MemorySet result = new MemorySet(compiler);
+    fieldValues.forEach((element, values) {
+      var otherValues = other.fieldValues[element];
+      if (otherValues == null) return;
+      values.forEach((receiver, value) {
+        HInstruction instruction = findCommonInstruction(
+            value, otherValues[receiver], block, predecessorIndex);
+        if (instruction != null) {
+          result.registerFieldValue(element, receiver, instruction);
+        }
+      });
+    });
+
+    keyedValues.forEach((receiver, values) {
+      var otherValues = other.keyedValues[receiver];
+      if (otherValues == null) return;
+      values.forEach((index, value) {
+        HInstruction instruction = findCommonInstruction(
+            value, otherValues[index], block, predecessorIndex);
+        if (instruction != null) {
+          result.registerKeyedValue(receiver, index, instruction);
+        }
+      });
+    });
+
+    nonEscapingReceivers.forEach((receiver) {
+      if (other.nonEscapingReceivers.contains(receiver)) {
+        result.nonEscapingReceivers.add(receiver);
+      }
+    });
+    return result;
+  }
+
+  /**
+   * Returns a copy of [this].
+   */
+  MemorySet clone() {
+    MemorySet result = new MemorySet(compiler);
+
+    fieldValues.forEach((element, values) {
+      result.fieldValues[element] =
+          new Map<HInstruction, HInstruction>.from(values);
+    });
+
+    keyedValues.forEach((receiver, values) {
+      result.keyedValues[receiver] =
+          new Map<HInstruction, HInstruction>.from(values);
+    });
+
+    result.nonEscapingReceivers.addAll(nonEscapingReceivers);
+    return result;
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
index bf4262b..559c5db 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
@@ -224,6 +224,18 @@
     }
   }
 
+  // Returns the non-HCheck instruction, or the last [HCheck] in the
+  // check chain that is not generate at use site.
+  HInstruction checkedInstructionOrNonGenerateAtUseSite(HCheck check) {
+    var checked = check.checkedInput;
+    while (checked is HCheck) {
+      HInstruction next = checked.checkedInput;
+      if (generateAtUseSite.contains(next)) break;
+      checked = next;
+    }
+    return checked;
+  }
+
   void markAsLiveInEnvironment(HInstruction instruction,
                                LiveEnvironment environment) {
     if (generateAtUseSite.contains(instruction)) {
@@ -235,7 +247,7 @@
       // [HCheck] will share the same live ranges.
       if (instruction is HCheck) {
         HCheck check = instruction;
-        HInstruction checked = check.nonCheck();
+        HInstruction checked = checkedInstructionOrNonGenerateAtUseSite(check);
         if (!generateAtUseSite.contains(checked)) {
           environment.add(checked, instructionId);
         }
@@ -250,7 +262,7 @@
     // interval as the instruction it is checking.
     if (instruction is HCheck) {
       HCheck check = instruction;
-      HInstruction checked = check.nonCheck();
+      HInstruction checked = checkedInstructionOrNonGenerateAtUseSite(check);
       if (!generateAtUseSite.contains(checked)) {
         liveIntervals.putIfAbsent(checked, () => new LiveInterval());
         // Unconditionally force the live ranges of the HCheck to
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index 42d97c6..de5cac5 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -162,6 +162,7 @@
   Label asLabel() => null;
   LabeledStatement asLabeledStatement() => null;
   LibraryName asLibraryName() => null;
+  LibraryDependency asLibraryDependency() => null;
   LiteralBool asLiteralBool() => null;
   LiteralDouble asLiteralDouble() => null;
   LiteralInt asLiteralInt() => null;
@@ -1766,6 +1767,8 @@
                     this.combinators,
                     Link<MetadataAnnotation> metadata)
     : super(metadata);
+
+  LibraryDependency asLibraryDependency() => this;
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
index d210715..d22f263 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -1079,6 +1079,10 @@
     throw new UnsupportedError("");
   }
 
+  bool isCalledOnce(Element element) {
+    throw new UnsupportedError("");
+  }
+
   // --- analysis ---
 
   /**
@@ -1236,7 +1240,7 @@
 
     ConcreteType result = emptyConcreteType;
     void registerClass(ClassElement element) {
-      if (!element.isAbstract(compiler)) {
+      if (!element.isAbstract) {
         result =
             result.union(singletonConcreteType(new ClassBaseType(element)));
         augmentSeenClasses(element);
@@ -1520,7 +1524,7 @@
     listElementType = emptyConcreteType;
     concreteSeenClasses = compiler.enqueuer.resolution
         .seenClasses
-        .where((cls) => !cls.isAbstract(compiler))
+        .where((cls) => !cls.isAbstract)
         .toList()
         ..add(baseTypes.numBaseType.element);
     nativeTypesToConcreteTypes = new Map<ClassElement, ConcreteType>()
diff --git a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
index ec7ba94..7be08f1 100644
--- a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
@@ -82,14 +82,48 @@
     }
   }
 
-  bool isInMask(other, Compiler compiler) {
+  bool isSingleImplementationOf(ClassElement cls, Compiler compiler) {
+    // Special case basic types so that, for example, JSString is the
+    // single implementation of String.
+    // The general optimization is to realize there is only one class that
+    // implements [base] and [base] is not instantiated. We however do
+    // not track correctly the list of truly instantiated classes.
+    Backend backend = compiler.backend;
+    if (containsOnlyString(compiler)) {
+      return cls == compiler.stringClass || cls == backend.stringImplementation;
+    }
+    if (containsOnlyBool(compiler)) {
+      return cls == compiler.boolClass || cls == backend.boolImplementation;
+    }
+    if (containsOnlyInt(compiler)) {
+      return cls == compiler.intClass || cls == backend.intImplementation;
+    }
+    if (containsOnlyDouble(compiler)) {
+      return cls == compiler.doubleClass
+          || cls == compiler.backend.doubleImplementation;
+    }
+    return false;
+  }
+
+  bool isInMask(TypeMask other, Compiler compiler) {
     if (isEmpty) {
       return isNullable ? other.isNullable : true;
     }
     if (other.isEmpty) return false;
     if (isNullable && !other.isNullable) return false;
     if (other is! FlatTypeMask) return other.containsMask(this, compiler);
-    return satisfies(other.base, compiler);
+    FlatTypeMask flatOther = other;
+    ClassElement otherBase = flatOther.base;
+    if (flatOther.isExact) {
+      return (isExact && base == otherBase)
+          || isSingleImplementationOf(otherBase, compiler);
+    }
+    if (flatOther.isSubclass) {
+      if (isSubtype) return false;
+      return base == otherBase || isSubclassOf(base, otherBase, compiler);
+    }
+    assert(flatOther.isSubtype);
+    return satisfies(otherBase, compiler);
   }
 
   bool containsMask(TypeMask other, Compiler compiler) {
@@ -138,26 +172,6 @@
     if (isEmpty) return false;
     if (base == cls) return true;
     if (isSubtypeOf(base, cls, compiler)) return true;
-
-    // Special case basic types so that, for example, String satisfies
-    // JSString.
-    // The general optimization is to realize there is only one class that
-    // implements [base] and [base] is not instantiated. We however do
-    // not track correctly the list of truly instantiated classes.
-    Backend backend = compiler.backend;
-    if (containsOnlyString(compiler)) {
-      return cls == compiler.stringClass || cls == backend.stringImplementation;
-    }
-    if (containsOnlyBool(compiler)) {
-      return cls == compiler.boolClass || cls == backend.boolImplementation;
-    }
-    if (containsOnlyInt(compiler)) {
-      return cls == compiler.intClass || cls == backend.intImplementation;
-    }
-    if (containsOnlyDouble(compiler)) {
-      return cls == compiler.doubleClass
-          || cls == compiler.backend.doubleImplementation;
-    }
     return false;
   }
 
@@ -476,7 +490,7 @@
     Element element = findMatchIn(cls, selector, compiler);
     if (element == null) return false;
 
-    if (element.isAbstract(compiler)) {
+    if (element.isAbstract) {
       ClassElement enclosingClass = element.getEnclosingClass();
       return hasConcreteMatch(enclosingClass.superclass, selector, compiler);
     }
@@ -505,7 +519,7 @@
     // `null`.
     if (isEmpty) return false;
     // A call on an exact mask for an abstract class is dead code.
-    if (isExact && base.isAbstract(compiler)) return false;
+    if (isExact && base.isAbstract) return false;
     // If the receiver is guaranteed to have a member that
     // matches what we're looking for, there's no need to
     // introduce a noSuchMethod handler. It will never be called.
@@ -550,7 +564,7 @@
 
     bool hasMatch = hasConcreteMatch(base, selector, compiler);
     if (isExact) return !hasMatch;
-    if (!base.isAbstract(compiler) && !hasMatch) return true;
+    if (!base.isAbstract && !hasMatch) return true;
 
     Set<ClassElement> subtypesToCheck;
     if (isSubtype) {
@@ -566,7 +580,7 @@
               // instance of them will be created at runtime, and
               // therefore there is no instance that will require
               // [noSuchMethod] handling.
-              return !cls.isAbstract(compiler)
+              return !cls.isAbstract
                   && !hasConcreteMatch(cls, selector, compiler);
            });
   }
diff --git a/sdk/lib/_internal/compiler/implementation/types/types.dart b/sdk/lib/_internal/compiler/implementation/types/types.dart
index e754376..1d3ac5c 100644
--- a/sdk/lib/_internal/compiler/implementation/types/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/types.dart
@@ -31,6 +31,7 @@
   Iterable<TypeMask> get containerTypes;
   void clear();
   Iterable<Element> getCallersOf(Element element);
+  bool isCalledOnce(Element element);
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
index c79f826..793362b 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
@@ -18,7 +18,7 @@
 
   void add(Element element) {
     assert(element.isInstanceMember());
-    assert(!element.isAbstract(compiler));
+    assert(!element.isAbstract);
     String name = element.name;
     FunctionSetNode node = nodes.putIfAbsent(name, () => newNode(name));
     node.add(element);
@@ -26,7 +26,7 @@
 
   void remove(Element element) {
     assert(element.isInstanceMember());
-    assert(!element.isAbstract(compiler));
+    assert(!element.isAbstract);
     String name = element.name;
     FunctionSetNode node = nodes[name];
     if (node != null) {
@@ -36,7 +36,7 @@
 
   bool contains(Element element) {
     assert(element.isInstanceMember());
-    assert(!element.isAbstract(compiler));
+    assert(!element.isAbstract);
     String name = element.name;
     FunctionSetNode node = nodes[name];
     return (node != null)
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 052d223..6fe713d 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -1335,6 +1335,12 @@
       const MessageKind(
       "Error: Argument for 'JS_INTERCEPTOR_CONSTANT' must be a type constant.");
 
+  static const MessageKind EXPECTED_IDENTIFIER_NOT_RESERVED_WORD =
+      const MessageKind(
+          "Error: '#{keyword}' is a reserved word and can't be used here.",
+          howToFix: "Try using a different name.",
+          examples: const ["do() {} main() {}"]);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       "Error: The compiler crashed when compiling this element.");
 
@@ -1481,6 +1487,11 @@
   // Patch errors end.
   //////////////////////////////////////////////////////////////////////////////
 
+  static const MessageKind CALL_NOT_SUPPORTED_ON_NATIVE_CLASS =
+      const MessageKind(
+          "Error: Non-supported 'call' member on a native class, or a "
+          "subclass of a native class.");
+
   toString() => template;
 
   Message message([Map arguments = const {}, bool terse = false]) {
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 971ac69..aa48510 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -27,6 +27,10 @@
   final Map<ClassElement, Set<ClassElement>> _supertypes =
       new Map<ClassElement, Set<ClassElement>>();
 
+  final Set<Element> sideEffectsFreeElements = new Set<Element>();
+
+  final Set<Element> elementsThatCannotThrow = new Set<Element>();
+
   Set<ClassElement> subclassesOf(ClassElement cls) {
     return _subclasses[cls.declaration];
   }
@@ -187,7 +191,7 @@
   }
 
   void registerUsedElement(Element element) {
-    if (element.isInstanceMember() && !element.isAbstract(compiler)) {
+    if (element.isInstanceMember() && !element.isAbstract) {
       allFunctions.add(element);
     }
   }
@@ -230,6 +234,22 @@
     return functionsCalledInLoop.contains(element.declaration);
   }
 
+  bool fieldNeverChanges(Element element) {
+    if (!element.isField()) return false;
+    if (element.isNative()) {
+      // Some native fields are views of data that may be changed by operations.
+      // E.g. node.firstChild depends on parentNode.removeBefore(n1, n2).
+      // TODO(sra): Refine the effect classification so that native effects are
+      // distinct from ordinary Dart effects.
+      return false;
+    }
+
+    return element.modifiers.isFinal()
+        || element.modifiers.isConst()
+        || (element.isInstanceMember()
+            && !compiler.resolverWorld.hasInvokedSetter(element, compiler));
+  }
+
   SideEffects getSideEffectsOfElement(Element element) {
     // The type inferrer (where the side effects are being computed),
     // does not see generative constructor bodies because they are
@@ -238,31 +258,51 @@
     // implies that currently, the side effects of a constructor body
     // contain the side effects of the initializers.
     assert(!element.isGenerativeConstructorBody());
+    assert(!element.isField());
     return sideEffects.putIfAbsent(element.declaration, () {
       return new SideEffects();
     });
   }
 
   void registerSideEffects(Element element, SideEffects effects) {
+    if (sideEffectsFreeElements.contains(element)) return;
     sideEffects[element.declaration] = effects;
   }
 
+  void registerSideEffectsFree(Element element) {
+    sideEffects[element.declaration] = new SideEffects.empty();
+    sideEffectsFreeElements.add(element);
+  }
+
   SideEffects getSideEffectsOfSelector(Selector selector) {
     // We're not tracking side effects of closures.
-    if (selector.isClosureCall()) {
-      return new SideEffects();
-    }
+    if (selector.isClosureCall()) return new SideEffects();
     SideEffects sideEffects = new SideEffects.empty();
     for (Element e in allFunctions.filter(selector)) {
       if (e.isField()) {
         if (selector.isGetter()) {
-          sideEffects.setDependsOnInstancePropertyStore();
+          if (!fieldNeverChanges(e)) {
+            sideEffects.setDependsOnInstancePropertyStore();
+          }
         } else if (selector.isSetter()) {
           sideEffects.setChangesInstanceProperty();
+        } else {
+          assert(selector.isCall());
+          sideEffects.setAllSideEffects();
+          sideEffects.setDependsOnSomething();
         }
+      } else {
+        sideEffects.add(getSideEffectsOfElement(e));
       }
-      sideEffects.add(getSideEffectsOfElement(e));
     }
     return sideEffects;
   }
+
+  void registerCannotThrow(Element element) {
+    elementsThatCannotThrow.add(element);
+  }
+
+  bool getCannotThrow(Element element) {
+    return elementsThatCannotThrow.contains(element);
+  }
 }
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index b0536bd..5ba7f0e 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -271,18 +271,15 @@
    */
   List<LibraryMirror> _sortedLibraries;
 
-  /** A map from absolute paths of libraries to the libraries at those paths. */
-  Map<String, LibraryMirror> _librariesByPath;
-
   /**
-   * A map from absolute paths of hidden libraries to lists of [Export]s that
-   * export those libraries from visible libraries. This is used to determine
-   * what public library any given entity belongs to.
+   * A map from hidden libraries to lists of [Export]s that export those
+   * libraries from visible libraries. This is used to determine what public
+   * library any given entity belongs to.
    *
    * The lists of exports are sorted so that exports that hide the fewest number
    * of members come first.
    */
-  Map<String, List<Export>> _hiddenLibraryExports;
+  Map<LibraryMirror, List<Export>> _hiddenLibraryExports;
 
   /** The library that we're currently generating docs for. */
   LibraryMirror _currentLibrary;
@@ -425,12 +422,6 @@
   Future documentLibraries(List<Uri> libraryList, String libPath,
       String packageRoot) {
     _packageRoot = packageRoot;
-    _exports = new ExportMap.parse(libraryList, packageRoot);
-    var librariesToAnalyze =
-        _exports.allExportedFiles
-                .map((file) => new Uri.file(file).toString())
-                .toList();
-    librariesToAnalyze.addAll(libraryList.map((uri) => uri.toString()));
 
     // dart2js takes a String, but it expects that to be a Uri, not a file
     // system path.
@@ -444,8 +435,8 @@
     // statements.
     print('Analyzing libraries...');
     return dart2js.analyze(
-        librariesToAnalyze.toList(), libPath,
-        packageRoot: packageRoot, options: COMPILER_OPTIONS)
+        libraryList.map((uri) => uri.toString()).toList(),
+        libPath, packageRoot: packageRoot, options: COMPILER_OPTIONS)
       .then((MirrorSystem mirrors) {
         print('Generating documentation...');
         _document(mirrors);
@@ -453,6 +444,7 @@
   }
 
   void _document(MirrorSystem mirrors) {
+    _exports = new ExportMap(mirrors);
     _started = true;
 
 
@@ -472,14 +464,6 @@
           displayName(y).toUpperCase());
     });
 
-    _librariesByPath = <String, LibraryMirror>{};
-    for (var library in mirrors.libraries.values) {
-      var libraryPath = _libraryPath(library);
-      if (libraryPath == null) continue;
-      libraryPath = path.normalize(path.absolute(libraryPath));
-      _librariesByPath[libraryPath] = library;
-    }
-
     _hiddenLibraryExports = _generateHiddenLibraryExports();
 
     // Generate the docs.
@@ -538,41 +522,38 @@
   }
 
   /**
-   * Generate [_hiddenLibraryExports] from [_exports] and [_librariesByPath].
+   * Generate [_hiddenLibraryExports] from [_exports].
    */
-  Map<String, List<Export>> _generateHiddenLibraryExports() {
-    // First generate a map `exported path => exporter path => Export`. The
-    // inner map makes it easier to merge multiple exports of the same library
-    // by the same exporter.
-    var hiddenLibraryExportMaps = <String, Map<String, Export>>{};
-    _exports.exports.forEach((exporter, exports) {
-      var library = _librariesByPath[exporter];
-      // TODO(nweiz): remove this check when issue 9645 is fixed.
-      if (library == null) return;
-      if (!shouldIncludeLibrary(library)) return;
-      for (var export in exports) {
-        var library = _librariesByPath[export.path];
-        // TODO(nweiz): remove this check when issue 9645 is fixed.
-        if (library == null) continue;
-        if (shouldIncludeLibrary(library)) continue;
+  Map<LibraryMirror, List<Export>> _generateHiddenLibraryExports() {
+    // First generate a map `exported library => exporter library => Export`.
+    // The inner map makes it easier to merge multiple exports of the same
+    // library by the same exporter.
+    var hiddenLibraryExportMaps =
+        new Map<LibraryMirror, Map<LibraryMirror, Export>>();
 
-        var hiddenExports = _exports.transitiveExports(export.path)
+    _exports.exports.forEach((exporter, exports) {
+      if (!shouldIncludeLibrary(exporter)) return;
+      for (var export in exports) {
+        var exported = export.exported;
+        if (shouldIncludeLibrary(exported)) continue;
+
+        var hiddenExports = _exports.transitiveExports(exported)
             .map((transitiveExport) => export.compose(transitiveExport))
             .toList();
         hiddenExports.add(export);
 
         for (var hiddenExport in hiddenExports) {
-          var exportsByExporterPath = hiddenLibraryExportMaps
-              .putIfAbsent(hiddenExport.path, () => <String, Export>{});
-          addOrMergeExport(exportsByExporterPath, exporter, hiddenExport);
+          var exportsByExporter = hiddenLibraryExportMaps.putIfAbsent(
+              hiddenExport.exported, () => new Map<LibraryMirror, Export>());
+          addOrMergeExport(exportsByExporter, exporter, hiddenExport);
         }
       }
     });
 
     // Now sort the values of the inner maps of `hiddenLibraryExportMaps` to get
     // the final value of `_hiddenLibraryExports`.
-    var hiddenLibraryExports = <String, List<Export>>{};
-    hiddenLibraryExportMaps.forEach((exporteePath, exportsByExporterPath) {
+    var hiddenLibraryExports = new Map<LibraryMirror, List<Export>>();
+    hiddenLibraryExportMaps.forEach((exportee, exportsByExporter) {
       int rank(Export export) {
         if (export.show.isEmpty && export.hide.isEmpty) return 0;
         if (export.show.isEmpty) return export.hide.length;
@@ -580,16 +561,16 @@
         return 1000 * export.show.length;
       }
 
-      var exports = exportsByExporterPath.values.toList();
+      var exports = exportsByExporter.values.toList();
       exports.sort((export1, export2) {
         var comparison = Comparable.compare(rank(export1), rank(export2));
         if (comparison != 0) return comparison;
 
-        var library1 = _librariesByPath[export1.exporter];
-        var library2 = _librariesByPath[export2.exporter];
+        var library1 = export1.exporter;
+        var library2 = export2.exporter;
         return Comparable.compare(displayName(library1), displayName(library2));
       });
-      hiddenLibraryExports[exporteePath] = exports;
+      hiddenLibraryExports[exportee] = exports;
     });
     return hiddenLibraryExports;
   }
@@ -1068,7 +1049,7 @@
     _totalTypes++;
     _currentType = type;
 
-    startFile(typeUrl(type));
+    startFile(typePath(type));
 
     var kind;
     if (type.isTypedef) {
@@ -1156,8 +1137,8 @@
     listTypes(types, header) {
       if (types == null) return;
 
-      // Filter out injected types. (JavaScriptIndexingBehavior)
-      types = new List.from(types.where((t) => t.library != null));
+      // Filter out types from private dart libraries.
+      types = new List.from(types.where((t) => !isFromPrivateDartLibrary(t)));
 
       var publicTypes;
       if (showPrivate) {
@@ -1191,7 +1172,9 @@
       final supertypes = [];
       var thisType = superclass;
       do {
-        supertypes.add(thisType);
+        if (!isFromPrivateDartLibrary(thisType)) {
+          supertypes.add(thisType);
+        }
         thisType = getSuperclass(thisType);
       } while (!thisType.isObject);
 
@@ -1258,12 +1241,8 @@
   }();
 
   void docExports(LibraryMirror library) {
-    // TODO(nweiz): show `dart:` library exports.
-    var exportLinks = _exports.transitiveExports(_libraryPath(library))
-        .map((export) {
-      var library = _librariesByPath[export.path];
-      // TODO(nweiz): remove this check when issue 9645 is fixed.
-      if (library == null) return null;
+    var exportLinks = _exports.transitiveExports(library).map((export) {
+      var library = export.exported;
       // Only link to publically visible libraries.
       if (!shouldIncludeLibrary(library)) return null;
 
@@ -1280,7 +1259,7 @@
       }
 
       return '<ul>${a(libraryUrl(library), displayName(library))}'
-        '$combinator</ul>';
+             '$combinator</ul>';
     }).where((link) => link != null);
 
     if (!exportLinks.isEmpty) {
@@ -1326,6 +1305,7 @@
       var iterable = new HierarchyIterable(host, includeType: true);
       for (ClassMirror type in iterable) {
         if (!host.isObject && !inheritFromObject && type.isObject) continue;
+        if (isFromPrivateDartLibrary(type)) continue;
 
         type.members.forEach((_, MemberMirror member) {
           if (member.isStatic) return;
@@ -1780,6 +1760,7 @@
             new HierarchyIterable(mirror.owner,
                                   includeType: false);
         for (ClassMirror type in iterable) {
+          if (isFromPrivateDartLibrary(type)) continue;
           var inheritedMember = type.members[mirror.simpleName];
           if (inheritedMember is MemberMirror) {
             comment = computeComment(inheritedMember);
@@ -1826,8 +1807,23 @@
     return '${sanitize(displayName(library))}.html';
   }
 
-  /** Gets the URL for the documentation for [type]. */
+  /**
+   * Gets the URL for the documentation for [type] or `null` if there is no
+   * link to the documentation of [type].
+   */
   String typeUrl(ContainerMirror type) {
+    var library = type is LibraryMirror ? type : _libraryFor(type);
+    if (shouldLinkToPublicApi(library)) {
+      return "$API_LOCATION${typePath(type)}";
+    } else if (shouldIncludeLibrary(library)) {
+      return typePath(type);
+    } else {
+      return null;
+    }
+  }
+
+  /** Gets the relative path for the documentation for [type]. */
+  String typePath(ContainerMirror type) {
     if (type is LibraryMirror) {
       return '${sanitize(type.simpleName)}.html';
     }
@@ -1844,7 +1840,7 @@
   /** Gets the URL for the documentation for [member]. */
   String memberUrl(MemberMirror member) {
     String url = typeUrl(_ownerFor(member));
-    return '$url#${memberAnchor(member)}';
+    return url != null ? '$url#${memberAnchor(member)}' : null;
   }
 
   /** Gets the anchor id for the document for [member]. */
@@ -1854,13 +1850,17 @@
 
   /**
    * Creates a hyperlink. Handles turning the [href] into an appropriate
-   * relative path from the current file.
+   * relative path from the current file. If [href] is `null`, [contents] is
+   * not embedded in an anchor tag, and thus no link is created.
    */
   String a(String href, String contents, [String css]) {
-    // Mark outgoing external links, mainly so we can style them.
-    final rel = isAbsolute(href) ? ' ref="external"' : '';
-    final cssClass = css == null ? '' : ' class="$css"';
-    return '<a href="${relativePath(href)}"$cssClass$rel>$contents</a>';
+    if (href != null) {
+      // Mark outgoing external links, mainly so we can style them.
+      final rel = isAbsolute(href) ? ' ref="external"' : '';
+      final cssClass = css == null ? '' : ' class="$css"';
+      return '<a href="${relativePath(href)}"$cssClass$rel>$contents</a>';
+    }
+    return contents;
   }
 
   /**
@@ -1922,14 +1922,7 @@
     assert(type is ClassMirror);
 
     // Link to the type.
-    var library = _libraryFor(type);
-    if (shouldLinkToPublicApi(library)) {
-      write('<a href="$API_LOCATION${typeUrl(type)}">${type.simpleName}</a>');
-    } else if (shouldIncludeLibrary(library)) {
-      write(a(typeUrl(type), type.simpleName));
-    } else {
-      write(type.simpleName);
-    }
+    write(a(typeUrl(type), type.simpleName));
 
     if (type.isOriginalDeclaration) {
       // Avoid calling [:typeArguments():] on a declaration.
@@ -2036,10 +2029,14 @@
                                 ContainerMirror currentType,
                                 LibraryMirror currentLibrary}) {
     makeLink(String href) {
-      final anchor = new md.Element.text('a', name);
-      anchor.attributes['href'] = relativePath(href);
-      anchor.attributes['class'] = 'crossref';
-      return anchor;
+      if (href != null) {
+        final anchor = new md.Element.text('a', name);
+        anchor.attributes['href'] = relativePath(href);
+        anchor.attributes['class'] = 'crossref';
+        return anchor;
+      } else {
+        return new md.Element.text('code', name);
+      }
     }
 
     DeclarationMirror declaration = currentMember;
@@ -2191,14 +2188,11 @@
   List<DeclarationMirror> _libraryContents(LibraryMirror library,
       List<DeclarationMirror> fn(LibraryMirror)) {
     var contents = fn(library).toList();
-    var path = _libraryPath(library);
-    if (path == null || _exports.exports[path] == null) return contents;
+    var exports = _exports.exports[library];
+    if (exports == null) return contents;
 
-
-    contents.addAll(_exports.exports[path].expand((export) {
-      var exportedLibrary = _librariesByPath[export.path];
-      // TODO(nweiz): remove this check when issue 9645 is fixed.
-      if (exportedLibrary == null) return [];
+    contents.addAll(exports.expand((export) {
+      var exportedLibrary = export.exported;
       if (shouldIncludeLibrary(exportedLibrary)) return [];
       return fn(exportedLibrary).where((declaration) =>
           export.isMemberVisible(displayName(declaration)));
@@ -2231,14 +2225,14 @@
   LibraryMirror _visibleLibrary(LibraryMirror library, String name) {
     if (library == null) return null;
 
-    var exports = _hiddenLibraryExports[_libraryPath(library)];
+    var exports = _hiddenLibraryExports[library];
     if (exports == null) return library;
 
     var export = exports.firstWhere(
         (exp) => exp.isMemberVisible(name),
         orElse: () => null);
     if (export == null) return library;
-    return _librariesByPath[export.exporter];
+    return export.exporter;
   }
 }
 
diff --git a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
index fe73e1b..3f876b6 100644
--- a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
@@ -115,7 +115,8 @@
  * If [map] contains an [Export] under [key], this merges that with [export].
  * Otherwise, it sets [key] to [export].
  */
-void addOrMergeExport(Map<String, Export> map, String key, Export export) {
+void addOrMergeExport(Map<LibraryMirror, Export> map,
+                      LibraryMirror key, Export export) {
   if (map.containsKey(key)) {
     map[key] = map[key].merge(export);
   } else {
diff --git a/sdk/lib/_internal/dartdoc/lib/src/export_map.dart b/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
index 25f6491..09f894c 100644
--- a/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
@@ -8,72 +8,47 @@
 /// doesn't provide this information itself.
 library export_map;
 
-import 'dart:io';
-
-import 'package:analyzer/analyzer.dart';
-import 'package:path/path.dart' as pathos;
-
-import 'dartdoc/utils.dart';
+import '../../../compiler/implementation/mirrors/mirrors.dart';
+import '../../../compiler/implementation/mirrors/mirrors_util.dart';
 
 /// A class that tracks which libraries export which other libraries.
 class ExportMap {
   /// A map from libraries to their [Export]s.
   ///
-  /// Each key is the absolute path of a library on the filesystem, and each
-  /// value is a list of [Export]s for that library. There's guaranteed to be
-  /// only one [Export] of a given library in a given list.
-  final Map<String, List<Export>> exports;
+  /// Each key is a library and each value is a list of [Export]s for that
+  /// library. There's guaranteed to be only one [Export] of a given library
+  /// in a given list.
+  final Map<LibraryMirror, List<Export>> exports = {};
 
-  /// A cache of the transitive exports for each library. The keys are paths to
-  /// libraries. The values are maps from the exported path to the [Export]
-  /// objects, to make it easier to merge multiple exports of the same library.
-  final _transitiveExportsByPath = <String, Map<String, Export>>{};
+  /// A cache of the transitive exports for each library. The values are maps
+  /// from the exported libraries to the [Export] objects, to make it easier to
+  /// merge multiple exports of the same library.
+  Map<LibraryMirror, Map<LibraryMirror, Export>> _transitiveExports = {};
 
-  /// Parse an export map from a set of [libraries], which should be Dart import
-  /// [Uri]s. [packageRoot] should be the path to the `packages` directory to
-  /// use when resolving `package:` imports and libraries. Libraries that are
-  /// not available on the local machine will be ignored.
-  ///
-  /// In addition to parsing the exports in [libraries], this will parse the
-  /// exports in all libraries transitively reachable from [libraries] via
-  /// `import` or `export`.
-  factory ExportMap.parse(Iterable<Uri> libraries, String packageRoot) {
-    var exports = <String, List<Export>>{};
-
-    void traverse(String path) {
-      if (exports.containsKey(path)) return;
-
-      var importsAndExports;
-      try {
-        importsAndExports = _importsAndExportsForFile(path, packageRoot);
-      } on FileSystemException catch (_) {
-        // Ignore unreadable/nonexistent files.
-        return;
-      }
-
-      var exportsForLibrary = <String, Export>{};
-      for (var export in importsAndExports.last) {
-        addOrMergeExport(exportsForLibrary, export.path, export);
-      }
-      exports[path] = new List.from(exportsForLibrary.values);
-      exports[path].map((directive) => directive.path).forEach(traverse);
-      importsAndExports.first.forEach(traverse);
-    }
-
-    for (var library in libraries) {
-      var path = importUriToPath(library, packageRoot: packageRoot);
-      if (path != null) traverse(path);
-    }
-
-    return new ExportMap._(exports);
+  ExportMap(MirrorSystem mirrors) {
+    mirrors.libraries.values.where((lib) => !_isDartLibrary(lib))
+                            .forEach(_computeExports);
   }
 
-  ExportMap._(this.exports);
+  bool _isDartLibrary(LibraryMirror lib) => lib.uri.scheme == 'dart';
 
-  /// Returns a list of all the paths of exported libraries that [this] is aware
-  /// of.
-  List<String> get allExportedFiles => exports.values.expand((e) => e)
-      .map((directive) => directive.path).toList();
+  /// Compute all non-dart: exports in [library].
+  void _computeExports(LibraryMirror library) {
+    var exportMap = {};
+    library.libraryDependencies
+        .where((mirror) =>
+            mirror.isExport && !_isDartLibrary(mirror.targetLibrary))
+        .map((mirror) => new Export.fromMirror(mirror))
+        .forEach((export) {
+      var target = export.exported;
+      if (exportMap.containsKey(target)) {
+        exportMap[target] = exportMap[target].merge(export);
+      } else {
+        exportMap[target] = export;
+      }
+    });
+    exports[library] = exportMap.values.toList();
+  }
 
   /// Returns a list of all exports that [library] transitively exports. This
   /// means that if [library] exports another library that in turn exports a
@@ -81,44 +56,43 @@
   ///
   /// This will automatically handle nested `hide` and `show` directives on the
   /// exports, as well as merging multiple exports of the same library.
-  List<Export> transitiveExports(String library) {
-    Map<String, Export> _getTransitiveExportsByPath(String path) {
-      if (_transitiveExportsByPath.containsKey(path)) {
-        return _transitiveExportsByPath[path];
+  List<Export> transitiveExports(LibraryMirror library) {
+    Map<LibraryMirror, Export> _getTransitiveExports(LibraryMirror library) {
+      if (_transitiveExports.containsKey(library)) {
+        return _transitiveExports[library];
       }
 
-      var exportsByPath = <String, Export>{};
-      _transitiveExportsByPath[path] = exportsByPath;
-      if (exports[path] == null) return exportsByPath;
+      var exportsByPath = <LibraryMirror, Export>{};
+      _transitiveExports[library] = exportsByPath;
+      if (exports[library] == null) return exportsByPath;
 
-      for (var export in exports[path]) {
-        exportsByPath[export.path] = export;
+      for (var export in exports[library]) {
+        exportsByPath[export.exported] = export;
       }
 
-      for (var export in exports[path]) {
-        for (var subExport in _getTransitiveExportsByPath(export.path).values) {
+      for (var export in exports[library]) {
+        for (var subExport in _getTransitiveExports(export.exported).values) {
           subExport = export.compose(subExport);
-          if (exportsByPath.containsKey(subExport.path)) {
-            subExport = subExport.merge(exportsByPath[subExport.path]);
+          if (exportsByPath.containsKey(subExport.exported)) {
+            subExport = subExport.merge(exportsByPath[subExport.exported]);
           }
-          exportsByPath[subExport.path] = subExport;
+          exportsByPath[subExport.exported] = subExport;
         }
       }
       return exportsByPath;
     }
 
-    var path = pathos.normalize(pathos.absolute(library));
-    return _getTransitiveExportsByPath(path).values.toList();
+    return _getTransitiveExports(library).values.toList();
   }
 }
 
 /// A class that represents one library exporting another.
 class Export {
-  /// The absolute path of the library that contains this export.
-  final String exporter;
+  /// The library that contains this export.
+  final LibraryMirror exporter;
 
-  /// The absolute path of the library being exported.
-  final String path;
+  /// The library being exported.
+  final LibraryMirror exported;
 
   /// The set of identifiers that are explicitly being exported. If this is
   /// non-empty, no identifiers other than these will be visible.
@@ -140,8 +114,23 @@
   ///
   /// This will normalize [show] and [hide] so that if both are non-empty, only
   /// [show] will be set.
-  Export(this.exporter, this.path, {Iterable<String> show,
-      Iterable<String> hide}) {
+  factory Export.fromMirror(LibraryDependencyMirror mirror) {
+    var show = <String>[];
+    var hide = <String>[];
+    for (var combinator in mirror.combinators) {
+      if (combinator.isShow) {
+        show.addAll(combinator.identifiers);
+      }
+      if (combinator.isHide) {
+        hide.addAll(combinator.identifiers);
+      }
+    }
+    return new Export(
+        mirror.sourceLibrary, mirror.targetLibrary, show: show, hide: hide);
+  }
+
+  Export(this.exporter, this.exported,
+         {Iterable<String> show, Iterable<String> hide}) {
     _show = new Set<String>.from(show == null ? [] : show);
     _hide = new Set<String>.from(hide == null ? [] : hide);
 
@@ -172,7 +161,7 @@
       hide.addAll(nested.hide);
     }
 
-    return new Export(this.exporter, nested.path, show: show, hide: hide);
+    return new Export(this.exporter, nested.exported, show: show, hide: hide);
   }
 
   /// Returns a new [Export] that merges [this] with [nested], as though both
@@ -180,14 +169,14 @@
   ///
   /// [this] and [other] must have the same values for [exporter] and [path].
   Export merge(Export other) {
-    if (this.path != other.path) {
+    if (this.exported != other.exported) {
       throw new ArgumentError("Can't merge two Exports with different paths: "
-          "export '$path' from '$exporter' and export '${other.path}' from "
-          "'${other.exporter}'.");
+          "export '$exported' from '$exporter' and export '${other.exported}' "
+          "from '${other.exporter}'.");
     } if (this.exporter != other.exporter) {
       throw new ArgumentError("Can't merge two Exports with different "
-          "exporters: export '$path' from '$exporter' and export "
-          "'${other.path}' from '${other.exporter}'.");
+          "exporters: export '$exported' from '$exporter' and export "
+          "'${other.exported}' from '${other.exporter}'.");
     }
 
     var show = new Set<String>();
@@ -210,7 +199,7 @@
       }
     }
 
-    return new Export(exporter, path, show: show, hide: hide);
+    return new Export(exporter, exported, show: show, hide: hide);
   }
 
   /// Returns whether or not a member named [name] is visible through this
@@ -219,14 +208,16 @@
     _hideByDefault ? show.contains(name) : !hide.contains(name);
 
   bool operator==(other) => other is Export && other.exporter == exporter &&
-      other.path == path && show.containsAll(other.show) &&
+      other.exported == exported && show.containsAll(other.show) &&
       other.show.containsAll(show) && hide.containsAll(other.hide) &&
       other.hide.containsAll(hide);
 
   int get hashCode {
-    var hashCode = exporter.hashCode ^ path.hashCode;
-    hashCode = show.reduce(hashCode, (hash, name) => hash ^ name.hashCode);
-    return hide.reduce(hashCode, (hash, name) => hash ^ name.hashCode);
+    var hashCode = exporter.hashCode ^ exported.hashCode;
+    combineHashCode(name) => hashCode ^= name.hashCode;
+    show.forEach(combineHashCode);
+    hide.forEach(combineHashCode);
+    return hashCode;
   }
 
   String toString() {
@@ -236,63 +227,7 @@
     } else if (!hide.isEmpty) {
       combinator = ' hide ${hide.join(', ')}';
     }
-    return "export '$path'$combinator (from $exporter)";
+    return "export '${displayName(exported)}'"
+           "$combinator (from ${displayName(exporter)})";
   }
 }
-
-/// Returns a list of imports and a list of exports for the dart library at
-/// [file]. [packageRoot] is used to resolve `package:` URLs.
-///
-/// The imports are a list of absolute paths, while the exports are [Export]
-/// objects.
-Pair<List<String>, List<Export>> _importsAndExportsForFile(String file,
-    String packageRoot) {
-  var collector = new _ImportExportCollector();
-  parseDartFile(file).accept(collector);
-
-  var imports = collector.imports.map((import) {
-    return _pathForDirective(import, pathos.dirname(file), packageRoot);
-  }).where((import) => import != null).toList();
-
-  var exports = collector.exports.map((export) {
-    var path = _pathForDirective(export, pathos.dirname(file), packageRoot);
-    if (path == null) return null;
-
-    path = pathos.normalize(pathos.absolute(path));
-    var show = export.combinators
-        .where((combinator) => combinator is ShowCombinator)
-        .expand((combinator) => combinator.shownNames.map((name) => name.name));
-    var hide = export.combinators
-        .where((combinator) => combinator is HideCombinator)
-        .expand((combinator) =>
-            combinator.hiddenNames.map((name) => name.name));
-
-    return new Export(file, path, show: show, hide: hide);
-  }).where((export) => export != null).toList();
-
-  return new Pair<List<String>, List<Export>>(imports, exports);
-}
-
-/// Returns the absolute path to the library imported by [directive], or `null`
-/// if it doesn't refer to a file on the local filesystem.
-///
-/// [basePath] is the path from which relative imports should be resolved.
-/// [packageRoot] is the path from which `package:` imports should be resolved.
-String _pathForDirective(NamespaceDirective directive, String basePath,
-    String packageRoot) {
-  var uri = Uri.parse(stringLiteralToString(directive.uri));
-  var path = importUriToPath(uri, basePath: basePath, packageRoot: packageRoot);
-  if (path == null) return null;
-  return pathos.normalize(pathos.absolute(path));
-}
-
-/// A simple visitor that collects import and export nodes.
-class _ImportExportCollector extends GeneralizingASTVisitor {
-  final imports = <ImportDirective>[];
-  final exports = <ExportDirective>[];
-
-  _ImportExportCollector();
-
-  visitImportDirective(ImportDirective node) => imports.add(node);
-  visitExportDirective(ExportDirective node) => exports.add(node);
-}
diff --git a/sdk/lib/_internal/dartdoc/pubspec.yaml b/sdk/lib/_internal/dartdoc/pubspec.yaml
index 3a19028..fe775e4 100644
--- a/sdk/lib/_internal/dartdoc/pubspec.yaml
+++ b/sdk/lib/_internal/dartdoc/pubspec.yaml
@@ -3,7 +3,6 @@
  Libraries for generating documentation from Dart source code.
 
 dependencies:
-  analyzer: ">=0.4.5 <1.0.0"
   args: ">=0.4.2 <1.0.0"
   path: ">=0.4.2 <1.0.0"
 
diff --git a/sdk/lib/_internal/dartdoc/test/export_map_test.dart b/sdk/lib/_internal/dartdoc/test/export_map_test.dart
index 4d43bd4..12aa98a 100644
--- a/sdk/lib/_internal/dartdoc/test/export_map_test.dart
+++ b/sdk/lib/_internal/dartdoc/test/export_map_test.dart
@@ -2,397 +2,466 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
-
-import 'package:path/path.dart' as pathos;
 import 'package:unittest/unittest.dart';
 
-import '../lib/src/export_map.dart';
-import '../lib/src/dartdoc/utils.dart';
+import 'dart:async' show Future;
+import 'dart:io' show Platform;
 
-String tempDir;
+import '../lib/src/export_map.dart';
+import '../../../../../tests/compiler/dart2js/memory_source_file_helper.dart'
+       show MemorySourceFileProvider;
+import '../../compiler/implementation/mirrors/mirrors.dart'
+       show MirrorSystem, LibraryMirror;
+import '../../compiler/implementation/mirrors/dart2js_mirror.dart'
+       as source_mirrors;
+
+Future<MirrorSystem> mirrorSystemFor(Map<String, String> memorySourceFiles) {
+  var provider = new MemorySourceFileProvider(memorySourceFiles);
+  handler(Uri uri, int begin, int end, String message, kind) {}
+
+  var script = Uri.base.resolveUri(Platform.script);
+  var libraryRoot = script.resolve('../../../../');
+  // Read packages from 'memory:packages/'.
+  var packageRoot = Uri.parse('memory:packages/');
+
+  var libraries = <Uri>[];
+  memorySourceFiles.forEach((String path, _) {
+    if (path.startsWith('packages/')) {
+      // Analyze files from 'packages/' as packages.
+      libraries.add(new Uri(scheme: 'package', path: path.substring(9)));
+    } else {
+      libraries.add(new Uri(scheme: 'memory', path: path));
+    }
+  });
+  libraries.add(new Uri(scheme: 'dart', path: 'async'));
+  return source_mirrors.analyze(
+      libraries, libraryRoot, packageRoot, provider, handler);
+}
+
+Future<ExportMap> testExports(Map<String, String> sourceFiles) {
+  return mirrorSystemFor(sourceFiles).then((mirrors) {
+    libMirror = (uri) => mirrors.libraries[Uri.parse(uri)];
+    return new ExportMap(mirrors);
+  });
+}
+
+Function libMirror;
 
 main() {
   group('ExportMap', () {
-    setUp(createTempDir);
-    tearDown(deleteTempDir);
-
     test('with an empty library', () {
-      createLibrary('lib.dart');
-      var map = parse(['lib.dart']);
+      return testExports({'lib.dart': ''}).then((map) {
+        var lib = libMirror('memory:lib.dart');
+        var nonexistent = libMirror('memory:nonexistent.dart');
 
-      var expectedExports = {};
-      expectedExports[libPath('lib.dart')] = [];
-      expect(map.exports, equals(expectedExports));
-      expect(map.allExportedFiles, isEmpty);
-      expect(map.transitiveExports(libPath('lib.dart')), isEmpty);
-      expect(map.transitiveExports(libPath('nonexistent.dart')), isEmpty);
+        var expectedExports = {};
+        expectedExports[lib] = [];
+        expect(map.exports, equals(expectedExports));
+        expect(map.transitiveExports(lib), isEmpty);
+        expect(map.transitiveExports(nonexistent), isEmpty);
+      });
     });
 
     test('with one library with one export', () {
-      createLibrary('a.dart', 'export "b.dart";');
-      createLibrary('b.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart";',
+        'b.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'))
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b)
+        ]));
 
-      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'))
-      ]));
+        expect(map.transitiveExports(a), unorderedEquals([
+          new Export(a, b)
+        ]));
 
-      expect(map.allExportedFiles, unorderedEquals([libPath('b.dart')]));
+        expect(map.exports[b], isEmpty);
 
-      expect(map.exports[libPath('b.dart')], isEmpty);
-      expect(map.transitiveExports(libPath('b.dart')), isEmpty);
+        expect(map.transitiveExports(b), isEmpty);
+      });
     });
 
     test('with one library with multiple exports', () {
-      createLibrary('a.dart', 'export "b.dart";\nexport "c.dart";');
-      createLibrary('b.dart');
-      createLibrary('c.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart";\nexport "c.dart";',
+        'b.dart': '', 'c.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
+        var c = libMirror('memory:c.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart')),
-        new Export(libPath('a.dart'), libPath('c.dart'))
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b),
+          new Export(a, c)
+        ]));
 
-      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart')),
-        new Export(libPath('a.dart'), libPath('c.dart'))
-      ]));
+        expect(map.transitiveExports(a), unorderedEquals([
+          new Export(a, b),
+          new Export(a, c)
+        ]));
 
-      expect(map.allExportedFiles, unorderedEquals([
-        libPath('b.dart'), libPath('c.dart')
-      ]));
-
-      expect(map.exports[libPath('b.dart')], isEmpty);
-      expect(map.transitiveExports(libPath('b.dart')), isEmpty);
-      expect(map.exports[libPath('c.dart')], isEmpty);
-      expect(map.transitiveExports(libPath('c.dart')), isEmpty);
+        expect(map.exports[b], isEmpty);
+        expect(map.transitiveExports(b), isEmpty);
+        expect(map.exports[c], isEmpty);
+        expect(map.transitiveExports(c), isEmpty);
+      });
     });
 
     test('with two libraries each with one export', () {
-      createLibrary('a.dart', 'export "a_export.dart";');
-      createLibrary('b.dart', 'export "b_export.dart";');
-      createLibrary('a_export.dart');
-      createLibrary('b_export.dart');
-      var map = parse(['a.dart', 'b.dart']);
+      return testExports({
+        'a.dart': 'export "a_export.dart";',
+        'b.dart': 'export "b_export.dart";',
+        'a_export.dart': '',
+        'b_export.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
+        var a_export = libMirror('memory:a_export.dart');
+        var b_export = libMirror('memory:b_export.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('a_export.dart')),
-      ]));
-      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
-        new Export(libPath('a.dart'), libPath('a_export.dart')),
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, a_export),
+        ]));
+        expect(map.transitiveExports(a), unorderedEquals([
+          new Export(a, a_export),
+        ]));
 
-      expect(map.transitiveExports(libPath('b.dart')), unorderedEquals([
-        new Export(libPath('b.dart'), libPath('b_export.dart')),
-      ]));
-      expect(map.exports[libPath('b.dart')], unorderedEquals([
-        new Export(libPath('b.dart'), libPath('b_export.dart'))
-      ]));
+        expect(map.transitiveExports(b), unorderedEquals([
+          new Export(b, b_export),
+        ]));
+        expect(map.exports[b], unorderedEquals([
+          new Export(b, b_export)
+        ]));
 
-      expect(map.allExportedFiles, unorderedEquals([
-        libPath('a_export.dart'), libPath('b_export.dart')
-      ]));
-
-      expect(map.exports[libPath('a_export.dart')], isEmpty);
-      expect(map.transitiveExports(libPath('a_export.dart')), isEmpty);
-      expect(map.exports[libPath('b_export.dart')], isEmpty);
-      expect(map.transitiveExports(libPath('b_export.dart')), isEmpty);
+        expect(map.exports[a_export], isEmpty);
+        expect(map.transitiveExports(a_export), isEmpty);
+        expect(map.exports[b_export], isEmpty);
+        expect(map.transitiveExports(b_export), isEmpty);
+      });
     });
 
     test('with a transitive export', () {
-      createLibrary('a.dart', 'export "b.dart";');
-      createLibrary('b.dart', 'export "c.dart";');
-      createLibrary('c.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart";',
+        'b.dart': 'export "c.dart";',
+        'c.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
+        var c = libMirror('memory:c.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart')),
-      ]));
-      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart')),
-        new Export(libPath('a.dart'), libPath('c.dart')),
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b),
+        ]));
+        expect(map.transitiveExports(a), unorderedEquals([
+          new Export(a, b),
+          new Export(a, c),
+        ]));
 
-      expect(map.exports[libPath('b.dart')], unorderedEquals([
-        new Export(libPath('b.dart'), libPath('c.dart')),
-      ]));
-      expect(map.transitiveExports(libPath('b.dart')), unorderedEquals([
-        new Export(libPath('b.dart'), libPath('c.dart')),
-      ]));
+        expect(map.exports[b], unorderedEquals([
+          new Export(b, c),
+        ]));
+        expect(map.transitiveExports(b), unorderedEquals([
+          new Export(b, c),
+        ]));
 
-      expect(map.allExportedFiles, unorderedEquals([
-        libPath('b.dart'), libPath('c.dart')
-      ]));
-
-      expect(map.exports[libPath('c.dart')], isEmpty);
-      expect(map.transitiveExports(libPath('c.dart')), isEmpty);
+        expect(map.exports[c], isEmpty);
+        expect(map.transitiveExports(c), isEmpty);
+      });
     });
 
     test('with an export through an import', () {
-      createLibrary('a.dart', 'import "b.dart";');
-      createLibrary('b.dart', 'export "c.dart";');
-      createLibrary('c.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'import "b.dart";',
+        'b.dart': 'export "c.dart";',
+        'c.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
+        var c = libMirror('memory:c.dart');
 
-      expect(map.exports[libPath('b.dart')], unorderedEquals([
-        new Export(libPath('b.dart'), libPath('c.dart')),
-      ]));
-      expect(map.transitiveExports(libPath('b.dart')), unorderedEquals([
-        new Export(libPath('b.dart'), libPath('c.dart')),
-      ]));
+        expect(map.exports[b], unorderedEquals([
+          new Export(b, c),
+        ]));
+        expect(map.transitiveExports(b), unorderedEquals([
+          new Export(b, c),
+        ]));
 
-      expect(map.allExportedFiles, unorderedEquals([libPath('c.dart')]));
-
-      expect(map.exports[libPath('a.dart')], isEmpty);
-      expect(map.exports[libPath('c.dart')], isEmpty);
-      expect(map.transitiveExports(libPath('a.dart')), isEmpty);
-      expect(map.transitiveExports(libPath('c.dart')), isEmpty);
+        expect(map.exports[a], isEmpty);
+        expect(map.exports[c], isEmpty);
+        expect(map.transitiveExports(a), isEmpty);
+        expect(map.transitiveExports(c), isEmpty);
+      });
     });
 
     test('with an export with a show combinator', () {
-      createLibrary('a.dart', 'export "b.dart" show x, y;');
-      createLibrary('b.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart" show x, y;',
+        'b.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'), show: ['x', 'y'])
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b, show: ['x', 'y'])
+        ]));
+      });
     });
 
     test('with an export with a hide combinator', () {
-      createLibrary('a.dart', 'export "b.dart" hide x, y;');
-      createLibrary('b.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart" hide x, y;',
+        'b.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['x', 'y'])
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b, hide: ['x', 'y'])
+        ]));
+      });
     });
 
     test('with an export with a show and a hide combinator', () {
-      createLibrary('a.dart', 'export "b.dart" show x, y hide y, z;');
-      createLibrary('b.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart" show x, y hide y, z;',
+        'b.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'), show: ['x'])
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b, show: ['x'])
+        ]));
+      });
     });
 
     test('composes transitive exports', () {
-      createLibrary('a.dart', 'export "b.dart" hide x;');
-      createLibrary('b.dart', 'export "c.dart" hide y;');
-      createLibrary('c.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart" hide x;',
+        'b.dart': 'export "c.dart" hide y;',
+        'c.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
+        var c = libMirror('memory:c.dart');
 
-      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['x']),
-        new Export(libPath('a.dart'), libPath('c.dart'), hide: ['x', 'y'])
-      ]));
+        expect(map.transitiveExports(a), unorderedEquals([
+          new Export(a, b, hide: ['x']),
+          new Export(a, c, hide: ['x', 'y'])
+        ]));
+      });
     });
 
     test('merges adjacent exports', () {
-      createLibrary('a.dart', '''
-          export "b.dart" show x, y;
-          export "b.dart" hide y, z;
-      ''');
-      createLibrary('b.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': '''
+            export "b.dart" show x, y;
+            export "b.dart" hide y, z;
+        ''',
+        'b.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['z']),
-      ]));
-      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart'), hide: ['z']),
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b, hide: ['z']),
+        ]));
+        expect(map.transitiveExports(a), unorderedEquals([
+          new Export(a, b, hide: ['z']),
+        ]));
+      });
     });
 
     test('merges adjacent exports transitively', () {
-      createLibrary('a.dart', 'export "b.dart";\nexport "c.dart";');
-      createLibrary('b.dart', 'export "d.dart" show x, y;');
-      createLibrary('c.dart', 'export "d.dart" hide y, z;');
-      createLibrary('d.dart');
-      var map = parse(['a.dart']);
+      return testExports({
+        'a.dart': 'export "b.dart";\nexport "c.dart";',
+        'b.dart': 'export "d.dart" show x, y;',
+        'c.dart': 'export "d.dart" hide y, z;',
+        'd.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('memory:b.dart');
+        var c = libMirror('memory:c.dart');
+        var d = libMirror('memory:d.dart');
 
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart')),
-        new Export(libPath('a.dart'), libPath('c.dart')),
-      ]));
-      expect(map.transitiveExports(libPath('a.dart')), unorderedEquals([
-        new Export(libPath('a.dart'), libPath('b.dart')),
-        new Export(libPath('a.dart'), libPath('c.dart')),
-        new Export(libPath('a.dart'), libPath('d.dart'), hide: ['z']),
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b),
+          new Export(a, c),
+        ]));
+        expect(map.transitiveExports(a), unorderedEquals([
+          new Export(a, b),
+          new Export(a, c),
+          new Export(a, d, hide: ['z']),
+        ]));
+      });
     });
 
     test('resolves package: exports', () {
-      createLibrary('a.dart', 'export "package:b/b.dart";');
-      var bPath = pathos.join('packages', 'b', 'b.dart');
-      createLibrary(bPath);
-      var map = parse(['a.dart']);
-
-      expect(map.exports[libPath('a.dart')], unorderedEquals([
-        new Export(libPath('a.dart'), libPath(bPath))
-      ]));
+      return testExports({
+        'a.dart': 'export "package:b/b.dart";',
+        'packages/b/b.dart': ''
+      }).then((map) {
+        var a = libMirror('memory:a.dart');
+        var b = libMirror('package:b/b.dart');
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b)
+        ]));
+      });
     });
 
     test('ignores dart: exports', () {
-      createLibrary('a.dart', 'export "dart:async";');
-      var map = parse(['a.dart']);
-      expect(map.exports[libPath('a.dart')], isEmpty);
+      return testExports({'a.dart': 'export "dart:async";'}).then((map) {
+        var a = libMirror('memory:a.dart');
+
+        expect(map.exports[a], isEmpty);
+      });
     });
 
     test('.parse() resolves package: imports', () {
-      var aPath = pathos.join('packages', 'a', 'a.dart');
-      createLibrary(aPath, 'export "package:b/b.dart";');
-      var bPath = pathos.join('packages', 'b', 'b.dart');
-      createLibrary(bPath);
-      var map = new ExportMap.parse(
-          [Uri.parse('package:a/a.dart')],
-          pathos.join(tempDir, 'packages'));
+      return testExports({
+        'packages/a/a.dart': 'export "package:b/b.dart";',
+        'packages/b/b.dart': ''
+      }).then((map) {
+        var a = libMirror('package:a/a.dart');
+        var b = libMirror('package:b/b.dart');
 
-      expect(map.exports[libPath(aPath)], unorderedEquals([
-        new Export(libPath(aPath), libPath(bPath))
-      ]));
+        expect(map.exports[a], unorderedEquals([
+          new Export(a, b)
+        ]));
+      });
     });
 
     test('.parse() ignores dart: imports', () {
-      var map = new ExportMap.parse(
-          [Uri.parse('dart:async')],
-          pathos.join(tempDir, 'packages'));
-      expect(map.exports, isEmpty);
+      return testExports({}).then((map) {
+        expect(map.exports, isEmpty);
+      });
     });
   });
 
   group('Export', () {
     test('normalizes hide and show', () {
-      expect(new Export('', '', show: ['x', 'y'], hide: ['y', 'z']),
-          equals(new Export('', '', show: ['x'])));
+      expect(new Export(null, null, show: ['x', 'y'], hide: ['y', 'z']),
+          equals(new Export(null, null, show: ['x'])));
     });
 
     test("doesn't care about the order of show or hide", () {
-      expect(new Export('', '', show: ['x', 'y']),
-          equals(new Export('', '', show: ['y', 'x'])));
-      expect(new Export('', '', hide: ['x', 'y']),
-          equals(new Export('', '', hide: ['y', 'x'])));
+      expect(new Export(null, null, show: ['x', 'y']),
+          equals(new Export(null, null, show: ['y', 'x'])));
+      expect(new Export(null, null, hide: ['x', 'y']),
+          equals(new Export(null, null, hide: ['y', 'x'])));
     });
 
     test('with no combinators considers anything visible', () {
-      var export = new Export('', '');
+      var export = new Export(null, null);
       expect(export.isMemberVisible('x'), isTrue);
       expect(export.isMemberVisible('y'), isTrue);
       expect(export.isMemberVisible('z'), isTrue);
     });
 
     test('with hide combinators considers anything not hidden visible', () {
-      var export = new Export('', '', hide: ['x', 'y']);
+      var export = new Export(null, null, hide: ['x', 'y']);
       expect(export.isMemberVisible('x'), isFalse);
       expect(export.isMemberVisible('y'), isFalse);
       expect(export.isMemberVisible('z'), isTrue);
     });
 
     test('with show combinators considers anything not shown invisible', () {
-      var export = new Export('', '', show: ['x', 'y']);
+      var export = new Export(null, null, show: ['x', 'y']);
       expect(export.isMemberVisible('x'), isTrue);
       expect(export.isMemberVisible('y'), isTrue);
       expect(export.isMemberVisible('z'), isFalse);
     });
 
     test('composing uses the parent exporter and child path', () {
-      expect(new Export('exporter1.dart', 'path1.dart')
-              .compose(new Export('exporter2.dart', 'path2.dart')),
-          equals(new Export('exporter1.dart', 'path2.dart')));
+      return testExports({
+        'exporter1.dart': '',
+        'exporter2.dart': '',
+        'path1.dart': '',
+        'path2.dart': ''
+      }).then((map) {
+        var exporter1 = libMirror('memory:exporter1.dart');
+        var exporter2 = libMirror('memory:exporter2.dart');
+        var path1 = libMirror('memory:path1.dart');
+        var path2 = libMirror('memory:path2.dart');
+        expect(new Export(exporter1, path1)
+                .compose(new Export(exporter2, path2)),
+            equals(new Export(exporter1, path2)));
+      });
     });
 
     test('composing show . show takes the intersection', () {
-      expect(new Export('', '', show: ['x', 'y'])
-              .compose(new Export('', '', show: ['y', 'z'])),
-          equals(new Export('', '', show: ['y'])));
+      expect(new Export(null, null, show: ['x', 'y'])
+              .compose(new Export(null, null, show: ['y', 'z'])),
+          equals(new Export(null, null, show: ['y'])));
     });
 
     test('composing show . hide takes the difference', () {
-      expect(new Export('', '', show: ['x', 'y'])
-              .compose(new Export('', '', hide: ['y', 'z'])),
-          equals(new Export('', '', show: ['x'])));
+      expect(new Export(null, null, show: ['x', 'y'])
+              .compose(new Export(null, null, hide: ['y', 'z'])),
+          equals(new Export(null, null, show: ['x'])));
     });
 
     test('composing hide . show takes the reverse difference', () {
-      expect(new Export('', '', hide: ['x', 'y'])
-              .compose(new Export('', '', show: ['y', 'z'])),
-          equals(new Export('', '', show: ['z'])));
+      expect(new Export(null, null, hide: ['x', 'y'])
+              .compose(new Export(null, null, show: ['y', 'z'])),
+          equals(new Export(null, null, show: ['z'])));
     });
 
     test('composing hide . hide takes the union', () {
-      expect(new Export('', '', hide: ['x', 'y'])
-              .compose(new Export('', '', hide: ['y', 'z'])),
-          equals(new Export('', '', hide: ['x', 'y', 'z'])));
+      expect(new Export(null, null, hide: ['x', 'y'])
+              .compose(new Export(null, null, hide: ['y', 'z'])),
+          equals(new Export(null, null, hide: ['x', 'y', 'z'])));
     });
 
     test('merging requires identical exporters and paths', () {
-      expect(() => new Export('exporter1.dart', '')
-              .merge(new Export('exporter2.dart', '')),
-          throwsA(isArgumentError));
-      expect(() => new Export('', 'path1.dart')
-              .merge(new Export('', 'path2.dart')),
-          throwsA(isArgumentError));
-      expect(new Export('', '').merge(new Export('', '')),
-          equals(new Export('', '')));
+      return testExports({
+        'exporter1.dart': '',
+        'exporter2.dart': '',
+        'path1.dart': '',
+        'path2.dart': ''
+      }).then((map) {
+          var exporter1 = libMirror('memory:exporter1.dart');
+          var exporter2 = libMirror('memory:exporter2.dart');
+          var path1 = libMirror('memory:path1.dart');
+          var path2 = libMirror('memory:path2.dart');
+        expect(() => new Export(exporter1, null)
+                .merge(new Export(exporter2, null)),
+            throwsA(isArgumentError));
+        expect(() => new Export(null, path1)
+                .merge(new Export(null, path2)),
+            throwsA(isArgumentError));
+        expect(new Export(null, null)
+                    .merge(new Export(null, null)),
+            equals(new Export(null, null)));
+      });
     });
 
     test('merging show + show takes the union', () {
-      expect(new Export('', '', show: ['x', 'y'])
-              .merge(new Export('', '', show: ['y', 'z'])),
-          equals(new Export('', '', show: ['x', 'y', 'z'])));
+      expect(new Export(null, null, show: ['x', 'y'])
+              .merge(new Export(null, null, show: ['y', 'z'])),
+          equals(new Export(null, null, show: ['x', 'y', 'z'])));
     });
 
     test('merging show + hide takes the difference', () {
-      expect(new Export('', '', show: ['x', 'y'])
-              .merge(new Export('', '', hide: ['y', 'z'])),
-          equals(new Export('', '', hide: ['z'])));
+      expect(new Export(null, null, show: ['x', 'y'])
+              .merge(new Export(null, null, hide: ['y', 'z'])),
+          equals(new Export(null, null, hide: ['z'])));
     });
 
     test('merging hide + show takes the difference', () {
-      expect(new Export('', '', hide: ['x', 'y'])
-              .merge(new Export('', '', show: ['y', 'z'])),
-          equals(new Export('', '', hide: ['x'])));
+      expect(new Export(null, null, hide: ['x', 'y'])
+              .merge(new Export(null, null, show: ['y', 'z'])),
+          equals(new Export(null, null, hide: ['x'])));
     });
 
     test('merging hide + hide takes the intersection', () {
-      expect(new Export('', '', hide: ['x', 'y'])
-              .merge(new Export('', '', hide: ['y', 'z'])),
-          equals(new Export('', '', hide: ['y'])));
+      expect(new Export(null, null, hide: ['x', 'y'])
+              .merge(new Export(null, null, hide: ['y', 'z'])),
+          equals(new Export(null, null, hide: ['y'])));
     });
   });
 }
-
-ExportMap parse(List<String> libraries) {
-  return new ExportMap.parse(
-      libraries.map(libPath).map(pathos.toUri),
-      pathos.join(tempDir, 'packages'));
-}
-
-void createLibrary(String name, [String contents]) {
-  if (contents == null) contents = '';
-  new Directory(pathos.dirname(libPath(name))).createSync(recursive: true);
-  new File(libPath(name)).writeAsStringSync('''
-      library ${pathos.basename(name)};
-      $contents
-  ''');
-}
-
-String libPath(String name) => pathos.normalize(pathos.join(tempDir, name));
-
-void createTempDir() {
-  tempDir = Directory.systemTemp.createTempSync('dartdoc_').path;
-  new Directory(pathos.join(tempDir, 'packages')).createSync();
-}
-
-void deleteTempDir() {
-  new Directory(tempDir).deleteSync(recursive: true);
-}
diff --git a/sdk/lib/_internal/lib/annotations.dart b/sdk/lib/_internal/lib/annotations.dart
new file mode 100644
index 0000000..66d4818
--- /dev/null
+++ b/sdk/lib/_internal/lib/annotations.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of _js_helper;
+
+/// Tells the optimizing compiler that the annotated method has no
+/// side-effects.
+/// Requires @NoInline() to function correctly.
+class NoSideEffects {
+  const NoSideEffects();
+}
+
+/// Tells the optimizing compiler that the annotated method cannot throw.
+/// Requires @NoInline() to function correctly.
+class NoThrows {
+  const NoThrows();
+}
+
+/// Tells the optimizing compiler to not inline the annotated method.
+class NoInline {
+  const NoInline();
+}
diff --git a/sdk/lib/_internal/lib/collection_dev_patch.dart b/sdk/lib/_internal/lib/collection_dev_patch.dart
index f7467fd..cd766c4 100644
--- a/sdk/lib/_internal/lib/collection_dev_patch.dart
+++ b/sdk/lib/_internal/lib/collection_dev_patch.dart
@@ -2,45 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:_foreign_helper' show JS;
+import 'dart:_js_primitives' show printString;
 
 patch class Symbol implements core.Symbol {
   patch const Symbol(String name)
       : this._name = name;
 }
 
-/**
-  * This is the low-level method that is used to implement
-  * [print]. It is possible to override this function from JavaScript
-  * by defining a function in JavaScript called "dartPrint".
-  */
 patch void printToConsole(String line) {
-  if (JS('bool', r'typeof dartPrint == "function"')) {
-    // Support overriding print from JavaScript.
-    JS('void', r'dartPrint(#)', line);
-    return;
-  }
-
-  // Inside browser or nodejs.
-  if (JS('bool', r'typeof console == "object"') &&
-      JS('bool', r'typeof console.log == "function"')) {
-    JS('void', r'console.log(#)', line);
-    return;
-  }
-
-  // Don't throw inside IE, the console is only defined if dev tools is open.
-  if (JS('bool', r'typeof window == "object"')) {
-    return;
-  }
-
-  // Running in d8, the V8 developer shell, or in Firefox' js-shell.
-  if (JS('bool', r'typeof print == "function"')) {
-    JS('void', r'print(#)', line);
-    return;
-  }
-
-  // This is somewhat nasty, but we don't want to drag in a bunch of
-  // dependencies to handle a situation that cannot happen. So we
-  // avoid using Dart [:throw:] and Dart [toString].
-  JS('void', 'throw "Unable to print message: " + String(#)', line);
+  printString('$line');
 }
diff --git a/sdk/lib/_internal/lib/collection_patch.dart b/sdk/lib/_internal/lib/collection_patch.dart
index e98bac6..feb40e6 100644
--- a/sdk/lib/_internal/lib/collection_patch.dart
+++ b/sdk/lib/_internal/lib/collection_patch.dart
@@ -71,7 +71,7 @@
   }
 
   Iterable<V> get values {
-    return keys.map((each) => this[each]);
+    return new MappedIterable<K, V>(keys, (each) => this[each]);
   }
 
   bool containsKey(Object key) {
@@ -527,7 +527,7 @@
   }
 
   Iterable<V> get values {
-    return keys.map((each) => this[each]);
+    return new MappedIterable<K, V>(keys, (each) => this[each]);
   }
 
   bool containsKey(Object key) {
diff --git a/sdk/lib/_internal/lib/constant_map.dart b/sdk/lib/_internal/lib/constant_map.dart
index 5c68379..0fabc0b 100644
--- a/sdk/lib/_internal/lib/constant_map.dart
+++ b/sdk/lib/_internal/lib/constant_map.dart
@@ -55,7 +55,7 @@
   }
 
   Iterable<V> get values {
-    return _keys.map((key) => this[key]);
+    return new MappedIterable<K, V>(_keys, (key) => this[key]);
   }
 }
 
@@ -92,7 +92,9 @@
   // have not been defined when constants are created.
   Map<K, V> _getMap() {
     if (JS('bool', r'!this.$map')) {
-      JS('', r'this.$map = #', makeConstantMap(_jsData));
+      Map backingMap =
+          new LinkedHashMap<K, V>(equals: identical, hashCode: objectHashCode);
+      JS('', r'this.$map = #', fillLiteralMap(_jsData, backingMap));
     }
     return JS('Map', r'this.$map');
   }
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 601149a..de1c0c0 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -11,7 +11,6 @@
                               Primitives,
                               stringJoinUnchecked,
                               objectHashCode;
-import "dart:_collection-dev" as _symbol_dev;
 
 String _symbolToString(Symbol symbol) => _symbol_dev.Symbol.getName(symbol);
 
@@ -191,22 +190,12 @@
 // Patch for List implementation.
 patch class List<E> {
   patch factory List([int length]) {
-    if (length == null) return Primitives.newGrowableList(0);
-    // Explicit type test is necessary to protect Primitives.newFixedList in
-    // unchecked mode.
-    if ((length is !int) || (length < 0)) {
-      throw new ArgumentError("Length must be a positive integer: $length.");
-    }
-    return Primitives.newFixedList(length);
+    if (length == null) return new JSArray<E>.emptyGrowable();
+    return new JSArray<E>.fixed(length);
   }
 
   patch factory List.filled(int length, E fill) {
-    // Explicit type test is necessary to protect Primitives.newFixedList in
-    // unchecked mode.
-    if ((length is !int) || (length < 0)) {
-      throw new ArgumentError("Length must be a positive integer: $length.");
-    }
-    List result = Primitives.newFixedList(length);
+    List result = new JSArray<E>.fixed(length);
     if (length != 0 && fill != null) {
       for (int i = 0; i < result.length; i++) {
         result[i] = fill;
diff --git a/sdk/lib/_internal/lib/interceptors.dart b/sdk/lib/_internal/lib/interceptors.dart
index 23955bb..3bab8fd 100644
--- a/sdk/lib/_internal/lib/interceptors.dart
+++ b/sdk/lib/_internal/lib/interceptors.dart
@@ -28,7 +28,8 @@
                               lookupAndCacheInterceptor,
                               lookupDispatchRecord,
                               StringMatch,
-                              firstMatchAfter;
+                              firstMatchAfter,
+                              NoInline;
 import 'dart:_foreign_helper' show JS, JS_EFFECT, JS_INTERCEPTOR_CONSTANT;
 import 'dart:math' show Random;
 
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 069e9a8..d262d79 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -233,6 +233,9 @@
   patch static InternetAddress get ANY_IP_V6 {
     throw new UnsupportedError("InternetAddress.ANY_IP_V6");
   }
+  patch factory InternetAddress(String address) {
+    throw new UnsupportedError("InternetAddress");
+  }
   patch static Future<List<InternetAddress>> lookup(
       String host, {InternetAddressType type: InternetAddressType.ANY}) {
     throw new UnsupportedError("InternetAddress.lookup");
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index d13871b..3eb0459 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -225,14 +225,14 @@
   int id;
 
   /** Registry of receive ports currently active on this isolate. */
-  Map<int, ReceivePort> ports;
+  Map<int, RawReceivePortImpl> ports;
 
   /** Holds isolate globals (statics and top-level properties). */
   var isolateStatics; // native object containing all globals of an isolate.
 
   _IsolateContext() {
     id = _globalState.nextIsolateId++;
-    ports = new Map<int, ReceivePort>();
+    ports = new Map<int, RawReceivePortImpl>();
     isolateStatics = JS_CREATE_ISOLATE();
   }
 
@@ -258,10 +258,10 @@
   }
 
   /** Lookup a port registered for this isolate. */
-  ReceivePort lookup(int portId) => ports[portId];
+  RawReceivePortImpl lookup(int portId) => ports[portId];
 
   /** Register a port on this isolate. */
-  void register(int portId, ReceivePort port)  {
+  void register(int portId, RawReceivePortImpl port)  {
     if (ports.containsKey(portId)) {
       throw new Exception("Registry: ports must be registered only once.");
     }
@@ -725,7 +725,7 @@
 
 /** A send port that delivers messages in-memory via native JavaScript calls. */
 class _NativeJsSendPort extends _BaseSendPort implements SendPort {
-  final ReceivePortImpl _receivePort;
+  final RawReceivePortImpl _receivePort;
 
   const _NativeJsSendPort(this._receivePort, int isolateId) : super(isolateId);
 
@@ -734,7 +734,7 @@
       // Check that the isolate still runs and the port is still open
       final isolate = _globalState.isolates[_isolateId];
       if (isolate == null) return;
-      if (_receivePort._controller.isClosed) return;
+      if (_receivePort._isClosed) return;
 
       // We force serialization/deserialization as a simple way to ensure
       // isolate communication restrictions are respected between isolates that
@@ -750,11 +750,11 @@
         msg = _serializeMessage(msg);
       }
       _globalState.topEventLoop.enqueue(isolate, () {
-        if (!_receivePort._controller.isClosed) {
+        if (!_receivePort._isClosed) {
           if (shouldSerialize) {
             msg = _deserializeMessage(msg);
           }
-          _receivePort._controller.add(msg);
+          _receivePort._add(msg);
         }
       }, 'receive $message');
     });
@@ -859,16 +859,47 @@
   int get hashCode => _id;
 }
 
-/** Implementation of a multi-use [ReceivePort] on top of JavaScript. */
-class ReceivePortImpl extends Stream implements ReceivePort {
+class RawReceivePortImpl implements RawReceivePort {
   static int _nextFreeId = 1;
-  final int _id;
+
+  final int _id = _nextFreeId++;
+  Function _handler;
+  bool _isClosed = false;
+
+  RawReceivePortImpl(this._handler) {
+    _globalState.currentContext.register(_id, this);
+  }
+
+  void set handler(Function newHandler) {
+    _handler = newHandler;
+  }
+
+  void close() {
+    if (_isClosed) return;
+    _isClosed = true;
+    _handler = null;
+    _globalState.currentContext.unregister(_id);
+  }
+
+  void _add(dataEvent) {
+    if (_isClosed) return;
+    _handler(dataEvent);
+  }
+
+  SendPort get sendPort {
+    return new _NativeJsSendPort(this, _globalState.currentContext.id);
+  }
+}
+
+class ReceivePortImpl extends Stream implements ReceivePort {
+  final RawReceivePort _rawPort;
   StreamController _controller;
 
-  ReceivePortImpl()
-      : _id = _nextFreeId++ {
+  ReceivePortImpl() : this.fromRawReceivePort(new RawReceivePortImpl(null));
+
+  ReceivePortImpl.fromRawReceivePort(this._rawPort) {
     _controller = new StreamController(onCancel: close, sync: true);
-    _globalState.currentContext.register(_id, this);
+    _rawPort.handler = _controller.add;
   }
 
   StreamSubscription listen(void onData(var event),
@@ -880,16 +911,14 @@
   }
 
   void close() {
-    if (_controller.isClosed) return;
+    _rawPort.close();
     _controller.close();
-    _globalState.currentContext.unregister(_id);
   }
 
-  SendPort get sendPort {
-    return new _NativeJsSendPort(this, _globalState.currentContext.id);
-  }
+  SendPort get sendPort => _rawPort.sendPort;
 }
 
+
 /** Wait until all ports in a message are resolved. */
 _waitForPendingPorts(var message, void callback()) {
   final finder = new _PendingSendPortFinder();
@@ -1220,7 +1249,9 @@
 
   _serializeList(List list) {
     int len = list.length;
-    var result = new List(len);
+    // Use a growable list because we do not add extra properties on
+    // them.
+    var result = new List()..length = len;
     for (int i = 0; i < len; i++) {
       result[i] = _dispatch(list[i]);
     }
diff --git a/sdk/lib/_internal/lib/isolate_patch.dart b/sdk/lib/_internal/lib/isolate_patch.dart
index 057e571..69fa23e 100644
--- a/sdk/lib/_internal/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/lib/isolate_patch.dart
@@ -7,6 +7,7 @@
 import 'dart:_isolate_helper' show IsolateNatives,
                                    lazyPort,
                                    ReceivePortImpl,
+                                   RawReceivePortImpl,
                                    CloseToken,
                                    JsIsolateSink;
 
@@ -34,17 +35,15 @@
 
 /** Default factory for receive ports. */
 patch class ReceivePort {
-  patch factory ReceivePort() {
-    return new ReceivePortImpl();
-  }
+  patch factory ReceivePort() = ReceivePortImpl;
 
   patch factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
-    throw new UnimplementedError("ReceivePort.fromRawReceivePort");
+    return new ReceivePortImpl.fromRawReceivePort(rawPort);
   }
 }
 
 patch class RawReceivePort {
   patch factory RawReceivePort([void handler(event)]) {
-    throw new UnimplementedError("RawReceivePort");
+    return new RawReceivePortImpl(handler);
   }
 }
diff --git a/sdk/lib/_internal/lib/js_array.dart b/sdk/lib/_internal/lib/js_array.dart
index 32c0c8c..ec5aef9 100644
--- a/sdk/lib/_internal/lib/js_array.dart
+++ b/sdk/lib/_internal/lib/js_array.dart
@@ -14,6 +14,66 @@
 
   const JSArray();
 
+  /**
+   * Returns a fresh JavaScript Array, marked as fixed-length.
+   *
+   * [length] must be a non-negative integer.
+   */
+  factory JSArray.fixed(int length)  {
+    // Explicit type test is necessary to guard against JavaScript conversions
+    // in unchecked mode.
+    if ((length is !int) || (length < 0)) {
+      throw new ArgumentError("Length must be a non-negative integer: $length");
+    }
+    return new JSArray<E>.markFixed(JS('', 'new Array(#)', length));
+  }
+
+  /**
+   * Returns a fresh growable JavaScript Array of zero length length.
+   */
+  factory JSArray.emptyGrowable() => new JSArray<E>.markGrowable(JS('', '[]'));
+
+  /**
+   * Returns a fresh growable JavaScript Array with initial length.
+   *
+   * [validatedLength] must be a non-negative integer.
+   */
+  factory JSArray.growable(int length) {
+    // Explicit type test is necessary to guard against JavaScript conversions
+    // in unchecked mode.
+    if ((length is !int) || (length < 0)) {
+      throw new ArgumentError("Length must be a non-negative integer: $length");
+    }
+    return new JSArray<E>.markGrowable(JS('', 'new Array(#)', length));
+  }
+
+  /**
+   * Constructor for adding type parameters to an existing JavaScript Array.
+   * The compiler specially recognizes this constructor.
+   *
+   *     var a = new JSArray<int>.typed(JS('JSExtendableArray', '[]'));
+   *     a is List<int>    --> true
+   *     a is List<String> --> false
+   *
+   * Usually either the [JSArray.markFixed] or [JSArray.markGrowable]
+   * constructors is used instead.
+   *
+   * The input must be a JavaScript Array.  The JS form is just a re-assertion
+   * to help type analysis when the input type is sloppy.
+   */
+  factory JSArray.typed(allocation) => JS('JSArray', '#', allocation);
+
+  factory JSArray.markFixed(allocation) =>
+      JS('JSFixedArray', '#', markFixedList(new JSArray<E>.typed(allocation)));
+
+  factory JSArray.markGrowable(allocation) =>
+      JS('JSExtendableArray', '#', new JSArray<E>.typed(allocation));
+
+  static List markFixedList(List list) {
+    JS('void', r'#.fixed$length = init', list);
+    return JS('JSFixedArray', '#', list);
+  }
+
   checkMutable(reason) {
     if (this is !JSMutableArray) {
       throw new UnsupportedError(reason);
@@ -174,9 +234,9 @@
         throw new RangeError.range(end, start, length);
       }
     }
-    // TODO(ngeoffray): Parameterize the return value.
-    if (start == end) return [];
-    return JS('JSExtendableArray', r'#.slice(#, #)', this, start, end);
+    if (start == end) return <E>[];
+    return new JSArray<E>.markGrowable(
+        JS('', r'#.slice(#, #)', this, start, end));
   }
 
 
@@ -268,8 +328,13 @@
 
   String toString() => IterableMixinWorkaround.toStringIterable(this, '[', ']');
 
-  List<E> toList({ bool growable: true }) =>
-      new List<E>.from(this, growable: growable);
+  List<E> toList({ bool growable: true }) {
+    if (growable) {
+      return new JSArray<E>.markGrowable(JS('', '#.slice()', this));
+    } else {
+      return new JSArray<E>.markFixed(JS('', '#.slice()', this));
+    }
+  }
 
   Set<E> toSet() => new Set<E>.from(this);
 
@@ -309,6 +374,6 @@
  * information about arrays through their type. The CPA type inference
  * relies on the fact that these classes do not override [] nor []=.
  */
-class JSMutableArray extends JSArray implements JSMutableIndexable {}
-class JSFixedArray extends JSMutableArray {}
-class JSExtendableArray extends JSMutableArray {}
+class JSMutableArray<E> extends JSArray<E> implements JSMutableIndexable {}
+class JSFixedArray<E> extends JSMutableArray<E> {}
+class JSExtendableArray<E> extends JSMutableArray<E> {}
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index b4d4b4a..7e753ef 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -30,11 +30,13 @@
                                    RAW_DART_FUNCTION_REF;
 import 'dart:_interceptors';
 import 'dart:_collection-dev' as _symbol_dev;
+import 'dart:_collection-dev' show MappedIterable;
 
 import 'dart:_js_names' show
     mangledNames,
     unmangleGlobalNameIfPreservedAnyways;
 
+part 'annotations.dart';
 part 'constant_map.dart';
 part 'native_helper.dart';
 part 'regexp_helper.dart';
@@ -414,16 +416,6 @@
     return "Instance of '$name'";
   }
 
-  static List newGrowableList(length) {
-    return JS('JSExtendableArray', r'new Array(#)', length);
-  }
-
-  static List newFixedList(length) {
-    var result = JS('JSFixedArray', r'new Array(#)', length);
-    JS('void', r'#.fixed$length = #', result, true);
-    return result;
-  }
-
   static num dateNow() => JS('num', r'Date.now()');
 
   static num numMicroseconds() {
@@ -526,11 +518,37 @@
   }
 
   static String getTimeZoneName(receiver) {
-    // When calling toString on a Date it will emit the timezone in parenthesis.
+    // Firefox and Chrome emit the timezone in parenthesis.
     // Example: "Wed May 16 2012 21:13:00 GMT+0200 (CEST)".
     // We extract this name using a regexp.
     var d = lazyAsJsDate(receiver);
-    return JS('String', r'/\((.*)\)/.exec(#.toString())[1]', d);
+    List match = JS('JSArray|Null', r'/\((.*)\)/.exec(#.toString())', d);
+    if (match != null) return match[1];
+
+    // Internet Explorer 10+ emits the zone name without parenthesis:
+    // Example: Thu Oct 31 14:07:44 PDT 2013
+    match = JS('JSArray|Null',
+                // Thu followed by a space.
+                r'/^[A-Z,a-z]{3}\s'
+                // Oct 31 followed by space.
+                r'[A-Z,a-z]{3}\s\d+\s'
+                // Time followed by a space.
+                r'\d{2}:\d{2}:\d{2}\s'
+                // The time zone name followed by a space.
+                r'([A-Z]{3,5})\s'
+                // The year.
+                r'\d{4}$/'
+                '.exec(#.toString())',
+                d);
+    if (match != null) return match[1];
+
+    // IE 9 and Opera don't provide the zone name. We fall back to emitting the
+    // UTC/GMT offset.
+    // Example (IE9): Wed Nov 20 09:51:00 UTC+0100 2013
+    //       (Opera): Wed Nov 20 2013 11:03:38 GMT+0100
+    match = JS('JSArray|Null', r'/(?:GMT|UTC)[+-]\d{4}/.exec(#.toString())', d);
+    if (match != null) return match[0];
+    return "";
   }
 
   static int getTimeZoneOffsetInMinutes(receiver) {
@@ -1444,11 +1462,6 @@
   return fillLiteralMap(keyValuePairs, new LinkedHashMap());
 }
 
-makeConstantMap(keyValuePairs) {
-  return fillLiteralMap(keyValuePairs,
-      new LinkedHashMap(equals: identical, hashCode: objectHashCode));
-}
-
 fillLiteralMap(keyValuePairs, Map result) {
   // TODO(johnniwinther): Use JSArray to optimize this code instead of calling
   // [getLength] and [getIndex].
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 79bbdb6..002865d 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -247,7 +247,7 @@
   final bool _isRoot;
   final _globalObject;
   List<JsMethodMirror> _cachedFunctionMirrors;
-  List<JsVariableMirror> _cachedFields;
+  List<VariableMirror> _cachedFields;
   UnmodifiableMapView<Symbol, ClassMirror> _cachedClasses;
   UnmodifiableMapView<Symbol, MethodMirror> _cachedFunctions;
   UnmodifiableMapView<Symbol, MethodMirror> _cachedGetters;
@@ -1087,7 +1087,7 @@
   List _metadata;
   ClassMirror _superclass;
   List<JsMethodMirror> _cachedMethods;
-  List<JsVariableMirror> _cachedFields;
+  List<VariableMirror> _cachedFields;
   UnmodifiableMapView<Symbol, MethodMirror> _cachedConstructors;
   UnmodifiableMapView<Symbol, MethodMirror> _cachedMethodsMap;
   UnmodifiableMapView<Symbol, MethodMirror> _cachedGetters;
@@ -1432,7 +1432,6 @@
 }
 
 class JsVariableMirror extends JsDeclarationMirror implements VariableMirror {
-  static final int REFLECTION_MARKER = 45;
 
   // TODO(ahe): The values in these fields are virtually untested.
   final String _jsName;
@@ -1440,10 +1439,12 @@
   final bool isStatic;
   final _metadataFunction;
   final DeclarationMirror _owner;
+  final int _type;
   List _metadata;
 
   JsVariableMirror(Symbol simpleName,
                    this._jsName,
+                   this._type,
                    this.isFinal,
                    this.isStatic,
                    this._metadataFunction,
@@ -1454,18 +1455,16 @@
                                 metadataFunction,
                                 JsDeclarationMirror owner,
                                 bool isStatic) {
-    int length = descriptor.length;
-    var code = fieldCode(descriptor.codeUnitAt(length - 1));
-    if (code == REFLECTION_MARKER) {
-      // If the field descriptor has a reflection marker, remove it by
-      // changing length and getting the real getter/setter code.  The
-      // descriptor will be truncated below.
-      length--;
-      code = fieldCode(descriptor.codeUnitAt(length - 1));
-    } else {
+    List<String> fieldInformation = descriptor.split('-');
+    if (fieldInformation.length == 1) {
       // The field is not available for reflection.
+      // TODO(ahe): Should return an unreflectable field.
       return null;
     }
+
+    String field = fieldInformation[0];
+    int length = field.length;
+    var code = fieldCode(field.codeUnitAt(length - 1));
     bool isFinal = false;
     if (code == 0) return null; // Inherited field.
     bool hasGetter = (code & 3) != 0;
@@ -1473,11 +1472,11 @@
     isFinal = !hasSetter;
     length--;
     String jsName;
-    String accessorName = jsName = descriptor.substring(0, length);
-    int divider = descriptor.indexOf(':');
+    String accessorName = jsName = field.substring(0, length);
+    int divider = field.indexOf(':');
     if (divider > 0) {
       accessorName = accessorName.substring(0, divider);
-      jsName = descriptor.substring(divider + 1);
+      jsName = field.substring(divider + 1);
     }
     var unmangledName;
     if (isStatic) {
@@ -1497,14 +1496,21 @@
         }
       }
     }
-    return new JsVariableMirror(
-        s(unmangledName), jsName, isFinal, isStatic, metadataFunction, owner);
+    int type = int.parse(fieldInformation[1]);
+    return new JsVariableMirror(s(unmangledName),
+                                jsName,
+                                type,
+                                isFinal,
+                                isStatic,
+                                metadataFunction,
+                                owner);
   }
 
   String get _prettyName => 'VariableMirror';
 
-  // TODO(ahe): Improve this information and test it.
-  TypeMirror get type => JsMirrorSystem._dynamicType;
+  TypeMirror get type {
+    return typeMirrorFromRuntimeTypeRepresentation(owner, getMetadata(_type));
+  }
 
   DeclarationMirror get owner => _owner;
 
@@ -1518,7 +1524,6 @@
   }
 
   static int fieldCode(int code) {
-    if (code == REFLECTION_MARKER) return code;
     if (code >= 60 && code <= 64) return code - 59;
     if (code >= 123 && code <= 126) return code - 117;
     if (code >= 37 && code <= 43) return code - 27;
@@ -1768,6 +1773,8 @@
   // TODO(ahe): Implement this.
   bool get isFinal => false;
 
+  bool get isConst => false;
+
   // TODO(ahe): Implement this.
   bool get isOptional => false;
 
@@ -1987,17 +1994,17 @@
     bool isStatic,
     List<Mirror> result) {
   List fieldsMetadata = null;
-  List<String> fieldNames;
+  List<String> fields;
   if (fieldSpecification is List) {
-    fieldNames = splitFields(fieldSpecification[0], ',');
+    fields = splitFields(fieldSpecification[0], ',');
     fieldsMetadata = fieldSpecification.sublist(1);
   } else if (fieldSpecification is String) {
-    fieldNames = splitFields(fieldSpecification, ',');
+    fields = splitFields(fieldSpecification, ',');
   } else {
-    fieldNames = [];
+    fields = [];
   }
   int fieldNumber = 0;
-  for (String field in fieldNames) {
+  for (String field in fields) {
     var metadata;
     if (fieldsMetadata != null) {
       metadata = fieldsMetadata[fieldNumber++];
diff --git a/sdk/lib/_internal/lib/js_names.dart b/sdk/lib/_internal/lib/js_names.dart
index 9eaf777..90ad3cf 100644
--- a/sdk/lib/_internal/lib/js_names.dart
+++ b/sdk/lib/_internal/lib/js_names.dart
@@ -8,6 +8,8 @@
 
 import 'dart:_js_helper' show JsCache;
 
+import 'dart:_interceptors' show JSArray;
+
 /// No-op method that is called to inform the compiler that unmangled named
 /// must be preserved.
 preserveNames() {}
@@ -64,7 +66,7 @@
 }
 
 List extractKeys(victim) {
-  return JS('List', '''
+  var result = JS('', '''
 (function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -72,6 +74,7 @@
   }
   return result;
 })(#, Object.prototype.hasOwnProperty)''', victim);
+  return new JSArray.markFixed(result);
 }
 
 /**
diff --git a/sdk/lib/_internal/lib/js_primitives.dart b/sdk/lib/_internal/lib/js_primitives.dart
new file mode 100644
index 0000000..3315040
--- /dev/null
+++ b/sdk/lib/_internal/lib/js_primitives.dart
@@ -0,0 +1,50 @@
+// 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.
+
+/// dart2js "primitives", that is, features that cannot be implemented without
+/// access to JavaScript features.
+library dart2js._js_primitives;
+
+import 'dart:_foreign_helper' show
+    JS;
+
+/**
+ * This is the low-level method that is used to implement [print].  It is
+ * possible to override this function from JavaScript by defining a function in
+ * JavaScript called "dartPrint".
+ *
+ * Notice that it is also possible to intercept calls to [print] from within a
+ * Dart program using zones. This means that there is no guarantee that a call
+ * to print ends in this method.
+ */
+void printString(String string) {
+  if (JS('bool', r'typeof dartPrint == "function"')) {
+    // Support overriding print from JavaScript.
+    JS('void', r'dartPrint(#)', string);
+    return;
+  }
+
+  // Inside browser or nodejs.
+  if (JS('bool', r'typeof console == "object"') &&
+      JS('bool', r'typeof console.log == "function"')) {
+    JS('void', r'console.log(#)', string);
+    return;
+  }
+
+  // Don't throw inside IE, the console is only defined if dev tools is open.
+  if (JS('bool', r'typeof window == "object"')) {
+    return;
+  }
+
+  // Running in d8, the V8 developer shell, or in Firefox' js-shell.
+  if (JS('bool', r'typeof print == "function"')) {
+    JS('void', r'print(#)', string);
+    return;
+  }
+
+  // This is somewhat nasty, but we don't want to drag in a bunch of
+  // dependencies to handle a situation that cannot happen. So we
+  // avoid using Dart [:throw:] and Dart [toString].
+  JS('void', 'throw "Unable to print message: " + String(#)', string);
+}
diff --git a/sdk/lib/_internal/lib/js_rti.dart b/sdk/lib/_internal/lib/js_rti.dart
index 67dd441..d8feff5 100644
--- a/sdk/lib/_internal/lib/js_rti.dart
+++ b/sdk/lib/_internal/lib/js_rti.dart
@@ -116,11 +116,22 @@
  * Returns the [index]th type argument of [target] as an instance of
  * [substitutionName].
  */
+@NoThrows() @NoSideEffects() @NoInline()
 getRuntimeTypeArgument(Object target, String substitutionName, int index) {
   var arguments = getRuntimeTypeArguments(target, substitutionName);
   return isNull(arguments) ? null : getIndex(arguments, index);
 }
 
+@NoThrows() @NoSideEffects() @NoInline()
+getTypeArgumentByIndex(Object target, int index) {
+  var rti = getRuntimeTypeInfo(target);
+  return isNull(rti) ? null : getIndex(rti, index);
+}
+
+void copyTypeArguments(Object source, Object target) {
+  JS('var', r'#.$builtinTypeInfo = #.$builtinTypeInfo', target, source);
+}
+
 /**
  * Retrieves the class name from type information stored on the constructor
  * of [object].
diff --git a/sdk/lib/_internal/libraries.dart b/sdk/lib/_internal/libraries.dart
index d8c5e00..7135991 100644
--- a/sdk/lib/_internal/libraries.dart
+++ b/sdk/lib/_internal/libraries.dart
@@ -173,7 +173,15 @@
       documented: false,
       platforms: DART2JS_PLATFORM),
 
-   "_mirror_helper": const LibraryInfo(
+  "_js_primitives": const LibraryInfo(
+      "_internal/lib/js_primitives.dart",
+      category: "Internal",
+      documented: false,
+      platforms: DART2JS_PLATFORM),
+
+  // TODO(ahe): This library is only for dart2dart, perhaps it should use a
+  // different platform.
+  "_mirror_helper": const LibraryInfo(
       "_internal/lib/mirror_helper.dart",
       category: "Internal",
       documented: false,
diff --git a/sdk/lib/_internal/pub/README.md b/sdk/lib/_internal/pub/README.md
new file mode 100644
index 0000000..6191ea3
--- /dev/null
+++ b/sdk/lib/_internal/pub/README.md
@@ -0,0 +1,90 @@
+# Contibuting to pub
+
+Thanks for being interested in contributing to pub! Contributing to a new
+project can be hard: there's a lot of new code and practices to learn. This
+document is intended to get you up and running as quickly as possible. If you're
+looking for documentation on using pub, try
+[pub.dartlang.org](http://pub.dartlang.org/doc).
+
+The first step towards contributing is to contact the pub dev team and let us
+know what you're working on, so we can be sure not to start working on the same
+thing at the same time. Just send an email to [misc@dartlang.org] letting us
+know that you're interested in contributing and what you plan on working on.
+This will also let us give you specific advice about where to start.
+
+[misc@dartlang.org]: mailto:misc@dartlang.org
+
+## Organization
+
+Pub isn't a package, but it's organized like one. It has four top-level
+directories:
+
+* `lib/` contains the implementation of pub. Currently, it's all in `lib/src/`,
+  since there are no libraries intended for public consumption.
+
+* `test/` contains the tests for pub.
+
+* `bin/` contains `pub.dart`, the entrypoint script that's run whenever a user
+  types "pub" on the command line or runs it in the Dart editor. This is usually
+  run through shell scripts in `sdk/bin` at the root of the Dart repository.
+
+* `resource/` contains static resource files that pub uses. They're
+  automatically distributed in the Dart SDK.
+
+It's probably easiest to start diving into the codebase by looking at a
+particular pub command. Each command is encapsulated in files in
+`lib/src/command/`.
+
+## Running pub
+
+To run pub from the Dart repository, first [build Dart][building]. From the root
+of the repo:
+
+    ./tools/build.py -m release
+
+You'll need to re-build whenever you sync the repository, but not when you
+modify pub or any packages it depends on. To run pub, just run `sdk/bin/pub` (or
+`sdk/bin/pub.bat` on Windows).
+
+[building]: https://code.google.com/p/dart/wiki/Building
+
+## Testing pub
+
+Before any change is made to pub, all tests should pass. To run all the pub
+tests, run this from the root of the Dart repository:
+
+    ./tools/test.py -m release pub
+
+Changes to pub should be accompanied by one or more tests that exercise the new
+functionality. When adding a test, the best strategy is to find a similar test
+in `test/` and follow the same patterns. Note that pub makes wide use of the
+[scheduled_test] package in its tests, so it's usually important to be familiar
+with that when adding tests.
+
+[scheduled_test]: http://pub.dartlang.org/packages/scheduled_test
+
+Pub tests come in two basic forms. The first, which is usually used to unit test
+classes and libraries internal to pub, has many tests in a single file. This is
+used when each test will take a short time to run. For example,
+`test/version_test.dart` contains unit tests for pub's Version class.
+
+The other form, used by most pub tests, is usually used for integration tests of
+user-visible pub commands. Each test has a file to itself, which is named after
+the test description. This is used when tests can take a long time to run to
+avoid having the tests time out when running on the build bots. For example,
+`tests/get/hosted/get_transitive_test.dart` tests the resolution of transitive
+hosted dependencies when using `pub get`.
+
+When testing new functionality, it's often useful to run a single test rather
+than the entire test suite. You can do this by appending the path to the test
+file to the test command. For example, to run `get/relative_symlink_test.dart`:
+
+    ./tools/test.py -m release pub/get/relative_symlink_test
+
+## Landing your patch
+
+All patches to the Dart repo, including to pub, need to undergo code review
+before they're submitted. The full process for putting up your patch for review
+is [documented elsewhere][contributing].
+
+[contributing]: https://code.google.com/p/dart/wiki/Contributing
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index ca88d38..e19d9a0 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -122,7 +122,7 @@
 /// an error message and exits. Completes when the validation is done.
 Future validatePlatform() {
   return new Future.sync(() {
-    if (Platform.operatingSystem != 'windows') return;
+    if (Platform.operatingSystem != 'windows') return null;
 
     return runProcess('ver', []).then((result) {
       if (result.stdout.join('\n').contains('XP')) {
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index 7e317f63..08e5665 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -8,6 +8,7 @@
 
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
+import 'package:stack_trace/stack_trace.dart';
 
 import 'barback/load_all_transformers.dart';
 import 'barback/pub_package_provider.dart';
@@ -17,6 +18,8 @@
 import 'package_graph.dart';
 import 'utils.dart';
 
+export 'barback/sources.dart' show WatcherType;
+
 /// An identifier for a transformer and the configuration that will be passed to
 /// it.
 ///
@@ -108,7 +111,7 @@
 /// the app when the server is started will be maintained.
 Future<BarbackServer> createServer(String host, int port, PackageGraph graph,
     BarbackMode mode, {Iterable<Transformer> builtInTransformers,
-    bool watchForUpdates: true}) {
+    WatcherType watcher: WatcherType.AUTO}) {
   var provider = new PubPackageProvider(graph);
   var barback = new Barback(provider);
 
@@ -117,7 +120,10 @@
   return BarbackServer.bind(host, port, barback, graph.entrypoint.root.name)
       .then((server) {
     return new Future.sync(() {
-      if (watchForUpdates) return watchSources(graph, barback);
+      if (watcher != WatcherType.NONE) {
+        return watchSources(graph, barback, watcher);
+      }
+
       loadSources(graph, barback);
     }).then((_) {
       var completer = new Completer();
@@ -128,7 +134,9 @@
       var subscriptions = [
         server.barback.errors.listen((error) {
           if (error is TransformerException) error = error.error;
-          if (!completer.isCompleted) completer.completeError(error);
+          if (!completer.isCompleted) {
+            completer.completeError(error, new Trace.current());
+          }
         }),
         server.barback.results.listen((_) {}, onError: (error, stackTrace) {
           if (completer.isCompleted) return;
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 8eca860..35a4ac2 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -26,8 +26,8 @@
 class Dart2JSTransformer extends Transformer {
   final PackageGraph _graph;
 
-  /// Whether the JavaScript output should be minified.
-  final bool _minify;
+  /// The mode that the transformer is running in.
+  final BarbackMode _mode;
 
   /// The [AssetId]s the transformer has discovered so far. Used by pub build
   /// to determine where to copy the JS bootstrap files.
@@ -44,8 +44,7 @@
   /// is here: https://code.google.com/p/dart/issues/detail?id=14730.
   Future _running;
 
-  Dart2JSTransformer(this._graph, {bool minify})
-      : _minify = minify == true ? true : false;
+  Dart2JSTransformer(this._graph, this._mode);
 
   /// Only ".dart" files within "web/" are processed.
   Future<bool> isPrimary(Asset asset) {
@@ -79,10 +78,10 @@
         }
 
         var parsed = parseCompilationUnit(code, name: name);
-        if (!dart.isEntrypoint(parsed)) return;
+        if (!dart.isEntrypoint(parsed)) return null;
       } on AnalyzerErrorGroup catch (e) {
         transform.logger.error(e.message);
-        return;
+        return null;
       }
 
       var provider = new _BarbackInputProvider(_graph, transform);
@@ -103,7 +102,7 @@
       // path so they can understand them.
       return dart.compile(entrypoint,
           packageRoot: packageRoot,
-          minify: _minify,
+          minify: _mode == BarbackMode.RELEASE,
           inputProvider: provider.readStringFromUri,
           diagnosticHandler: provider.handleDiagnostic).then((js) {
         var id = transform.primaryInput.id.changeExtension(".dart.js");
@@ -115,7 +114,7 @@
       }).catchError((error) {
         // The compile failed and errors have been reported through the
         // diagnostic handler, so just do nothing here.
-        if (error is CompilerException) return;
+        if (error is dart.CompilerException) return;
         throw error;
       });
     }).whenComplete(() {
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart_forwarding_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart_forwarding_transformer.dart
index 8c25a38..ed99c84 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart_forwarding_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart_forwarding_transformer.dart
@@ -10,17 +10,27 @@
 
 import '../utils.dart';
 
-/// A single transformer that just forwards any ".dart" file as an output.
+/// A single transformer that just forwards any ".dart" file as an output when
+/// not in release mode.
 ///
 /// Since the [Dart2JSTransformer] consumes its inputs, this is used in
 /// parallel to make sure the original Dart file is still available for use by
-/// Dartium.
+/// Dartium. In release mode, it's used to the do the exact opposite: it
+/// ensures that no Dart files are emitted, since all that is deployed is the
+/// compiled JavaScript.
 class DartForwardingTransformer extends Transformer {
+  /// The mode that the transformer is running in.
+  final BarbackMode _mode;
+
+  DartForwardingTransformer(this._mode);
+
   String get allowedExtensions => ".dart";
 
   Future apply(Transform transform) {
     return newFuture(() {
-      transform.addOutput(transform.primaryInput);
+      if (_mode != BarbackMode.RELEASE) {
+        transform.addOutput(transform.primaryInput);
+      }
     });
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
index ed36c55..5418b91 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
@@ -115,7 +115,11 @@
         return unionAll(phase.map((id) => loader.transformersFor(id)));
       }).toList();
 
-      if (builtInTransformers != null && builtInTransformers.isNotEmpty) {
+      // The built-in transformers are for dart2js and forwarding assets around
+      // dart2js, and those only apply to the entrypoints in the root package.
+      if (package.name == graph.entrypoint.root.name &&
+          builtInTransformers != null &&
+          builtInTransformers.isNotEmpty) {
         phases.add(builtInTransformers);
       }
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
index 38938be..aff85de 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
@@ -9,6 +9,8 @@
 import 'dart:isolate';
 
 import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
 import 'package:source_maps/source_maps.dart';
 
 import '../barback.dart';
@@ -27,9 +29,11 @@
 import 'dart:convert';
 import 'dart:mirrors';
 
-import 'http://<<HOST_AND_PORT>>/packages/source_maps/span.dart';
-import 'http://<<HOST_AND_PORT>>/packages/stack_trace/stack_trace.dart';
-import 'http://<<HOST_AND_PORT>>/packages/barback/barback.dart';
+import '<<URL_BASE>>/packages/source_maps/span.dart';
+import '<<URL_BASE>>/packages/stack_trace/stack_trace.dart';
+import '<<URL_BASE>>/packages/barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import '<<URL_BASE>>/packages/barback/src/internal_asset.dart';
 
 /// Sets up the initial communication with the host isolate.
 void main(_, SendPort replyTo) {
@@ -99,7 +103,7 @@
   /// Creates a transform from a serializable map sent from the host isolate.
   ForeignTransform(Map transform)
       : _port = transform['port'],
-        primaryInput = _deserializeAsset(transform['primaryInput']) {
+        primaryInput = deserializeAsset(transform['primaryInput']) {
     _logger = new TransformLogger((assetId, level, message, span) {
       _call(_port, {
         'type': 'log',
@@ -115,7 +119,7 @@
     return _call(_port, {
       'type': 'getInput',
       'id': _serializeId(id)
-    }).then(_deserializeAsset);
+    }).then(deserializeAsset);
   }
 
   Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
@@ -129,7 +133,7 @@
   void addOutput(Asset output) {
     _call(_port, {
       'type': 'addOutput',
-      'output': _serializeAsset(output)
+      'output': serializeAsset(output)
     });
   }
 }
@@ -184,7 +188,7 @@
   port.listen((wrappedMessage) {
     _respond(wrappedMessage, (message) {
       if (message['type'] == 'isPrimary') {
-        return transformer.isPrimary(_deserializeAsset(message['asset']));
+        return transformer.isPrimary(deserializeAsset(message['asset']));
       } else {
         assert(message['type'] == 'apply');
         return transformer.apply(
@@ -211,76 +215,9 @@
   };
 }
 
-/// Converts a serializable map into an [Asset].
-Asset _deserializeAsset(Map asset) {
-  return new Asset.fromStream(
-      _deserializeId(asset['id']),
-      _deserializeStream(asset['stream']));
-}
-
-/// The body of a [StreamTransformer] that deserializes the values in a stream
-/// sent by [_serializeStream].
-StreamSubscription _deserializeTransformer(Stream input, bool cancelOnError) {
-  var subscription;
-  var transformed = input.transform(new StreamTransformer.fromHandlers(
-      handleData: (data, sink) {
-    if (data['type'] == 'data') {
-      sink.add(data['data']);
-    } else if (data['type'] == 'error') {
-      sink.addError(CrossIsolateException.deserialize(data['error']));
-    } else {
-      assert(data['type'] == 'done');
-      sink.close();
-      subscription.cancel();
-    }
-  }));
-  subscription = transformed.listen(null, cancelOnError: cancelOnError);
-  return subscription;
-}
-
-/// Convert a [SendPort] whose opposite is waiting to send us a stream into a
-/// [Stream].
-///
-/// No stream data will actually be sent across the isolate boundary until
-/// someone subscribes to the returned stream.
-Stream _deserializeStream(SendPort sendPort) {
-  return callbackStream(() {
-    var receivePort = new ReceivePort();
-    sendPort.send(receivePort.sendPort);
-    return receivePort.transform(
-        const StreamTransformer(_deserializeTransformer));
-  });
-}
-
 /// Converts a serializable map into an [AssetId].
 AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
 
-/// Converts [asset] into a serializable map.
-Map _serializeAsset(Asset asset) {
-  return {
-    'id': _serializeId(asset.id),
-    'stream': _serializeStream(asset.read())
-  };
-}
-
-/// Converts [stream] into a [SendPort] with which another isolate can request
-/// the data from [stream].
-SendPort _serializeStream(Stream stream) {
-  var receivePort = new ReceivePort();
-  receivePort.first.then((sendPort) {
-    stream.listen((data) => sendPort.send({'type': 'data', 'data': data}),
-        onDone: () => sendPort.send({'type': 'done'}),
-        onError: (error, stackTrace) {
-      sendPort.send({
-        'type': 'error',
-        'error': CrossIsolateException.serialize(error, stackTrace)
-      });
-    });
-  });
-
-  return receivePort.sendPort;
-}
-
 /// Converts [id] into a serializable map.
 Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
 
@@ -447,10 +384,10 @@
   return id.getAssetId(server.barback).then((assetId) {
     var path = assetId.path.replaceFirst('lib/', '');
     // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
-    var hostAndPort = '${server.address.address}:${server.port}';
-    var uri = 'http://$hostAndPort/packages/${id.package}/$path';
-    var code = 'import "$uri";' +
-        _TRANSFORMER_ISOLATE.replaceAll('<<HOST_AND_PORT>>', hostAndPort);
+    var baseUrl = baseUrlForAddress(server.address, server.port);
+    var uri = '$baseUrl/packages/${id.package}/$path';
+    var code = 'import "$uri";\n' +
+        _TRANSFORMER_ISOLATE.replaceAll('<<URL_BASE>>', baseUrl);
     log.fine("Loading transformers from $assetId");
 
     var port = new ReceivePort();
@@ -467,7 +404,7 @@
         log.fine("Transformers from $assetId: $transformers");
         return transformers;
       });
-    }).catchError((error) {
+    }).catchError((error, stackTrace) {
       if (error is! dart.CrossIsolateException) throw error;
       if (error.type != 'IsolateSpawnException') throw error;
       // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
@@ -479,8 +416,8 @@
       // If there was an IsolateSpawnException and the import that actually
       // failed was the one we were loading transformers from, throw an
       // application exception with a more user-friendly message.
-      fail('Transformer library "package:${id.package}/$path" not '
-          'found.');
+      fail('Transformer library "package:${id.package}/$path" not found.',
+          error, stackTrace);
     });
   });
 }
@@ -503,7 +440,7 @@
   Future<bool> isPrimary(Asset asset) {
     return _call(_port, {
       'type': 'isPrimary',
-      'asset': _serializeAsset(asset)
+      'asset': serializeAsset(asset)
     });
   }
 
@@ -547,11 +484,11 @@
     _respond(wrappedMessage, (message) {
       if (message['type'] == 'getInput') {
         return transform.getInput(_deserializeId(message['id']))
-            .then(_serializeAsset);
+            .then((asset) => serializeAsset(asset));
       }
 
       if (message['type'] == 'addOutput') {
-        transform.addOutput(_deserializeAsset(message['output']));
+        transform.addOutput(deserializeAsset(message['output']));
         return null;
       }
 
@@ -576,51 +513,10 @@
 
   return {
     'port': receivePort.sendPort,
-    'primaryInput': _serializeAsset(transform.primaryInput)
+    'primaryInput': serializeAsset(transform.primaryInput)
   };
 }
 
-/// Converts a serializable map into an [Asset].
-Asset _deserializeAsset(Map asset) {
-  return new Asset.fromStream(
-      _deserializeId(asset['id']),
-      _deserializeStream(asset['stream']));
-}
-
-/// A transformer that deserializes the values in a stream sent by
-/// [_serializeStream].
-StreamSubscription _deserializeTransformer(Stream input, bool cancelOnError) {
-  var subscription;
-  var transformed = input.transform(new StreamTransformer.fromHandlers(
-      handleData: (data, sink) {
-    if (data['type'] == 'data') {
-      sink.add(data['data']);
-    } else if (data['type'] == 'error') {
-      sink.addError(CrossIsolateException.deserialize(data['error']));
-    } else {
-      assert(data['type'] == 'done');
-      sink.close();
-      subscription.cancel();
-    }
-  }));
-  subscription = transformed.listen(null, cancelOnError: cancelOnError);
-  return subscription;
-}
-
-/// Convert a [SendPort] whose opposite is waiting to send us a stream into a
-/// [Stream].
-///
-/// No stream data will actually be sent across the isolate boundary until
-/// someone subscribes to the returned stream.
-Stream _deserializeStream(SendPort sendPort) {
-  return callbackStream(() {
-    var receivePort = new ReceivePort();
-    sendPort.send(receivePort.sendPort);
-    return receivePort.transform(
-        const StreamTransformer(_deserializeTransformer));
-  });
-}
-
 /// Converts a serializable map into an [AssetId].
 AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
 
@@ -639,34 +535,6 @@
       location['line'], location['column']);
 }
 
-// TODO(nweiz): add custom serialization code for assets that can be more
-// efficiently serialized.
-/// Converts [asset] into a serializable map.
-Map _serializeAsset(Asset asset) {
-  return {
-    'id': _serializeId(asset.id),
-    'stream': _serializeStream(asset.read())
-  };
-}
-
-/// Converts [stream] into a [SendPort] with which another isolate can request
-/// the data from [stream].
-SendPort _serializeStream(Stream stream) {
-  var receivePort = new ReceivePort();
-  receivePort.first.then((sendPort) {
-    stream.listen((data) => sendPort.send({'type': 'data', 'data': data}),
-        onDone: () => sendPort.send({'type': 'done'}),
-        onError: (error, stackTrace) {
-      sendPort.send({
-        'type': 'error',
-        'error': CrossIsolateException.serialize(error, stackTrace)
-      });
-    });
-  });
-
-  return receivePort.sendPort;
-}
-
 /// Converts [id] into a serializable map.
 Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/server.dart b/sdk/lib/_internal/pub/lib/src/barback/server.dart
index 4c8cf59..f491aab 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/server.dart
@@ -16,6 +16,9 @@
 import '../log.dart' as log;
 import '../utils.dart';
 
+/// Callback for determining if an asset with [id] should be served or not.
+typedef bool AllowAsset(AssetId id);
+
 /// A server that serves assets transformed by barback.
 class BarbackServer {
   /// The underlying HTTP server.
@@ -34,6 +37,15 @@
   /// The server's address.
   final InternetAddress address;
 
+  /// Optional callback to determine if an asset should be served.
+  ///
+  /// This can be set to allow outside code to filter out assets. Pub serve
+  /// uses this after plug-ins are loaded to avoid serving ".dart" files in
+  /// release mode.
+  ///
+  /// If this is `null`, all assets may be served.
+  AllowAsset allowAsset;
+
   /// The results of requests handled by the server.
   ///
   /// These can be used to provide visual feedback for the server's processing.
@@ -91,6 +103,12 @@
       return;
     }
 
+    // See if the asset should be blocked.
+    if (allowAsset != null && !allowAsset(id)) {
+      _notFound(request, "Asset $id is not available in this configuration.");
+      return;
+    }
+
     _logRequest(request, "Loading $id");
     barback.getAssetById(id).then((asset) {
       return validateStream(asset.read()).then((stream) {
@@ -130,7 +148,7 @@
         trace = new Trace.from(trace);
         _logRequest(request, "$error\n$trace");
 
-        _resultsController.addError(error);
+        _resultsController.addError(error, trace);
         close();
         return;
       }
@@ -208,12 +226,8 @@
             _webSocketError(socket, 'Unknown command "${command["command"]}".');
             break;
         }
-      }, onError: (error) {
-        _resultsController.addError(error);
-      }, cancelOnError: true);
-    }).catchError((error) {
-      _resultsController.addError(error);
-    });
+      }, onError: _resultsController.addError, cancelOnError: true);
+    }).catchError(_resultsController.addError);
   }
 
   /// Converts a [url] served by pub serve into an [AssetId] that can be
diff --git a/sdk/lib/_internal/pub/lib/src/barback/sources.dart b/sdk/lib/_internal/pub/lib/src/barback/sources.dart
index c85044b..ece690b 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/sources.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/sources.dart
@@ -18,9 +18,13 @@
 /// Adds all of the source assets in the provided packages to barback and
 /// then watches the public directories for changes.
 ///
-/// Returns a Future that completes when the sources are loaded and the
-/// watchers are active.
-Future watchSources(PackageGraph graph, Barback barback) {
+/// [watcherFactory] should return a [DirectoryWatcher] watching the given
+/// directory for changes.
+///
+/// Returns a Future that completes when the sources are loaded and the watchers
+/// are active.
+Future watchSources(PackageGraph graph, Barback barback,
+    WatcherType watcherType) {
   return Future.wait(graph.packages.values.map((package) {
     // If this package comes from a cached source, its contents won't change so
     // we don't need to monitor it. `packageId` will be null for the application
@@ -39,7 +43,7 @@
       if (!dirExists(subdirectory)) return new Future.value();
 
       // TODO(nweiz): close these watchers when [barback] is closed.
-      var watcher = new DirectoryWatcher(subdirectory);
+      var watcher = watcherType.create(subdirectory);
       watcher.events.listen((event) {
         // Don't watch files symlinked into these directories.
         // TODO(rnystrom): If pub gets rid of symlinks, remove this.
@@ -102,3 +106,47 @@
   if (package.name == entrypoint.root.name) directories.add("web");
   return directories;
 }
+
+/// An enum describing different modes of constructing a [DirectoryWatcher].
+abstract class WatcherType {
+  /// A watcher that automatically chooses its type based on the operating
+  /// system.
+  static const AUTO = const _AutoWatcherType();
+
+  /// A watcher that always polls the filesystem for changes.
+  static const POLLING = const _PollingWatcherType();
+
+  /// No directory watcher at all.
+  static const NONE = const _NoneWatcherType();
+
+  /// Creates a new DirectoryWatcher.
+  DirectoryWatcher create(String directory);
+
+  String toString();
+}
+
+class _AutoWatcherType implements WatcherType {
+  const _AutoWatcherType();
+
+  DirectoryWatcher create(String directory) =>
+    new DirectoryWatcher(directory);
+
+  String toString() => "auto";
+}
+
+class _PollingWatcherType implements WatcherType {
+  const _PollingWatcherType();
+
+  DirectoryWatcher create(String directory) =>
+    new PollingDirectoryWatcher(directory);
+
+  String toString() => "polling";
+}
+
+class _NoneWatcherType implements WatcherType {
+  const _NoneWatcherType();
+
+  DirectoryWatcher create(String directory) => null;
+
+  String toString() => "none";
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index c6e25ea..221bc45 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -103,6 +103,12 @@
         }
       }
 
+      if (error is ApplicationException && error.innerError != null) {
+        var message = "Wrapped exception: ${error.innerError}";
+        if (error.innerTrace != null) message = "$message\n${error.innerTrace}";
+        log.fine(message);
+      }
+
       if (options['trace']) {
         log.dumpTranscript();
       } else if (!isUserFacingException(error)) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 12dccf0..1c9e37e 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -10,6 +10,7 @@
 import 'package:path/path.dart' as path;
 
 import '../barback/dart2js_transformer.dart';
+import '../barback/dart_forwarding_transformer.dart';
 import '../barback.dart' as barback;
 import '../command.dart';
 import '../exit_codes.dart' as exit_codes;
@@ -33,12 +34,12 @@
   /// The path to the application's build output directory.
   String get target => path.join(entrypoint.root.dir, 'build');
 
-  /// `true` if generated JavaScript should be minified.
-  bool get minify => commandOptions['minify'];
+  /// The build mode.
+  BarbackMode get mode => new BarbackMode(commandOptions['mode']);
 
   BuildCommand() {
-    commandParser.addFlag('minify', defaultsTo: true,
-        help: 'Minify generated JavaScript.');
+    commandParser.addOption('mode', defaultsTo: BarbackMode.RELEASE.toString(),
+        help: 'Mode to run transformers in.');
   }
 
   Future onRun() {
@@ -49,19 +50,24 @@
     cleanDir(target);
 
     var dart2jsTransformer;
+    var builtFiles = 0;
 
     return entrypoint.ensureLockFileIsUpToDate().then((_) {
       return entrypoint.loadPackageGraph();
     }).then((graph) {
-      dart2jsTransformer = new Dart2JSTransformer(graph, minify: minify);
+      dart2jsTransformer = new Dart2JSTransformer(graph, mode);
+      var builtInTransformers = [
+        dart2jsTransformer,
+        new DartForwardingTransformer(mode)
+      ];
 
       // Since this server will only be hit by the transformer loader and isn't
       // user-facing, just use an IPv4 address to avoid a weird bug on the
       // OS X buildbots.
       // TODO(rnystrom): Allow specifying mode.
-      return barback.createServer("127.0.0.1", 0, graph, BarbackMode.RELEASE,
-          builtInTransformers: [dart2jsTransformer],
-          watchForUpdates: false);
+      return barback.createServer("127.0.0.1", 0, graph, mode,
+          builtInTransformers: builtInTransformers,
+          watcher: barback.WatcherType.NONE);
     }).then((server) {
       // Show in-progress errors, but not results. Those get handled implicitly
       // by getAllAssets().
@@ -72,11 +78,15 @@
       return log.progress("Building ${entrypoint.root.name}",
           () => server.barback.getAllAssets());
     }).then((assets) {
-      // Don't copy Dart libraries. Their contents will already be included
-      // in the generated JavaScript.
-      assets = assets.where((asset) => asset.id.extension != ".dart");
-
       return Future.wait(assets.map((asset) {
+        // In release mode, strip out .dart files since all relevant ones have
+        // been compiled to JavaScript already.
+        if (mode == BarbackMode.RELEASE && asset.id.extension == ".dart") {
+          return new Future.value();
+        }
+
+        builtFiles++;
+
         // Figure out the output directory for the asset, which is the same
         // as the path pub serve would use to serve it.
         var relativeUrl = barback.idtoUrlPath(entrypoint.root.name, asset.id);
@@ -91,10 +101,8 @@
         // TODO(rnystrom): Should we display this to the user?
         return createFileFromStream(asset.read(), destPath);
       })).then((_) {
-        _copyBrowserJsFiles(dart2jsTransformer.entrypoints);
-        // TODO(rnystrom): Should this count include the JS files?
-        log.message("Built ${assets.length} "
-            "${pluralize('file', assets.length)}!");
+        builtFiles += _copyBrowserJsFiles(dart2jsTransformer.entrypoints);
+        log.message("Built $builtFiles ${pluralize('file', builtFiles)}!");
       });
     }).catchError((error) {
       // If [getAllAssets()] throws a BarbackException, the error has already
@@ -109,11 +117,13 @@
   /// If this package depends directly on the `browser` package, this ensures
   /// that the JavaScript bootstrap files are copied into `packages/browser/`
   /// directories next to each entrypoint in [entrypoints].
-  void _copyBrowserJsFiles(Iterable<AssetId> entrypoints) {
+  ///
+  /// Returns the number of files it copied.
+  int _copyBrowserJsFiles(Iterable<AssetId> entrypoints) {
     // Must depend on the browser package.
     if (!entrypoint.root.dependencies.any(
         (dep) => dep.name == 'browser' && dep.source == 'hosted')) {
-      return;
+      return 0;
     }
 
     // Get all of the directories that contain Dart entrypoints.
@@ -130,6 +140,8 @@
       _addBrowserJs(dir, "dart");
       _addBrowserJs(dir, "interop");
     }
+
+    return entrypointDirs.length * 2;
   }
 
   // TODO(nweiz): do something more principled when issue 6101 is fixed.
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index d5b6b50..1cc95ac 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -15,6 +15,7 @@
 import '../io.dart';
 import '../log.dart' as log;
 import '../oauth2.dart' as oauth2;
+import '../sdk.dart' as sdk;
 import '../source/hosted.dart';
 import '../utils.dart';
 import '../validator.dart';
@@ -93,6 +94,15 @@
   }
 
   Future onRun() {
+    // Sanity check. Don't push to the production server when running tests or
+    // developing on pub.
+    if (sdk.isBleedingEdge &&
+        server.toString() == HostedSource.defaultUrl &&
+        !dryRun) {
+      log.error('Cannot publish to $server from bleeding edge pub!');
+      return null;
+    }
+
     if (force && dryRun) {
       log.error('Cannot use both --force and --dry-run.');
       this.printUsage();
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index d3df35a..f6df4ce 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -33,8 +33,8 @@
   /// `true` if Dart entrypoints should be compiled to JavaScript.
   bool get useDart2JS => commandOptions['dart2js'];
 
-  /// `true` if generated JavaScript should be minified.
-  bool get minify => commandOptions['minify'];
+  /// The build mode.
+  BarbackMode get mode => new BarbackMode(commandOptions['mode']);
 
   ServeCommand() {
     commandParser.addOption('port', defaultsTo: '8080',
@@ -47,12 +47,12 @@
     commandParser.addOption('hostname',
                             defaultsTo: 'localhost',
                             hide: true);
-
     commandParser.addFlag('dart2js', defaultsTo: true,
         help: 'Compile Dart to JavaScript.');
-
-    commandParser.addFlag('minify', defaultsTo: false,
-        help: 'Minify generated JavaScript.');
+    commandParser.addFlag('force-poll', defaultsTo: false,
+        help: 'Force the use of a polling filesystem watcher.');
+    commandParser.addOption('mode', defaultsTo: BarbackMode.DEBUG.toString(),
+        help: 'Mode to run transformers in.');
   }
 
   Future onRun() {
@@ -68,19 +68,24 @@
     return entrypoint.ensureLockFileIsUpToDate().then((_) {
       return entrypoint.loadPackageGraph();
     }).then((graph) {
-      // TODO(rnystrom): Add support for dart2dart transformer here.
-      var builtInTransformers = null;
+      var builtInTransformers = [new DartForwardingTransformer(mode)];
       if (useDart2JS) {
-        builtInTransformers = [
-          new Dart2JSTransformer(graph, minify: minify),
-          new DartForwardingTransformer()
-        ];
+        builtInTransformers.add(new Dart2JSTransformer(graph, mode));
+        // TODO(rnystrom): Add support for dart2dart transformer here.
       }
 
-      // TODO(rnystrom): Allow specifying other modes.
-      return barback.createServer(hostname, port, graph, BarbackMode.DEBUG,
-          builtInTransformers: builtInTransformers);
+      var watcherType = commandOptions['force-poll'] ?
+          barback.WatcherType.POLLING : barback.WatcherType.AUTO;
+      return barback.createServer(hostname, port, graph, mode,
+          builtInTransformers: builtInTransformers,
+          watcher: watcherType);
     }).then((server) {
+      // In release mode, strip out .dart files since all relevant ones have
+      // been compiled to JavaScript already.
+      if (mode == BarbackMode.RELEASE) {
+        server.allowAsset = (url) => !url.path.endsWith(".dart");
+      }
+
       /// This completer is used to keep pub running (by not completing) and
       /// to pipe fatal errors to pub's top-level error-handling machinery.
       var completer = new Completer();
diff --git a/sdk/lib/_internal/pub/lib/src/command/uploader.dart b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
index f9aa11d..330efcc 100644
--- a/sdk/lib/_internal/pub/lib/src/command/uploader.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
@@ -69,7 +69,7 @@
               "${Uri.encodeComponent(package)}/uploaders");
           return client.post(url,
               headers: PUB_API_HEADERS,
-              fields: {"email": uploader});
+              body: {"email": uploader});
         } else { // command == 'remove'
           var url = server.resolve("/api/packages/"
               "${Uri.encodeComponent(package)}/uploaders/"
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index c743b3a..b4ef32b 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -143,6 +143,16 @@
     return new Future.sync(() {
       if (!result.succeeded) throw result.error;
 
+      // Warn the user if any overrides were in effect.
+      if (result.overrides.isNotEmpty) {
+        var buffer = new StringBuffer();
+        buffer.write("Warning: You are overriding these dependencies:");
+        for (var override in result.overrides) {
+          buffer.write("\n- $override");
+        }
+        log.warning(buffer);
+      }
+
       cleanDir(packagesDir);
       return Future.wait(result.packages.map((id) {
         if (id.isRoot) return new Future.value(id);
@@ -196,7 +206,7 @@
   /// pubspec.
   Future ensureLockFileIsUpToDate() {
     return new Future.sync(() {
-      if (isLockFileUpToDate()) return;
+      if (isLockFileUpToDate()) return null;
 
       if (lockFileExists) {
         log.message(
@@ -238,7 +248,7 @@
     }
 
     var lockFilePath = path.join(root.dir, 'pubspec.lock');
-    writeTextFile(lockFilePath, lockFile.serialize());
+    writeTextFile(lockFilePath, lockFile.serialize(root.dir, cache.sources));
   }
 
   /// Creates a self-referential symlink in the `packages` directory that allows
diff --git a/sdk/lib/_internal/pub/lib/src/http.dart b/sdk/lib/_internal/pub/lib/src/http.dart
index f9e63bb..017b387 100644
--- a/sdk/lib/_internal/pub/lib/src/http.dart
+++ b/sdk/lib/_internal/pub/lib/src/http.dart
@@ -52,6 +52,7 @@
 
   Future<http.StreamedResponse> send(http.BaseRequest request) {
     _requestStopwatches[request] = new Stopwatch()..start();
+    request.headers[HttpHeaders.USER_AGENT] = "Dart pub ${sdk.version}";
     _logRequest(request);
 
     // TODO(nweiz): remove this when issue 4061 is fixed.
@@ -85,7 +86,7 @@
       return http.Response.fromStream(streamedResponse).then((response) {
         throw new PubHttpException(response);
       });
-    }).catchError((error) {
+    }).catchError((error, stackTrace) {
       if (error is SocketException &&
           error.osError != null) {
         if (error.osError.errorCode == 8 ||
@@ -93,14 +94,14 @@
             error.osError.errorCode == -5 ||
             error.osError.errorCode == 11001 ||
             error.osError.errorCode == 11004) {
-          fail('Could not resolve URL "${request.url.origin}".');
+          fail('Could not resolve URL "${request.url.origin}".',
+              error, stackTrace);
         } else if (error.osError.errorCode == -12276) {
           fail('Unable to validate SSL certificate for '
-              '"${request.url.origin}".');
+              '"${request.url.origin}".',
+              error, stackTrace);
         }
       }
-      print('Error in PubHttpClient.send (issue 12581) error: $error');
-      print('    stacktrace: $stackTrace');
       throw error;
     }), HTTP_TIMEOUT, 'fetching URL "${request.url}"');
   }
@@ -197,7 +198,7 @@
       errorMap['error']['message'] is! String) {
     invalidServerResponse(response);
   }
-  throw errorMap['error']['message'];
+  fail(errorMap['error']['message']);
 }
 
 /// Parses a response body, assuming it's JSON-formatted. Throws a user-friendly
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index 40f09bf..89179eb 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -12,6 +12,8 @@
 
 import 'package:path/path.dart' as path;
 import 'package:http/http.dart' show ByteStream;
+import 'package:stack_trace/stack_trace.dart';
+
 import 'error_group.dart';
 import 'log.dart' as log;
 import 'sdk.dart' as sdk;
@@ -462,19 +464,16 @@
 Future store(Stream stream, EventSink sink,
     {bool cancelOnError: true, bool closeSink: true}) {
   var completer = new Completer();
-  stream.listen(sink.add,
-      onError: (e, [stackTrace]) {
-        // TODO(floitsch): Sink.addError without stack trace.
-        sink.addError(e);
-        if (cancelOnError) {
-          completer.complete();
-          if (closeSink) sink.close();
-        }
-      },
-      onDone: () {
-        if (closeSink) sink.close();
-        completer.complete();
-      }, cancelOnError: cancelOnError);
+  stream.listen(sink.add, onError: (e, stackTrace) {
+    sink.addError(e, stackTrace);
+    if (cancelOnError) {
+      completer.complete();
+      if (closeSink) sink.close();
+    }
+  }, onDone: () {
+    if (closeSink) sink.close();
+    completer.complete();
+  }, cancelOnError: cancelOnError);
   return completer.future;
 }
 
@@ -634,16 +633,17 @@
   var completer = new Completer();
   var timer = new Timer(new Duration(milliseconds: milliseconds), () {
     completer.completeError(new TimeoutException(
-        'Timed out while $description.'));
+        'Timed out while $description.'),
+        new Trace.current());
   });
   input.then((value) {
     if (completer.isCompleted) return;
     timer.cancel();
     completer.complete(value);
-  }).catchError((e) {
+  }).catchError((e, stackTrace) {
     if (completer.isCompleted) return;
     timer.cancel();
-    completer.completeError(e);
+    completer.completeError(e, stackTrace);
   });
   return completer.future;
 }
@@ -775,10 +775,10 @@
     // file and pass them in via --files-from for tar and -i@filename for 7zip.
     startProcess("tar", args).then((process) {
       store(process.stdout, controller);
-    }).catchError((e) {
+    }).catchError((e, stackTrace) {
       // We don't have to worry about double-signaling here, since the store()
       // above will only be reached if startProcess succeeds.
-      controller.addError(e);
+      controller.addError(e, stackTrace);
       controller.close();
     });
     return new ByteStream(controller.stream);
@@ -807,10 +807,10 @@
       // occurs.
       return store(process.stdout, controller);
     });
-  }).catchError((e) {
+  }).catchError((e, stackTrace) {
     // We don't have to worry about double-signaling here, since the store()
     // above will only be reached if everything succeeds.
-    controller.addError(e);
+    controller.addError(e, stackTrace);
     controller.close();
   });
   return new ByteStream(controller.stream);
diff --git a/sdk/lib/_internal/pub/lib/src/lock_file.dart b/sdk/lib/_internal/pub/lib/src/lock_file.dart
index e3dff80..68af3ca 100644
--- a/sdk/lib/_internal/pub/lib/src/lock_file.dart
+++ b/sdk/lib/_internal/pub/lib/src/lock_file.dart
@@ -83,14 +83,20 @@
   }
 
   /// Returns the serialized YAML text of the lock file.
-  String serialize() {
+  ///
+  /// [packageDir] is the containing directory of the root package, used to
+  /// properly serialize package descriptions.
+  String serialize(String packageDir, SourceRegistry sources) {
     // Convert the dependencies to a simple object.
     var data = {};
     packages.forEach((name, package) {
+      var description = sources[package.source].serializeDescription(packageDir,
+          package.description);
+
       data[name] = {
-        'version': packages[name].version.toString(),
-        'source': packages[name].source,
-        'description': packages[name].description
+        'version': package.version.toString(),
+        'source': package.source,
+        'description': description
       };
     });
 
diff --git a/sdk/lib/_internal/pub/lib/src/package.dart b/sdk/lib/_internal/pub/lib/src/package.dart
index 5e97516..6b31e56 100644
--- a/sdk/lib/_internal/pub/lib/src/package.dart
+++ b/sdk/lib/_internal/pub/lib/src/package.dart
@@ -37,6 +37,9 @@
   /// The immediate dev dependencies this package specifies in its pubspec.
   List<PackageDep> get devDependencies => pubspec.devDependencies;
 
+  /// The dependency overrides this package specifies in its pubspec.
+  List<PackageDep> get dependencyOverrides => pubspec.dependencyOverrides;
+
   /// Returns the path to the README file at the root of the entrypoint, or null
   /// if no README file is found. If multiple READMEs are found, this uses the
   /// same conventions as pub.dartlang.org for choosing the primary one: the
@@ -111,6 +114,10 @@
   /// Returns a [PackageId] for this package with the given concrete version.
   PackageId atVersion(Version version) =>
     new PackageId(name, source, version, description);
+
+  /// Returns a [PackageDep] for this package with the given version constraint.
+  PackageDep withConstraint(VersionConstraint constraint) =>
+    new PackageDep(name, source, constraint, description);
 }
 
 /// A reference to a [Package], but not any particular version(s) of it.
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index ee91067..c5c5c1a 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -102,6 +102,18 @@
   }
   List<PackageDep> _devDependencies;
 
+  /// The dependency constraints that this package overrides when it is the
+  /// root package.
+  ///
+  /// Dependencies here will replace any dependency on a package with the same
+  /// name anywhere in the dependency graph.
+  List<PackageDep> get dependencyOverrides {
+    if (_dependencyOverrides != null) return _dependencyOverrides;
+    _dependencyOverrides = _parseDependencies('dependency_overrides');
+    return _dependencyOverrides;
+  }
+  List<PackageDep> _dependencyOverrides;
+
   /// The ids of the transformers to use for this package.
   List<Set<TransformerId>> get transformers {
     if (_transformers != null) return _transformers;
@@ -150,6 +162,15 @@
             _error('"$field.$library" field must be a map, but was '
                 '"$configuration".');
           }
+
+          var reservedKeys = configuration.keys
+              .where((key) => key is String && key.startsWith(r'$'))
+              .map((key) => '"$key"');
+          if (reservedKeys.isNotEmpty) {
+            _error('"$field.$library" field cannot contain reserved '
+                '${pluralize('field', reservedKeys.length)} '
+                '${toSentence(reservedKeys)}.');
+          }
         }
 
         var id = _wrapFormatException("transformer identifier",
@@ -211,7 +232,8 @@
   }
 
   Pubspec(this._name, this._version, this._dependencies, this._devDependencies,
-          this._environment, this._transformers, [Map fields])
+          this._dependencyOverrides, this._environment, this._transformers,
+          [Map fields])
     : this.fields = fields == null ? {} : fields,
       _sources = null,
       _location = null;
diff --git a/sdk/lib/_internal/pub/lib/src/safe_http_server.dart b/sdk/lib/_internal/pub/lib/src/safe_http_server.dart
index 35fffe4..e88ee93 100644
--- a/sdk/lib/_internal/pub/lib/src/safe_http_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/safe_http_server.dart
@@ -154,7 +154,8 @@
     _inner.writeAll(objects, separator);
   void writeCharCode(int charCode) => _inner.writeCharCode(charCode);
   void writeln([Object obj = ""]) => _inner.writeln(obj);
-  void addError(error) => _inner.addError(error);
+  void addError(error, [StackTrace stackTrace]) =>
+      _inner.addError(error, stackTrace);
 
   Duration get deadline => _inner.deadline;
   set deadline(Duration value) {
diff --git a/sdk/lib/_internal/pub/lib/src/sdk.dart b/sdk/lib/_internal/pub/lib/src/sdk.dart
index 65aaef6..c99f516 100644
--- a/sdk/lib/_internal/pub/lib/src/sdk.dart
+++ b/sdk/lib/_internal/pub/lib/src/sdk.dart
@@ -10,7 +10,6 @@
 import 'package:path/path.dart' as path;
 
 import 'io.dart';
-import 'log.dart' as log;
 import 'version.dart';
 
 /// Matches an Eclipse-style SDK version number. This is four dotted numbers
@@ -20,19 +19,14 @@
 
 /// Gets the path to the root directory of the SDK.
 String get rootDirectory {
-  // If the environment variable was provided, use it. This is mainly used for
-  // the pub tests.
-  var dir = Platform.environment["DART_SDK"];
-  if (dir != null) {
-    log.fine("Using DART_SDK to find SDK at $dir");
-    return dir;
-  }
-
   // Assume the Dart executable is always coming from the SDK.
   return path.dirname(path.dirname(Platform.executable));
 }
 
-/// Gets the SDK's revision number formatted to be a semantic version.
+/// The SDK's revision number formatted to be a semantic version.
+///
+/// This can be set so that the version solver tests can artificially select
+/// different SDK versions.
 Version version = _getVersion();
 
 /// Is `true` if the current SDK is an unreleased bleeding edge version.
@@ -41,11 +35,8 @@
   return version.major == 0 && version.minor == 1 && version.patch == 2;
 }
 
-/// Determine the SDK's version number.
-Version _getVersion() {
-  var revisionPath = path.join(rootDirectory, "version");
-  var version = readTextFile(revisionPath).trim();
-
+/// Parse an Eclipse-style version number using the SDK's versioning convention.
+Version parseVersion(String version) {
   // Given a version file like: 0.1.2.0_r17495
   // We create a semver like:   0.1.2+0.r17495
   var match = _versionPattern.firstMatch(version);
@@ -61,3 +52,17 @@
       int.parse(match[1]), int.parse(match[2]), int.parse(match[3]),
       build: build);
 }
+
+/// Determine the SDK's version number.
+Version _getVersion() {
+  // Some of the pub integration tests require an SDK version number, but the
+  // tests on the bots are not run from a built SDK so this lets us avoid
+  // parsing the missing version file.
+  var sdkVersion = Platform.environment["_PUB_TEST_SDK_VERSION"];
+  if (sdkVersion != null) return new Version.parse(sdkVersion);
+
+  // Read the "version" file.
+  var revisionPath = path.join(rootDirectory, "version");
+  var version = readTextFile(revisionPath).trim();
+  return parseVersion(version);
+}
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index 48b84f2..4300909 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -59,6 +59,13 @@
   /// only allow the very latest version for each of these packages.
   final _forceLatest = new Set<String>();
 
+  /// The set of packages whose dependecy is being overridden by the root
+  /// package, keyed by the name of the package.
+  ///
+  /// Any dependency on a package that appears in this map will be overriden
+  /// to use the one here.
+  final _overrides = new Map<String, PackageDep>();
+
   /// Every time a package is encountered when traversing the dependency graph,
   /// the solver must select a version for it, sometimes when multiple versions
   /// are valid. This keeps track of which versions have been selected so far
@@ -90,6 +97,10 @@
       forceLatestVersion(package);
       lockFile.packages.remove(package);
     }
+
+    for (var override in root.dependencyOverrides) {
+      _overrides[override.name] = override;
+    }
   }
 
   /// Run the solver. Completes with a list of specific package versions if
@@ -99,6 +110,10 @@
 
     _logParameters();
 
+    // Sort the overrides by package name to make sure they're deterministic.
+    var overrides = _overrides.values.toList();
+    overrides.sort((a, b) => a.name.compareTo(b.name));
+
     return newFuture(() {
       stopwatch.start();
 
@@ -108,12 +123,12 @@
       _validateSdkConstraint(root.pubspec);
       return _traverseSolution();
     }).then((packages) {
-      return new SolveResult(packages, null, attemptedSolutions);
+      return new SolveResult(packages, overrides, null, attemptedSolutions);
     }).catchError((error) {
       if (error is! SolveFailure) throw error;
 
       // Wrap a failure in a result so we can attach some other data.
-      return new SolveResult(null, error, attemptedSolutions);
+      return new SolveResult(null, overrides, error, attemptedSolutions);
     }).whenComplete(() {
       // Gather some solving metrics.
       var buffer = new StringBuffer();
@@ -381,10 +396,25 @@
     return _solver.cache.getPubspec(id).then((pubspec) {
       _validateSdkConstraint(pubspec);
 
-      var deps = pubspec.dependencies.toList();
+      var deps = pubspec.dependencies.toSet();
 
-      // Include dev dependencies of the root package.
-      if (id.isRoot) deps.addAll(pubspec.devDependencies);
+      if (id.isRoot) {
+        // Include dev dependencies of the root package.
+        deps.addAll(pubspec.devDependencies);
+
+        // Add all overrides. This ensures a dependency only present as an
+        // override is still included.
+        deps.addAll(_solver._overrides.values);
+      }
+
+      // Replace any overridden dependencies.
+      deps = deps.map((dep) {
+        var override = _solver._overrides[dep.name];
+        if (override != null) return override;
+
+        // Not overridden.
+        return dep;
+      });
 
       // Make sure the package doesn't have any bad dependencies.
       for (var dep in deps) {
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
index aff7042..54c5ab4 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
@@ -43,6 +43,9 @@
   /// reachable from the root, or `null` if the solver failed.
   final List<PackageId> packages;
 
+  /// The dependency overrides that were used in the solution.
+  final List<PackageDep> overrides;
+
   /// The error that prevented the solver from finding a solution or `null` if
   /// it was successful.
   final SolveFailure error;
@@ -53,7 +56,8 @@
   /// solution.
   final int attemptedSolutions;
 
-  SolveResult(this.packages, this.error, this.attemptedSolutions);
+  SolveResult(this.packages, this.overrides, this.error,
+      this.attemptedSolutions);
 
   String toString() {
     if (!succeeded) {
@@ -121,7 +125,12 @@
   /// or returns `null` if not in the cache.
   Pubspec getCachedPubspec(PackageId id) => _pubspecs[id];
 
-  /// Gets the list of versions for [package] in descending order.
+  /// Gets the list of versions for [package].
+  ///
+  /// Packages are sorted in descending version order with all "stable"
+  /// versions (i.e. ones without a prerelease suffix) before pre-release
+  /// versions. This ensures that the solver prefers stable packages over
+  /// unstable ones.
   Future<List<PackageId>> getVersions(PackageRef package) {
     if (package.isRoot) {
       throw new StateError("Cannot get versions for root package $package.");
@@ -140,7 +149,14 @@
     return source.getVersions(package.name, package.description)
         .then((versions) {
       // Sort by descending version so we try newer versions first.
-      versions.sort((a, b) => b.compareTo(a));
+      versions.sort((a, b) {
+        // Sort all prerelease versions after all normal versions. This way
+        // the solver will prefer stable packages over unstable ones.
+        if (a.isPreRelease && !b.isPreRelease) return 1;
+        if (!a.isPreRelease && b.isPreRelease) return -1;
+
+        return b.compareTo(a);
+      });
 
       var ids = versions.map((version) => package.atVersion(version)).toList();
       _versions[package] = ids;
@@ -172,6 +188,9 @@
   /// an empty collection if the failure is not specific to one package.
   final Iterable<Dependency> dependencies;
 
+  final innerError = null;
+  final innerTrace = null;
+
   SolveFailure(this.package, Iterable<Dependency> dependencies)
       : dependencies = dependencies != null ? dependencies : <Dependency>[];
 
diff --git a/sdk/lib/_internal/pub/lib/src/source.dart b/sdk/lib/_internal/pub/lib/src/source.dart
index c978221..676e1a6 100644
--- a/sdk/lib/_internal/pub/lib/src/source.dart
+++ b/sdk/lib/_internal/pub/lib/src/source.dart
@@ -227,6 +227,13 @@
     return description;
   }
 
+  /// When a [LockFile] is serialized, it uses this method to get the
+  /// [description] in the right format. [containingPath] references the
+  /// containing directory of the root package.
+  dynamic serializeDescription(String containingPath, description) {
+    return description;
+  }
+
   /// Returns whether or not [description1] describes the same package as
   /// [description2] for this source. This method should be light-weight. It
   /// doesn't need to validate that either package exists.
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index 8e4a95d..265c844 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -50,9 +50,9 @@
       return doc['versions']
           .map((version) => new Version.parse(version['version']))
           .toList();
-    }).catchError((ex) {
+    }).catchError((ex, stackTrace) {
       var parsed = _parseDescription(description);
-      _throwFriendlyError(ex, parsed.first, parsed.last);
+      _throwFriendlyError(ex, stackTrace, parsed.first, parsed.last);
     });
   }
 
@@ -73,9 +73,9 @@
       // been downloaded.
       return new Pubspec.fromMap(version['pubspec'], systemCache.sources,
           expectedName: id.name, location: url);
-    }).catchError((ex) {
+    }).catchError((ex, stackTrace) {
       var parsed = _parseDescription(id.description);
-      _throwFriendlyError(ex, id, parsed.last);
+      _throwFriendlyError(ex, stackTrace, id, parsed.last);
     });
   }
 
@@ -155,19 +155,21 @@
   /// When an error occurs trying to read something about [package] from [url],
   /// this tries to translate into a more user friendly error message. Always
   /// throws an error, either the original one or a better one.
-  void _throwFriendlyError(error, package, url) {
+  void _throwFriendlyError(error, StackTrace stackTrace, String package,
+      String url) {
     if (error is PubHttpException &&
         error.response.statusCode == 404) {
-      fail('Could not find package "$package" at $url.');
+      fail('Could not find package "$package" at $url.', error, stackTrace);
     }
 
     if (error is TimeoutException) {
-      fail('Timed out trying to find package "$package" at $url.');
+      fail('Timed out trying to find package "$package" at $url.',
+          error, stackTrace);
     }
 
     if (error is io.SocketException) {
-      fail('Got socket error trying to find package "$package" at $url.\n'
-          '$error');
+      fail('Got socket error trying to find package "$package" at $url.',
+           error, stackTrace);
     }
 
     // Otherwise re-throw the original exception.
diff --git a/sdk/lib/_internal/pub/lib/src/source/path.dart b/sdk/lib/_internal/pub/lib/src/source/path.dart
index 9af0fd1..af752d6 100644
--- a/sdk/lib/_internal/pub/lib/src/source/path.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/path.dart
@@ -90,7 +90,8 @@
       // local file system.
       assert(containingPath != null);
 
-      description = path.join(path.dirname(containingPath), description);
+      description = path.normalize(
+          path.join(path.dirname(containingPath), description));
     }
 
     return {
@@ -99,6 +100,19 @@
     };
   }
 
+  /// Serializes path dependency's [description]. For the descriptions where
+  /// `relative` attribute is `true`, tries to make `path` relative to the
+  /// specified [containingPath].
+  dynamic serializeDescription(String containingPath, description) {
+    if (description["relative"]) {
+      return {
+        "path": path.relative(description['path'], from: containingPath),
+        "relative": true
+      };
+    }
+    return description;
+  }
+
   /// Ensures that [description] is a valid path description and returns a
   /// normalized path to the package.
   ///
@@ -106,7 +120,7 @@
   /// existing directory. Throws an [ApplicationException] if the path is
   /// invalid.
   String _validatePath(String name, description) {
-    var dir = path.normalize(description["path"]);
+    var dir = description["path"];
 
     if (dirExists(dir)) return dir;
 
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 0ed773c..711b224 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -15,6 +15,7 @@
 import "package:analyzer/analyzer.dart";
 import "package:crypto/crypto.dart";
 import 'package:path/path.dart' as path;
+import "package:stack_trace/stack_trace.dart";
 
 import 'dart.dart';
 
@@ -63,11 +64,11 @@
         completed = true;
         _completer.complete(_values);
       }
-    }).catchError((e) {
+    }).catchError((e, stackTrace) {
       if (completed) return;
 
       completed = true;
-      _completer.completeError(e);
+      _completer.completeError(e, stackTrace);
     }));
 
     return task;
@@ -112,6 +113,19 @@
   return '${name}s';
 }
 
+/// Creates a URL string for [address]:[port].
+///
+/// Handles properly formatting IPv6 addresses.
+String baseUrlForAddress(InternetAddress address, int port) {
+  // IPv6 addresses in URLs need to be enclosed in square brackets to avoid
+  // URL ambiguity with the ":" in the address.
+  if (address.type == InternetAddressType.IP_V6) {
+    return "http://[${address.address}]:$port";
+  }
+
+  return "http://${address.address}:$port";
+}
+
 /// Flattens nested lists inside an iterable into a single list containing only
 /// non-list elements.
 List flatten(Iterable nested) {
@@ -278,8 +292,7 @@
 /// Configures [future] so that its result (success or exception) is passed on
 /// to [completer].
 void chainToCompleter(Future future, Completer completer) {
-  future.then((value) => completer.complete(value),
-      onError: (e) => completer.completeError(e));
+  future.then(completer.complete, onError: completer.completeError);
 }
 
 /// Ensures that [stream] can emit at least one value successfully (or close
@@ -576,12 +589,18 @@
   return path.fromUri(lib.uri);
 }
 
-/// Gets a "special" string (ANSI escape or Unicode). On Windows, returns
-/// something else since those aren't supported.
+/// Gets a "special" string (ANSI escape or Unicode).
+///
+/// On Windows or when not printing to a terminal, returns something else since
+/// those aren't supported.
 String getSpecial(String color, [String onWindows = '']) {
   // No ANSI escapes on windows or when running tests.
-  if (runningAsTest || Platform.operatingSystem == 'windows') return onWindows;
-  return color;
+  if (runningAsTest || Platform.operatingSystem == 'windows' ||
+      stdioType(stdout) != StdioType.TERMINAL) {
+    return onWindows;
+  } else {
+    return color;
+  }
 }
 
 /// Prepends each line in [text] with [prefix]. If [firstPrefix] is passed, the
@@ -621,8 +640,8 @@
   // first and second cases described above.
   newFuture(fn).then((val) {
     scheduleMicrotask(() => completer.complete(val));
-  }).catchError((err) {
-    scheduleMicrotask(() => completer.completeError(err));
+  }).catchError((err, stackTrace) {
+    scheduleMicrotask(() => completer.completeError(err, stackTrace));
   });
   return completer.future;
 }
@@ -712,14 +731,21 @@
 class ApplicationException implements Exception {
   final String message;
 
-  ApplicationException(this.message);
+  /// The underlying exception that [this] is wrapping, if any.
+  final innerError;
+
+  /// The stack trace for [innerError] if it exists.
+  final Trace innerTrace;
+
+  ApplicationException(this.message, [this.innerError, StackTrace innerTrace])
+      : innerTrace = innerTrace == null ? null : new Trace.from(innerTrace);
 
   String toString() => message;
 }
 
 /// Throw a [ApplicationException] with [message].
-void fail(String message) {
-  throw new ApplicationException(message);
+void fail(String message, [innerError, StackTrace innerTrace]) {
+  throw new ApplicationException(message, innerError, innerTrace);
 }
 
 /// All the names of user-facing exceptions.
diff --git a/sdk/lib/_internal/pub/lib/src/validator.dart b/sdk/lib/_internal/pub/lib/src/validator.dart
index 98ef43e..640c54f 100644
--- a/sdk/lib/_internal/pub/lib/src/validator.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator.dart
@@ -11,6 +11,7 @@
 import 'utils.dart';
 import 'validator/compiled_dartdoc.dart';
 import 'validator/dependency.dart';
+import 'validator/dependency_override.dart';
 import 'validator/directory.dart';
 import 'validator/lib.dart';
 import 'validator/license.dart';
@@ -55,6 +56,7 @@
       new NameValidator(entrypoint),
       new PubspecFieldValidator(entrypoint),
       new DependencyValidator(entrypoint),
+      new DependencyOverrideValidator(entrypoint),
       new DirectoryValidator(entrypoint),
       new CompiledDartdocValidator(entrypoint),
       new Utf8ReadmeValidator(entrypoint)
diff --git a/sdk/lib/_internal/pub/lib/src/validator/dependency_override.dart b/sdk/lib/_internal/pub/lib/src/validator/dependency_override.dart
new file mode 100644
index 0000000..a5ce299
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/validator/dependency_override.dart
@@ -0,0 +1,28 @@
+// 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 pub.validator.dependency_override;
+
+import 'dart:async';
+
+import '../entrypoint.dart';
+import '../validator.dart';
+
+/// A validator that validates a package's dependencies overrides (or the
+/// absence thereof).
+class DependencyOverrideValidator extends Validator {
+  DependencyOverrideValidator(Entrypoint entrypoint)
+    : super(entrypoint);
+
+  Future validate() {
+    if (entrypoint.root.dependencyOverrides.isNotEmpty) {
+      errors.add(
+          'Your pubspec.yaml must not have a "dependency_overrides" field.\n'
+          'This ensures you test your package against the same versions of '
+              'its dependencies\n'
+          'that users will have when they use it.');
+    }
+    return new Future.value();
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/version.dart b/sdk/lib/_internal/pub/lib/src/version.dart
index 969d268..dcba9d4 100644
--- a/sdk/lib/_internal/pub/lib/src/version.dart
+++ b/sdk/lib/_internal/pub/lib/src/version.dart
@@ -9,6 +9,8 @@
 
 import 'dart:math';
 
+import 'package:collection_helpers/equality.dart';
+
 /// Regex that matches a version number at the beginning of a string.
 final _START_VERSION = new RegExp(
     r'^'                                        // Start at beginning.
@@ -23,10 +25,14 @@
 /// a string.
 final _START_COMPARISON = new RegExp(r"^[<>]=?");
 
+/// The equality operator to use for comparing version components.
+final _equality = const IterableEquality();
+
 /// A parsed semantic version number.
 class Version implements Comparable<Version>, VersionConstraint {
   /// No released version: i.e. "0.0.0".
   static Version get none => new Version(0, 0, 0);
+
   /// The major version number: "1" in "1.2.3".
   final int major;
 
@@ -36,15 +42,30 @@
   /// The patch version number: "3" in "1.2.3".
   final int patch;
 
-  /// The pre-release identifier: "foo" in "1.2.3-foo". May be `null`.
-  final String preRelease;
+  /// The pre-release identifier: "foo" in "1.2.3-foo".
+  ///
+  /// This is split into a list of components, each of which may be either a
+  /// string or a non-negative integer. It may also be empty, indicating that
+  /// this version has no pre-release identifier.
+  final List preRelease;
 
-  /// The build identifier: "foo" in "1.2.3+foo". May be `null`.
-  final String build;
+  /// The build identifier: "foo" in "1.2.3+foo".
+  ///
+  /// This is split into a list of components, each of which may be either a
+  /// string or a non-negative integer. It may also be empty, indicating that
+  /// this version has no build identifier.
+  final List build;
 
-  /// Creates a new [Version] object.
-  Version(this.major, this.minor, this.patch, {String pre, this.build})
-    : preRelease = pre {
+  /// The original string representation of the version number.
+  ///
+  /// This preserves textual artifacts like leading zeros that may be left out
+  /// of the parsed version.
+  final String _text;
+
+  Version._(this.major, this.minor, this.patch, String preRelease, String build,
+            this._text)
+      : preRelease = preRelease == null ? [] : _splitParts(preRelease), 
+        build = build == null ? [] : _splitParts(build) {
     if (major < 0) throw new ArgumentError(
         'Major version must be non-negative.');
     if (minor < 0) throw new ArgumentError(
@@ -53,6 +74,15 @@
         'Patch version must be non-negative.');
   }
 
+  /// Creates a new [Version] object.
+  factory Version(int major, int minor, int patch, {String pre, String build}) {
+    var text = "$major.$minor.$patch";
+    if (pre != null) text += "-$pre";
+    if (build != null) text += "+$build";
+
+    return new Version._(major, minor, patch, pre, build, text);
+  }
+
   /// Creates a new [Version] by parsing [text].
   factory Version.parse(String text) {
     final match = _COMPLETE_VERSION.firstMatch(text);
@@ -68,7 +98,7 @@
       String preRelease = match[5];
       String build = match[8];
 
-      return new Version(major, minor, patch, pre: preRelease, build: build);
+      return new Version._(major, minor, patch, preRelease, build, text);
     } on FormatException catch (ex) {
       throw new FormatException('Could not parse "$text".');
     }
@@ -88,11 +118,31 @@
     return primary;
   }
 
+  /// Splits a string of dot-delimited identifiers into their component parts.
+  ///
+  /// Identifiers that are numeric are converted to numbers.
+  static List _splitParts(String text) {
+    return text.split('.').map((part) {
+      try {
+        return int.parse(part);
+      } on FormatException catch (ex) {
+        // Not a number.
+        return part;
+      }
+    }).toList();
+  }
+
   bool operator ==(other) {
     if (other is! Version) return false;
-    return compareTo(other) == 0;
+    return major == other.major && minor == other.minor &&
+        patch == other.patch &&
+        _equality.equals(preRelease, other.preRelease) &&
+        _equality.equals(build, other.build);
   }
 
+  int get hashCode => major ^ minor ^ patch ^ _equality.hash(preRelease) ^
+      _equality.hash(build);
+
   bool operator <(Version other) => compareTo(other) < 0;
   bool operator >(Version other) => compareTo(other) > 0;
   bool operator <=(Version other) => compareTo(other) <= 0;
@@ -102,7 +152,7 @@
   bool get isEmpty => false;
 
   /// Whether or not this is a pre-release version.
-  bool get isPreRelease => preRelease != null;
+  bool get isPreRelease => preRelease.isNotEmpty;
 
   /// Tests if [other] matches this version exactly.
   bool allows(Version other) => this == other;
@@ -127,83 +177,57 @@
     if (minor != other.minor) return minor.compareTo(other.minor);
     if (patch != other.patch) return patch.compareTo(other.patch);
 
-    if (preRelease != other.preRelease) {
-      // Pre-releases always come before no pre-release string.
-      if (preRelease == null) return 1;
-      if (other.preRelease == null) return -1;
+    // Pre-releases always come before no pre-release string.
+    if (!isPreRelease && other.isPreRelease) return 1;
+    if (!other.isPreRelease && isPreRelease) return -1;
 
-      return _compareStrings(preRelease, other.preRelease);
-    }
+    var comparison = _compareLists(preRelease, other.preRelease);
+    if (comparison != 0) return comparison;
 
-    if (build != other.build) {
-      // Builds always come after no build string.
-      if (build == null) return -1;
-      if (other.build == null) return 1;
-
-      return _compareStrings(build, other.build);
-    }
-
-    return 0;
+    // Builds always come after no build string.
+    if (build.isEmpty && other.build.isNotEmpty) return -1;
+    if (other.build.isEmpty && build.isNotEmpty) return 1;
+    return _compareLists(build, other.build);
   }
 
-  int get hashCode => toString().hashCode;
+  String toString() => _text;
 
-  String toString() {
-    var buffer = new StringBuffer();
-    buffer.write('$major.$minor.$patch');
-    if (preRelease != null) buffer.write('-$preRelease');
-    if (build != null) buffer.write('+$build');
-    return buffer.toString();
-  }
+  /// Compares a dot-separated component of two versions.
+  ///
+  /// This is used for the pre-release and build version parts. This follows
+  /// Rule 12 of the Semantic Versioning spec (v2.0.0-rc.1).
+  int _compareLists(List a, List b) {
+    for (var i = 0; i < max(a.length, b.length); i++) {
+      var aPart = (i < a.length) ? a[i] : null;
+      var bPart = (i < b.length) ? b[i] : null;
 
-  /// Compares the string part of two versions. This is used for the pre-release
-  /// and build version parts. This follows Rule 12. of the Semantic Versioning
-  /// spec.
-  int _compareStrings(String a, String b) {
-    var aParts = _splitParts(a);
-    var bParts = _splitParts(b);
+      if (aPart == bPart) continue;
 
-    for (int i = 0; i < max(aParts.length, bParts.length); i++) {
-      var aPart = (i < aParts.length) ? aParts[i] : null;
-      var bPart = (i < bParts.length) ? bParts[i] : null;
+      // Missing parts come before present ones.
+      if (aPart == null) return -1;
+      if (bPart == null) return 1;
 
-      if (aPart != bPart) {
-        // Missing parts come before present ones.
-        if (aPart == null) return -1;
-        if (bPart == null) return 1;
-
-        if (aPart is num) {
-          if (bPart is num) {
-            // Compare two numbers.
-            return aPart.compareTo(bPart);
-          } else {
-            // Numbers come before strings.
-            return -1;
-          }
+      if (aPart is num) {
+        if (bPart is num) {
+          // Compare two numbers.
+          return aPart.compareTo(bPart);
         } else {
-          if (bPart is num) {
-            // Strings come after numbers.
-            return 1;
-          } else {
-            // Compare two strings.
-            return aPart.compareTo(bPart);
-          }
+          // Numbers come before strings.
+          return -1;
+        }
+      } else {
+        if (bPart is num) {
+          // Strings come after numbers.
+          return 1;
+        } else {
+          // Compare two strings.
+          return aPart.compareTo(bPart);
         }
       }
     }
-  }
 
-  /// Splits a string of dot-delimited identifiers into their component parts.
-  /// Identifiers that are numeric are converted to numbers.
-  List _splitParts(String text) {
-    return text.split('.').map((part) {
-      try {
-        return int.parse(part);
-      } on FormatException catch (ex) {
-        // Not a number.
-        return part;
-      }
-    }).toList();
+    // The lists are entirely equal.
+    return 0;
   }
 }
 
diff --git a/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart b/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
new file mode 100644
index 0000000..8a5f6bf
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:source_maps/source_maps.dart';
+
+class ModeTransformer extends Transformer {
+  final BarbackSettings settings;
+  ModeTransformer.asPlugin(this.settings);
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return new Future.value().then((_) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      transform.addOutput(new Asset.fromString(id, settings.mode.toString()));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("allows user-defined mode names", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    schedulePub(args: ["build", "--mode", "depeche"],
+        exitCode: 0);
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.file('foo.out', 'depeche')
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/build/compiles_dart_entrypoints_to_dart_and_js_test.dart b/sdk/lib/_internal/pub/test/build/compiles_dart_entrypoints_to_js_test.dart
similarity index 95%
rename from sdk/lib/_internal/pub/test/build/compiles_dart_entrypoints_to_dart_and_js_test.dart
rename to sdk/lib/_internal/pub/test/build/compiles_dart_entrypoints_to_js_test.dart
index f69676a..725fac5 100644
--- a/sdk/lib/_internal/pub/test/build/compiles_dart_entrypoints_to_dart_and_js_test.dart
+++ b/sdk/lib/_internal/pub/test/build/compiles_dart_entrypoints_to_js_test.dart
@@ -13,7 +13,7 @@
   // TODO(rnystrom): Should also add tests that other transformers work
   // (#14556).
 
-  integration("compiles Dart entrypoints to Dart and JS", () {
+  integration("compiles Dart entrypoints to JS", () {
     // Dart2js can take a long time to compile dart code, so we increase the
     // timeout to cope with that.
     currentSchedule.timeout *= 3;
diff --git a/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart b/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
index 98ed288..a8e22f4 100644
--- a/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
+++ b/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
@@ -62,7 +62,7 @@
     pubGet();
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 4 files!"),
+        output: new RegExp(r"Built 8 files!"),
         exitCode: 0);
 
     d.dir(appPath, [
diff --git a/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart b/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart
new file mode 100644
index 0000000..0778ab1
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  // This is a regression test for https://dartbug.com/15183. The code that
+  // stripped .dart files from release builds was in the forwarding transformer,
+  // and that transformer was applied to all loaded packages. That meant that
+  // if the root package imported a .dart file from another package, the
+  // forwarding transformer in that package would remove the file before
+  // dart2js could find it when compiling the entrypoint in the root package.
+
+  integration("dart2js can find imports across packages", () {
+    // Dart2js can take a long time to compile dart code, so we increase the
+    // timeout to cope with that.
+    currentSchedule.timeout *= 3;
+
+    d.dir("foo", [
+      d.libPubspec("foo", "0.0.1"),
+      d.dir("lib", [
+        d.file("foo.dart",
+            """
+            library foo;
+            foo() => 'foo';
+            """)
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      }),
+      d.dir("web", [
+        d.file("main.dart",
+            """
+            import 'package:foo/foo.dart';
+            main() => print(foo());
+            """)
+      ])
+    ]).create();
+
+    schedulePub(args: ["build"],
+        output: new RegExp(r"Built 1 file!"),
+        exitCode: 0);
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.matcherFile('main.dart.js', isNot(isEmpty))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart b/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
new file mode 100644
index 0000000..7d0d482
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:source_maps/source_maps.dart';
+
+class ModeTransformer extends Transformer {
+  final BarbackSettings settings;
+  ModeTransformer.asPlugin(this.settings);
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return new Future.value().then((_) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      transform.addOutput(new Asset.fromString(id, settings.mode.toString()));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("defaults to release mode", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    schedulePub(args: ["build"],
+        exitCode: 0);
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.file('foo.out', 'release')
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart b/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
index 94eb21b..51d6b9d 100644
--- a/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
+++ b/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:path/path.dart' as path;
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
diff --git a/sdk/lib/_internal/pub/test/build/includes_dart_files_in_debug_mode_test.dart b/sdk/lib/_internal/pub/test/build/includes_dart_files_in_debug_mode_test.dart
new file mode 100644
index 0000000..96f3cd0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/includes_dart_files_in_debug_mode_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  integration("includes Dart files in debug mode", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('web', [
+        d.file('file1.dart', 'var main = () => print("hello");'),
+        d.file('file2.dart', 'void main(arg) => print("hello");'),
+        d.file('file3.dart', 'class Foo { void main() => print("hello"); }'),
+        d.file('file4.dart', 'var foo;')
+      ])
+    ]).create();
+
+    schedulePub(args: ["build", "--mode", "debug"],
+        output: new RegExp(r"Built 4 files!"),
+        exitCode: 0);
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.nothing('file1.dart.js'),
+        d.matcherFile('file1.dart', isNot(isEmpty)),
+        d.nothing('file2.dart.js'),
+        d.matcherFile('file2.dart', isNot(isEmpty)),
+        d.nothing('file3.dart.js'),
+        d.matcherFile('file3.dart', isNot(isEmpty)),
+        d.nothing('file4.dart.js'),
+        d.matcherFile('file4.dart', isNot(isEmpty))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/build/minifies_js_by_default_test.dart b/sdk/lib/_internal/pub/test/build/minifies_js_by_default_test.dart
deleted file mode 100644
index 73f58dd..0000000
--- a/sdk/lib/_internal/pub/test/build/minifies_js_by_default_test.dart
+++ /dev/null
@@ -1,35 +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.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("generates minified JavaScript", () {
-    // 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', 'void main() => print("hello");')
-      ])
-    ]).create();
-
-    schedulePub(args: ["build"],
-        output: new RegExp(r"Built 1 file!"),
-        exitCode: 0);
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.matcherFile('main.dart.js', isMinifiedDart2JSOutput)
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/takes_flag_to_disable_minification_test.dart b/sdk/lib/_internal/pub/test/build/takes_flag_to_disable_minification_test.dart
deleted file mode 100644
index fc4bfd0..0000000
--- a/sdk/lib/_internal/pub/test/build/takes_flag_to_disable_minification_test.dart
+++ /dev/null
@@ -1,35 +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.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("takes a flag to generate unminified JavaScript", () {
-    // 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', 'void main() => print("hello");')
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "--no-minify"],
-        output: new RegExp(r"Built 1 file!"),
-        exitCode: 0);
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.matcherFile('main.dart.js', isUnminifiedDart2JSOutput)
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/dependency_override_test.dart b/sdk/lib/_internal/pub/test/dependency_override_test.dart
new file mode 100644
index 0000000..c930dd5
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/dependency_override_test.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'descriptor.dart' as d;
+import 'test_pub.dart';
+
+main() {
+  initConfig();
+  forBothPubGetAndUpgrade((command) {
+    integration("chooses best version matching override constraint", () {
+      servePackages([
+        packageMap("foo", "1.0.0"),
+        packageMap("foo", "2.0.0"),
+        packageMap("foo", "3.0.0")
+      ]);
+
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependencies": {
+            "foo": ">2.0.0"
+          },
+          "dependency_overrides": {
+            "foo": "<3.0.0"
+          }
+        })
+      ]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({
+        "foo": "2.0.0"
+      }).validate();
+    });
+
+    integration("treats override as implicit dependency", () {
+      servePackages([
+        packageMap("foo", "1.0.0")
+      ]);
+
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependency_overrides": {
+            "foo": "any"
+          }
+        })
+      ]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({
+        "foo": "1.0.0"
+      }).validate();
+    });
+
+    integration("ignores other constraints on overridden package", () {
+      servePackages([
+        packageMap("foo", "1.0.0"),
+        packageMap("foo", "2.0.0"),
+        packageMap("foo", "3.0.0"),
+        packageMap("bar", "1.0.0", {"foo": "5.0.0-nonexistent"})
+      ]);
+
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependencies": {
+            "bar": "any"
+          },
+          "dependency_overrides": {
+            "foo": "<3.0.0"
+          }
+        })
+      ]).create();
+
+      pubCommand(command);
+
+      d.packagesDir({
+        "foo": "2.0.0",
+        "bar": "1.0.0"
+      }).validate();
+    });
+
+    integration("warns about overridden dependencies", () {
+      servePackages([
+        packageMap("foo", "1.0.0"),
+        packageMap("bar", "1.0.0"),
+        packageMap("baz", "1.0.0")
+      ]);
+
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependency_overrides": {
+            "foo": "any",
+            "bar": "any",
+            "baz": "any"
+          }
+        })
+      ]).create();
+
+      schedulePub(args: [command.name], output: command.success, error:
+          """
+          Warning: You are overriding these dependencies:
+          - bar any from hosted (bar)
+          - baz any from hosted (baz)
+          - foo any from hosted (foo)
+          """);
+    });
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/get/path/relative_path_test.dart b/sdk/lib/_internal/pub/test/get/path/relative_path_test.dart
index 8313f3e..d9f8ce8 100644
--- a/sdk/lib/_internal/pub/test/get/path/relative_path_test.dart
+++ b/sdk/lib/_internal/pub/test/get/path/relative_path_test.dart
@@ -2,6 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE d.file.
 
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../../lib/src/lock_file.dart';
+import '../../../lib/src/source_registry.dart';
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -59,4 +65,27 @@
       ])
     ]).validate();
   });
+
+  integration("relative path preserved in the lockfile", () {
+    d.dir("foo", [
+      d.libDir("foo"),
+      d.libPubspec("foo", "0.0.1")
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    pubGet();
+
+    schedule(() {
+      var lockfilePath = path.join(sandboxDir, appPath, "pubspec.lock");
+      var lockfile = new LockFile.load(lockfilePath, new SourceRegistry());
+      var description = lockfile.packages["foo"].description;
+
+      expect(path.isRelative(description["path"]), isTrue);
+    });
+  });
 }
diff --git a/sdk/lib/_internal/pub/test/lock_file_test.dart b/sdk/lib/_internal/pub/test/lock_file_test.dart
index b69cce4..29c9fcc 100644
--- a/sdk/lib/_internal/pub/test/lock_file_test.dart
+++ b/sdk/lib/_internal/pub/test/lock_file_test.dart
@@ -179,7 +179,7 @@
         lockfile.packages['bar'] = new PackageId(
             'bar', mockSource.name, new Version.parse('3.2.1'), 'bar desc');
 
-        expect(loadYaml(lockfile.serialize()), equals({
+        expect(loadYaml(lockfile.serialize(null, sources)), equals({
           'packages': {
             'foo': {
               'version': '1.2.3',
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index cf0749c..9651554 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import 'descriptor.dart' as d;
 import 'test_pub.dart';
 
 final USAGE_STRING = """
@@ -169,23 +168,5 @@
     integration('displays the current version', () {
       schedulePub(args: ['version'], output: VERSION_STRING);
     });
-
-    integration('parses a release-style version', () {
-      d.dir(sdkPath, [
-        d.file('version', '0.1.2.0_r17645'),
-      ]).create();
-
-      schedulePub(args: ['version'], output: "Pub 0.1.2+0.r17645\n");
-    });
-
-    integration('parses a dev-only style version', () {
-      // The "version" file generated on developer builds is a little funky and
-      // we need to make sure we don't choke on it.
-      d.dir(sdkPath, [
-        d.file('version', '0.1.2.0_r16279_bobross'),
-      ]).create();
-
-      schedulePub(args: ['version'], output: "Pub 0.1.2+0.r16279.bobross\n");
-    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/pubspec_test.dart b/sdk/lib/_internal/pub/test/pubspec_test.dart
index a9d7779..70eba93 100644
--- a/sdk/lib/_internal/pub/test/pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/pubspec_test.dart
@@ -100,6 +100,29 @@
       expect(pubspec.devDependencies, isEmpty);
     });
 
+    test("allows a version constraint for dependency overrides", () {
+      var pubspec = new Pubspec.parse('''
+dependency_overrides:
+  foo:
+    mock: ok
+    version: ">=1.2.3 <3.4.5"
+''', sources);
+
+      var foo = pubspec.dependencyOverrides[0];
+      expect(foo.name, equals('foo'));
+      expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue);
+      expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue);
+      expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse);
+    });
+
+    test("allows an empty dependency overrides map", () {
+      var pubspec = new Pubspec.parse('''
+dependency_overrides:
+''', sources);
+
+      expect(pubspec.dependencyOverrides, isEmpty);
+    });
+
     test("allows an unknown source", () {
       var pubspec = new Pubspec.parse('''
 dependencies:
@@ -143,6 +166,15 @@
 ''', (pubspec) => pubspec.devDependencies);
     });
 
+    test("throws if it has an override on itself", () {
+      expectPubspecException('''
+name: myapp
+dependency_overrides:
+  myapp:
+    mock: ok
+''', (pubspec) => pubspec.dependencyOverrides);
+    });
+
     test("throws if the description isn't valid", () {
       expectPubspecException('''
 dependencies:
@@ -195,6 +227,18 @@
           (pubspec) => pubspec.transformers);
     });
 
+    test("throws if a transformer's configuration contains a top-level key "
+        "beginning with a dollar sign", () {
+      expectPubspecException('transformers: {pkg: {\$key: value}}',
+          (pubspec) => pubspec.transformers);
+    });
+
+    test("doesn't throw if a transformer's configuration contains a "
+        "non-top-level key beginning with a dollar sign", () {
+      expectPubspecException('transformers: {pkg: {\$key: value}}',
+          (pubspec) => pubspec.transformers);
+    });
+
     test("allows comment-only files", () {
       var pubspec = new Pubspec.parse('''
 # No external dependencies yet
diff --git a/sdk/lib/_internal/pub/test/real_version_test.dart b/sdk/lib/_internal/pub/test/real_version_test.dart
index c1bea3c..d1aa737 100644
--- a/sdk/lib/_internal/pub/test/real_version_test.dart
+++ b/sdk/lib/_internal/pub/test/real_version_test.dart
@@ -19,11 +19,9 @@
   // This test is a bit funny.
   //
   // Pub parses the "version" file that gets generated and shipped with the SDK.
-  // Most of the pub tests here generate a synthetic SDK directory so that we
-  // can tests against a known SDK state. But we want to make sure that the
-  // actual version file that gets created is also one pub can parse. If this
-  // test fails, it means the version file's format has changed in a way pub
-  // didn't expect.
+  // We want to make sure that the actual version file that gets created is
+  // also one pub can parse. If this test fails, it means the version file's
+  // format has changed in a way pub didn't expect.
   //
   // Note that this test expects to be invoked from a Dart executable that is
   // in the built SDK's "bin" directory. Note also that this invokes pub from
diff --git a/sdk/lib/_internal/pub/test/sdk_test.dart b/sdk/lib/_internal/pub/test/sdk_test.dart
new file mode 100644
index 0000000..6cec3e9
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/sdk_test.dart
@@ -0,0 +1,26 @@
+// 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 pub_tests;
+
+import 'package:unittest/unittest.dart';
+
+import '../lib/src/sdk.dart' as sdk;
+import '../lib/src/version.dart';
+
+main() {
+  group("parseVersion()", () {
+    test("parses a release-style version", () {
+      expect(sdk.parseVersion("0.1.2.0_r17645"),
+          equals(new Version.parse("0.1.2+0.r17645")));
+    });
+
+    test("parses a dev-only style version", () {
+      // The "version" file generated on developer builds is a little funky and
+      // we need to make sure we don't choke on it.
+      expect(sdk.parseVersion("0.1.2.0_r16279_bobross"),
+          equals(new Version.parse("0.1.2+0.r16279.bobross")));
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart b/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
new file mode 100644
index 0000000..7d6be6c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:source_maps/source_maps.dart';
+
+class ModeTransformer extends Transformer {
+  final BarbackSettings settings;
+  ModeTransformer.asPlugin(this.settings);
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return new Future.value().then((_) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      transform.addOutput(new Asset.fromString(id, settings.mode.toString()));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("allows user-defined mode names", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    pubServe(args: ["--mode", "depeche"]);
+    requestShouldSucceed("foo.out", "depeche");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart b/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
new file mode 100644
index 0000000..5da9948
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:source_maps/source_maps.dart';
+
+class ModeTransformer extends Transformer {
+  final BarbackSettings settings;
+  ModeTransformer.asPlugin(this.settings);
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return new Future.value().then((_) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      transform.addOutput(new Asset.fromString(id, settings.mode.toString()));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("defaults to debug mode", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    pubServe();
+    requestShouldSucceed("foo.out", "debug");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_a_dependency_is_removed_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_a_dependency_is_removed_test.dart
index b42c2a5..48ab3c1 100644
--- a/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_a_dependency_is_removed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_a_dependency_is_removed_test.dart
@@ -29,7 +29,7 @@
       d.appPubspec()
     ]).create();
 
-    startPubServe(shouldGetFirst: false);
+    pubServe(shouldGetFirst: false);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_git_url_did_not_change_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_git_url_did_not_change_test.dart
index d560cfc..d0c8fa1 100644
--- a/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_git_url_did_not_change_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_git_url_did_not_change_test.dart
@@ -21,7 +21,7 @@
     }).create();
 
     pubGet();
-    startPubServe(shouldGetFirst: false);
+    pubServe(shouldGetFirst: false);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_locked_version_matches_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_locked_version_matches_test.dart
index 077c5dc..6b46bce 100644
--- a/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_locked_version_matches_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/does_not_get_first_if_locked_version_matches_test.dart
@@ -38,7 +38,7 @@
       })
     ]).create();
 
-    startPubServe(shouldGetFirst: false);
+    pubServe(shouldGetFirst: false);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_dart_in_release_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_dart_in_release_test.dart
new file mode 100644
index 0000000..1c61497
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_serve_dart_in_release_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("does not serve .dart files in release mode", () {
+
+    d.dir("foo", [
+      d.libPubspec("foo", "0.0.1"),
+      d.dir("lib", [
+        d.file("foo.dart",
+            """
+            library foo;
+            foo() => 'foo';
+            """)
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      }),
+      d.dir("lib", [
+        d.file("lib.dart", "lib() => print('hello');"),
+      ]),
+      d.dir("web", [
+        d.file("file.dart",
+            """
+            import 'package:foo/foo.dart';
+            main() => print('hello');
+            """),
+        d.dir("sub", [
+          d.file("sub.dart", "main() => 'foo';"),
+        ])
+      ])
+    ]).create();
+
+    pubServe(shouldGetFirst: true, args: ["--mode", "release"]);
+    requestShould404("file.dart");
+    requestShould404("packages/myapp/lib.dart");
+    requestShould404("packages/foo/foo.dart");
+    requestShould404("sub/sub.dart");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_added_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_added_test.dart
index feee957..f1d7bb8 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_added_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_added_test.dart
@@ -29,7 +29,7 @@
       })
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_version_changed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_version_changed_test.dart
index f577605..4bcd4e4 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_version_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_version_changed_test.dart
@@ -39,7 +39,7 @@
       d.libDir("foo")
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_dev_dependency_changed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_dev_dependency_changed_test.dart
index 01797cc..6b41d01 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_dev_dependency_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_dev_dependency_changed_test.dart
@@ -31,7 +31,7 @@
       }))
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_git_ref_changed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_git_ref_changed_test.dart
index f98f27b..91f2d3f 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_git_ref_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_git_ref_changed_test.dart
@@ -38,7 +38,7 @@
       "foo": {"git": {"url": "../foo.git", "ref": commit2}}
     }).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "after";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_git_url_changed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_git_url_changed_test.dart
index 1849ea7..71e98ad 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_git_url_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_git_url_changed_test.dart
@@ -33,7 +33,7 @@
       "foo": {"git": "../foo-after.git"}
     }).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "after";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_no_lockfile_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_no_lockfile_test.dart
index 3afad7d..6abbfd9 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_no_lockfile_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_no_lockfile_test.dart
@@ -20,7 +20,7 @@
       "foo": {"path": "../foo"}
     }).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_path_dependency_changed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_path_dependency_changed_test.dart
index 5a5bb47..abb460e 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_path_dependency_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_path_dependency_changed_test.dart
@@ -33,7 +33,7 @@
       "foo": {"path": "../foo-after"}
     }).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "after";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_source_changed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_source_changed_test.dart
index cb6a702..dfefed2 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_source_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_source_changed_test.dart
@@ -36,7 +36,7 @@
       }))
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/foo.dart", 'main() => "foo";');
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/invalid_method_test.dart b/sdk/lib/_internal/pub/test/serve/invalid_method_test.dart
index 28a259d..a49f77b 100644
--- a/sdk/lib/_internal/pub/test/serve/invalid_method_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/invalid_method_test.dart
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
 
     postShould405("index.html");
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart b/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart
index 4939fd6..be48245 100644
--- a/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart
@@ -36,7 +36,7 @@
     ]).create();
 
     pubGet();
-    startPubServe();
+    pubServe();
     requestShould404("packages");
     requestShould404("assets");
     requestShould404("packages/");
diff --git a/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart b/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
index 39efa26..c173982 100644
--- a/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/missing_asset_test.dart
@@ -15,7 +15,7 @@
       d.appPubspec()
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShould404("index.html");
     requestShould404("packages/myapp/nope.dart");
     requestShould404("assets/myapp/nope.png");
diff --git a/sdk/lib/_internal/pub/test/serve/missing_dependency_file_test.dart b/sdk/lib/_internal/pub/test/serve/missing_dependency_file_test.dart
index 0e3d0fd1..7ebe99a 100644
--- a/sdk/lib/_internal/pub/test/serve/missing_dependency_file_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/missing_dependency_file_test.dart
@@ -22,7 +22,7 @@
     ]).create();
 
     pubGet();
-    startPubServe();
+    pubServe();
     requestShould404("packages/foo/nope.dart");
     requestShould404("assets/foo/nope.png");
     requestShould404("dir/packages/foo/nope.dart");
diff --git a/sdk/lib/_internal/pub/test/serve/missing_file_test.dart b/sdk/lib/_internal/pub/test/serve/missing_file_test.dart
index 693ae55..47956b9 100644
--- a/sdk/lib/_internal/pub/test/serve/missing_file_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/missing_file_test.dart
@@ -30,7 +30,7 @@
 
     // Start the server with the files present so that it creates barback
     // assets for them.
-    startPubServe();
+    pubServe();
 
     // TODO(rnystrom): When pub serve supports file watching, we'll have to do
     // something here to specifically disable that so that we can get barback
diff --git a/sdk/lib/_internal/pub/test/serve/native_watch_added_file_test.dart b/sdk/lib/_internal/pub/test/serve/native_watch_added_file_test.dart
new file mode 100644
index 0000000..4da32bd
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/native_watch_added_file_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+// TODO(nweiz): Default to testing the native watcher and add an explicit test
+// for the polling watcher when issue 14941 is fixed.
+
+main() {
+  initConfig();
+  integration("picks up files added after serving started when using the "
+      "native watcher", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "body")
+      ])
+    ]).create();
+
+    pubServe(args: ["--no-force-poll"]);
+    waitForBuildSuccess();
+    requestShouldSucceed("index.html", "body");
+
+    d.dir(appPath, [
+      d.dir("web", [
+        d.file("other.html", "added")
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("other.html", "added");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/native_watch_modified_file_test.dart b/sdk/lib/_internal/pub/test/serve/native_watch_modified_file_test.dart
new file mode 100644
index 0000000..883af6d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/native_watch_modified_file_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+// TODO(nweiz): Default to testing the native watcher and add an explicit test
+// for the polling watcher when issue 14941 is fixed.
+
+main() {
+  initConfig();
+  integration("watches modifications to files when using the native watcher",
+      () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "before")
+      ])
+    ]).create();
+
+    pubServe(args: ["--no-force-poll"]);
+    requestShouldSucceed("index.html", "before");
+
+    d.dir(appPath, [
+      d.dir("web", [
+        d.file("index.html", "after")
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("index.html", "after");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/native_watch_removed_file_test.dart b/sdk/lib/_internal/pub/test/serve/native_watch_removed_file_test.dart
new file mode 100644
index 0000000..271842e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/native_watch_removed_file_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+// TODO(nweiz): Default to testing the native watcher and add an explicit test
+// for the polling watcher when issue 14941 is fixed.
+
+main() {
+  initConfig();
+  integration("stop serving a file that is removed when using the native "
+      "watcher", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "body")
+      ])
+    ]).create();
+
+    pubServe(args: ["--no-force-poll"]);
+    requestShouldSucceed("index.html", "body");
+
+    schedule(() => deleteEntry(
+        path.join(sandboxDir, appPath, "web", "index.html")));
+
+    waitForBuildSuccess();
+    requestShould404("index.html");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_app_asset_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_app_asset_test.dart
index c13c901..63d324b 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_app_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_app_asset_test.dart
@@ -21,7 +21,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("assets/myapp/foo.txt", "foo");
     requestShouldSucceed("assets/myapp/sub/bar.txt", "bar");
 
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_app_lib_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_app_lib_test.dart
index b5b8e91..ad4e91a 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_app_lib_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_app_lib_test.dart
@@ -21,7 +21,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("packages/myapp/lib.dart", "foo() => 'foo';");
     requestShouldSucceed("packages/myapp/sub/lib.dart", "bar() => 'bar';");
 
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_app_web_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_app_web_test.dart
index 6d46bac..4859b81 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_app_web_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_app_web_test.dart
@@ -23,7 +23,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("index.html", "<body>");
     requestShouldSucceed("file.dart", "main() => print('hello');");
     requestShouldSucceed("sub/file.html", "<body>in subdir</body>");
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
index 9acf804..08c76e0 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
@@ -27,7 +27,7 @@
       })
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("assets/foo/foo.txt", "foo");
     requestShouldSucceed("assets/foo/sub/bar.txt", "bar");
 
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
index a64b4ac..b55a06f 100644
--- a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_lib_test.dart
@@ -27,7 +27,7 @@
       })
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("packages/foo/lib.dart", "foo() => 'foo';");
     requestShouldSucceed("packages/foo/sub/lib.dart", "bar() => 'bar';");
 
diff --git a/sdk/lib/_internal/pub/test/serve/unknown_dependency_test.dart b/sdk/lib/_internal/pub/test/serve/unknown_dependency_test.dart
index 2f66d14..9f52958 100644
--- a/sdk/lib/_internal/pub/test/serve/unknown_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/unknown_dependency_test.dart
@@ -15,7 +15,7 @@
       d.appPubspec()
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShould404("packages/foo/nope.dart");
     requestShould404("assets/foo/nope.png");
     requestShould404("dir/packages/foo/nope.dart");
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index eb412a7..b57a984 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -92,17 +92,15 @@
 """;
 }
 
-/// Schedules starting the "pub serve" process.
+/// Schedules starting the `pub serve` process.
 ///
-/// If [shouldGetFirst] is `true`, validates that pub get is run first. If
-/// [dart2js] is `false`, does not compile Dart entrypoints in "web" to
-/// JavaScript.
+/// Unlike [pubServe], this doesn't determine the port number of the server, and
+/// so may be used to test for errors in the initialization process.
 ///
 /// Returns the `pub serve` process.
-ScheduledProcess startPubServe({bool shouldGetFirst: false,
-    Iterable<String> args}) {
+ScheduledProcess startPubServe([Iterable<String> args]) {
   // Use port 0 to get an ephemeral port.
-  var pubArgs = ["serve", "--port=0", "--hostname=127.0.0.1"];
+  var pubArgs = ["serve", "--port=0", "--hostname=127.0.0.1", "--force-poll"];
 
   if (args != null) pubArgs.addAll(args);
 
@@ -110,7 +108,18 @@
   // timeout to cope with that.
   currentSchedule.timeout = new Duration(seconds: 15);
 
-  _pubServer = startPub(args: pubArgs);
+  return startPub(args: pubArgs);
+}
+
+/// Schedules starting the "pub serve" process and records its port number for
+/// future requests.
+///
+/// If [shouldGetFirst] is `true`, validates that pub get is run first.
+///
+/// Returns the `pub serve` process.
+ScheduledProcess pubServe({bool shouldGetFirst: false,
+    Iterable<String> args}) {
+  _pubServer = startPubServe(args);
 
   currentSchedule.onComplete.schedule(() {
     if (_webSocket != null) {
diff --git a/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart
index 75a1718..7a42aa1 100644
--- a/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/watch_added_file_test.dart
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     waitForBuildSuccess();
     requestShouldSucceed("index.html", "body");
 
diff --git a/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart
index 6cf610d..4ab929e 100644
--- a/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/watch_modified_file_test.dart
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("index.html", "before");
 
     d.dir(appPath, [
diff --git a/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart b/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart
index 46fdc4c..55ff576 100644
--- a/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/watch_removed_file_test.dart
@@ -22,7 +22,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("index.html", "body");
 
     schedule(() => deleteEntry(
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/converts_asset_ids_to_urls_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/converts_asset_ids_to_urls_test.dart
index e2abf63..bd2f0e1 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/converts_asset_ids_to_urls_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/converts_asset_ids_to_urls_test.dart
@@ -40,7 +40,7 @@
       ])
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
 
     webSocketShouldReply({
       "command": "assetToUrl",
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/converts_urls_to_asset_ids_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/converts_urls_to_asset_ids_test.dart
index c06ae38..2f9c205 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/converts_urls_to_asset_ids_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/converts_urls_to_asset_ids_test.dart
@@ -40,7 +40,7 @@
       ])
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
 
     webSocketShouldReply(
         {"command": "urlToAsset", "path": "sub/bar.html"},
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_bad_commands_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_bad_commands_test.dart
index d6452f6..7bae48e 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_bad_commands_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_bad_commands_test.dart
@@ -16,7 +16,7 @@
       d.appPubspec()
     ]).create();
 
-    startPubServe();
+    pubServe();
 
     webSocketShouldReply(
         "not even valid json",
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_invalid_assets_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_invalid_assets_test.dart
index 581f99d..3434f63 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_invalid_assets_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/returns_errors_on_invalid_assets_test.dart
@@ -40,7 +40,7 @@
       ])
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
 
     webSocketShouldReply({
       "command": "assetToUrl",
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 5da6eb6..59be37c 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -32,6 +32,8 @@
 import '../lib/src/log.dart' as log;
 import '../lib/src/package.dart';
 import '../lib/src/safe_http_server.dart';
+import '../lib/src/source/path.dart';
+import '../lib/src/source_registry.dart';
 import '../lib/src/system_cache.dart';
 import '../lib/src/utils.dart';
 import '../lib/src/validator.dart';
@@ -246,10 +248,6 @@
 /// sandbox directory.
 final String cachePath = "cache";
 
-/// The path of the mock SDK directory used for tests. Relative to the sandbox
-/// directory.
-final String sdkPath = "sdk";
-
 /// The path of the mock app directory used for tests. Relative to the sandbox
 /// directory.
 final String appPath = "myapp";
@@ -338,11 +336,6 @@
       currentSchedule.timeout = new Duration(seconds: 10);
     }
 
-    // Ensure the SDK version is always available.
-    d.dir(sdkPath, [
-      d.file('version', '0.1.2.3')
-    ]).create();
-
     _sandboxDir = createSystemTempDir();
     d.defaultRoot = sandboxDir;
     currentSchedule.onComplete.schedule(() => deleteEntry(_sandboxDir),
@@ -481,7 +474,10 @@
     var environment = {};
     environment['_PUB_TESTING'] = 'true';
     environment['PUB_CACHE'] = pathInSandbox(cachePath);
-    environment['DART_SDK'] = pathInSandbox(sdkPath);
+
+    // Ensure a known SDK version is set for the tests that rely on that.
+    environment['_PUB_TEST_SDK_VERSION'] = "0.1.2+3";
+
     if (tokenEndpoint != null) {
       environment['_PUB_TEST_TOKEN_ENDPOINT'] =
         tokenEndpoint.toString();
@@ -653,7 +649,12 @@
     });
     lockFile.packages[name] = id;
   });
-  d.file(path.join(package, 'pubspec.lock'), lockFile.serialize()).create();
+
+  var sources = new SourceRegistry()
+    ..register(new PathSource());
+
+  d.file(path.join(package, 'pubspec.lock'),
+      lockFile.serialize(null, sources)).create();
 }
 
 /// Use [client] as the mock HTTP client for this test.
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart
index 0084d5c..1484c76 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart
@@ -46,7 +46,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("foo.out", "foo.out");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart
index db700ca..fba1eed 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart
@@ -47,7 +47,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("foo.out", "[[102, 111, 111]].out");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart b/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart
index e2f0511..1d8a1cf 100644
--- a/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart
@@ -51,7 +51,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var server = startPubServe();
+    var server = pubServe();
     requestShouldSucceed("foo.json", JSON.encode({}));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart
index 1a040b6..48cf45a 100644
--- a/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart
@@ -53,7 +53,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var server = startPubServe();
+    var server = pubServe();
     requestShouldSucceed("foo.json", JSON.encode(configuration));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart b/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart
index 3f0a195..76259ef 100644
--- a/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart
@@ -67,7 +67,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var server = startPubServe();
+    var server = pubServe();
     requestShouldSucceed("foo.json", JSON.encode(configuration));
     requestShould404("foo.out");
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/allows_import_in_dart_code_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/allows_import_in_dart_code_test.dart
index 215af0b..eb95620 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/allows_import_in_dart_code_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/allows_import_in_dart_code_test.dart
@@ -45,7 +45,7 @@
       ])
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShouldSucceed("main.dart.js", contains("footext"));
     requestShouldSucceed("main.dart.js", contains("libtext"));
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_dart_file_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_dart_file_test.dart
index 399c2ce..9d73a05 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_dart_file_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_dart_file_test.dart
@@ -32,7 +32,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart.js", contains("(before, munge)"));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_test.dart
index 45dc8a3..20793a0 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_test.dart
@@ -46,7 +46,7 @@
 
     createLockFile("myapp", sandbox: ["foo"], pkg: ["barback"]);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart.js", contains("(before, munge)"));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_imported_generated_file_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_imported_generated_file_test.dart
index f5fb55d..17c6dff 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_imported_generated_file_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_imported_generated_file_test.dart
@@ -36,7 +36,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart.js", contains("(before, munge)"));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/converts_entrypoint_in_web_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/converts_entrypoint_in_web_test.dart
index 538930a..90ad051 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/converts_entrypoint_in_web_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/converts_entrypoint_in_web_test.dart
@@ -20,7 +20,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart.js", contains("hello"));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_if_disabled_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_if_disabled_test.dart
index 848ae1b..a86135a 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_if_disabled_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_if_disabled_test.dart
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe(args: ["--no-dart2js"]);
+    pubServe(args: ["--no-dart2js"]);
     requestShould404("main.dart.js");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_in_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_in_dependency_test.dart
index cf4be08..2b86335 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_in_dependency_test.dart
@@ -24,7 +24,7 @@
       })
     ]).create();
 
-    startPubServe(shouldGetFirst: true);
+    pubServe(shouldGetFirst: true);
     requestShould404("web/packages/foo/lib.dart.js");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_outside_web_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_outside_web_test.dart
index baae7d4..1ad02a3 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_outside_web_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_outside_web_test.dart
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     requestShould404("packages/myapp/main.dart.js");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_nonentrypoint_in_web_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_nonentrypoint_in_web_test.dart
index f5922e6..29a079d 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_nonentrypoint_in_web_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_nonentrypoint_in_web_test.dart
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe();
     waitForBuildSuccess();
     requestShouldSucceed("notmain.dart", "foo() => print('hello');");
     requestShould404("notmain.dart.js");
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/takes_flag_minify_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/minifies_in_release_mode_test.dart
similarity index 85%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/takes_flag_minify_test.dart
rename to sdk/lib/_internal/pub/test/transformer/dart2js/minifies_in_release_mode_test.dart
index e385237..d2fc5e6c 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/takes_flag_minify_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/minifies_in_release_mode_test.dart
@@ -10,7 +10,7 @@
 
 main() {
   initConfig();
-  integration("generates minified JS if the flag is set", () {
+  integration("generates minified JS in release mode", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe(args: ["--minify"]);
+    pubServe(args: ["--mode", "release"]);
     requestShouldSucceed("main.dart.js", isMinifiedDart2JSOutput);
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/unminified_by_default_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/unminified_in_nonrelease_mode_test.dart
similarity index 83%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/unminified_by_default_test.dart
rename to sdk/lib/_internal/pub/test/transformer/dart2js/unminified_in_nonrelease_mode_test.dart
index 3f0bb23..dfffa2f 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/unminified_by_default_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/unminified_in_nonrelease_mode_test.dart
@@ -10,7 +10,7 @@
 
 main() {
   initConfig();
-  integration("generates unminified JS by default", () {
+  integration("generates unminified JS when not in release mode", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
@@ -18,7 +18,7 @@
       ])
     ]).create();
 
-    startPubServe();
+    pubServe(args: ["--mode", "whatever"]);
     requestShouldSucceed("main.dart.js", isUnminifiedDart2JSOutput);
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart b/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
index 0373ab6..dd98149 100644
--- a/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
@@ -38,8 +38,7 @@
 
     createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    // Use port 0 to get an ephemeral port.
-    var process = startPub(args: ["serve", "--port=0", "--hostname=127.0.0.1"]);
+    var process = startPubServe();
     process.shouldExit(1);
     expect(process.remainingStderr(), completion(equals(
         "Transformer cycle detected:\n"
diff --git a/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart b/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
index fa27d99..b9bf8bc 100644
--- a/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
@@ -54,8 +54,7 @@
 
     createLockFile('myapp', sandbox: ['foo', 'bar', 'baz'], pkg: ['barback']);
 
-    // Use port 0 to get an ephemeral port.
-    var process = startPub(args: ["serve", "--port=0", "--hostname=127.0.0.1"]);
+    var process = startPubServe();
     process.shouldExit(1);
     expect(process.remainingStderr(), completion(equals(
         "Transformer cycle detected:\n"
diff --git a/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart b/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart
index 982f042..01ba651 100644
--- a/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart
@@ -34,7 +34,7 @@
 
     createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShould404("assets/myapp/bar.out");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart
index a4f697b..aae47da 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart
@@ -8,6 +8,7 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
@@ -25,7 +26,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPub(args: ['serve', '--port=0', "--hostname=127.0.0.1"]);
+    var pub = startPubServe();
     expect(pub.nextErrLine(), completion(startsWith('No transformers were '
        'defined in ')));
     expect(pub.nextErrLine(), completion(startsWith('required by myapp.')));
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart
index da0ee0e..f961bae 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart
@@ -8,6 +8,7 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
@@ -19,7 +20,7 @@
       })
     ]).create();
 
-    var pub = startPub(args: ['serve', '--port=0', "--hostname=127.0.0.1"]);
+    var pub = startPubServe();
     expect(pub.nextErrLine(), completion(equals(
         'Transformer library "package:myapp/transform.dart" not found.')));
     pub.shouldExit(1);
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_config_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_config_test.dart
index 7f61911..7394784 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_config_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_config_test.dart
@@ -26,7 +26,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPub(args: ['serve', '--port=0', "--hostname=127.0.0.1"]);
+    var pub = startPubServe();
     expect(pub.nextErrLine(), completion(equals('Error in pubspec for package '
         '"myapp" loaded from pubspec.yaml:')));
     expect(pub.nextErrLine(), completion(equals('Invalid transformer '
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
index 3605734..04b80e2 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
@@ -8,6 +8,7 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
@@ -19,7 +20,7 @@
       })
     ]).create();
 
-    var pub = startPub(args: ['serve', '--port=0', "--hostname=127.0.0.1"]);
+    var pub = startPubServe();
     // Ignore the line containing the path to the pubspec.
     expect(pub.nextErrLine(), completes);
     expect(pub.nextErrLine(), completion(equals('"transformers.foo" refers to '
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
index 765c93f..911ef39 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
@@ -8,6 +8,7 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
@@ -27,7 +28,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPub(args: ['serve', '--port=0', "--hostname=127.0.0.1"]);
+    var pub = startPubServe();
     expect(pub.nextErrLine(), completion(startsWith('Error on line')));
     pub.shouldExit(1);
     expect(pub.remainingStderr(),
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
index b2bbe5e..78632a2 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
@@ -8,6 +8,7 @@
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
@@ -26,7 +27,7 @@
     ]).create();
 
     createLockFile('myapp', pkg: ['barback']);
-    var pub = startPub(args: ['serve', '--port=0', "--hostname=127.0.0.1"]);
+    var pub = startPubServe();
     expect(pub.nextErrLine(), completion(matches(new RegExp(
         r"error: line 1 pos 1: library handler failed$"))));
     pub.shouldExit(1);
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart
index 350a58c..46db4cd 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart
@@ -27,7 +27,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPub(args: ['serve', '--port=0', "--hostname=127.0.0.1"]);
+    var pub = startPubServe();
     expect(pub.nextErrLine(), completion(startsWith('No transformers that '
         'accept configuration were defined in ')));
     pub.shouldExit(1);
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart
index 845a19d..ea9be41 100644
--- a/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart
@@ -70,7 +70,7 @@
         sandbox: ['top', 'left', 'right'],
         pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart",
         'const TOKEN = "(((main.dart, (left, top)), (right, top)), ((myapp, '
         '(left, top)), (right, top)))";');
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
index 69a3bdb..70412d4 100644
--- a/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
@@ -46,7 +46,7 @@
 
     createLockFile('myapp', sandbox: ['foo', 'bar'], pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart",
         'const TOKEN = "(main.dart, myapp imports (bar, foo))";');
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_debug_in_serve_test.dart b/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_debug_in_serve_test.dart
index f45b8da..287dc41 100644
--- a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_debug_in_serve_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_debug_in_serve_test.dart
@@ -50,7 +50,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var server = startPubServe();
+    var server = pubServe();
     requestShouldSucceed("foo.txt", "debug");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart b/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart
index 1019a6e..f116bd4 100644
--- a/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart
@@ -46,7 +46,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("foo.out", "foo.out");
     requestShould404("foo.wrong");
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart
index ac8f112..ba20fa9 100644
--- a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart
@@ -42,7 +42,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var server = startPubServe();
+    var server = pubServe();
     expect(server.nextErrLine(),
         completion(equals('Build error:')));
     expect(server.nextErrLine(), completion(equals('Transform Rewrite on '
diff --git a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart
index d84ff22..07abb4f 100644
--- a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart
@@ -40,7 +40,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    var server = startPubServe();
+    var server = pubServe();
     expect(server.nextErrLine(), completion(equals('Build error:')));
     expect(server.nextErrLine(), completion(equals("Transform Rewrite on "
         "myapp|web/foo.txt threw error: Class 'RewriteTransformer' has no "
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart
index 423c3cb..a9e3e8f 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart
@@ -26,7 +26,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("foo.out", "foo.out");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart
index 6443a9e..af361f8 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart
@@ -31,7 +31,7 @@
 
     createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("foo.out", "foo.out");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart
index 807fa28..eafde5d 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart
@@ -34,7 +34,7 @@
 
     createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart",
         'const TOKEN = "((main.dart, foo), (myapp, foo))";');
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_transform_on_a_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_transform_on_a_dependency_test.dart
index 92b0348..f106895 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_transform_on_a_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_transform_on_a_dependency_test.dart
@@ -31,7 +31,7 @@
 
     createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("assets/foo/foo.out", "foo.out");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart
index ca285bd..b0a17ec 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart
@@ -39,7 +39,7 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("foo.out", "foo.out");
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart
index a38d35f..8ba5497 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart
@@ -46,7 +46,7 @@
 
     createLockFile('myapp', sandbox: ['foo', 'bar'], pkg: ['barback']);
 
-    startPubServe();
+    pubServe();
     requestShouldSucceed("main.dart",
         'const TOKEN = "(main.dart, (bar, foo))";');
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/validator/dependency_override_test.dart b/sdk/lib/_internal/pub/test/validator/dependency_override_test.dart
new file mode 100644
index 0000000..6f336a2
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/validator/dependency_override_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../lib/src/entrypoint.dart';
+import '../../lib/src/validator.dart';
+import '../../lib/src/validator/dependency_override.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+Validator dependencyOverride(Entrypoint entrypoint) =>
+    new DependencyOverrideValidator(entrypoint);
+
+main() {
+  initConfig();
+
+  integration('invalidates a package if it has dependency overrides', () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependency_overrides": {
+          "foo": "<3.0.0"
+        }
+      })
+    ]).create();
+
+    expectValidationError(dependencyOverride);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index ae2a8a9..83551b1 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -40,6 +40,8 @@
   group('bad source', badSource);
   group('backtracking', backtracking);
   group('SDK constraint', sdkConstraint);
+  group('pre-release', prerelease);
+  group('override', override);
 }
 
 void basicGraph() {
@@ -800,27 +802,212 @@
   }, useBleedingEdgeSdkVersion: true);
 }
 
-testResolve(description, packages, {
-             lockfile, result, FailMatcherBuilder error, int maxTries,
-             bool useBleedingEdgeSdkVersion}) {
-  _testResolve(test, description, packages, lockfile: lockfile, result: result,
-      error: error, maxTries: maxTries,
+void prerelease() {
+  testResolve('prefer stable versions over unstable', {
+    'myapp 0.0.0': {
+      'a': 'any'
+    },
+    'a 1.0.0': {},
+    'a 1.1.0-dev': {},
+    'a 2.0.0-dev': {},
+    'a 3.0.0-dev': {}
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '1.0.0'
+  });
+
+  testResolve('use latest allowed prerelease if no stable versions match', {
+    'myapp 0.0.0': {
+      'a': '<2.0.0'
+    },
+    'a 1.0.0-dev': {},
+    'a 1.1.0-dev': {},
+    'a 2.0.0-dev': {},
+    'a 3.0.0': {}
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '2.0.0-dev'
+  });
+
+  testResolve('use an earlier stable version on a < constraint', {
+    'myapp 0.0.0': {
+      'a': '<2.0.0'
+    },
+    'a 1.0.0': {},
+    'a 1.1.0': {},
+    'a 2.0.0-dev': {},
+    'a 2.0.0': {}
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '1.1.0'
+  });
+
+  testResolve('prefer a stable version even if constraint mentions unstable', {
+    'myapp 0.0.0': {
+      'a': '<=2.0.0-dev'
+    },
+    'a 1.0.0': {},
+    'a 1.1.0': {},
+    'a 2.0.0-dev': {},
+    'a 2.0.0': {}
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '1.1.0'
+  });
+}
+
+void override() {
+  testResolve('chooses best version matching override constraint', {
+    'myapp 0.0.0': {
+      'a': 'any'
+    },
+    'a 1.0.0': {},
+    'a 2.0.0': {},
+    'a 3.0.0': {}
+  }, overrides: {
+    'a': '<3.0.0'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '2.0.0'
+  });
+
+  testResolve('uses override as dependency', {
+    'myapp 0.0.0': {},
+    'a 1.0.0': {},
+    'a 2.0.0': {},
+    'a 3.0.0': {}
+  }, overrides: {
+    'a': '<3.0.0'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '2.0.0'
+  });
+
+  testResolve('ignores other constraints on overridden package', {
+    'myapp 0.0.0': {
+      'b': 'any',
+      'c': 'any'
+    },
+    'a 1.0.0': {},
+    'a 2.0.0': {},
+    'a 3.0.0': {},
+    'b 1.0.0': {
+      'a': '1.0.0'
+    },
+    'c 1.0.0': {
+      'a': '3.0.0'
+    }
+  }, overrides: {
+    'a': '2.0.0'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '2.0.0',
+    'b': '1.0.0',
+    'c': '1.0.0'
+  });
+
+  testResolve('backtracks on overidden package for its constraints', {
+    'myapp 0.0.0': {
+      'shared': '2.0.0'
+    },
+    'a 1.0.0': {
+      'shared': 'any'
+    },
+    'a 2.0.0': {
+      'shared': '1.0.0'
+    },
+    'shared 1.0.0': {},
+    'shared 2.0.0': {}
+  }, overrides: {
+    'a': '<3.0.0'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '1.0.0',
+    'shared': '2.0.0'
+  }, maxTries: 2);
+
+  testResolve('override compatible with locked dependency', {
+    'myapp 0.0.0': {
+      'foo': 'any'
+    },
+    'foo 1.0.0': { 'bar': '1.0.0' },
+    'foo 1.0.1': { 'bar': '1.0.1' },
+    'foo 1.0.2': { 'bar': '1.0.2' },
+    'bar 1.0.0': {},
+    'bar 1.0.1': {},
+    'bar 1.0.2': {}
+  }, lockfile: {
+    'foo': '1.0.1'
+  }, overrides: {
+    'foo': '<1.0.2'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'foo': '1.0.1',
+    'bar': '1.0.1'
+  });
+
+  testResolve('override incompatible with locked dependency', {
+    'myapp 0.0.0': {
+      'foo': 'any'
+    },
+    'foo 1.0.0': { 'bar': '1.0.0' },
+    'foo 1.0.1': { 'bar': '1.0.1' },
+    'foo 1.0.2': { 'bar': '1.0.2' },
+    'bar 1.0.0': {},
+    'bar 1.0.1': {},
+    'bar 1.0.2': {}
+  }, lockfile: {
+    'foo': '1.0.1'
+  }, overrides: {
+    'foo': '>1.0.1'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'foo': '1.0.2',
+    'bar': '1.0.2'
+  });
+
+  testResolve('no version that matches override', {
+    'myapp 0.0.0': {},
+    'foo 2.0.0': {},
+    'foo 2.1.3': {}
+  }, overrides: {
+    'foo': '>=1.0.0 <2.0.0'
+  }, error: noVersion(['myapp']));
+
+  testResolve('override a bad source without error', {
+    'myapp 0.0.0': {
+      'foo from bad': 'any'
+    },
+    'foo 0.0.0': {}
+  }, overrides: {
+    'foo': 'any'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'foo': '0.0.0'
+  });
+}
+
+testResolve(String description, Map packages, {
+    Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
+    int maxTries, bool useBleedingEdgeSdkVersion}) {
+  _testResolve(test, description, packages, lockfile: lockfile,
+      overrides: overrides, result: result, error: error, maxTries: maxTries,
       useBleedingEdgeSdkVersion: useBleedingEdgeSdkVersion);
 }
 
-solo_testResolve(description, packages, {
-             lockfile, result, FailMatcherBuilder error, int maxTries,
-             bool useBleedingEdgeSdkVersion}) {
+solo_testResolve(String description, Map packages, {
+    Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
+    int maxTries, bool useBleedingEdgeSdkVersion}) {
   log.showSolver();
   _testResolve(solo_test, description, packages, lockfile: lockfile,
-      result: result, error: error, maxTries: maxTries,
+      overrides: overrides, result: result, error: error, maxTries: maxTries,
       useBleedingEdgeSdkVersion: useBleedingEdgeSdkVersion);
 }
 
 _testResolve(void testFn(String description, Function body),
-             description, packages, {
-             lockfile, result, FailMatcherBuilder error, int maxTries,
-             bool useBleedingEdgeSdkVersion}) {
+    String description, Map packages, {
+    Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
+    int maxTries, bool useBleedingEdgeSdkVersion}) {
   if (maxTries == null) maxTries = 1;
   if (useBleedingEdgeSdkVersion == null) useBleedingEdgeSdkVersion = false;
 
@@ -834,36 +1021,32 @@
 
     // Build the test package graph.
     var root;
-    packages.forEach((nameVersion, dependencies) {
-      var parsed = parseSource(nameVersion, (isDev, nameVersion, source) {
-        var parts = nameVersion.split(' ');
-        var name = parts[0];
-        var version = parts[1];
-
-        var package = mockPackage(name, version, dependencies);
-        if (name == 'myapp') {
-          // Don't add the root package to the server, so we can verify that Pub
-          // doesn't try to look up information about the local package on the
-          // remote server.
-          root = package;
-        } else {
-          (cache.sources[source] as MockSource).addPackage(name, package);
-        }
-      });
+    packages.forEach((description, dependencies) {
+      var id = parseSpec(description);
+      var package = mockPackage(id, dependencies,
+          id.name == 'myapp' ? overrides : null);
+      if (id.name == 'myapp') {
+        // Don't add the root package to the server, so we can verify that Pub
+        // doesn't try to look up information about the local package on the
+        // remote server.
+        root = package;
+      } else {
+        (cache.sources[id.source] as MockSource).addPackage(
+            id.description, package);
+      }
     });
 
     // Clean up the expectation.
     if (result != null) {
       var newResult = {};
-      result.forEach((name, version) {
-        parseSource(name, (isDev, name, source) {
-          version = new Version.parse(version);
-          newResult[name] = new PackageId(name, source, version, name);
-        });
+      result.forEach((description, version) {
+        var id = parseSpec(description, version);
+        newResult[id.name] = id;
       });
       result = newResult;
     }
 
+    // Parse the lockfile.
     var realLockFile = new LockFile.empty();
     if (lockfile != null) {
       lockfile.forEach((name, version) {
@@ -880,8 +1063,7 @@
     }
 
     // Resolve the versions.
-    var future = resolveVersions(cache.sources, root,
-        lockFile: realLockFile);
+    var future = resolveVersions(cache.sources, root, lockFile: realLockFile);
 
     var matcher;
     if (result != null) {
@@ -1140,58 +1322,94 @@
   }
 }
 
-Package mockPackage(String description, String version,
-                    Map dependencyStrings) {
+Package mockPackage(PackageId id, Map dependencyStrings, Map overrides) {
   var sdkConstraint = null;
 
   // Build the pubspec dependencies.
   var dependencies = <PackageDep>[];
   var devDependencies = <PackageDep>[];
 
-  dependencyStrings.forEach((name, constraint) {
-    parseSource(name, (isDev, name, source) {
-      var packageName = name.replaceFirst(new RegExp(r"-[^-]+$"), "");
-      constraint = new VersionConstraint.parse(constraint);
+  dependencyStrings.forEach((spec, constraint) {
+    var isDev = spec.startsWith("(dev) ");
+    if (isDev) {
+      spec = spec.substring("(dev) ".length);
+    }
 
-      if (name == 'sdk') {
-        sdkConstraint = constraint;
-        return;
-      }
+    var dep = parseSpec(spec).withConstraint(
+        new VersionConstraint.parse(constraint));
 
-      var dep = new PackageDep(packageName, source, constraint, name);
+    if (dep.name == 'sdk') {
+      sdkConstraint = dep.constraint;
+      return;
+    }
 
-      if (isDev) {
-        devDependencies.add(dep);
-      } else {
-        dependencies.add(dep);
-      }
-    });
+    if (isDev) {
+      devDependencies.add(dep);
+    } else {
+      dependencies.add(dep);
+    }
   });
 
-  var name = description.replaceFirst(new RegExp(r"-[^-]+$"), "");
-  var pubspec = new Pubspec(
-      name, new Version.parse(version), dependencies, devDependencies,
+  var dependencyOverrides = <PackageDep>[];
+  if (overrides != null) {
+    overrides.forEach((spec, constraint) {
+      dependencyOverrides.add(parseSpec(spec).withConstraint(
+          new VersionConstraint.parse(constraint)));
+    });
+  }
+
+  var pubspec = new Pubspec(id.name, id.version, dependencies,
+      devDependencies, dependencyOverrides,
       new PubspecEnvironment(sdkConstraint), []);
   return new Package.inMemory(pubspec);
 }
 
-void parseSource(String description,
-    callback(bool isDev, String name, String source)) {
-  var isDev = false;
-
-  if (description.startsWith("(dev) ")) {
-    description = description.substring("(dev) ".length);
-    isDev = true;
+/// Creates a new [PackageId] parsed from [text], which looks something like
+/// this:
+///
+///   foo-xyz 1.0.0 from mock
+///
+/// The package name is "foo". A hyphenated suffix like "-xyz" here is part
+/// of the package description, but not its name, so the description here is
+/// "foo-xyz".
+///
+/// This is followed by an optional [Version]. If [version] is provided, then
+/// it is parsed to a [Version], and [text] should *not* also contain a
+/// version string.
+///
+/// The "from mock" optional suffix is the name of a source for the package.
+/// If omitted, it defaults to "mock1".
+PackageId parseSpec(String text, [String version]) {
+  var pattern = new RegExp(r"(([a-z]*)(-[a-z]+)?)( ([^ ]+))?( from (.*))?$");
+  var match = pattern.firstMatch(text);
+  if (match == null) {
+    throw new FormatException("Could not parse spec '$text'.");
   }
 
-  var name = description;
+  var description = match[1];
+  var name = match[2];
+
+  var parsedVersion;
+  if (version != null) {
+    // Spec string shouldn't also contain a version.
+    if (match[5] != null) {
+      throw new ArgumentError("Spec '$text' should not contain a version "
+          "since '$version' was passed in explicitly.");
+    }
+    parsedVersion = new Version.parse(version);
+  } else {
+    if (match[5] != null) {
+      parsedVersion = new Version.parse(match[5]);
+    } else {
+      parsedVersion = Version.none;
+    }
+  }
+
   var source = "mock1";
-  var match = new RegExp(r"(.*) from (.*)").firstMatch(description);
-  if (match != null) {
-    name = match[1];
-    source = match[2];
+  if (match[7] != null) {
+    source = match[7];
     if (source == "root") source = null;
   }
 
-  callback(isDev, name, source);
+  return new PackageId(name, source, parsedVersion, description);
 }
diff --git a/sdk/lib/_internal/pub/test/version_test.dart b/sdk/lib/_internal/pub/test/version_test.dart
index ee00e6e..f2c8c2c 100644
--- a/sdk/lib/_internal/pub/test/version_test.dart
+++ b/sdk/lib/_internal/pub/test/version_test.dart
@@ -80,6 +80,16 @@
           }
         }
       });
+
+      test('equality', () {
+        expect(new Version.parse('01.2.3'), equals(new Version.parse('1.2.3')));
+        expect(new Version.parse('1.02.3'), equals(new Version.parse('1.2.3')));
+        expect(new Version.parse('1.2.03'), equals(new Version.parse('1.2.3')));
+        expect(new Version.parse('1.2.3-01'),
+            equals(new Version.parse('1.2.3-1')));
+        expect(new Version.parse('1.2.3+01'),
+            equals(new Version.parse('1.2.3+1')));
+      });
     });
 
     test('allows()', () {
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 3e27a58..593a775 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -211,34 +211,51 @@
    * complete. If any of the futures in the list completes with an error,
    * the resulting future also completes with an error. Otherwise the value
    * of the returned future will be a list of all the values that were produced.
+   *
+   * If `eagerError` is true, the future completes with an error immediately on
+   * the first error from one of the futures. Otherwise all futures must
+   * complete before the returned future is completed (still with the first
+   * error to occur, the remaining errors are silently dropped).
    */
-  static Future<List> wait(Iterable<Future> futures) {
-    Completer completer;
-    // List collecting values from the futures.
-    // Set to null if an error occurs.
-    List values;
+  static Future<List> wait(Iterable<Future> futures, {bool eagerError: false}) {
+    Completer completer;  // Completer for the returned future.
+    List values;  // Collects the values. Set to null on error.
+    int remaining = 0;  // How many futures are we waiting for.
+    var error;   // The first error from a future.
+    StackTrace stackTrace;  // The stackTrace that came with the error.
 
-    dynamic handleError(error) {
-      if (values != null) {
-        values = null;
-        completer.completeError(error);
+    // Handle an error from any of the futures.
+    handleError(theError, theStackTrace) {
+      bool isFirstError = values != null;
+      values = null;
+      remaining--;
+      if (isFirstError) {
+        if (remaining == 0 || eagerError) {
+          completer.completeError(theError, theStackTrace);
+        } else {
+          error = theError;
+          stackTrace = theStackTrace;
+        }
+      } else if (remaining == 0 && !eagerError) {
+        completer.completeError(error, stackTrace);
       }
-      return null;
     }
 
     // As each future completes, put its value into the corresponding
     // position in the list of values.
-    int remaining = 0;
     for (Future future in futures) {
       int pos = remaining++;
-      future.catchError(handleError).then((Object value) {
-        if (values == null) return null;
-        values[pos] = value;
+      future.then((Object value) {
         remaining--;
-        if (remaining == 0) {
-          completer.complete(values);
+        if (values != null) {
+          values[pos] = value;
+          if (remaining == 0) {
+            completer.complete(values);
+          }
+        } else if (remaining == 0 && !eagerError) {
+          completer.completeError(error, stackTrace);
         }
-      });
+      }, onError: handleError);
     }
     if (remaining == 0) {
       return new Future.value(const []);
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index e299eb0..58bb090 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -36,7 +36,8 @@
  * There are two kinds of streams: The normal "single-subscription" streams and
  * "broadcast" streams.
  *
- * A single-subscription stream allows only a single listener at a time.
+ * A single-subscription stream allows only a single listener during the whole
+ * lifetime of the stream.
  * It holds back events until it gets a listener, and it may exhaust
  * itself when the listener is unsubscribed, even if the stream wasn't done.
  *
@@ -503,7 +504,15 @@
    * Checks whether [test] accepts any element provided by this stream.
    *
    * Completes the [Future] when the answer is known.
-   * If this stream reports an error, the [Future] will report that error.
+   *
+   * If this stream reports an error, the [Future] reports that error.
+   *
+   * Stops listening to the stream after the first matching element has been
+   * found.
+   *
+   * Internally the method cancels its subscription after this element. This
+   * means that single-subscription (non-broadcast) streams are closed and
+   * cannot be reused after a call to this method.
    */
   Future<bool> any(bool test(T element)) {
     _Future<bool> future = new _Future<bool>();
@@ -543,7 +552,15 @@
     return future;
   }
 
-  /** Reports whether this stream contains any elements. */
+  /**
+   * Reports whether this stream contains any elements.
+   *
+   * Stops listening to the stream after the first element has been received.
+   *
+   * Internally the method cancels its subscription after the first element.
+   * This means that single-subscription (non-broadcast) streams are closed and
+   * cannot be reused after a call to this getter.
+   */
   Future<bool> get isEmpty {
     _Future<bool> future = new _Future<bool>();
     StreamSubscription subscription;
@@ -613,6 +630,13 @@
    *
    * If this stream produces fewer than [count] values before it's done,
    * so will the returned stream.
+   *
+   * Stops listening to the stream after the first [n] elements have been
+   * received.
+   *
+   * Internally the method cancels its subscription after these elements. This
+   * means that single-subscription (non-broadcast) streams are closed and
+   * cannot be reused after a call to this method.
    */
   Stream<T> take(int count) {
     return new _TakeStream(this, count);
@@ -625,6 +649,12 @@
    * as [test] returns [:true:] for the event data. The stream is done
    * when either this stream is done, or when this stream first provides
    * a value that [test] doesn't accept.
+   * 
+   * Stops listening to the stream after the accepted elements.
+   *
+   * Internally the method cancels its subscription after these elements. This
+   * means that single-subscription (non-broadcast) streams are closed and
+   * cannot be reused after a call to this method.
    */
   Stream<T> takeWhile(bool test(T element)) {
     return new _TakeWhileStream(this, test);
@@ -667,6 +697,10 @@
    *
    * Stops listening to the stream after the first element has been received.
    *
+   * Internally the method cancels its subscription after the first element.
+   * This means that single-subscription (non-broadcast) streams are closed
+   * and cannot be reused after a call to this getter.
+   *
    * If an error event occurs before the first data event, the resulting future
    * is completed with that error.
    *
@@ -725,6 +759,9 @@
   /**
    * Returns the single element.
    *
+   * If an error event occurs before or after the first data event, the
+   * resulting future is completed with that error.
+   *
    * If [this] is empty or has more than one element throws a [StateError].
    */
   Future<T> get single {
@@ -765,6 +802,13 @@
    * [defaultValue] function is provided, the result of calling [defaultValue]
    * becomes the value of the future.
    *
+   * Stops listening to the stream after the first matching element has been
+   * received.
+   *
+   * Internally the method cancels its subscription after the first element that
+   * matches the predicate. This means that single-subscription (non-broadcast)
+   * streams are closed and cannot be reused after a call to this method.
+   *
    * If an error occurs, or if this stream ends without finding a match and
    * with no [defaultValue] function provided, the future will receive an
    * error.
@@ -884,7 +928,12 @@
   /**
    * Returns the value of the [index]th data event of this stream.
    *
-   * Stops listening to the stream after a value has been found.
+   * Stops listening to the stream after the [index]th data event has been
+   * received.
+   *
+   * Internally the method cancels its subscription after these elements. This
+   * means that single-subscription (non-broadcast) streams are closed and
+   * cannot be reused after a call to this method.
    *
    * If an error event occurs before the value is found, the future completes
    * with this error.
@@ -958,6 +1007,9 @@
    *
    * If the subscription is paused more than once, an equal number
    * of resumes must be performed to resume the stream.
+   *
+   * Currently DOM streams silently drop events when the stream is paused. This
+   * is a bug and will be fixed.
    */
   void pause([Future resumeSignal]);
 
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 685e682..c16bafa 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -364,7 +364,7 @@
   }
 
   // StreamSink interface.
-  Future addStream(Stream<T> source, { bool cancelOnError: true }) {
+  Future addStream(Stream<T> source, {bool cancelOnError: true}) {
     if (!_mayAddEvent) throw _badEventState();
     if (_isCanceled) return new _Future.immediate(null);
     _StreamControllerAddStreamState addState =
@@ -659,7 +659,8 @@
     _target.addError(error, stackTrace);
   }
   Future close() => _target.close();
-  Future addStream(Stream<T> source) => _target.addStream(source);
+  Future addStream(Stream<T> source, {bool cancelOnError: true}) =>
+      _target.addStream(source, cancelOnError: cancelOnError);
   Future get done => _target.done;
 }
 
diff --git a/sdk/lib/async/stream_transformers.dart b/sdk/lib/async/stream_transformers.dart
index 66989f3..832c395 100644
--- a/sdk/lib/async/stream_transformers.dart
+++ b/sdk/lib/async/stream_transformers.dart
@@ -228,24 +228,18 @@
       void handleData(S data, EventSink<T> sink),
       void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
       void handleDone(EventSink<T> sink)})
-      // TODO(14014): Remove static call.
-      : super(_workAroundBug14014(handleData, handleError, handleDone));
+      : super((EventSink<T> outputSink) {
+          if (handleData == null) handleData = _defaultHandleData;
+          if (handleError == null) handleError = _defaultHandleError;
+          if (handleDone == null) handleDone = _defaultHandleDone;
+          return new _HandlerEventSink<S, T>(
+              handleData, handleError, handleDone, outputSink);
+        });
 
   Stream<T> bind(Stream<S> stream) {
     return super.bind(stream);
   }
 
-  static _workAroundBug14014(handleData, handleError, handleDone) {
-    // TODO(14014): Use generic type.
-    return (EventSink/*<T>*/ outputSink) {
-      if (handleData == null) handleData = _defaultHandleData;
-      if (handleError == null) handleError = _defaultHandleError;
-      if (handleDone == null) handleDone = _defaultHandleDone;
-      // TODO(14014): Use generic type.
-      return new _HandlerEventSink/*<S, T>*/(
-          handleData, handleError, handleDone, outputSink);
-    };
-  }
   /** Default data handler forwards all data. */
   static void _defaultHandleData(var data, EventSink sink) {
     sink.add(data);
diff --git a/sdk/lib/collection/hash_set.dart b/sdk/lib/collection/hash_set.dart
index 74a25d5..10d74ba 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -20,14 +20,8 @@
 
   Set<E> intersection(Set<Object> other) {
     Set<E> result = _newSet();
-    if (other.length < this.length) {
-      for (var element in other) {
-        if (this.contains(element)) result.add(element);
-      }
-    } else {
-      for (E element in this) {
-        if (other.contains(element)) result.add(element);
-      }
+    for (var element in this) {
+      if (other.contains(element)) result.add(element);
     }
     return result;
   }
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index f94fb13..f0ce4c9 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -72,6 +72,20 @@
   void addAll(Iterable<E> iterable);
 
   /**
+   * Removes all elements matched by [test] from the queue.
+   *
+   * The `test` function must not throw or modify the queue.
+   */
+  void removeWhere(bool test(E element));
+
+  /**
+   * Removes all elements not matched by [test] from the queue.
+   *
+   * The `test` function must not throw or modify the queue.
+   */
+  void retainWhere(bool test(E element));
+
+  /**
    * Removes all elements in the queue. The size of the queue becomes zero.
    */
   void clear();
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index eab9fb8..389e678 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -136,32 +136,35 @@
     return comp;
   }
 
-  // Emulates splaying with a key that is smaller than any in the tree.
-  // After this, the smallest element in the tree is the root.
-  void _splayMin() {
-    assert(_root != null);
-    _SplayTreeNode current = _root;
+  // Emulates splaying with a key that is smaller than any in the subtree
+  // anchored at [node].
+  // and that node is returned. It should replace the reference to [node]
+  // in any parent tree or root pointer.
+  _SplayTreeNode<K> _splayMin(_SplayTreeNode<K> node) {
+    _SplayTreeNode current = node;
     while (current.left != null) {
       _SplayTreeNode left = current.left;
       current.left = left.right;
       left.right = current;
       current = left;
     }
-    _root = current;
+    return current;
   }
 
-  // Emulates splaying with a key that is greater than any in the tree.
-  // After this, the largest element in the tree is the root.
-  void _splayMax() {
-    assert(_root != null);
-    _SplayTreeNode current = _root;
+  // Emulates splaying with a key that is greater than any in the subtree
+  // anchored at [node].
+  // After this, the largest element in the tree is the root of the subtree,
+  // and that node is returned. It should replace the reference to [node]
+  // in any parent tree or root pointer.
+  _SplayTreeNode<K> _splayMax(_SplayTreeNode<K> node) {
+    _SplayTreeNode current = node;
     while (current.right != null) {
       _SplayTreeNode right = current.right;
       current.right = right.left;
       right.left = current;
       current = right;
     }
-    _root = current;
+    return current;
   }
 
   _SplayTreeNode _remove(K key) {
@@ -175,9 +178,8 @@
       _root = _root.right;
     } else {
       _SplayTreeNode<K> right = _root.right;
-      _root = _root.left;
       // Splay to make sure that the new root has an empty right child.
-      _splay(key);
+      _root = _splayMax(_root.left);
       // Insert the original right child as the right child of the new
       // root.
       _root.right = right;
@@ -214,13 +216,13 @@
 
   _SplayTreeNode get _first {
     if (_root == null) return null;
-    _splayMin();
+    _root = _splayMin(_root);
     return _root;
   }
 
   _SplayTreeNode get _last {
     if (_root == null) return null;
-    _splayMax();
+    _root = _splayMax(_root);
     return _root;
   }
 
@@ -495,8 +497,11 @@
    *
    * Incremented on [_tree] when a key is added or removed.
    * If it changes, iteration is aborted.
+   *
+   * Not final because some iterators may modify the tree knowingly,
+   * and they update the modification count in that case.
    */
-  final int _modificationCount;
+  int _modificationCount;
 
   /**
    * Count of splay operations on [_tree] when [_workList] was built.
@@ -515,11 +520,23 @@
     _findLeftMostDescendent(tree._root);
   }
 
+  _SplayTreeIterator.startAt(_SplayTree tree, var startKey)
+      : _tree = tree,
+        _modificationCount = tree._modificationCount {
+    int compare = tree._splay(startKey);
+    _splayCount = tree._splayCount;
+    _findLeftMostDescendent(compare < 0 ? tree._root.right : tree._root);
+  }
+
   T get current {
     if (_currentNode == null) return null;
     return _getValue(_currentNode);
   }
 
+  _SplayTreeNode _findStartNode(T key) {
+
+  }
+
   void _findLeftMostDescendent(_SplayTreeNode node) {
     while (node != null) {
       _workList.add(node);
@@ -560,7 +577,7 @@
       _currentNode = null;
       return false;
     }
-    if (_tree._splayCount != _splayCount) {
+    if (_tree._splayCount != _splayCount && _currentNode != null) {
       _rebuildWorkList(_currentNode);
     }
     _currentNode = _workList.removeLast();
@@ -601,6 +618,171 @@
 
 class _SplayTreeNodeIterator<K>
     extends _SplayTreeIterator<_SplayTreeNode<K>> {
-  _SplayTreeNodeIterator(_SplayTree<K> map): super(map);
+  _SplayTreeNodeIterator(_SplayTree<K> tree): super(tree);
+  _SplayTreeNodeIterator.startAt(_SplayTree<K> tree, var startKey)
+      : super.startAt(tree, startKey);
   _SplayTreeNode<K> _getValue(_SplayTreeNode node) => node;
 }
+
+
+class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>
+                      implements Set<E> {
+  Comparator _comparator;
+  _Predicate _validKey;
+  SplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)])
+      : _comparator = (compare == null) ? Comparable.compare : compare,
+        _validKey = (isValidKey != null) ? isValidKey : ((v) => v is E);
+
+  int _compare(E e1, E e2) => _comparator(e1, e2);
+
+  // From Iterable.
+
+  Iterator<E> get iterator => new _SplayTreeKeyIterator<E>(this);
+
+  int get length => _count;
+  bool get isEmpty => _root == null;
+  bool get isNotEmpty => _root != null;
+
+  E get first {
+    if (_count == 0) throw new StateError("no such element");
+    return _first.key;
+  }
+
+  E get last {
+    if (_count == 0) throw new StateError("no such element");
+    return _last.key;
+  }
+
+  E get single {
+    if (_count == 0) throw new StateError("no such element");
+    if (_count > 1) throw new StateError("too many elements");
+    return _root.key;
+  }
+
+  // From Set.
+  bool contains(Object object) {
+    return _validKey(object) && _splay(object) == 0;
+  }
+
+  bool add(E element) {
+    int compare = _splay(element);
+    if (compare == 0) return false;
+    _addNewRoot(new _SplayTreeNode(element), compare);
+    return true;
+  }
+
+  bool remove(Object object) {
+    if (!_validKey(object)) return false;
+    return _remove(object) != null;
+  }
+
+  void addAll(Iterable<E> elements) {
+    for (E element in elements) {
+      int compare = _splay(element);
+      if (compare != 0) {
+        _addNewRoot(new _SplayTreeNode(element), compare);
+      }
+    }
+  }
+
+  void removeAll(Iterable elements) {
+    for (Object element in elements) {
+      if (_validKey(element)) _remove(element);
+    }
+  }
+
+  /**
+   * Removes all elements not in [elements].
+   */
+  void retainAll(Iterable<Object> elements) {
+    // Build a set with the same sense of equality as this set.
+    SplayTreeSet<E> retainSet = new SplayTreeSet<E>(_comparator, _validKey);
+    int modificationCount = _modificationCount;
+    for (Object object in elements) {
+      if (modificationCount != _modificationCount) {
+        // The iterator should not have side effects.
+        throw new ConcurrentModificationError(this);
+      }
+      if (this.contains(object)) retainSet.add(object);
+    }
+    // Take over the elements from the retained set, if it differs.
+    if (retainSet._count != _count) {
+      _root = retainSet._root;
+      _count = retainSet._count;
+      _modificationCount++;
+    }
+  }
+
+  void _filterWhere(bool test(E element), bool removeMatching) {
+    _SplayTreeNodeIterator it = new _SplayTreeNodeIterator(this);
+    while (it.moveNext()) {
+      _SplayTreeNode node = it.current;
+      int modificationCount = _modificationCount;
+      bool matches = test(node.key);
+      if (modificationCount != _modificationCount) {
+        throw new ConcurrentModificationError(this);
+      }
+      if (matches == removeMatching) {
+        _remove(node.key);
+        it = new _SplayTreeNodeIterator.startAt(this, node.key);
+      }
+    }
+  }
+
+  void removeWhere(bool test(E element)) {
+    _filterWhere(test, true);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _filterWhere(test, false);
+  }
+
+  E lookup(Object object) {
+    if (!_validKey(object)) return null;
+    int comp = _splay(object);
+    if (comp != 0) return null;
+    return _root.key;
+  }
+
+  Set<E> intersection(Set<E> other) {
+    Set<E> result = new SplayTreeSet<E>();
+    for (E element in this) {
+      if (other.contains(element)) result.add(element);
+    }
+    return result;
+  }
+
+  Set<E> difference(Set<E> other) {
+    Set<E> result = new SplayTreeSet<E>();
+    for (E element in this) {
+      if (!other.contains(element)) result.add(element);
+    }
+    return result;
+  }
+
+  Set<E> union(Set<E> other) {
+    return _clone()..addAll(other);
+  }
+
+  SplayTreeSet<E> _clone() {
+    var set = new SplayTreeSet<E>();
+    set._count = _count;
+    set._root = _cloneNode(_root);
+    return set;
+  }
+
+  _SplayTreeNode<E> _cloneNode(_SplayTreeNode<E> node) {
+    if (node == null) return null;
+    return new _SplayTreeNode<E>(node.key)..left = _cloneNode(node.left)
+                                          ..right = _cloneNode(node.right);
+  }
+
+  bool containsAll(Iterable other) {
+    for (var element in other) {
+      if (!this.contains(element)) return false;
+    }
+    return true;
+  }
+
+  void clear() { _clear(); }
+}
diff --git a/sdk/lib/convert/byte_conversion.dart b/sdk/lib/convert/byte_conversion.dart
index edf297e..18da9d3 100644
--- a/sdk/lib/convert/byte_conversion.dart
+++ b/sdk/lib/convert/byte_conversion.dart
@@ -10,6 +10,10 @@
  *
  * Instead of limiting the interface to one non-chunked list of bytes it
  * accepts its input in chunks (themselves being lists of bytes).
+ *
+ * This abstract class will likely get more methods over time. Implementers are
+ * urged to extend or mix in [ByteConversionSinkBase] to ensure that their
+ * class covers the newly added methods.
  */
 abstract class ByteConversionSink extends ChunkedConversionSink<List<int>> {
   ByteConversionSink();
diff --git a/sdk/lib/convert/string_conversion.dart b/sdk/lib/convert/string_conversion.dart
index a10b616..ce10ad4 100644
--- a/sdk/lib/convert/string_conversion.dart
+++ b/sdk/lib/convert/string_conversion.dart
@@ -11,6 +11,11 @@
  * Instead of limiting the interface to one non-chunked String it accepts
  * partial strings or can be transformed into a byte sink that
  * accepts UTF-8 code units.
+ *
+ * This abstract class will likely get more methods over time. Implementers are
+ * urged to extend [StringConversionSinkBase] or to mix in
+ * [StringConversionSinkMixin], to ensure that their class covers the newly
+ * added methods.
  */
 abstract class StringConversionSink
     extends ChunkedConversionSink<String> {
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index 7e84379..8b27a25 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -73,9 +73,9 @@
  * You cannot get an item by index (position).
  * Adding a duplicate item has no effect.
  *
- *     Set villians = new Set();
- *     villians.add('Joker');
- *     villians.addAll( ['Lex Luther', 'Voldemort'] );
+ *     Set villains = new Set();
+ *     villains.add('Joker');
+ *     villains.addAll( ['Lex Luther', 'Voldemort'] );
  *
  * A Map is an unordered collection of key-value pairs.
  * Maps are sometimes called associative arrays because
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index 3886e83..c96c76f 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -190,6 +190,8 @@
   /**
    * Constructs a new [DateTime] instance based on [formattedString].
    *
+   * Throws a [FormatException] if the input cannot be parsed.
+   *
    * The function parses a subset of ISO 8601. Examples of accepted strings:
    *
    * * `"2012-02-27 13:27:00"`
@@ -254,13 +256,13 @@
       int millisecondsSinceEpoch = _brokenDownDateToMillisecondsSinceEpoch(
           years, month, day, hour, minute, second, millisecond, isUtc);
       if (millisecondsSinceEpoch == null) {
-        throw new ArgumentError(formattedString);
+        throw new FormatException(formattedString);
       }
       if (addOneMillisecond) millisecondsSinceEpoch++;
       return new DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch,
                                                      isUtc: isUtc);
     } else {
-      throw new ArgumentError(formattedString);
+      throw new FormatException(formattedString);
     }
   }
 
@@ -276,7 +278,6 @@
    * 1970-01-01T00:00:00Z + [millisecondsSinceEpoch] ms in the given
    * time zone (local or UTC).
    */
-  // TODO(lrn): Have two constructors instead of taking an optional bool.
   DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch,
                                       {bool isUtc: false})
       : this.millisecondsSinceEpoch = millisecondsSinceEpoch,
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index acc0ae8..a33cd35 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -275,8 +275,13 @@
    *
    * This operation does not increase the length of `this`.
    *
-   * An error occurs if the [index] is less than 0 or greater than length.
-   * An error occurs if the [iterable] is longer than [length] - [index].
+   * The [index] must be non-negative and no greater than [length].
+   *
+   * The [iterable] must not have more elements than what can fit from [index]
+   * to [length].
+   *
+   * If `iterable` is based on this list, its values may change /during/ the
+   * `setAll` operation.
    */
   void setAll(int index, Iterable<E> iterable);
 
@@ -307,10 +312,10 @@
    *
    * Returns the removed object.
    *
-   * * Throws an [ArgumentError] if [index] is not an [int].
-   * * Throws a [RangeError] if the [index] is out of range for this list.
-   * * Throws an [UnsupportedError], and doesn't remove the object,
-   * if this is a fixed-length list.
+   * The [index] must be in the range `0 ≤ index < length`.
+   *
+   * Throws an [UnsupportedError] if this is a fixed-length list. In that case
+   * the list is not modified.
    */
   E removeAt(int index);
 
@@ -384,7 +389,7 @@
 
   /**
    * Copies the objects of [iterable], skipping [skipCount] objects first,
-   * into the range [start] inclusive to [end] exclusive of `this`.
+   * into the range [start], inclusive, to [end], exclusive, of the list.
    *
    *     List<int> list1 = [1, 2, 3, 4];
    *     List<int> list2 = [5, 6, 7, 8, 9];
@@ -393,21 +398,29 @@
    *     list1.setRange(1, 3, list2, 3);
    *     list1.join(', '); // '1, 8, 9, 4'
    *
-   * If [start] equals [end] and [start]..[end] represents a legal range, this
-   * method has no effect.
+   * The [start] and [end] indices must satisfy `0 ≤ start ≤ end ≤ length`.
+   * If [start] equals [end], this method has no effect.
    *
-   * An error occurs if [start]..[end] is not a valid range for `this`.
-   * An error occurs if the [iterable] does not have enough objects after
-   * skipping [skipCount] objects.
+   * The [iterable] must have enough objects to fill the range from `start`
+   * to `end` after skipping [skipCount] objects.
    *
+   * If `iterable` is this list, the operation will copy the elements originally
+   * in the range from `skipCount` to `skipCount + (end - start)` to the
+   * range `start` to `end`, even if the two ranges overlap.
+   *
+   * If `iterable` depends on this list in some other way, no guarantees are
+   * made.
    */
   void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]);
 
   /**
    * Removes the objects in the range [start] inclusive to [end] exclusive.
    *
-   * An error occurs if [start]..[end] is not a valid range for `this`.
-   * Throws an [UnsupportedError] if this is a fixed-length list.
+   * The [start] and [end] indices must be in the range
+   * `0 ≤ index ≤ length`, and `start ≤ end`.
+   *
+   * Throws an [UnsupportedError] if this is a fixed-length list. In that case
+   * the list is not modified.
    */
   void removeRange(int start, int end);
 
@@ -421,15 +434,15 @@
 
   /**
    * Removes the objects in the range [start] inclusive to [end] exclusive
-   * and replaces them with the contents of the [iterable].
+   * and inserts the contents of [replacement] in its place.
    *
-   *     List<int> list = [1, 2, 3, 4];
-   *     list.replaceRange(1, 3, [6, 7]);
-   *     list.join(', '); // '1, 6, 7, 4'
+   *     List<int> list = [1, 2, 3, 4, 5];
+   *     list.replaceRange(1, 4, [6, 7]);
+   *     list.join(', '); // '1, 6, 7, 5'
    *
    * An error occurs if [start]..[end] is not a valid range for `this`.
    */
-  void replaceRange(int start, int end, Iterable<E> iterable);
+  void replaceRange(int start, int end, Iterable<E> replacement);
 
   /**
    * Returns an unmodifiable [Map] view of `this`.
diff --git a/sdk/lib/core/print.dart b/sdk/lib/core/print.dart
index 4379ceb..42c7d1c 100644
--- a/sdk/lib/core/print.dart
+++ b/sdk/lib/core/print.dart
@@ -4,8 +4,9 @@
 
 part of dart.core;
 
+/// Prints a string representation of the object to the console.
 void print(Object object) {
-  String line = object.toString();
+  String line = "$object";
   if (printToZone == null) {
     printToConsole(line);
   } else {
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index c22d0d7..2dff5f2 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -117,7 +117,7 @@
    * Returns a new set which is the intersection between this set and [other].
    *
    * That is, the returned set contains all the elements of this `Set` that
-   * are also elements of [other].
+   * are also elements of `other` according to `other.contains`.
    */
   Set<E> intersection(Set<Object> other);
 
@@ -133,7 +133,7 @@
    * Returns a new set with the the elements of this that are not in [other].
    *
    * That is, the returned set contains all the elements of this `Set` that
-   * are not elements of [other].
+   * are not elements of [other] according to `other.contains`.
    */
   Set<E> difference(Set<E> other);
 
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 5735697..944d6e6 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -1144,6 +1144,16 @@
   CanvasRenderingContext2D get context2D =>
       JS('Null|CanvasRenderingContext2D', '#.getContext(#)', this, '2d');
 
+  /**
+   * Returns a new Web GL context for this canvas.
+   *
+   * ## Other resources
+   *
+   * * [WebGL fundamentals]
+   * (http://www.html5rocks.com/en/tutorials/webgl/webgl_fundamentals/) from
+   * HTML5Rocks.
+   * * [WebGL homepage] (http://get.webgl.org/).
+   */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @Experimental()
@@ -6391,7 +6401,7 @@
    * Gets the data for the specified type.
    *
    * The data is only available from within a drop operation (such as an
-   * [Element.onDrop] event) and will return `null` before the event is
+   * [Element.onDrop] event) and will return null before the event is
    * triggered.
    *
    * Data transfer is prohibited across domains. If a drag originates
@@ -11244,7 +11254,7 @@
    *
    * ## Other resources
    *
-   * * [Using the full-screen API]
+   * * [Using the fullscreen API]
    * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
    * tutorial from WebPlatform.org.
    * * [Fullscreen specification]
@@ -12024,14 +12034,39 @@
   // To suppress missing implicit constructor warnings.
   factory Event._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * This event is being handled by the event target.
+   *
+   * ## Other resources
+   *
+   * * [Target phase] (http://www.w3.org/TR/DOM-Level-3-Events/#target-phase)
+   * from W3C.
+   */
   @DomName('Event.AT_TARGET')
   @DocsEditable()
   static const int AT_TARGET = 2;
 
+  /**
+   * This event is bubbling up through the target's ancestors.
+   *
+   * ## Other resources
+   *
+   * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
+   * from W3C.
+   */
   @DomName('Event.BUBBLING_PHASE')
   @DocsEditable()
   static const int BUBBLING_PHASE = 3;
 
+  /**
+   * This event is propagating through the target's ancestors, starting from the
+   * document.
+   *
+   * ## Other resources
+   *
+   * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
+   * from W3C.
+   */
   @DomName('Event.CAPTURING_PHASE')
   @DocsEditable()
   static const int CAPTURING_PHASE = 1;
@@ -12044,6 +12079,14 @@
   @DocsEditable()
   final bool cancelable;
 
+  /**
+   * Access to the system's clipboard data during copy, cut, and paste events.
+   *
+   * ## Other resources
+   *
+   * * [clipboardData specification]
+   * (http://www.w3.org/TR/clipboard-apis/#attributes) from W3C.
+   */
   @DomName('Event.clipboardData')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -12071,6 +12114,15 @@
   @DocsEditable()
   final int eventPhase;
 
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
   @DomName('Event.path')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
@@ -13814,6 +13866,19 @@
     _title = value;
   }
 
+  /**
+   * Returns page to standard layout.
+   *
+   * Has no effect if the page is not in fullscreen mode.
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitExitFullscreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -13830,12 +13895,43 @@
     _webkitExitPointerLock();
   }
 
+  /**
+   * Returns the element, if any, that is currently displayed in fullscreen.
+   *
+   * Returns null if there is currently no fullscreen element. You can use
+   * this to determine if the page is in fullscreen mode.
+   *
+   *     myVideo = new VideoElement();
+   *     if (document.fullscreenElement == null) {
+   *       myVideo.requestFullscreen();
+   *       print(document.fullscreenElement == myVideo); // true
+   *     }
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitFullscreenElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   Element get fullscreenElement => _webkitFullscreenElement;
 
+  /**
+   * Returns true if this document can display elements in fullscreen mode.
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitFullscreenEnabled')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -14570,7 +14666,7 @@
   String getAllResponseHeaders() native;
 
   /**
-   * Return the response header named `header`, or `null` if not found.
+   * Return the response header named `header`, or null if not found.
    *
    * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
    * for a list of common response headers.
@@ -19638,7 +19734,7 @@
   /**
    * The document this node belongs to.
    *
-   * Returns `null` if this node does not belong to any document.
+   * Returns null if this node does not belong to any document.
    *
    * ## Other resources
    *
@@ -19654,7 +19750,7 @@
   /**
    * The parent element of this node.
    *
-   * Returns `null` if this node either does not have a parent or its parent is
+   * Returns null if this node either does not have a parent or its parent is
    * not an element.
    *
    * ## Other resources
@@ -26634,6 +26730,15 @@
     return completer.future;
   }
 
+  /**
+   * The newest document in this window.
+   *
+   * ## Other resources
+   *
+   * * [Loading web pages]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html)
+   * from WHATWG.
+   */
   Document get document => JS('Document', '#.document', this);
 
   WindowBase _open2(url, name) => JS('Window', '#.open(#,#)', this, url, name);
@@ -26641,6 +26746,16 @@
   WindowBase _open3(url, name, options) =>
       JS('Window', '#.open(#,#,#)', this, url, name, options);
 
+  /**
+   * Opens a new window.
+   *
+   * ## Other resources
+   *
+   * * [Window.open]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.open) from MDN.
+   * * [Window open]
+   * (http://docs.webplatform.org/wiki/dom/methods/open) from WebPlatform.org.
+   */
   WindowBase open(String url, String name, [String options]) {
     if (options == null) {
       return _DOMWindowCrossFrame._createSafe(_open2(url, name));
@@ -26652,6 +26767,12 @@
   // API level getter and setter for Location.
   // TODO: The cross domain safe wrapper can be inserted here or folded into
   // _LocationWrapper.
+  /**
+   * The current location of this window.
+   *
+   *     Location currentLocation = window.location;
+   *     print(currentLocation.href); // 'http://www.example.com:80/'
+   */
   Location get location {
     // Firefox work-around for Location.  The Firefox location object cannot be
     // made to behave like a Dart object so must be wrapped.
@@ -26720,6 +26841,14 @@
     return _requestAnimationFrame(_wrapZone(callback));
   }
 
+  /**
+   * Cancels an animation frame request.
+   *
+   * ## Other resources
+   *
+   * * [Window.cancelAnimationFrame]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.cancelAnimationFrame) from MDN.
+   */
   void cancelAnimationFrame(int id) {
     _ensureRequestAnimationFrame();
     _cancelAnimationFrame(id);
@@ -26760,7 +26889,7 @@
   /**
    * Gets an instance of the Indexed DB factory to being using Indexed DB.
    *
-   * Use [IdbFactory.supported] to check if Indexed DB is supported on the
+   * Use [indexed_db.IdbFactory.supported] to check if Indexed DB is supported on the
    * current platform.
    */
   @SupportedBrowser(SupportedBrowser.CHROME, '23.0')
@@ -26768,10 +26897,11 @@
   @SupportedBrowser(SupportedBrowser.IE, '10.0')
   @Experimental()
   IdbFactory get indexedDB =>
-      JS('IdbFactory|Null',  // If not supported, returns `null`.
+      JS('IdbFactory|Null',  // If not supported, returns null.
          '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
          this, this, this);
 
+  /// The debugging console for this window.
   @DomName('Window.console')
   Console get console => Console._safeConsole;
 
@@ -26788,6 +26918,15 @@
     return _requestFileSystem(persistent? 1 : 0, size);
   }
 
+  /**
+   * Converts a point from node coordinates to this window's coordinates.
+   *
+   * ## Other resources
+   *
+   * * [webkitConvertPointFromPageToNode]
+   * (https://developer.apple.com/library/safari/documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html#//apple_ref/javascript/instm/DOMWindow/webkitConvertPointFromNodeToPage)
+   * from Safari Development Library.
+   */
   @DomName('Window.convertPointFromNodeToPage')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -26798,6 +26937,15 @@
     return new Point(result.x, result.y);
   }
 
+  /**
+   * Converts a point from this window's coordinates to node coordinates.
+   *
+   * ## Other resources
+   *
+   * * [webkitConvertPointFromPageToNode]
+   * (https://developer.apple.com/library/safari/documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html#//apple_ref/javascript/instm/DOMWindow/webkitConvertPointFromPageToNode)
+   * from Safari Development Library.
+   */
   @DomName('Window.convertPointFromPageToNode')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -26989,12 +27137,33 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
+  /**
+   * Indicates that file system data cannot be cleared unless given user
+   * permission.
+   *
+   * ## Other resources
+   *
+   * * [Exploring the FileSystem APIs]
+   * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.
+   * * [File API]
+   * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.
+   */
   @DomName('Window.PERSISTENT')
   @DocsEditable()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   @Experimental()
   static const int PERSISTENT = 1;
 
+  /**
+   * Indicates that file system data can be cleared at any time.
+   *
+   * ## Other resources
+   *
+   * * [Exploring the FileSystem APIs]
+   * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.
+   * * [File API]
+   * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.
+   */
   @DomName('Window.TEMPORARY')
   @DocsEditable()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
@@ -27002,10 +27171,28 @@
   static const int TEMPORARY = 0;
 
   @JSName('CSS')
+  /**
+   * Entrypoint for CSS-related functions.
+   *
+   * ## Other resources
+   *
+   * * [The CSS interface](http://dev.w3.org/csswg/css-conditional/#the-css-interface) from W3C.
+   */
   @DomName('Window.CSS')
   @DocsEditable()
   final Css css;
 
+  /**
+   * The application cache for this window.
+   *
+   * ## Other resources
+   *
+   * * [A beginner's guide to using the application cache]
+   * (http://www.html5rocks.com/en/tutorials/appcache/beginner) from HTML5Rocks.
+   * * [Application cache API]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api)
+   * from WHATWG.
+   */
   @DomName('Window.applicationCache')
   @DocsEditable()
   final ApplicationCache applicationCache;
@@ -27014,59 +27201,166 @@
   @DocsEditable()
   final bool closed;
 
+  /**
+   * Entrypoint for the browser's cryptographic functions.
+   *
+   * ## Other resources
+   *
+   * * [Web cryptography API](http://www.w3.org/TR/WebCryptoAPI/) from W3C.
+   */
   @DomName('Window.crypto')
   @DocsEditable()
   // http://www.w3.org/TR/WebCryptoAPI/
   @Experimental()
   final Crypto crypto;
 
+  /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
+  @Experimental() // non-standard
   String defaultStatus;
 
+  /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
   String defaultstatus;
 
+  /**
+   * The ratio between physical pixels and logical CSS pixels.
+   *
+   * ## Other resources
+   *
+   * * [devicePixelRatio]
+   * (http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html) from
+   * quirksmode.
+   * * [More about devicePixelRatio]
+   * (http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html) from
+   * quirksmode.
+   */
   @DomName('Window.devicePixelRatio')
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
   final double devicePixelRatio;
 
+  /**
+   * The current session history for this window's newest document.
+   *
+   * ## Other resources
+   *
+   * * [Loading web pages]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html)
+   * from WHATWG.
+   */
   @DomName('Window.history')
   @DocsEditable()
   final History history;
 
+  /**
+   * The height of the viewport including scrollbars.
+   *
+   * ## Other resources
+   *
+   * * [innerHeight]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/innerHeight) from
+   * WebPlatform.org.
+   */
   @DomName('Window.innerHeight')
   @DocsEditable()
   final int innerHeight;
 
+  /**
+   * The width of the viewport including scrollbars.
+   *
+   * ## Other resources
+   *
+   * * [innerWidth]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/innerWidth) from
+   * WebPlatform.org.
+   */
   @DomName('Window.innerWidth')
   @DocsEditable()
   final int innerWidth;
 
+  /**
+   * Storage for this window that persists across sessions.
+   *
+   * ## Other resources
+   *
+   * * [DOM storage guide]
+   * (https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage) from
+   * MDN.
+   * * [The past, present & future of local storage for web applications]
+   * (http://diveintohtml5.info/storage.html) from Dive Into HTML5.
+   * * [Local storage specification]
+   * (http://www.w3.org/TR/webstorage/#the-localstorage-attribute) from W3C.
+   */
   @DomName('Window.localStorage')
   @DocsEditable()
   final Storage localStorage;
 
+  /**
+   * This window's location bar, which displays the URL.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.locationbar')
   @DocsEditable()
   final BarProp locationbar;
 
+  /**
+   * This window's menu bar, which displays menu commands.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.menubar')
   @DocsEditable()
   final BarProp menubar;
 
+  /**
+   * The name of this window.
+   *
+   * ## Other resources
+   *
+   * * [Window name]
+   * (http://docs.webplatform.org/wiki/html/attributes/name_(window)) from
+   * WebPlatform.org.
+   */
   @DomName('Window.name')
   @DocsEditable()
   String name;
 
+  /**
+   * The user agent accessing this window.
+   *
+   * ## Other resources
+   *
+   * * [The navigator object]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#the-navigator-object)
+   * from WHATWG.
+   */
   @DomName('Window.navigator')
   @DocsEditable()
   final Navigator navigator;
 
+  /**
+   * Whether objects are drawn offscreen before being displayed.
+   *
+   * ## Other resources
+   *
+   * * [offscreenBuffering]
+   * (http://docs.webplatform.org/wiki/dom/properties/offscreenBuffering) from
+   * WebPlatform.org.
+   */
   @DomName('Window.offscreenBuffering')
   @DocsEditable()
   @Experimental() // non-standard
@@ -27082,18 +27376,60 @@
   @Returns('Window|=Object')
   final dynamic _get_opener;
 
+  /**
+   * The height of this window including all user interface elements.
+   *
+   * ## Other resources
+   *
+   * * [outerHeight]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/outerHeight) from
+   * WebPlatform.org.
+   */
   @DomName('Window.outerHeight')
   @DocsEditable()
   final int outerHeight;
 
+  /**
+   * The width of the window including all user interface elements.
+   *
+   * ## Other resources
+   *
+   * * [outerWidth]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/outerWidth) from
+   * WebPlatform.org.
+   */
   @DomName('Window.outerWidth')
   @DocsEditable()
   final int outerWidth;
 
+  /**
+   * The distance this window has been scrolled horizontally.
+   *
+   * This attribute is an alias for [scrollX].
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollX and pageXOffset]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX) from MDN.
+   */
   @DomName('Window.pageXOffset')
   @DocsEditable()
   final int pageXOffset;
 
+  /**
+   * The distance this window has been scrolled vertically.
+   *
+   * This attribute is an alias for [scrollY].
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollY and pageYOffset]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY) from MDN.
+   */
   @DomName('Window.pageYOffset')
   @DocsEditable()
   final int pageYOffset;
@@ -27108,6 +27444,17 @@
   @Returns('Window|=Object')
   final dynamic _get_parent;
 
+  /**
+   * Timing and navigation data for this window.
+   *
+   * ## Other resources
+   *
+   * * [Measuring page load speed with navigation timeing]
+   * (http://www.html5rocks.com/en/tutorials/webperformance/basics/) from
+   * HTML5Rocks.
+   * * [Navigation timing specification]
+   * (http://www.w3.org/TR/navigation-timing/) from W3C.
+   */
   @DomName('Window.performance')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -27115,64 +27462,180 @@
   @SupportedBrowser(SupportedBrowser.IE)
   final Performance performance;
 
+  /**
+   * Information about the screen displaying this window.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screen')
   @DocsEditable()
   final Screen screen;
 
+  /**
+   * The distance from the left side of the screen to the left side of this
+   * window.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenLeft')
   @DocsEditable()
   final int screenLeft;
 
+  /**
+   * The distance from the top of the screen to the top of this window.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenTop')
   @DocsEditable()
   final int screenTop;
 
+  /**
+   * The distance from the left side of the screen to the mouse pointer.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenX')
   @DocsEditable()
   final int screenX;
 
+  /**
+   * The distance from the top of the screen to the mouse pointer.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenY')
   @DocsEditable()
   final int screenY;
 
+  /**
+   * This window's scroll bars.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.scrollbars')
   @DocsEditable()
   final BarProp scrollbars;
 
+  /**
+   * The current window.
+   *
+   * ## Other resources
+   *
+   * * [Window.self]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.self) from MDN.
+   */
   @DomName('Window.self')
   @DocsEditable()
   WindowBase get self => _convertNativeToDart_Window(this._get_self);
   @JSName('self')
+  /**
+   * The current window.
+   *
+   * ## Other resources
+   *
+   * * [Window.self]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.self) from MDN.
+   */
   @DomName('Window.self')
   @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   final dynamic _get_self;
 
+  /**
+   * Storage for this window that is cleared when this session ends.
+   *
+   * ## Other resources
+   *
+   * * [DOM storage guide]
+   * (https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage) from
+   * MDN.
+   * * [The past, present & future of local storage for web applications]
+   * (http://diveintohtml5.info/storage.html) from Dive Into HTML5.
+   * * [Local storage specification]
+   * (http://www.w3.org/TR/webstorage/#dom-sessionstorage) from W3C.
+   */
   @DomName('Window.sessionStorage')
   @DocsEditable()
   final Storage sessionStorage;
 
+  /**
+   * Access to speech synthesis in the browser.
+   *
+   * ## Other resources
+   *
+   * * [Web speech specification]
+   * (https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section)
+   * from W3C.
+   */
   @DomName('Window.speechSynthesis')
   @DocsEditable()
   // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
   @Experimental()
   final SpeechSynthesis speechSynthesis;
 
+  /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
   String status;
 
+  /**
+   * This window's status bar.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.statusbar')
   @DocsEditable()
   final BarProp statusbar;
 
+  /**
+   * Access to CSS media queries.
+   *
+   * ## Other resources
+   *
+   * * [StyleMedia class reference]
+   * (https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html)
+   * from Safari Developer Library.
+   */
   @DomName('Window.styleMedia')
   @DocsEditable()
   // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
   @Experimental() // nonstandard
   final StyleMedia styleMedia;
 
+  /**
+   * This window's tool bar.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.toolbar')
   @DocsEditable()
   final BarProp toolbar;
@@ -27187,10 +27650,26 @@
   @Returns('Window|=Object')
   final dynamic _get_top;
 
+  /**
+   * The current window.
+   *
+   * ## Other resources
+   *
+   * * [Window.window]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.window) from MDN.
+   */
   @DomName('Window.window')
   @DocsEditable()
   WindowBase get window => _convertNativeToDart_Window(this._get_window);
   @JSName('window')
+  /**
+   * The current window.
+   *
+   * ## Other resources
+   *
+   * * [Window.window]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.window) from MDN.
+   */
   @DomName('Window.window')
   @DocsEditable()
   @Creates('Window|=Object')
@@ -27223,6 +27702,15 @@
   @Returns('Window|=Object')
   __getter___2(String name) native;
 
+  /**
+   * Displays a modal alert to the user.
+   *
+   * ## Other resources
+   *
+   * * [User prompts]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+   * from WHATWG.
+   */
   @DomName('Window.alert')
   @DocsEditable()
   void alert(String message) native;
@@ -27231,10 +27719,27 @@
   @DocsEditable()
   void close() native;
 
+  /**
+   * Displays a modal OK/Cancel prompt to the user.
+   *
+   * ## Other resources
+   *
+   * * [User prompts]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+   * from WHATWG.
+   */
   @DomName('Window.confirm')
   @DocsEditable()
   bool confirm(String message) native;
 
+  /**
+   * Finds text in this window.
+   *
+   * ## Other resources
+   *
+   * * [Window.find]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.find) from MDN.
+   */
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
@@ -27246,6 +27751,9 @@
   CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) native;
 
   @JSName('getMatchedCSSRules')
+  /**
+   * Returns all CSS rules that apply to the element's pseudo-element.
+   */
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
@@ -27253,14 +27761,46 @@
   @Creates('_CssRuleList')
   List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native;
 
+  /**
+   * Returns the currently selected text.
+   *
+   * ## Other resources
+   *
+   * * [Window.getSelection]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.getSelection)
+   * from MDN.
+   */
   @DomName('Window.getSelection')
   @DocsEditable()
   Selection getSelection() native;
 
+  /**
+   * Returns a list of media queries for the given query string.
+   *
+   * ## Other resources
+   *
+   * * [Testing media queries]
+   * (https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Testing_media_queries)
+   * from MDN.
+   * * [The MediaQueryList specification]
+   * (http://www.w3.org/TR/cssom-view/#the-mediaquerylist-interface) from W3C.
+   */
   @DomName('Window.matchMedia')
   @DocsEditable()
   MediaQueryList matchMedia(String query) native;
 
+  /**
+   * Moves this window.
+   *
+   * x and y can be negative.
+   *
+   * ## Other resources
+   *
+   * * [Window.moveBy]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveBy) from MDN.
+   * * [Window.moveBy]
+   * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.
+   */
   @DomName('Window.moveBy')
   @DocsEditable()
   void moveBy(num x, num y) native;
@@ -27270,6 +27810,7 @@
   @DocsEditable()
   void _moveTo(num x, num y) native;
 
+  /// *Deprecated.*
   @DomName('Window.openDatabase')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -27301,35 +27842,105 @@
   @DocsEditable()
   void _postMessage_2(message, targetOrigin) native;
 
+  /**
+   * Opens the print dialog for this window.
+   *
+   * ## Other resources
+   *
+   * * [Window.print]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.print) from MDN.
+   */
   @DomName('Window.print')
   @DocsEditable()
   void print() native;
 
+  /**
+   * Resizes this window by an offset.
+   *
+   * ## Other resources
+   *
+   * * [Window resizeBy] (http://docs.webplatform.org/wiki/dom/methods/resizeBy)
+   * from WebPlatform.org.
+   */
   @DomName('Window.resizeBy')
   @DocsEditable()
   void resizeBy(num x, num y) native;
 
+  /**
+   * Resizes this window to a specific width and height.
+   *
+   * ## Other resources
+   *
+   * * [Window resizeTo] (http://docs.webplatform.org/wiki/dom/methods/resizeTo)
+   * from WebPlatform.org.
+   */
   @DomName('Window.resizeTo')
   @DocsEditable()
   void resizeTo(num width, num height) native;
 
+  /**
+   * Scrolls the page horizontally and vertically to a specific point.
+   *
+   * This method is identical to [scrollTo].
+   *
+   * ## Other resources
+   *
+   * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)
+   * from WebPlatform.org.
+   */
   @DomName('Window.scroll')
   @DocsEditable()
   void scroll(int x, int y) native;
 
+  /**
+   * Scrolls the page horizontally and vertically by an offset.
+   *
+   * ## Other resources
+   *
+   * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+   * from WebPlatform.org.
+   */
   @DomName('Window.scrollBy')
   @DocsEditable()
   void scrollBy(int x, int y) native;
 
+  /**
+   * Scrolls the page horizontally and vertically to a specific point.
+   *
+   * This method is identical to [scroll].
+   *
+   * ## Other resources
+   *
+   * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+   * from WebPlatform.org.
+   */
   @DomName('Window.scrollTo')
   @DocsEditable()
   void scrollTo(int x, int y) native;
 
+  /**
+   * Opens a new page as a modal dialog.
+   *
+   * ## Other resources
+   *
+   * * [Dialogs implemented using separate documents]
+   * (http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
+   * from W3C.
+   */
   @DomName('Window.showModalDialog')
   @DocsEditable()
   @Creates('Null')
   Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native;
 
+  /**
+   * Stops the window from loading.
+   *
+   * ## Other resources
+   *
+   * * [The Window object]
+   * (http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)
+   * from W3C.
+   */
   @DomName('Window.stop')
   @DocsEditable()
   void stop() native;
@@ -27379,6 +27990,15 @@
   }
 
   @JSName('webkitResolveLocalFileSystemURL')
+  /**
+   * Asynchronously retrieves a local filesystem entry.
+   *
+   * ## Other resources
+   *
+   * * [Obtaining access to file system entry points]
+   * (http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)
+   * from W3C.
+   */
   @DomName('Window.webkitResolveLocalFileSystemURL')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -27387,6 +28007,15 @@
   void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native;
 
   @JSName('webkitResolveLocalFileSystemURL')
+  /**
+   * Asynchronously retrieves a local filesystem entry.
+   *
+   * ## Other resources
+   *
+   * * [Obtaining access to file system entry points]
+   * (http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)
+   * from W3C.
+   */
   @DomName('Window.webkitResolveLocalFileSystemURL')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -27741,12 +28370,45 @@
   @DomName('Window.onbeforeunload')
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
+  /**
+   * Moves this window to a specific position.
+   *
+   * x and y can be negative.
+   *
+   * ## Other resources
+   *
+   * * [Window.moveTo]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveTo) from MDN.
+   * * [Window.moveTo]
+   * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveto) from W3C.
+   */
   void moveTo(Point p) {
     _moveTo(p.x, p.y);
   }
 
+  /**
+   * The distance this window has been scrolled horizontally.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollX]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX) from MDN.
+   */
   int get scrollX => JS('bool', '("scrollX" in #)', this) ? JS('int',
       '#.scrollX', this) : document.documentElement.scrollLeft;
+
+  /**
+   * The distance this window has been scrolled vertically.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollY]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY) from MDN.
+   */
   int get scrollY => JS('bool', '("scrollY" in #)', this) ? JS('int',
       '#.scrollY', this) : document.documentElement.scrollTop;
 }
@@ -28442,7 +29104,7 @@
    * The intersection of two axis-aligned rectangles, if any, is always another
    * axis-aligned rectangle.
    *
-   * Returns the intersection of this and `other`, or `null` if they don't
+   * Returns the intersection of this and `other`, or null if they don't
    * intersect.
    */
   Rectangle intersection(Rectangle other) {
@@ -30097,6 +30759,16 @@
    *     print(currentLocation.href); // 'http://www.example.com:80/'
    */
   LocationBase get location;
+
+  /**
+   * The current session history for this window.
+   *
+   * ## Other resources
+   *
+   * * [Session history and navigation specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html)
+   * from WHATWG.
+   */
   HistoryBase get history;
 
   /**
@@ -30182,6 +30854,19 @@
    * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
    */
   void close();
+
+  /**
+   * Sends a cross-origin message.
+   *
+   * ## Other resources
+   *
+   * * [window.postMessage]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) from
+   * MDN.
+   * * [Cross-document messaging]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html)
+   * from WHATWG.
+   */
   void postMessage(var message, String targetOrigin, [List messagePorts]);
 }
 
@@ -30231,10 +30916,10 @@
    * This is the Dart equivalent of jQuery's
    * [addClass](http://api.jquery.com/addClass/).
    *
-   * If this corresponds to one element. Returns `true` if [value] was added to
-   * the set, otherwise `false`.
+   * If this corresponds to one element. Returns true if [value] was added to
+   * the set, otherwise false.
    *
-   * If this corresponds to many elements, `null` is always returned.
+   * If this corresponds to many elements, null is always returned.
    */
   bool add(String value);
 
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index c71a035..6ff1c32 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -1322,6 +1322,16 @@
   /** An API for drawing on this canvas. */
   CanvasRenderingContext2D get context2D => getContext('2d');
 
+  /**
+   * Returns a new Web GL context for this canvas.
+   *
+   * ## Other resources
+   *
+   * * [WebGL fundamentals]
+   * (http://www.html5rocks.com/en/tutorials/webgl/webgl_fundamentals/) from
+   * HTML5Rocks.
+   * * [WebGL homepage] (http://get.webgl.org/).
+   */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @Experimental()
@@ -6813,7 +6823,7 @@
    * Gets the data for the specified type.
    *
    * The data is only available from within a drop operation (such as an
-   * [Element.onDrop] event) and will return `null` before the event is
+   * [Element.onDrop] event) and will return null before the event is
    * triggered.
    *
    * Data transfer is prohibited across domains. If a drag originates
@@ -11425,7 +11435,7 @@
    *
    * ## Other resources
    *
-   * * [Using the full-screen API]
+   * * [Using the fullscreen API]
    * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
    * tutorial from WebPlatform.org.
    * * [Fullscreen specification]
@@ -12212,14 +12222,39 @@
   // To suppress missing implicit constructor warnings.
   factory Event._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * This event is being handled by the event target.
+   *
+   * ## Other resources
+   *
+   * * [Target phase] (http://www.w3.org/TR/DOM-Level-3-Events/#target-phase)
+   * from W3C.
+   */
   @DomName('Event.AT_TARGET')
   @DocsEditable()
   static const int AT_TARGET = 2;
 
+  /**
+   * This event is bubbling up through the target's ancestors.
+   *
+   * ## Other resources
+   *
+   * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
+   * from W3C.
+   */
   @DomName('Event.BUBBLING_PHASE')
   @DocsEditable()
   static const int BUBBLING_PHASE = 3;
 
+  /**
+   * This event is propagating through the target's ancestors, starting from the
+   * document.
+   *
+   * ## Other resources
+   *
+   * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
+   * from W3C.
+   */
   @DomName('Event.CAPTURING_PHASE')
   @DocsEditable()
   static const int CAPTURING_PHASE = 1;
@@ -12232,6 +12267,14 @@
   @DocsEditable()
   bool get cancelable native "Event_cancelable_Getter";
 
+  /**
+   * Access to the system's clipboard data during copy, cut, and paste events.
+   *
+   * ## Other resources
+   *
+   * * [clipboardData specification]
+   * (http://www.w3.org/TR/clipboard-apis/#attributes) from W3C.
+   */
   @DomName('Event.clipboardData')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -12253,6 +12296,15 @@
   @DocsEditable()
   int get eventPhase native "Event_eventPhase_Getter";
 
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
   @DomName('Event.path')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
@@ -14146,6 +14198,19 @@
     _title = value;
   }
 
+  /**
+   * Returns page to standard layout.
+   *
+   * Has no effect if the page is not in fullscreen mode.
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitExitFullscreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -14162,12 +14227,43 @@
     _webkitExitPointerLock();
   }
 
+  /**
+   * Returns the element, if any, that is currently displayed in fullscreen.
+   *
+   * Returns null if there is currently no fullscreen element. You can use
+   * this to determine if the page is in fullscreen mode.
+   *
+   *     myVideo = new VideoElement();
+   *     if (document.fullscreenElement == null) {
+   *       myVideo.requestFullscreen();
+   *       print(document.fullscreenElement == myVideo); // true
+   *     }
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitFullscreenElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   Element get fullscreenElement => _webkitFullscreenElement;
 
+  /**
+   * Returns true if this document can display elements in fullscreen mode.
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitFullscreenEnabled')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -15049,7 +15145,7 @@
   String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";
 
   /**
-   * Return the response header named `header`, or `null` if not found.
+   * Return the response header named `header`, or null if not found.
    *
    * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
    * for a list of common response headers.
@@ -20796,7 +20892,7 @@
   /**
    * The document this node belongs to.
    *
-   * Returns `null` if this node does not belong to any document.
+   * Returns null if this node does not belong to any document.
    *
    * ## Other resources
    *
@@ -20811,7 +20907,7 @@
   /**
    * The parent element of this node.
    *
-   * Returns `null` if this node either does not have a parent or its parent is
+   * Returns null if this node either does not have a parent or its parent is
    * not an element.
    *
    * ## Other resources
@@ -27849,13 +27945,13 @@
     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 MediaStream || blob_OR_source_OR_stream == null)) {
+    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 MediaSource || blob_OR_source_OR_stream == null)) {
+    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 _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
+    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");
@@ -28492,6 +28588,15 @@
     return _requestFileSystem(persistent? 1 : 0, size);
   }
 
+  /**
+   * Converts a point from node coordinates to this window's coordinates.
+   *
+   * ## Other resources
+   *
+   * * [webkitConvertPointFromPageToNode]
+   * (https://developer.apple.com/library/safari/documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html#//apple_ref/javascript/instm/DOMWindow/webkitConvertPointFromNodeToPage)
+   * from Safari Development Library.
+   */
   @DomName('Window.convertPointFromNodeToPage')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -28502,6 +28607,15 @@
     return new Point(result.x, result.y);
   }
 
+  /**
+   * Converts a point from this window's coordinates to node coordinates.
+   *
+   * ## Other resources
+   *
+   * * [webkitConvertPointFromPageToNode]
+   * (https://developer.apple.com/library/safari/documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html#//apple_ref/javascript/instm/DOMWindow/webkitConvertPointFromPageToNode)
+   * from Safari Development Library.
+   */
   @DomName('Window.convertPointFromPageToNode')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -28693,22 +28807,61 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
+  /**
+   * Indicates that file system data cannot be cleared unless given user
+   * permission.
+   *
+   * ## Other resources
+   *
+   * * [Exploring the FileSystem APIs]
+   * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.
+   * * [File API]
+   * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.
+   */
   @DomName('Window.PERSISTENT')
   @DocsEditable()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   @Experimental()
   static const int PERSISTENT = 1;
 
+  /**
+   * Indicates that file system data can be cleared at any time.
+   *
+   * ## Other resources
+   *
+   * * [Exploring the FileSystem APIs]
+   * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.
+   * * [File API]
+   * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.
+   */
   @DomName('Window.TEMPORARY')
   @DocsEditable()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   @Experimental()
   static const int TEMPORARY = 0;
 
+  /**
+   * Entrypoint for CSS-related functions.
+   *
+   * ## Other resources
+   *
+   * * [The CSS interface](http://dev.w3.org/csswg/css-conditional/#the-css-interface) from W3C.
+   */
   @DomName('Window.CSS')
   @DocsEditable()
   Css get css native "Window_CSS_Getter";
 
+  /**
+   * The application cache for this window.
+   *
+   * ## Other resources
+   *
+   * * [A beginner's guide to using the application cache]
+   * (http://www.html5rocks.com/en/tutorials/appcache/beginner) from HTML5Rocks.
+   * * [Application cache API]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api)
+   * from WHATWG.
+   */
   @DomName('Window.applicationCache')
   @DocsEditable()
   ApplicationCache get applicationCache native "Window_applicationCache_Getter";
@@ -28721,30 +28874,55 @@
   @DocsEditable()
   Console get console native "Window_console_Getter";
 
+  /**
+   * Entrypoint for the browser's cryptographic functions.
+   *
+   * ## Other resources
+   *
+   * * [Web cryptography API](http://www.w3.org/TR/WebCryptoAPI/) from W3C.
+   */
   @DomName('Window.crypto')
   @DocsEditable()
   // http://www.w3.org/TR/WebCryptoAPI/
   @Experimental()
   Crypto get crypto native "Window_crypto_Getter";
 
+  /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
+  @Experimental() // non-standard
   String get defaultStatus native "Window_defaultStatus_Getter";
 
+  /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
+  @Experimental() // non-standard
   void set defaultStatus(String value) native "Window_defaultStatus_Setter";
 
+  /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
   String get defaultstatus native "Window_defaultstatus_Getter";
 
+  /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
   void set defaultstatus(String value) native "Window_defaultstatus_Setter";
 
+  /**
+   * The ratio between physical pixels and logical CSS pixels.
+   *
+   * ## Other resources
+   *
+   * * [devicePixelRatio]
+   * (http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html) from
+   * quirksmode.
+   * * [More about devicePixelRatio]
+   * (http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html) from
+   * quirksmode.
+   */
   @DomName('Window.devicePixelRatio')
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
@@ -28755,6 +28933,15 @@
   @DocsEditable()
   Document get document native "Window_document_Getter";
 
+  /**
+   * The current session history for this window's newest document.
+   *
+   * ## Other resources
+   *
+   * * [Loading web pages]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html)
+   * from WHATWG.
+   */
   @DomName('Window.history')
   @DocsEditable()
   History get history native "Window_history_Getter";
@@ -28767,14 +28954,45 @@
   @Experimental()
   IdbFactory get indexedDB native "Window_indexedDB_Getter";
 
+  /**
+   * The height of the viewport including scrollbars.
+   *
+   * ## Other resources
+   *
+   * * [innerHeight]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/innerHeight) from
+   * WebPlatform.org.
+   */
   @DomName('Window.innerHeight')
   @DocsEditable()
   int get innerHeight native "Window_innerHeight_Getter";
 
+  /**
+   * The width of the viewport including scrollbars.
+   *
+   * ## Other resources
+   *
+   * * [innerWidth]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/innerWidth) from
+   * WebPlatform.org.
+   */
   @DomName('Window.innerWidth')
   @DocsEditable()
   int get innerWidth native "Window_innerWidth_Getter";
 
+  /**
+   * Storage for this window that persists across sessions.
+   *
+   * ## Other resources
+   *
+   * * [DOM storage guide]
+   * (https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage) from
+   * MDN.
+   * * [The past, present & future of local storage for web applications]
+   * (http://diveintohtml5.info/storage.html) from Dive Into HTML5.
+   * * [Local storage specification]
+   * (http://www.w3.org/TR/webstorage/#the-localstorage-attribute) from W3C.
+   */
   @DomName('Window.localStorage')
   @DocsEditable()
   Storage get localStorage native "Window_localStorage_Getter";
@@ -28783,26 +29001,80 @@
   @DocsEditable()
   Location get location native "Window_location_Getter";
 
+  /**
+   * This window's location bar, which displays the URL.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.locationbar')
   @DocsEditable()
   BarProp get locationbar native "Window_locationbar_Getter";
 
+  /**
+   * This window's menu bar, which displays menu commands.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.menubar')
   @DocsEditable()
   BarProp get menubar native "Window_menubar_Getter";
 
+  /**
+   * The name of this window.
+   *
+   * ## Other resources
+   *
+   * * [Window name]
+   * (http://docs.webplatform.org/wiki/html/attributes/name_(window)) from
+   * WebPlatform.org.
+   */
   @DomName('Window.name')
   @DocsEditable()
   String get name native "Window_name_Getter";
 
+  /**
+   * The name of this window.
+   *
+   * ## Other resources
+   *
+   * * [Window name]
+   * (http://docs.webplatform.org/wiki/html/attributes/name_(window)) from
+   * WebPlatform.org.
+   */
   @DomName('Window.name')
   @DocsEditable()
   void set name(String value) native "Window_name_Setter";
 
+  /**
+   * The user agent accessing this window.
+   *
+   * ## Other resources
+   *
+   * * [The navigator object]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#the-navigator-object)
+   * from WHATWG.
+   */
   @DomName('Window.navigator')
   @DocsEditable()
   Navigator get navigator native "Window_navigator_Getter";
 
+  /**
+   * Whether objects are drawn offscreen before being displayed.
+   *
+   * ## Other resources
+   *
+   * * [offscreenBuffering]
+   * (http://docs.webplatform.org/wiki/dom/properties/offscreenBuffering) from
+   * WebPlatform.org.
+   */
   @DomName('Window.offscreenBuffering')
   @DocsEditable()
   @Experimental() // non-standard
@@ -28812,18 +29084,60 @@
   @DocsEditable()
   WindowBase get opener native "Window_opener_Getter";
 
+  /**
+   * The height of this window including all user interface elements.
+   *
+   * ## Other resources
+   *
+   * * [outerHeight]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/outerHeight) from
+   * WebPlatform.org.
+   */
   @DomName('Window.outerHeight')
   @DocsEditable()
   int get outerHeight native "Window_outerHeight_Getter";
 
+  /**
+   * The width of the window including all user interface elements.
+   *
+   * ## Other resources
+   *
+   * * [outerWidth]
+   * (http://docs.webplatform.org/wiki/css/cssom/properties/outerWidth) from
+   * WebPlatform.org.
+   */
   @DomName('Window.outerWidth')
   @DocsEditable()
   int get outerWidth native "Window_outerWidth_Getter";
 
+  /**
+   * The distance this window has been scrolled horizontally.
+   *
+   * This attribute is an alias for [scrollX].
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollX and pageXOffset]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX) from MDN.
+   */
   @DomName('Window.pageXOffset')
   @DocsEditable()
   int get pageXOffset native "Window_pageXOffset_Getter";
 
+  /**
+   * The distance this window has been scrolled vertically.
+   *
+   * This attribute is an alias for [scrollY].
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollY and pageYOffset]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY) from MDN.
+   */
   @DomName('Window.pageYOffset')
   @DocsEditable()
   int get pageYOffset native "Window_pageYOffset_Getter";
@@ -28832,6 +29146,17 @@
   @DocsEditable()
   WindowBase get parent native "Window_parent_Getter";
 
+  /**
+   * Timing and navigation data for this window.
+   *
+   * ## Other resources
+   *
+   * * [Measuring page load speed with navigation timeing]
+   * (http://www.html5rocks.com/en/tutorials/webperformance/basics/) from
+   * HTML5Rocks.
+   * * [Navigation timing specification]
+   * (http://www.w3.org/TR/navigation-timing/) from W3C.
+   */
   @DomName('Window.performance')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -28839,22 +29164,63 @@
   @SupportedBrowser(SupportedBrowser.IE)
   Performance get performance native "Window_performance_Getter";
 
+  /**
+   * Information about the screen displaying this window.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screen')
   @DocsEditable()
   Screen get screen native "Window_screen_Getter";
 
+  /**
+   * The distance from the left side of the screen to the left side of this
+   * window.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenLeft')
   @DocsEditable()
   int get screenLeft native "Window_screenLeft_Getter";
 
+  /**
+   * The distance from the top of the screen to the top of this window.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenTop')
   @DocsEditable()
   int get screenTop native "Window_screenTop_Getter";
 
+  /**
+   * The distance from the left side of the screen to the mouse pointer.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenX')
   @DocsEditable()
   int get screenX native "Window_screenX_Getter";
 
+  /**
+   * The distance from the top of the screen to the mouse pointer.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   */
   @DomName('Window.screenY')
   @DocsEditable()
   int get screenY native "Window_screenY_Getter";
@@ -28867,42 +29233,110 @@
   @DocsEditable()
   int get scrollY native "Window_scrollY_Getter";
 
+  /**
+   * This window's scroll bars.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.scrollbars')
   @DocsEditable()
   BarProp get scrollbars native "Window_scrollbars_Getter";
 
+  /**
+   * The current window.
+   *
+   * ## Other resources
+   *
+   * * [Window.self]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.self) from MDN.
+   */
   @DomName('Window.self')
   @DocsEditable()
   WindowBase get self native "Window_self_Getter";
 
+  /**
+   * Storage for this window that is cleared when this session ends.
+   *
+   * ## Other resources
+   *
+   * * [DOM storage guide]
+   * (https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage) from
+   * MDN.
+   * * [The past, present & future of local storage for web applications]
+   * (http://diveintohtml5.info/storage.html) from Dive Into HTML5.
+   * * [Local storage specification]
+   * (http://www.w3.org/TR/webstorage/#dom-sessionstorage) from W3C.
+   */
   @DomName('Window.sessionStorage')
   @DocsEditable()
   Storage get sessionStorage native "Window_sessionStorage_Getter";
 
+  /**
+   * Access to speech synthesis in the browser.
+   *
+   * ## Other resources
+   *
+   * * [Web speech specification]
+   * (https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section)
+   * from W3C.
+   */
   @DomName('Window.speechSynthesis')
   @DocsEditable()
   // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
   @Experimental()
   SpeechSynthesis get speechSynthesis native "Window_speechSynthesis_Getter";
 
+  /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
   String get status native "Window_status_Getter";
 
+  /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
   void set status(String value) native "Window_status_Setter";
 
+  /**
+   * This window's status bar.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.statusbar')
   @DocsEditable()
   BarProp get statusbar native "Window_statusbar_Getter";
 
+  /**
+   * Access to CSS media queries.
+   *
+   * ## Other resources
+   *
+   * * [StyleMedia class reference]
+   * (https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html)
+   * from Safari Developer Library.
+   */
   @DomName('Window.styleMedia')
   @DocsEditable()
   // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
   @Experimental() // nonstandard
   StyleMedia get styleMedia native "Window_styleMedia_Getter";
 
+  /**
+   * This window's tool bar.
+   *
+   * ## Other resources
+   *
+   * * [Browser interface elements]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)
+   * from WHATWG.
+   */
   @DomName('Window.toolbar')
   @DocsEditable()
   BarProp get toolbar native "Window_toolbar_Getter";
@@ -28911,6 +29345,14 @@
   @DocsEditable()
   WindowBase get top native "Window_top_Getter";
 
+  /**
+   * The current window.
+   *
+   * ## Other resources
+   *
+   * * [Window.window]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.window) from MDN.
+   */
   @DomName('Window.window')
   @DocsEditable()
   WindowBase get window native "Window_window_Getter";
@@ -28929,6 +29371,15 @@
 
   WindowBase ___getter___2(index_OR_name) native "Window____getter___2_Callback";
 
+  /**
+   * Displays a modal alert to the user.
+   *
+   * ## Other resources
+   *
+   * * [User prompts]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+   * from WHATWG.
+   */
   @DomName('Window.alert')
   @DocsEditable()
   void alert(String message) native "Window_alert_Callback";
@@ -28941,10 +29392,27 @@
   @DocsEditable()
   void close() native "Window_close_Callback";
 
+  /**
+   * Displays a modal OK/Cancel prompt to the user.
+   *
+   * ## Other resources
+   *
+   * * [User prompts]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+   * from WHATWG.
+   */
   @DomName('Window.confirm')
   @DocsEditable()
   bool confirm(String message) native "Window_confirm_Callback";
 
+  /**
+   * Finds text in this window.
+   *
+   * ## Other resources
+   *
+   * * [Window.find]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.find) from MDN.
+   */
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
@@ -28954,19 +29422,54 @@
   @DocsEditable()
   CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) native "Window_getComputedStyle_Callback";
 
+  /**
+   * Returns all CSS rules that apply to the element's pseudo-element.
+   */
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
   List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native "Window_getMatchedCSSRules_Callback";
 
+  /**
+   * Returns the currently selected text.
+   *
+   * ## Other resources
+   *
+   * * [Window.getSelection]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.getSelection)
+   * from MDN.
+   */
   @DomName('Window.getSelection')
   @DocsEditable()
   Selection getSelection() native "Window_getSelection_Callback";
 
+  /**
+   * Returns a list of media queries for the given query string.
+   *
+   * ## Other resources
+   *
+   * * [Testing media queries]
+   * (https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Testing_media_queries)
+   * from MDN.
+   * * [The MediaQueryList specification]
+   * (http://www.w3.org/TR/cssom-view/#the-mediaquerylist-interface) from W3C.
+   */
   @DomName('Window.matchMedia')
   @DocsEditable()
   MediaQueryList matchMedia(String query) native "Window_matchMedia_Callback";
 
+  /**
+   * Moves this window.
+   *
+   * x and y can be negative.
+   *
+   * ## Other resources
+   *
+   * * [Window.moveBy]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveBy) from MDN.
+   * * [Window.moveBy]
+   * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.
+   */
   @DomName('Window.moveBy')
   @DocsEditable()
   void moveBy(num x, num y) native "Window_moveBy_Callback";
@@ -28979,6 +29482,7 @@
   @DocsEditable()
   WindowBase open(String url, String name, [String options]) native "Window_open_Callback";
 
+  /// *Deprecated.*
   @DomName('Window.openDatabase')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -28992,6 +29496,14 @@
   @DocsEditable()
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "Window_postMessage_Callback";
 
+  /**
+   * Opens the print dialog for this window.
+   *
+   * ## Other resources
+   *
+   * * [Window.print]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.print) from MDN.
+   */
   @DomName('Window.print')
   @DocsEditable()
   void print() native "Window_print_Callback";
@@ -29000,30 +29512,92 @@
   @DocsEditable()
   int _requestAnimationFrame(RequestAnimationFrameCallback callback) native "Window_requestAnimationFrame_Callback";
 
+  /**
+   * Resizes this window by an offset.
+   *
+   * ## Other resources
+   *
+   * * [Window resizeBy] (http://docs.webplatform.org/wiki/dom/methods/resizeBy)
+   * from WebPlatform.org.
+   */
   @DomName('Window.resizeBy')
   @DocsEditable()
   void resizeBy(num x, num y) native "Window_resizeBy_Callback";
 
+  /**
+   * Resizes this window to a specific width and height.
+   *
+   * ## Other resources
+   *
+   * * [Window resizeTo] (http://docs.webplatform.org/wiki/dom/methods/resizeTo)
+   * from WebPlatform.org.
+   */
   @DomName('Window.resizeTo')
   @DocsEditable()
   void resizeTo(num width, num height) native "Window_resizeTo_Callback";
 
+  /**
+   * Scrolls the page horizontally and vertically to a specific point.
+   *
+   * This method is identical to [scrollTo].
+   *
+   * ## Other resources
+   *
+   * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)
+   * from WebPlatform.org.
+   */
   @DomName('Window.scroll')
   @DocsEditable()
   void scroll(int x, int y) native "Window_scroll_Callback";
 
+  /**
+   * Scrolls the page horizontally and vertically by an offset.
+   *
+   * ## Other resources
+   *
+   * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+   * from WebPlatform.org.
+   */
   @DomName('Window.scrollBy')
   @DocsEditable()
   void scrollBy(int x, int y) native "Window_scrollBy_Callback";
 
+  /**
+   * Scrolls the page horizontally and vertically to a specific point.
+   *
+   * This method is identical to [scroll].
+   *
+   * ## Other resources
+   *
+   * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+   * from WebPlatform.org.
+   */
   @DomName('Window.scrollTo')
   @DocsEditable()
   void scrollTo(int x, int y) native "Window_scrollTo_Callback";
 
+  /**
+   * Opens a new page as a modal dialog.
+   *
+   * ## Other resources
+   *
+   * * [Dialogs implemented using separate documents]
+   * (http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
+   * from W3C.
+   */
   @DomName('Window.showModalDialog')
   @DocsEditable()
   Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native "Window_showModalDialog_Callback";
 
+  /**
+   * Stops the window from loading.
+   *
+   * ## Other resources
+   *
+   * * [The Window object]
+   * (http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)
+   * from W3C.
+   */
   @DomName('Window.stop')
   @DocsEditable()
   void stop() native "Window_stop_Callback";
@@ -29063,6 +29637,15 @@
     return completer.future;
   }
 
+  /**
+   * Asynchronously retrieves a local filesystem entry.
+   *
+   * ## Other resources
+   *
+   * * [Obtaining access to file system entry points]
+   * (http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)
+   * from W3C.
+   */
   @DomName('Window.webkitResolveLocalFileSystemURL')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -29423,6 +30006,18 @@
   @DomName('Window.onbeforeunload')
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
+  /**
+   * Moves this window to a specific position.
+   *
+   * x and y can be negative.
+   *
+   * ## Other resources
+   *
+   * * [Window.moveTo]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveTo) from MDN.
+   * * [Window.moveTo]
+   * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveto) from W3C.
+   */
   void moveTo(Point p) {
     _moveTo(p.x, p.y);
   }
@@ -30176,7 +30771,7 @@
    * The intersection of two axis-aligned rectangles, if any, is always another
    * axis-aligned rectangle.
    *
-   * Returns the intersection of this and `other`, or `null` if they don't
+   * Returns the intersection of this and `other`, or null if they don't
    * intersect.
    */
   Rectangle intersection(Rectangle other) {
@@ -32038,6 +32633,16 @@
    *     print(currentLocation.href); // 'http://www.example.com:80/'
    */
   LocationBase get location;
+
+  /**
+   * The current session history for this window.
+   *
+   * ## Other resources
+   *
+   * * [Session history and navigation specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html)
+   * from WHATWG.
+   */
   HistoryBase get history;
 
   /**
@@ -32123,6 +32728,19 @@
    * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
    */
   void close();
+
+  /**
+   * Sends a cross-origin message.
+   *
+   * ## Other resources
+   *
+   * * [window.postMessage]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) from
+   * MDN.
+   * * [Cross-document messaging]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html)
+   * from WHATWG.
+   */
   void postMessage(var message, String targetOrigin, [List messagePorts]);
 }
 
@@ -32172,10 +32790,10 @@
    * This is the Dart equivalent of jQuery's
    * [addClass](http://api.jquery.com/addClass/).
    *
-   * If this corresponds to one element. Returns `true` if [value] was added to
-   * the set, otherwise `false`.
+   * If this corresponds to one element. Returns true if [value] was added to
+   * the set, otherwise false.
    *
-   * If this corresponds to many elements, `null` is always returned.
+   * If this corresponds to many elements, null is always returned.
    */
   bool add(String value);
 
@@ -35961,24 +36579,6 @@
     return result;
   }
 
-  static List parseStackTrace(StackTrace stackTrace) {
-    final regExp = new RegExp(r'#\d\s+(.*) \((.*):(\d+):(\d+)\)');
-    List result = [];
-    for (var match in regExp.allMatches(stackTrace.toString())) {
-      result.add([match.group(1), match.group(2), int.parse(match.group(3)), int.parse(match.group(4))]);
-    }
-    return result;
-  }
-
-  static List captureParsedStackTrace() {
-    try {
-      // Throwing an exception is the only way to generate a stack trace.
-      throw new Exception();
-    } catch (e, stackTrace) {
-      return parseStackTrace(stackTrace);
-    }
-  }
-
   static void populateMap(Map result, List list) {
     for (int i = 0; i < list.length; i += 2) {
       result[list[i]] = list[i + 1];
@@ -36193,7 +36793,7 @@
     addForClass(ClassMirror mirror, bool isStatic) {
       if (mirror == null)
         return;
-      addAll(mirror.members, isStatic);
+      addAll(mirror.declarations, isStatic);
       if (mirror.superclass != null)
         addForClass(mirror.superclass, isStatic);
       for (var interface in mirror.superinterfaces) {
@@ -36314,7 +36914,9 @@
     }
     var className = MirrorSystem.getName(cls.simpleName);
     var createdConstructor = cls.constructors[new Symbol('$className.created')];
-    if (createdConstructor == null) {
+    if (createdConstructor == null ||
+        createdConstructor is! MethodMirror ||
+        !createdConstructor.isConstructor) {
       throw new UnsupportedError(
           'Class is missing constructor $className.created');
     }
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index 8f54a39..fee6dc9 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -16,6 +16,13 @@
   factory Directory(String path) => new _Directory(path);
 
   /**
+   * Create a Directory object from a URI.
+   *
+   * If [uri] cannot reference a directory this throws [UnsupportedError].
+   */
+  factory Directory.fromUri(Uri uri) => new Directory(uri.toFilePath());
+
+  /**
    * Creates a directory object pointing to the current working
    * directory.
    */
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 1c0e371..152fb6e 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -8,15 +8,25 @@
  * FileMode describes the modes in which a file can be opened.
  */
 class FileMode {
+  /// The [FileMode] for opening a file only for reading.
   static const READ = const FileMode._internal(0);
+  /// The [FileMode] for opening a file for reading and writing. The file will
+  /// be overwritten. If the file does not exist, it will be created.
   static const WRITE = const FileMode._internal(1);
+  /// The [FileMode] for opening a file for reading a file and writing to the
+  /// end of it. If the file does not exist, it will be created.
   static const APPEND = const FileMode._internal(2);
   const FileMode._internal(int this._mode);
   final int _mode;
 }
 
+/// The [FileMode] for opening a file only for reading.
 const READ = FileMode.READ;
+/// The [FileMode] for opening a file for reading and writing. The file will be
+/// overwritten. If the file does not exist, it will be created.
 const WRITE = FileMode.WRITE;
+/// The [FileMode] for opening a file for reading a file and writing to the end
+/// of it. If the file does not exist, it will be created.
 const APPEND = FileMode.APPEND;
 
 /**
@@ -41,6 +51,13 @@
   factory File(String path) => new _File(path);
 
   /**
+   * Create a File object from a URI.
+   *
+   * If [uri] cannot reference a file this throws [UnsupportedError].
+   */
+  factory File.fromUri(Uri uri) => new File(uri.toFilePath());
+
+  /**
    * Create the file. Returns a [:Future<File>:] that completes with
    * the file when it has been created.
    *
@@ -249,8 +266,13 @@
    * By default [writeAsBytes] creates the file for writing and truncates the
    * file if it already exists. In order to append the bytes to an existing
    * file, pass [FileMode.APPEND] as the optional mode parameter.
+   *
+   * If the argument [flush] is set to `true`, the data written will be
+   * flushed to the file system before the returned future completes.
    */
-  Future<File> writeAsBytes(List<int> bytes, {FileMode mode: FileMode.WRITE});
+  Future<File> writeAsBytes(List<int> bytes,
+                            {FileMode mode: FileMode.WRITE,
+                             bool flush: false});
 
   /**
    * Synchronously write a list of bytes to a file.
@@ -261,9 +283,14 @@
    * the file if it already exists. In order to append the bytes to an existing
    * file, pass [FileMode.APPEND] as the optional mode parameter.
    *
+   * If the [flush] argument is set to `true` data written will be
+   * flushed to the file system before returning.
+   *
    * Throws a [FileSystemException] if the operation fails.
    */
-  void writeAsBytesSync(List<int> bytes, {FileMode mode: FileMode.WRITE});
+  void writeAsBytesSync(List<int> bytes,
+                        {FileMode mode: FileMode.WRITE,
+                         bool flush: false});
 
   /**
    * Write a string to a file.
@@ -275,10 +302,15 @@
    * By default [writeAsString] creates the file for writing and truncates the
    * file if it already exists. In order to append the bytes to an existing
    * file, pass [FileMode.APPEND] as the optional mode parameter.
+   *
+   * If the argument [flush] is set to `true`, the data written will be
+   * flushed to the file system before the returned future completes.
+   *
    */
   Future<File> writeAsString(String contents,
                              {FileMode mode: FileMode.WRITE,
-                              Encoding encoding: UTF8});
+                              Encoding encoding: UTF8,
+                              bool flush: false});
 
   /**
    * Synchronously write a string to a file.
@@ -291,11 +323,15 @@
    * to an existing file, pass [FileMode.APPEND] as the optional mode
    * parameter.
    *
+   * If the [flush] argument is set to `true` data written will be
+   * flushed to the file system before returning.
+   *
    * Throws a [FileSystemException] if the operation fails.
    */
   void writeAsStringSync(String contents,
                          {FileMode mode: FileMode.WRITE,
-                          Encoding encoding: UTF8});
+                          Encoding encoding: UTF8,
+                          bool flush: false});
 
   /**
    * Get the path of the file.
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index e7080d7..8a7ce39 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -494,28 +494,37 @@
   }
 
   Future<File> writeAsBytes(List<int> bytes,
-                            {FileMode mode: FileMode.WRITE}) {
+                            {FileMode mode: FileMode.WRITE,
+                             bool flush: false}) {
     try {
       IOSink sink = openWrite(mode: mode);
       sink.add(bytes);
-      sink.close();
+      if (flush) {
+        sink.flush().then((_) => sink.close());
+      } else {
+        sink.close();
+      }
       return sink.done.then((_) => this);
     } catch (e) {
       return new Future.error(e);
     }
   }
 
-  void writeAsBytesSync(List<int> bytes, {FileMode mode: FileMode.WRITE}) {
+  void writeAsBytesSync(List<int> bytes,
+                        {FileMode mode: FileMode.WRITE,
+                         bool flush: false}) {
     RandomAccessFile opened = openSync(mode: mode);
     opened.writeFromSync(bytes, 0, bytes.length);
+    if (flush) opened.flushSync();
     opened.closeSync();
   }
 
   Future<File> writeAsString(String contents,
                              {FileMode mode: FileMode.WRITE,
-                              Encoding encoding: UTF8}) {
+                              Encoding encoding: UTF8,
+                              bool flush: false}) {
     try {
-      return writeAsBytes(encoding.encode(contents), mode: mode);
+      return writeAsBytes(encoding.encode(contents), mode: mode, flush: flush);
     } catch (e) {
       return new Future.error(e);
     }
@@ -523,8 +532,9 @@
 
   void writeAsStringSync(String contents,
                          {FileMode mode: FileMode.WRITE,
-                          Encoding encoding: UTF8}) {
-    writeAsBytesSync(encoding.encode(contents), mode: mode);
+                          Encoding encoding: UTF8,
+                          bool flush: false}) {
+    writeAsBytesSync(encoding.encode(contents), mode: mode, flush: flush);
   }
 
   String toString() => "File: '$path'";
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index aa000ff..8598037 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -75,11 +75,11 @@
  * The following example shows how to bind a [HttpServer] to a IPv6
  * [InternetAddress] on port 80, and listening to requests.
  *
- *   HttpServer.bind(InternetAddress.ANY_IP_V6, 80).then((server) {
- *     server.listen((HttpRequest request) {
- *       // Handle requests.
+ *     HttpServer.bind(InternetAddress.ANY_IP_V6, 80).then((server) {
+ *       server.listen((HttpRequest request) {
+ *         // Handle requests.
+ *       });
  *     });
- *   });
  */
 abstract class HttpServer implements Stream<HttpRequest> {
   /**
@@ -1156,18 +1156,18 @@
    * The string returned by [f] must be in the format used by browser
    * PAC (proxy auto-config) scripts. That is either
    *
-   *   "DIRECT"
+   *     "DIRECT"
    *
    * for using a direct connection or
    *
-   *   "PROXY host:port"
+   *     "PROXY host:port"
    *
    * for using the proxy server [:host:] on port [:port:].
    *
    * A configuration can contain several configuration elements
    * separated by semicolons, e.g.
    *
-   *   "PROXY host:port; PROXY host2:port2; DIRECT"
+   *     "PROXY host:port; PROXY host2:port2; DIRECT"
    *
    * The static function [findProxyFromEnvironment] on this class can
    * be used to implement proxy server resolving based on environment
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 2dac442..cff9d37 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -5,8 +5,24 @@
 part of dart.io;
 
 class _HttpHeaders implements HttpHeaders {
+  final Map<String, List<String>> _headers;
+  final String protocolVersion;
+
+  bool _mutable = true;  // Are the headers currently mutable?
+  List<String> _noFoldingHeaders;
+
+  int _contentLength = -1;
+  bool _persistentConnection = true;
+  bool _chunkedTransferEncoding = false;
+  String _host;
+  int _port;
+
   _HttpHeaders(String this.protocolVersion)
-      : _headers = new Map<String, List<String>>();
+      : _headers = new HashMap<String, List<String>>() {
+    if (protocolVersion == "1.0") {
+      _persistentConnection = false;
+    }
+  }
 
   List<String> operator[](String name) {
     name = name.toLowerCase();
@@ -25,6 +41,10 @@
 
   void add(String name, value) {
     _checkMutable();
+    _addAll(name.toLowerCase(), value);
+  }
+
+  void _addAll(String name, value) {
     if (value is List) {
       for (int i = 0; i < value.length; i++) {
         _add(name, value[i]);
@@ -35,10 +55,10 @@
   }
 
   void set(String name, Object value) {
-    name = name.toLowerCase();
     _checkMutable();
-    removeAll(name);
-    add(name, value);
+    name = name.toLowerCase();
+    _headers.remove(name);
+    _addAll(name, value);
   }
 
   void remove(String name, Object value) {
@@ -69,38 +89,53 @@
     _noFoldingHeaders.add(name);
   }
 
-  bool get persistentConnection {
-    List<String> connection = _headers[HttpHeaders.CONNECTION];
-    if (protocolVersion == "1.1") {
-      if (connection == null) return true;
-      return !connection.any((value) => value.toLowerCase() == "close");
-    } else {
-      if (connection == null) return false;
-      return connection.any((value) => value.toLowerCase() == "keep-alive");
-    }
-  }
+  bool get persistentConnection => _persistentConnection;
 
   void set persistentConnection(bool persistentConnection) {
     _checkMutable();
-    // Determine the value of the "Connection" header.
-    remove(HttpHeaders.CONNECTION, "close");
-    remove(HttpHeaders.CONNECTION, "keep-alive");
-    if (protocolVersion == "1.1" && !persistentConnection) {
-      add(HttpHeaders.CONNECTION, "close");
-    } else if (protocolVersion == "1.0" && persistentConnection) {
-      add(HttpHeaders.CONNECTION, "keep-alive");
+    if (persistentConnection == _persistentConnection) return;
+    if (persistentConnection) {
+      if (protocolVersion == "1.1") {
+        remove(HttpHeaders.CONNECTION, "close");
+      } else {
+        if (_contentLength == -1) {
+          throw new HttpException(
+              "Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with "
+              "no ContentLength");
+        }
+        add(HttpHeaders.CONNECTION, "keep-alive");
+      }
+    } else {
+      if (protocolVersion == "1.1") {
+        add(HttpHeaders.CONNECTION, "close");
+      } else {
+        remove(HttpHeaders.CONNECTION, "keep-alive");
+      }
     }
+    _persistentConnection = persistentConnection;
   }
 
   int get contentLength => _contentLength;
 
   void set contentLength(int contentLength) {
     _checkMutable();
+    if (protocolVersion == "1.0" &&
+        persistentConnection &&
+        contentLength == -1) {
+      throw new HttpException(
+          "Trying to clear ContentLength on HTTP 1.0 headers with "
+          "'Connection: Keep-Alive' set");
+    }
+    if (_contentLength == contentLength) return;
     _contentLength = contentLength;
     if (_contentLength >= 0) {
+      if (chunkedTransferEncoding) chunkedTransferEncoding = false;
       _set(HttpHeaders.CONTENT_LENGTH, contentLength.toString());
     } else {
       removeAll(HttpHeaders.CONTENT_LENGTH);
+      if (protocolVersion == "1.1") {
+        chunkedTransferEncoding = true;
+      }
     }
   }
 
@@ -108,16 +143,23 @@
 
   void set chunkedTransferEncoding(bool chunkedTransferEncoding) {
     _checkMutable();
-    _chunkedTransferEncoding = chunkedTransferEncoding;
-    List<String> values = _headers[HttpHeaders.TRANSFER_ENCODING];
-    if ((values == null || values[values.length - 1] != "chunked") &&
-        chunkedTransferEncoding) {
-      // Headers does not specify chunked encoding - add it if set.
+    if (chunkedTransferEncoding && protocolVersion == "1.0") {
+      throw new HttpException(
+          "Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers");
+    }
+    if (chunkedTransferEncoding == _chunkedTransferEncoding) return;
+    if (chunkedTransferEncoding) {
+      List<String> values = _headers[HttpHeaders.TRANSFER_ENCODING];
+      if ((values == null || values.last != "chunked")) {
+        // Headers does not specify chunked encoding - add it if set.
         _addValue(HttpHeaders.TRANSFER_ENCODING, "chunked");
-    } else if (!chunkedTransferEncoding) {
+      }
+      contentLength = -1;
+    } else {
       // Headers does specify chunked encoding - remove it if not set.
       remove(HttpHeaders.TRANSFER_ENCODING, "chunked");
     }
+    _chunkedTransferEncoding = chunkedTransferEncoding;
   }
 
   String get host => _host;
@@ -207,10 +249,10 @@
     _set(HttpHeaders.CONTENT_TYPE, contentType.toString());
   }
 
+  // [name] must be a lower-case version of the name.
   void _add(String name, value) {
-    var lowerCaseName = name.toLowerCase();
     // TODO(sgjesse): Add immutable state throw HttpException is immutable.
-    if (lowerCaseName == HttpHeaders.CONTENT_LENGTH) {
+    if (name == HttpHeaders.CONTENT_LENGTH) {
       if (value is int) {
         contentLength = value;
       } else if (value is String) {
@@ -218,13 +260,13 @@
       } else {
         throw new HttpException("Unexpected type for header named $name");
       }
-    } else if (lowerCaseName == HttpHeaders.TRANSFER_ENCODING) {
+    } else if (name == HttpHeaders.TRANSFER_ENCODING) {
       if (value == "chunked") {
         chunkedTransferEncoding = true;
       } else {
-        _addValue(lowerCaseName, value);
+        _addValue(name, value);
       }
-    } else if (lowerCaseName == HttpHeaders.DATE) {
+    } else if (name == HttpHeaders.DATE) {
       if (value is DateTime) {
         date = value;
       } else if (value is String) {
@@ -232,7 +274,7 @@
       } else {
         throw new HttpException("Unexpected type for header named $name");
       }
-    } else if (lowerCaseName == HttpHeaders.EXPIRES) {
+    } else if (name == HttpHeaders.EXPIRES) {
       if (value is DateTime) {
         expires = value;
       } else if (value is String) {
@@ -240,7 +282,7 @@
       } else {
         throw new HttpException("Unexpected type for header named $name");
       }
-    } else if (lowerCaseName == HttpHeaders.IF_MODIFIED_SINCE) {
+    } else if (name == HttpHeaders.IF_MODIFIED_SINCE) {
       if (value is DateTime) {
         ifModifiedSince = value;
       } else if (value is String) {
@@ -248,7 +290,7 @@
       } else {
         throw new HttpException("Unexpected type for header named $name");
       }
-    } else if (lowerCaseName == HttpHeaders.HOST) {
+    } else if (name == HttpHeaders.HOST) {
       if (value is String) {
         int pos = value.indexOf(":");
         if (pos == -1) {
@@ -274,10 +316,18 @@
       } else {
         throw new HttpException("Unexpected type for header named $name");
       }
-    } else if (lowerCaseName == HttpHeaders.CONTENT_TYPE) {
+    } else if (name == HttpHeaders.CONNECTION) {
+      var lowerCaseValue = value.toLowerCase();
+      if (lowerCaseValue == 'close') {
+        _persistentConnection = false;
+      } else if (lowerCaseValue == 'keep-alive') {
+        _persistentConnection = true;
+      }
+      _addValue(name, value);
+    } else if (name == HttpHeaders.CONTENT_TYPE) {
       _set(HttpHeaders.CONTENT_TYPE, value);
     } else {
-      _addValue(lowerCaseName, value);
+      _addValue(name, value);
     }
   }
 
@@ -295,7 +345,7 @@
   }
 
   void _set(String name, String value) {
-    name = name.toLowerCase();
+    assert(name == name.toLowerCase());
     List<String> values = new List<String>();
     _headers[name] = values;
     values.add(value);
@@ -320,55 +370,40 @@
     return true;
   }
 
-  void _synchronize() {
-    // If the content length is not known make sure chunked transfer
-    // encoding is used for HTTP 1.1.
-    if (contentLength < 0) {
-      if (protocolVersion == "1.0") {
-        persistentConnection = false;
-      } else {
-        chunkedTransferEncoding = true;
-      }
-    }
-    // If a Transfer-Encoding header field is present the
-    // Content-Length header MUST NOT be sent (RFC 2616 section 4.4).
-    if (chunkedTransferEncoding &&
-        contentLength >= 0 &&
-        protocolVersion == "1.1") {
-      contentLength = -1;
-    }
-  }
-
   void _finalize() {
-    _synchronize();
     _mutable = false;
   }
 
-  _write(BytesBuilder builder) {
-    final COLONSP = const [_CharCode.COLON, _CharCode.SP];
-    final COMMASP = const [_CharCode.COMMA, _CharCode.SP];
-    final CRLF = const [_CharCode.CR, _CharCode.LF];
+  int _write(Uint8List buffer, int offset) {
+    void write(List<int> bytes) {
+      int len = bytes.length;
+      for (int i = 0; i < len; i++) {
+        buffer[offset + i] = bytes[i];
+      }
+      offset += len;
+    }
 
     // Format headers.
     _headers.forEach((String name, List<String> values) {
       bool fold = _foldHeader(name);
       var nameData = name.codeUnits;
-      builder.add(nameData);
-      builder.add(const [_CharCode.COLON, _CharCode.SP]);
+      write(nameData);
+      write(const [_CharCode.COLON, _CharCode.SP]);
       for (int i = 0; i < values.length; i++) {
         if (i > 0) {
           if (fold) {
-            builder.add(const [_CharCode.COMMA, _CharCode.SP]);
+            write(const [_CharCode.COMMA, _CharCode.SP]);
           } else {
-            builder.add(const [_CharCode.CR, _CharCode.LF]);
-            builder.add(nameData);
-            builder.add(const [_CharCode.COLON, _CharCode.SP]);
+            write(const [_CharCode.CR, _CharCode.LF]);
+            write(nameData);
+            write(const [_CharCode.COLON, _CharCode.SP]);
           }
         }
-        builder.add(values[i].codeUnits);
+        write(values[i].codeUnits);
       }
-      builder.add(const [_CharCode.CR, _CharCode.LF]);
+      write(const [_CharCode.CR, _CharCode.LF]);
     });
+    return offset;
   }
 
   String toString() {
@@ -457,17 +492,6 @@
     }
     return cookies;
   }
-
-
-  bool _mutable = true;  // Are the headers currently mutable?
-  Map<String, List<String>> _headers;
-  List<String> _noFoldingHeaders;
-
-  int _contentLength = -1;
-  bool _chunkedTransferEncoding = false;
-  final String protocolVersion;
-  String _host;
-  int _port;
 }
 
 
@@ -478,7 +502,7 @@
   _HeaderValue([String this._value = "", Map<String, String> parameters]) {
     if (parameters != null) {
       _parameters =
-          new _UnmodifiableMap(new Map<String, String>.from(parameters));
+          new _UnmodifiableMap(new HashMap<String, String>.from(parameters));
     }
   }
 
@@ -495,7 +519,7 @@
 
   void _ensureParameters() {
     if (_parameters == null) {
-      _parameters = new _UnmodifiableMap(new Map<String, String>());
+      _parameters = new _UnmodifiableMap(new HashMap<String, String>());
     }
   }
 
@@ -553,7 +577,7 @@
     }
 
     void parseParameters() {
-      var parameters = new Map<String, String>();
+      var parameters = new HashMap<String, String>();
       _parameters = new _UnmodifiableMap(parameters);
 
       String parseParameterName() {
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 07ef4fe..e4960fa 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -4,6 +4,8 @@
 
 part of dart.io;
 
+const int _HEADERS_BUFFER_SIZE = 8 * 1024;
+
 class _HttpIncoming extends Stream<List<int>> {
   final int _transferLength;
   final Completer _dataCompleter = new Completer();
@@ -93,7 +95,10 @@
                _HttpServer this._httpServer,
                _HttpConnection this._httpConnection)
       : super(_incoming) {
-    response.headers.persistentConnection = headers.persistentConnection;
+    if (headers.protocolVersion == "1.1") {
+      response.headers.chunkedTransferEncoding = true;
+      response.headers.persistentConnection = headers.persistentConnection;
+    }
 
     if (_httpServer._sessionManagerInstance != null) {
       // Map to session if exists.
@@ -479,9 +484,17 @@
   Future<T> get done => _dataSink.done;
 
   Future _writeHeaders({bool drainRequest: true}) {
+    void write() {
+      try {
+        _writeHeader();
+      } catch (error) {
+        // Headers too large.
+        throw new HttpException(
+            "Headers size exceeded the of '$_HEADERS_BUFFER_SIZE' bytes");
+      }
+    }
     if (_headersWritten) return new Future.value();
     _headersWritten = true;
-    headers._synchronize();  // Be sure the 'chunked' option is updated.
     _dataSink.encoding = encoding;
     bool isServerSide = this is _HttpResponse;
     if (isServerSide) {
@@ -503,10 +516,10 @@
         return response._httpRequest.drain()
             // TODO(ajohnsen): Timeout on drain?
             .catchError((_) {})  // Ignore errors.
-            .then((_) => _writeHeader());
+            .then((_) => write());
       }
     }
-    return new Future.sync(_writeHeader);
+    return new Future.sync(write);
   }
 
   Future _addStream(Stream<List<int>> stream) {
@@ -532,8 +545,6 @@
   }
 
   Future _close() {
-    // TODO(ajohnsen): Currently, contentLength, chunkedTransferEncoding and
-    // persistentConnection is not guaranteed to be in sync.
     if (!_headersWritten) {
       if (!_ignoreBody && headers.contentLength == -1) {
         // If no body was written, _ignoreBody is false (it's not a HEAD
@@ -549,10 +560,10 @@
         return _headersSink.done;
       }
     }
-    return _writeHeaders().then((_) => _headersSink.close());
+    return _writeHeaders().whenComplete(_headersSink.close);
   }
 
-  void _writeHeader();  // TODO(ajohnsen): Better name.
+  void _writeHeader();
 }
 
 
@@ -713,7 +724,7 @@
                 _HttpOutgoing outgoing,
                 String serverHeader)
       : super(uri, protocolVersion, outgoing) {
-    if (serverHeader != null) headers.set('Server', serverHeader);
+    if (serverHeader != null) headers._add('server', serverHeader);
   }
 
   List<Cookie> get cookies {
@@ -736,7 +747,7 @@
   Future redirect(Uri location, {int status: HttpStatus.MOVED_TEMPORARILY}) {
     if (_headersWritten) throw new StateError("Header already sent");
     statusCode = status;
-    headers.set("Location", location.toString());
+    headers.set("location", location.toString());
     return close();
   }
 
@@ -769,21 +780,29 @@
   }
 
   void _writeHeader() {
-    var builder = new BytesBuilder();
-    writeSP() => builder.add(const [_CharCode.SP]);
-    writeCRLF() => builder.add(const [_CharCode.CR, _CharCode.LF]);
+    Uint8List buffer = _httpRequest._httpConnection._headersBuffer;
+    int offset = 0;
+
+    void write(List<int> bytes) {
+      int len = bytes.length;
+      for (int i = 0; i < len; i++) {
+        buffer[offset + i] = bytes[i];
+      }
+      offset += len;
+    }
 
     // Write status line.
     if (headers.protocolVersion == "1.1") {
-      builder.add(_Const.HTTP11);
+      write(_Const.HTTP11);
     } else {
-      builder.add(_Const.HTTP10);
+      write(_Const.HTTP10);
     }
-    writeSP();
-    builder.add(statusCode.toString().codeUnits);
-    writeSP();
-    builder.add(reasonPhrase.codeUnits);
-    writeCRLF();
+    buffer[offset++] = _CharCode.SP;
+    write(statusCode.toString().codeUnits);
+    buffer[offset++] = _CharCode.SP;
+    write(reasonPhrase.codeUnits);
+    buffer[offset++] = _CharCode.CR;
+    buffer[offset++] = _CharCode.LF;
 
     var session = _httpRequest._session;
     if (session != null && !session._destroyed) {
@@ -816,9 +835,10 @@
     headers._finalize();
 
     // Write headers.
-    headers._write(builder);
-    writeCRLF();
-    _headersSink.add(builder.takeBytes());
+    offset = headers._write(buffer, offset);
+    buffer[offset++] = _CharCode.CR;
+    buffer[offset++] = _CharCode.LF;
+    _headersSink.add(new Uint8List.view(buffer.buffer, 0, offset));
   }
 
   String _findReasonPhrase(int statusCode) {
@@ -913,13 +933,15 @@
     // GET and HEAD have 'content-length: 0' by default.
     if (method == "GET" || method == "HEAD") {
       contentLength = 0;
+    } else {
+      headers.chunkedTransferEncoding = true;
     }
   }
 
   Future<HttpClientResponse> get done {
     if (_response == null) {
-      _response = Future.wait([_responseCompleter.future,
-                               super.done])
+      _response = Future.wait([_responseCompleter.future, super.done],
+                              eagerError: true)
         .then((list) => list[0]);
     }
     return _response;
@@ -1012,21 +1034,27 @@
   }
 
   void _writeHeader() {
-    var builder = new BytesBuilder();
+    Uint8List buffer = _httpClientConnection._headersBuffer;
+    int offset = 0;
 
-    writeSP() => builder.add(const [_CharCode.SP]);
-
-    writeCRLF() => builder.add(const [_CharCode.CR, _CharCode.LF]);
+    void write(List<int> bytes) {
+      int len = bytes.length;
+      for (int i = 0; i < len; i++) {
+        buffer[offset + i] = bytes[i];
+      }
+      offset += len;
+    }
 
     // Write the request method.
-    builder.add(method.codeUnits);
-    writeSP();
+    write(method.codeUnits);
+    buffer[offset++] = _CharCode.SP;
     // Write the request URI.
-    builder.add(_requestUri().codeUnits);
-    writeSP();
+    write(_requestUri().codeUnits);
+    buffer[offset++] = _CharCode.SP;
     // Write HTTP/1.1.
-    builder.add(_Const.HTTP11);
-    writeCRLF();
+    write(_Const.HTTP11);
+    buffer[offset++] = _CharCode.CR;
+    buffer[offset++] = _CharCode.LF;
 
     // Add the cookies to the headers.
     if (!cookies.isEmpty) {
@@ -1043,9 +1071,10 @@
     headers._finalize();
 
     // Write headers.
-    headers._write(builder);
-    writeCRLF();
-    _headersSink.add(builder.takeBytes());
+    offset = headers._write(buffer, offset);
+    buffer[offset++] = _CharCode.CR;
+    buffer[offset++] = _CharCode.LF;
+    _headersSink.add(new Uint8List.view(buffer.buffer, 0, offset));
   }
 }
 
@@ -1209,6 +1238,7 @@
   Timer _idleTimer;
   bool closed = false;
   Uri _currentUri;
+  final Uint8List _headersBuffer = new Uint8List(_HEADERS_BUFFER_SIZE);
 
   Completer<_HttpIncoming> _nextResponseCompleter;
   Future _streamFuture;
@@ -1273,9 +1303,9 @@
                                          this);
     request.headers.host = uri.host;
     request.headers.port = port;
-    request.headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip");
+    request.headers._add(HttpHeaders.ACCEPT_ENCODING, "gzip");
     if (_httpClient.userAgent != null) {
-      request.headers.set('User-Agent', _httpClient.userAgent);
+      request.headers._add('user-agent', _httpClient.userAgent);
     }
     if (proxy.isAuthenticated) {
       // If the proxy configuration contains user information use that
@@ -1460,9 +1490,9 @@
   bool _closing = false;
 
   final Map<String, Set<_HttpClientConnection>> _idleConnections
-      = new Map<String, Set<_HttpClientConnection>>();
+      = new HashMap<String, Set<_HttpClientConnection>>();
   final Set<_HttpClientConnection> _activeConnections
-      = new Set<_HttpClientConnection>();
+      = new HashSet<_HttpClientConnection>();
   final List<_Credentials> _credentials = [];
   final List<_ProxyCredentials> _proxyCredentials = [];
   Function _authenticate;
@@ -1578,9 +1608,11 @@
       throw new ArgumentError(method);
     }
     if (method != "CONNECT") {
-      if (uri.host.isEmpty ||
-          (uri.scheme != "http" && uri.scheme != "https")) {
-        throw new ArgumentError("Unsupported scheme '${uri.scheme}' in $uri");
+      if (uri.host.isEmpty) {
+        throw new ArgumentError("No host specified in URI $uri");
+      } else if (uri.scheme != "http" && uri.scheme != "https") {
+        throw new ArgumentError(
+            "Unsupported scheme '${uri.scheme}' in URI $uri");
       }
     }
 
@@ -1651,7 +1683,7 @@
       return;
     }
     if (!_idleConnections.containsKey(connection.key)) {
-      _idleConnections[connection.key] = new LinkedHashSet();
+      _idleConnections[connection.key] = new HashSet();
     }
     _idleConnections[connection.key].add(connection);
     connection.startTimer();
@@ -1791,7 +1823,12 @@
       if (option == null) return null;
       Iterator<String> names = option.split(",").map((s) => s.trim()).iterator;
       while (names.moveNext()) {
-        if (url.host.endsWith(names.current)) {
+        var name = names.current;
+        if ((name.startsWith("[") &&
+             name.endsWith("]") &&
+             "[${url.host}]" == name) ||
+            (name.isNotEmpty &&
+             url.host.endsWith(name))) {
           return "DIRECT";
         }
       }
@@ -1800,6 +1837,8 @@
 
     checkProxy(String option) {
       if (option == null) return null;
+      option = option.trim();
+      if (option.isEmpty) return null;
       int pos = option.indexOf("://");
       if (pos >= 0) {
         option = option.substring(pos + 3);
@@ -1808,7 +1847,13 @@
       if (pos >= 0) {
         option = option.substring(0, pos);
       }
-      if (option.indexOf(":") == -1) option = "$option:1080";
+      // Add default port if no port configured.
+      if (option.indexOf("[") == 0) {
+        var pos = option.lastIndexOf(":");
+        if (option.indexOf("]") > pos) option = "$option:1080";
+      } else {
+        if (option.indexOf(":") == -1) option = "$option:1080";
+      }
       return "PROXY $option";
     }
 
@@ -1856,6 +1901,7 @@
   final _HttpParser _httpParser;
   StreamSubscription _subscription;
   Timer _idleTimer;
+  final Uint8List _headersBuffer = new Uint8List(_HEADERS_BUFFER_SIZE);
 
   Future _streamFuture;
 
@@ -2148,12 +2194,15 @@
             password = userinfo.substring(colon + 1).trim();
           }
           // Look for proxy host and port.
-          int colon = proxy.indexOf(":");
+          int colon = proxy.lastIndexOf(":");
           if (colon == -1 || colon == 0 || colon == proxy.length - 1) {
             throw new HttpException(
                 "Invalid proxy configuration $configuration");
           }
           String host = proxy.substring(0, colon).trim();
+          if (host.startsWith("[") && host.endsWith("]")) {
+            host = host.substring(1, host.length - 1);
+          }
           String portString = proxy.substring(colon + 1).trim();
           int port;
           try {
@@ -2526,3 +2575,5 @@
   version = version.substring(0, index);
   return 'Dart/$version (dart:io)';
 }
+
+
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index 058bb67..99bc7c7 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -15,16 +15,17 @@
   // Bytes for "HTTP/1.1".
   static const HTTP11 = const [72, 84, 84, 80, 47, 49, 46, 49];
 
-  static const END_CHUNKED = const [0x30, 13, 10, 13, 10];
-
-  // Bytes for '()<>@,;:\\"/[]?={} \t'.
-  static const SEPARATORS = const [40, 41, 60, 62, 64, 44, 59, 58, 92, 34, 47,
-                                   91, 93, 63, 61, 123, 125, 32, 9];
-
-  // Bytes for '()<>@,;:\\"/[]?={} \t\r\n'.
-  static const SEPARATORS_AND_CR_LF = const [40, 41, 60, 62, 64, 44, 59, 58, 92,
-                                             34, 47, 91, 93, 63, 61, 123, 125,
-                                             32, 9, 13, 10];
+  static const bool T = true;
+  static const bool F = false;
+  // Loopup-map for the following characters: '()<>@,;:\\"/[]?={} \t'.
+  static const SEPARATOR_MAP = const [
+      F,F,F,F,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,F,T,F,F,
+      F,F,F,T,T,F,F,T,F,F,T,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,
+      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+      F,F,F,F,F,F,F,F,F,F,F,F,T,F,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
+      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F];
 }
 
 
@@ -210,9 +211,8 @@
           _pauseStateChanged();
         },
         onCancel: () {
-          try {
+          if (_socketSubscription != null) {
             _socketSubscription.cancel();
-          } catch (e) {
           }
         });
     _reset();
@@ -370,7 +370,9 @@
           if (byte == _CharCode.SP) {
             _state = _State.REQUEST_LINE_URI;
           } else {
-            if (_Const.SEPARATORS_AND_CR_LF.indexOf(byte) != -1) {
+            if (_Const.SEPARATOR_MAP[byte] ||
+                byte == _CharCode.CR ||
+                byte == _CharCode.LF) {
               throw new HttpException("Invalid request method");
             }
             _method_or_status_code.add(byte);
@@ -524,10 +526,10 @@
                 if (tokens[i].toLowerCase() == "upgrade") {
                   _connectionUpgrade = true;
                 }
-                _headers.add(headerField, tokens[i]);
+                _headers._add(headerField, tokens[i]);
               }
             } else {
-              _headers.add(headerField, headerValue);
+              _headers._add(headerField, headerValue);
             }
             _headerField.clear();
             _headerValue.clear();
@@ -665,12 +667,14 @@
             if (_index == 0) {
               data = _buffer;
             } else {
-              data = new Uint8List(dataAvailable);
-              data.setRange(0, dataAvailable, _buffer, _index);
+              data = new Uint8List.view(_buffer.buffer,
+                                        _index,
+                                        dataAvailable);
             }
           } else {
-            data = new Uint8List(_remainingContent);
-            data.setRange(0, _remainingContent, _buffer, _index);
+            data = new Uint8List.view(_buffer.buffer,
+                                      _index,
+                                      _remainingContent);
           }
           _bodyController.add(data);
           if (_remainingContent != -1) {
@@ -835,7 +839,7 @@
   }
 
   bool _isTokenChar(int byte) {
-    return byte > 31 && byte < 128 && _Const.SEPARATORS.indexOf(byte) == -1;
+    return byte > 31 && byte < 128 && !_Const.SEPARATOR_MAP[byte];
   }
 
   List<String> _tokenizeFieldValue(String headerValue) {
@@ -956,7 +960,7 @@
   bool _parserCalled = false;
 
   // The data that is currently being parsed.
-  List<int> _buffer;
+  Uint8List _buffer;
   int _index;
 
   final bool _requestParser;
diff --git a/sdk/lib/io/http_session.dart b/sdk/lib/io/http_session.dart
index 85c9b3c..1b049e3 100644
--- a/sdk/lib/io/http_session.dart
+++ b/sdk/lib/io/http_session.dart
@@ -19,7 +19,7 @@
   _HttpSession _prev;
   _HttpSession _next;
 
-  final Map _data = new Map();
+  final Map _data = new HashMap();
 
   _HttpSession(_HttpSessionManager this._sessionManager, String this.id)
     : _lastSeen = new DateTime.now();
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 0c08ff5..1cf9c4d 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -16,7 +16,8 @@
 
 import 'dart:async';
 import 'dart:_collection-dev';
-import 'dart:collection' show LinkedHashSet,
+import 'dart:collection' show HashMap,
+                              HashSet,
                               LinkedList,
                               LinkedListEntry;
 import 'dart:convert';
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 82aef2a..7f07234 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -15,6 +15,13 @@
   factory Link(String path) => new _Link(path);
 
   /**
+   * Create a Lint object from a URI.
+   *
+   * If [uri] cannot reference a link this throws [UnsupportedError].
+   */
+  factory Link.fromUri(Uri uri) => new Link(uri.toFilePath());
+
+  /**
    * Creates a symbolic link. Returns a [:Future<Link>:] that completes with
    * the link when it has been created. If the link exists,
    * the future will complete with an error.
@@ -143,7 +150,6 @@
     }
   }
 
-
   String toString() => "Link: '$path'";
 
   Future<bool> exists() => FileSystemEntity.isLink(path);
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index 5ca1597..7a4f917 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -95,6 +95,14 @@
    * streams of processes started with [:Process.start:]. If the user
    * does not read all data on the streams the underlying system
    * resources will not be freed since there is still pending data.
+   *
+   * The following code uses `Process.start` to grep for `main` in the
+   * file `test.dart` on Linux.
+   *
+   *     Process.start('grep', ['-i', 'main', 'test.dart']).then((process) {
+   *       stdout.addStream(process.stdout);
+   *       stderr.addStream(process.stderr);
+   *     });
    */
   external static Future<Process> start(
       String executable,
@@ -136,6 +144,14 @@
    * Returns a `Future<ProcessResult>` that completes with the
    * result of running the process, i.e., exit code, standard out and
    * standard in.
+   *
+   * The following code uses `Process.run` to grep for `main` in the
+   * file `test.dart` on Linux.
+   *
+   *     Process.run('grep', ['-i', 'main', 'test.dart']).then((result) {
+   *       stdout.write(result.stdout);
+   *       stderr.write(result.stderr);
+   *     });
    */
   external static Future<ProcessResult> run(
       String executable,
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index f821d8b..f1ceec5 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -77,12 +77,15 @@
   InternetAddressType type;
 
   /**
-   * The resolved address of the host.
+   * The numeric address of the host. For IPv4 addresses this is using
+   * the dotted-decimal notation. For IPv6 it is using the
+   * hexadecimal representation.
    */
   String get address;
 
   /**
-   * The host used to lookup the address.
+   * The host used to lookup the address. If there is no host
+   * associated with the address this returns the numeric address.
    */
   String get host;
 
@@ -97,6 +100,20 @@
   bool get isLinkLocal;
 
   /**
+   * Returns true if the [InternetAddress]s scope is multicast.
+   */
+  bool get isMulticast;
+
+  /**
+   * Creates a new [InternetAddress] from a numeric address.
+   *
+   * If the address in [address] is not a numeric IPv4
+   * (dotted-decimal notation) or IPv6 (hexadecimal representation).
+   * address [ArgumentError] is thrown.
+   */
+  external factory InternetAddress(String address);
+
+  /**
    * Perform a reverse dns lookup on the [address], creating a new
    * [InternetAddress] where the host field set to the result.
    */
@@ -507,11 +524,7 @@
       sb.write(": $osError");
     }
     if (address != null) {
-      if (address.host.isNotEmpty) {
-        sb.write(", address = ${address.host}");
-      } else {
-        sb.write(", address = ${address.address}");
-      }
+      sb.write(", address = ${address.host}");
     }
     if (port != null) {
       sb.write(", port = $port");
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 0865aae..b0e246d 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -171,6 +171,7 @@
   Future get done => _sink.done;
 }
 
+/// The type of object a standard IO stream is attached to.
 class StdioType {
   static const StdioType TERMINAL = const StdioType._("terminal");
   static const StdioType PIPE = const StdioType._("pipe");
@@ -187,6 +188,7 @@
 IOSink _stderr;
 
 
+/// The standard input stream of data read by this program.
 Stdin get stdin {
   if (_stdin == null) {
     _stdin = _StdIOUtils._getStdioInputStream();
@@ -195,6 +197,7 @@
 }
 
 
+/// The standard output stream of data written by this program.
 IOSink get stdout {
   if (_stdout == null) {
     _stdout = _StdIOUtils._getStdioOutputStream(1);
@@ -203,6 +206,7 @@
 }
 
 
+/// The standard output stream of errors written by this program.
 IOSink get stderr {
   if (_stderr == null) {
     _stderr = _StdIOUtils._getStdioOutputStream(2);
@@ -211,6 +215,8 @@
 }
 
 
+/// For a stream, returns whether it is attached to a file, pipe, terminal, or
+/// something else.
 StdioType stdioType(object) {
   if (object is _StdStream) {
     object = object._stream;
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index 091f0d6..af3cce7 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -4,6 +4,7 @@
 
 part of dart.io;
 
+/// The current system encoding.
 const SystemEncoding SYSTEM_ENCODING = const SystemEncoding();
 
 /**
diff --git a/sdk/lib/io/timer_impl.dart b/sdk/lib/io/timer_impl.dart
index 49c0b43..1d7b277 100644
--- a/sdk/lib/io/timer_impl.dart
+++ b/sdk/lib/io/timer_impl.dart
@@ -16,15 +16,17 @@
 
   Function _callback;
   int _milliSeconds;
-  int _wakeupTime;
+  int _wakeupTime = 0;
 
   static Timer _createTimer(void callback(Timer timer),
                             int milliSeconds,
                             bool repeating) {
     _Timer timer = new _Timer._internal();
     timer._callback = callback;
-    timer._wakeupTime =
-        new DateTime.now().millisecondsSinceEpoch + milliSeconds;
+    if (milliSeconds > 0) {
+      timer._wakeupTime =
+          new DateTime.now().millisecondsSinceEpoch + milliSeconds;
+    }
     timer._milliSeconds = repeating ? milliSeconds : -1;
     timer._addTimerToList();
     timer._notifyEventHandler();
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 6440bc4..c6b9253 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -15,7 +15,6 @@
 library dart.isolate;
 
 import "dart:async";
-import "dart:collection" show HashMap;
 
 /**
  * Thrown when an isolate cannot be created.
@@ -39,15 +38,18 @@
    * isolate.
    *
    * The argument [entryPoint] specifies the entry point of the spawned
-   * isolate. It must be a static top-level function or a static method that
-   * takes no arguments. It is not allowed to pass a function closure.
+   * isolate. It must be a top-level function or a static method that
+   * takes one argument - that is, one-parameter functions that can be
+   * compile-time constant function values.
+   * It is not allowed to pass the value of function expressions or an instance
+   * method extracted from an object.
    *
    * The entry-point function is invoked with the initial [message].
    * Usually the initial [message] contains a [SendPort] so
    * that the spawner and spawnee can communicate with each other.
    *
-   * Returns a future that will complete with an [Isolate] instance. The
-   * isolate instance can be used to control the spawned isolate.
+   * Returns a future that will complete with an [Isolate] instance if the
+   * spawning succeeded. It will complete with an error otherwise.
    */
   external static Future<Isolate> spawn(void entryPoint(message), var message);
 
@@ -58,17 +60,17 @@
    * The isolate starts executing the top-level `main` function of the library
    * with the given URI.
    *
-   * The target `main` may have one of the four following signatures:
+   * The target `main` must be a subtype of one of these three signatures:
    *
    * * `main()`
    * * `main(args)`
    * * `main(args, message)`
    *
-   * When present, the argument `message` is set to the initial [message].
-   * When present, the argument `args` is set to the provided [args] list.
+   * When present, the parameter `args` is set to the provided [args] list.
+   * When present, the parameter `message` is set to the initial [message].
    *
-   * Returns a future that will complete with an [Isolate] instance. The
-   * isolate instance can be used to control the spawned isolate.
+   * Returns a future that will complete with an [Isolate] instance if the
+   * spawning succeeded. It will complete with an error otherwise.
    */
   external static Future<Isolate> spawnUri(
       Uri uri, List<String> args, var message);
@@ -78,7 +80,7 @@
  * Sends messages to its [ReceivePort]s.
  *
  * [SendPort]s are created from [ReceivePort]s. Any message sent through
- * a [SendPort] is delivered to its respective [ReceivePort]. There might be
+ * a [SendPort] is delivered to its corresponding [ReceivePort]. There might be
  * many [SendPort]s for the same [ReceivePort].
  *
  * [SendPort]s can be transmitted to other isolates.
@@ -86,15 +88,15 @@
 abstract class SendPort {
 
   /**
-   * Sends an asynchronous [message] to this send port. The message is copied to
-   * the receiving isolate.
+   * Sends an asynchronous [message] through this send port, to its
+   * corresponding `ReceivePort`.
    *
    * The content of [message] can be: primitive values (null, num, bool, double,
    * String), instances of [SendPort], and lists and maps whose elements are any
    * of these. List and maps are also allowed to be cyclic.
    *
    * In the special circumstances when two isolates share the same code and are
-   * running in the same process (e.g. isolates created via [spawnFunction]), it
+   * running in the same process (e.g. isolates created via [Isolate.spawn]), it
    * is also possible to send object instances (which would be copied in the
    * process). This is currently only supported by the dartvm.  For now, the
    * dart2js compiler only supports the restricted messages described above.
@@ -117,10 +119,10 @@
 /**
  * Together with [SendPort], the only means of communication between isolates.
  *
- * [ReceivePort]s have a `sendport` getter which returns a [SendPort].
+ * [ReceivePort]s have a `sendPort` getter which returns a [SendPort].
  * Any message that is sent through this [SendPort]
  * is delivered to the [ReceivePort] it has been created from. There, the
- * message is dispatched to its listener.
+ * message is dispatched to the `ReceivePort`'s listener.
  *
  * A [ReceivePort] is a non-broadcast stream. This means that it buffers
  * incoming messages until a listener is registered. Only one listener can
@@ -154,8 +156,11 @@
   /**
    * Inherited from [Stream].
    *
-   * Note that all named arguments are ignored since a ReceivePort will never
-   * receive an error, or done message.
+   * Note that [onError] and [cancelOnError] are ignored since a ReceivePort
+   * will never receive an error.
+   *
+   * The [onDone] handler will be called when the stream closes.
+   * The stream closes when [close] is called.
    */
   StreamSubscription listen(void onData(var message),
                             { Function onError,
@@ -173,7 +178,7 @@
   void close();
 
   /**
-   * Returns a send port that sends to this receive port.
+   * Returns a [SendPort] that sends to this receive port.
    */
   SendPort get sendPort;
 }
@@ -201,6 +206,11 @@
    * After a call to this method any incoming message is silently dropped.
    */
   void close();
+
+  /**
+   * Returns a [SendPort] that sends to this receive port.
+   */
+  SendPort get sendPort;
 }
 
 /**
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 6de9a37..027b197 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -875,6 +875,10 @@
 abstract class TypedefMirror implements TypeMirror {
   /**
    * The defining type for this typedef.
+   * If the the type referred to by the reflectee is a function type 
+   * *F*, the result will be [:FunctionTypeMirror:] reflecting *F*
+   * which is abstract and has an abstract method [:call:] whose 
+   * signature corresponds to *F*.
    *
    * For instance [:void f(int):] is the referent for [:typedef void f(int):].
    */
diff --git a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
index b52d22b..6bcb22e 100644
--- a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
@@ -10,7 +10,9 @@
 
 import 'dart:collection';
 import 'dart:_collection-dev';
-import 'dart:_js_helper' show Creates, JavaScriptIndexingBehavior, JSName, Null, Returns;
+import 'dart:_interceptors' show JSIndexable;
+import 'dart:_js_helper'
+    show Creates, JavaScriptIndexingBehavior, JSName, Null, Returns;
 import 'dart:_foreign_helper' show JS, JS_CONST;
 import 'dart:math' as Math;
 
@@ -40,18 +42,6 @@
   final int lengthInBytes;
 }
 
-// TODO(12929): Remove this constant once V8 optimizes length access of
-// typed arrays. Firefox does not like accessing a named property of a
-// typed array, so we only use the new [:$dartCachedLength:] property in V8 and
-// Chrome.
-const fetchLength = const JS_CONST(r'''
-    ((typeof version == "function" && typeof os == "object" && "system" in os)
-    || (typeof navigator == "object"
-        && navigator.userAgent.indexOf('Chrome') != -1))
-        ? function(x) { return x.$dartCachedLength || x.length; }
-        : function(x) { return x.length; };
-''');
-
 /**
  * A typed view of a sequence of bytes.
  */
@@ -96,12 +86,6 @@
     }
   }
 
-  // TODO(12929): Remove this method once V8 optimizes length access of
-  // typed arrays.
-  void _setCachedLength() {
-    JS('void', r'#.$dartCachedLength = #.length', this, this);
-  }
-
   int _checkSublistArguments(int start, int end, int length) {
     // For `sublist` the [start] and [end] indices are allowed to be equal to
     // [length]. However, [_checkIndex] only allows indices in the range
@@ -119,7 +103,12 @@
 // Ensures that [list] is a JavaScript Array or a typed array.  If necessary,
 // returns a copy of the list.
 List _ensureNativeList(List list) {
-  return list;  // TODO: make sure.
+  if (list is JSIndexable) return list;
+  List result = new List(list.length);
+  for (int i = 0; i < list.length; i++) {
+    result[i] = list[i];
+  }
+  return result;
 }
 
 
@@ -178,6 +167,8 @@
   num getFloat32(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
       _getFloat32(byteOffset, endian._littleEndian);
 
+  int get elementSizeInBytes => 1;
+
   @JSName('getFloat32')
   @Returns('num')
   num _getFloat32(int byteOffset, [bool littleEndian]) native;
@@ -454,14 +445,13 @@
   void setUint8(int byteOffset, int value) native;
 
   static ByteData _create1(arg) =>
-      JS('ByteData', 'new DataView(new ArrayBuffer(#))', arg).._setCachedLength();
+      JS('ByteData', 'new DataView(new ArrayBuffer(#))', arg);
 
   static ByteData _create2(arg1, arg2) =>
-      JS('ByteData', 'new DataView(#, #)', arg1, arg2).._setCachedLength();
+      JS('ByteData', 'new DataView(#, #)', arg1, arg2);
 
   static ByteData _create3(arg1, arg2, arg3) =>
-      JS('ByteData', 'new DataView(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('ByteData', 'new DataView(#, #, #)', arg1, arg2, arg3);
 }
 
 /**
@@ -510,7 +500,7 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   num operator[](int index) {
     _checkIndex(index, length);
@@ -525,20 +515,17 @@
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('Float32List', '#.subarray(#, #)', this, start, end);
-    source._setCachedLength();
     return _create1(source);
   }
 
   static Float32List _create1(arg) =>
-      JS('Float32List', 'new Float32Array(#)', arg).._setCachedLength();
+      JS('Float32List', 'new Float32Array(#)', arg);
 
   static Float32List _create2(arg1, arg2) =>
-      JS('Float32List', 'new Float32Array(#, #)', arg1, arg2)
-          .._setCachedLength();
+      JS('Float32List', 'new Float32Array(#, #)', arg1, arg2);
 
   static Float32List _create3(arg1, arg2, arg3) =>
-      JS('Float32List', 'new Float32Array(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Float32List', 'new Float32Array(#, #, #)', arg1, arg2, arg3);
 }
 
 
@@ -588,7 +575,7 @@
 
   static const int BYTES_PER_ELEMENT = 8;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   num operator[](int index) {
     _checkIndex(index, length);
@@ -603,22 +590,19 @@
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('Float64List', '#.subarray(#, #)', this, start, end);
-    source._setCachedLength();
     return _create1(source);
   }
 
   static Float64List _create1(arg) {
-    return JS('Float64List', 'new Float64Array(#)', arg).._setCachedLength();
+    return JS('Float64List', 'new Float64Array(#)', arg);
   }
 
   static Float64List _create2(arg1, arg2) {
-    return JS('Float64List', 'new Float64Array(#, #)', arg1, arg2)
-        .._setCachedLength();
+    return JS('Float64List', 'new Float64Array(#, #)', arg1, arg2);
   }
 
   static Float64List _create3(arg1, arg2, arg3) {
-    return JS('Float64List', 'new Float64Array(#, #, #)', arg1, arg2, arg3)
-        .._setCachedLength();
+    return JS('Float64List', 'new Float64Array(#, #, #)', arg1, arg2, arg3);
   }
 }
 
@@ -667,7 +651,7 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -681,20 +665,18 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Int16List', '#.subarray(#, #)', this, start, end)
-        .._setCachedLength();
+    var source = JS('Int16List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static Int16List _create1(arg) =>
-      JS('Int16List', 'new Int16Array(#)', arg).._setCachedLength();
+      JS('Int16List', 'new Int16Array(#)', arg);
 
   static Int16List _create2(arg1, arg2) =>
-      JS('Int16List', 'new Int16Array(#, #)', arg1, arg2).._setCachedLength();
+      JS('Int16List', 'new Int16Array(#, #)', arg1, arg2);
 
   static Int16List _create3(arg1, arg2, arg3) =>
-      JS('Int16List', 'new Int16Array(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Int16List', 'new Int16Array(#, #, #)', arg1, arg2, arg3);
 }
 
 
@@ -742,7 +724,7 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -756,20 +738,18 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Int32List', '#.subarray(#, #)', this, start, end)
-        .._setCachedLength();
+    var source = JS('Int32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static Int32List _create1(arg) =>
-      JS('Int32List', 'new Int32Array(#)', arg).._setCachedLength();
+      JS('Int32List', 'new Int32Array(#)', arg);
 
   static Int32List _create2(arg1, arg2) =>
-      JS('Int32List', 'new Int32Array(#, #)', arg1, arg2).._setCachedLength();
+      JS('Int32List', 'new Int32Array(#, #)', arg1, arg2);
 
   static Int32List _create3(arg1, arg2, arg3) =>
-      JS('Int32List', 'new Int32Array(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Int32List', 'new Int32Array(#, #, #)', arg1, arg2, arg3);
 }
 
 
@@ -814,7 +794,7 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -828,20 +808,18 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Int8List', '#.subarray(#, #)', this, start, end)
-        .._setCachedLength();
+    var source = JS('Int8List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static Int8List _create1(arg) =>
-      JS('Int8List', 'new Int8Array(#)', arg).._setCachedLength();
+      JS('Int8List', 'new Int8Array(#)', arg);
 
   static Int8List _create2(arg1, arg2) =>
-      JS('Int8List', 'new Int8Array(#, #)', arg1, arg2).._setCachedLength();
+      JS('Int8List', 'new Int8Array(#, #)', arg1, arg2);
 
   static Int8List _create3(arg1, arg2, arg3) =>
-      JS('Int8List', 'new Int8Array(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Int8List', 'new Int8Array(#, #, #)', arg1, arg2, arg3);
 }
 
 
@@ -890,7 +868,7 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -904,20 +882,18 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint16List', '#.subarray(#, #)', this, start, end)
-        .._setCachedLength();
+    var source = JS('Uint16List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static Uint16List _create1(arg) =>
-      JS('Uint16List', 'new Uint16Array(#)', arg).._setCachedLength();
+      JS('Uint16List', 'new Uint16Array(#)', arg);
 
   static Uint16List _create2(arg1, arg2) =>
-      JS('Uint16List', 'new Uint16Array(#, #)', arg1, arg2).._setCachedLength();
+      JS('Uint16List', 'new Uint16Array(#, #)', arg1, arg2);
 
   static Uint16List _create3(arg1, arg2, arg3) =>
-      JS('Uint16List', 'new Uint16Array(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Uint16List', 'new Uint16Array(#, #, #)', arg1, arg2, arg3);
 }
 
 
@@ -966,7 +942,7 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -980,20 +956,18 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint32List', '#.subarray(#, #)', this, start, end)
-        .._setCachedLength();
+    var source = JS('Uint32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static Uint32List _create1(arg) =>
-      JS('Uint32List', 'new Uint32Array(#)', arg).._setCachedLength();
+      JS('Uint32List', 'new Uint32Array(#)', arg);
 
   static Uint32List _create2(arg1, arg2) =>
-      JS('Uint32List', 'new Uint32Array(#, #)', arg1, arg2).._setCachedLength();
+      JS('Uint32List', 'new Uint32Array(#, #)', arg1, arg2);
 
   static Uint32List _create3(arg1, arg2, arg3) =>
-      JS('Uint32List', 'new Uint32Array(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Uint32List', 'new Uint32Array(#, #, #)', arg1, arg2, arg3);
 }
 
 
@@ -1039,7 +1013,7 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -1053,22 +1027,19 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint8ClampedList', '#.subarray(#, #)', this, start, end)
-        .._setCachedLength();
+    var source = JS('Uint8ClampedList', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static Uint8ClampedList _create1(arg) =>
-      JS('Uint8ClampedList', 'new Uint8ClampedArray(#)', arg)
-          .._setCachedLength();
+      JS('Uint8ClampedList', 'new Uint8ClampedArray(#)', arg);
 
   static Uint8ClampedList _create2(arg1, arg2) =>
-      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #)', arg1, arg2)
-          .._setCachedLength();
+      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #)', arg1, arg2);
 
   static Uint8ClampedList _create3(arg1, arg2, arg3) =>
-      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #, #)',
+         arg1, arg2, arg3);
 }
 
 
@@ -1118,7 +1089,7 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  int get length => JS("int", '#(#)', fetchLength, this);
+  int get length => JS("int", '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -1132,20 +1103,18 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint8List', '#.subarray(#, #)', this, start, end)
-        .._setCachedLength();
+    var source = JS('Uint8List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static Uint8List _create1(arg) =>
-      JS('Uint8List', 'new Uint8Array(#)', arg).._setCachedLength();
+      JS('Uint8List', 'new Uint8Array(#)', arg);
 
   static Uint8List _create2(arg1, arg2) =>
-      JS('Uint8List', 'new Uint8Array(#, #)', arg1, arg2).._setCachedLength();
+      JS('Uint8List', 'new Uint8Array(#, #)', arg1, arg2);
 
   static Uint8List _create3(arg1, arg2, arg3) =>
-      JS('Uint8List', 'new Uint8Array(#, #, #)', arg1, arg2, arg3)
-          .._setCachedLength();
+      JS('Uint8List', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
 }
 
 
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 08468cf..211c085 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -13,9 +13,6 @@
 # TBF: infinite look: class A {const A();final m = const A();}
 Language/12_Expressions/01_Constants_A17_t03: fail
 
-# TBF: malformed or malbounded type in "conts" is static warning
-Language/12_Expressions/12_Instance_Creation_A01_t08: Fail
-
 # TBF: it seems that "12.15.3 Unqualied Invocation" was changed, so it may be not an error anymore to call unknown function from top-level
 Language/13_Statements/04_Local_Function_Declaration_A04_t02: Fail # co19-roll r641: Please triage this failure
 
@@ -31,39 +28,16 @@
 
 # co19 issue #455, undeclared identifier is static warning
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: fail, OK
-Language/13_Statements/04_Local_Function_Declaration_A02_t02: fail, OK
 Language/14_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
 Language/14_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
 
-# co19 issue #513, rules for finals were loosened, contradiction in spec was fixed
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A21_t01: fail, OK
-
-# co19 issue #515, it is a compile-time error if there is more than one entity with the same name declared in the same scope
-Language/07_Classes/3_Setters_A08_t03: fail, OK
-
-# co19 issue #593: Conditional expressions are now allowed as constant expressions
-Language/12_Expressions/01_Constants_A15_t16: fail, OK
-
 # co19 issue #438, Static variables are initialized lazily, need not be constants
 Language/12_Expressions/01_Constants_A16_t01: fail, OK
 Language/12_Expressions/01_Constants_A16_t02: fail, OK
 
-# co19 issue #420, "throw" requires expression, "rethrow" should be used instead
-Language/12_Expressions/08_Throw_A05_t01: fail, OK
-Language/12_Expressions/08_Throw_A05_t02: fail, OK
-Language/12_Expressions/08_Throw_A05_t03: fail, OK
-
 # co19 issue #454 (wrongly closed)
 Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail, OK
 
-# co19 issue #528, Const: wrong number of type arguments
-Language/12_Expressions/12_Instance_Creation_A01_t05: fail, OK
-Language/12_Expressions/12_Instance_Creation_A01_t06: fail, OK
-
-# co19 issue #541: tests contain unqualified reference to static members defined in superclass
-Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: fail, OK
-Language/12_Expressions/30_Identifier_Reference_A14_t03: fail, OK
-
 # co19 issue #543: invocation of a non-function
 Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t02: fail, OK
 
@@ -74,97 +48,7 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue #617: "hasNext" is not a function; "Expec"
-LibTest/collection/HasNextIterator/HasNextIterator_A01_t01: Fail, OK
-
-# co19 issue #623: main() { {}; } is block and empty statement, not a map
-Language/13_Statements/02_Expression_Statements_A01_t13: Fail, OK
-
-# co19 issue #626: StreamTransformers have been refactored.
-LibTest/async/EventTransformStream/EventTransformStream_A01_t01: Fail
-LibTest/async/EventTransformStream/EventTransformStream_A01_t02: Fail
-LibTest/async/EventTransformStream/any_A01_t01: Fail
-LibTest/async/EventTransformStream/any_A02_t01: Fail
-LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: Fail
-LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: Fail
-LibTest/async/EventTransformStream/asBroadcastStream_A02_t01: Fail
-LibTest/async/EventTransformStream/contains_A01_t01: Fail
-LibTest/async/EventTransformStream/contains_A02_t01: Fail
-LibTest/async/EventTransformStream/contains_A03_t01: Fail
-LibTest/async/EventTransformStream/distinct_A01_t01: Fail
-LibTest/async/EventTransformStream/distinct_A01_t02: Fail
-LibTest/async/EventTransformStream/drain_A01_t01: Fail
-LibTest/async/EventTransformStream/drain_A02_t01: Fail
-LibTest/async/EventTransformStream/drain_A02_t02: Fail
-LibTest/async/EventTransformStream/elementAt_A01_t01: Fail
-LibTest/async/EventTransformStream/elementAt_A02_t01: Fail
-LibTest/async/EventTransformStream/elementAt_A03_t01: Fail
-LibTest/async/EventTransformStream/every_A01_t01: Fail
-LibTest/async/EventTransformStream/every_A02_t01: Fail
-LibTest/async/EventTransformStream/expand_A01_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A01_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A02_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A03_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A03_t02: Fail
-LibTest/async/EventTransformStream/first_A01_t01: Fail
-LibTest/async/EventTransformStream/first_A02_t01: Fail
-LibTest/async/EventTransformStream/first_A03_t01: Fail
-LibTest/async/EventTransformStream/fold_A01_t01: Fail
-LibTest/async/EventTransformStream/fold_A01_t02: Fail
-LibTest/async/EventTransformStream/forEach_A01_t01: Fail
-LibTest/async/EventTransformStream/forEach_A02_t01: Fail
-LibTest/async/EventTransformStream/forEach_A02_t02: Fail
-LibTest/async/EventTransformStream/handleError_A01_t01: Fail
-LibTest/async/EventTransformStream/handleError_A02_t01: Fail
-LibTest/async/EventTransformStream/handleError_A03_t01: Fail
-LibTest/async/EventTransformStream/isBroadcast_A01_t01: Fail
-LibTest/async/EventTransformStream/isBroadcast_A01_t02: Fail
-LibTest/async/EventTransformStream/isEmpty_A01_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A01_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A02_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A03_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A04_t01: Fail
-LibTest/async/EventTransformStream/last_A01_t01: Fail
-LibTest/async/EventTransformStream/last_A02_t01: Fail
-LibTest/async/EventTransformStream/length_A01_t01: Fail
-LibTest/async/EventTransformStream/listen_A01_t01: Fail
-LibTest/async/EventTransformStream/listen_A02_t01: Fail
-LibTest/async/EventTransformStream/listen_A03_t01: Fail
-LibTest/async/EventTransformStream/listen_A04_t01: Fail
-LibTest/async/EventTransformStream/map_A01_t01: Fail
-LibTest/async/EventTransformStream/reduce_A01_t01: Fail
-LibTest/async/EventTransformStream/reduce_A01_t02: Fail
-LibTest/async/EventTransformStream/reduce_A01_t03: Fail
-LibTest/async/EventTransformStream/singleWhere_A01_t01: Fail
-LibTest/async/EventTransformStream/singleWhere_A02_t01: Fail
-LibTest/async/EventTransformStream/single_A01_t01: Fail
-LibTest/async/EventTransformStream/single_A02_t01: Fail
-LibTest/async/EventTransformStream/skipWhile_A01_t01: Fail
-LibTest/async/EventTransformStream/skip_A01_t01: Fail
-LibTest/async/EventTransformStream/takeWhile_A01_t01: Fail
-LibTest/async/EventTransformStream/take_A01_t01: Fail
-LibTest/async/EventTransformStream/take_A01_t02: Fail
-LibTest/async/EventTransformStream/take_A01_t03: Fail
-LibTest/async/EventTransformStream/toList_A01_t01: Fail
-LibTest/async/EventTransformStream/toSet_A01_t01: Fail
-LibTest/async/EventTransformStream/transform_A01_t01: Fail
-LibTest/async/EventTransformStream/where_A01_t01: Fail
-LibTest/async/EventTransformStream/where_A01_t02: Fail
-LibTest/async/StreamEventTransformer/bind_A01_t01: Fail
-LibTest/async/StreamEventTransformer/handleData_A01_t01: Fail
-LibTest/async/StreamEventTransformer/handleDone_A01_t01: Fail
-LibTest/async/StreamEventTransformer/handleError_A01_t01: Fail
-
 # co19 issue 639.
-Language/12_Expressions/12_Spawning_an_Isolate_A01_t01: Fail
-LibTest/isolate/IsolateSink/add_A01_t01: Fail
-LibTest/isolate/IsolateSink/add_A01_t02: Fail
-LibTest/isolate/IsolateSink/add_A02_t01: Fail
-LibTest/isolate/IsolateSink/close_A01_t01: Fail
-LibTest/isolate/IsolateSink/close_A01_t02: Fail
-LibTest/isolate/IsolateSink/close_A01_t03: Fail
-LibTest/isolate/IsolateSink/close_A01_t04: Fail
-LibTest/isolate/IsolateSink/operator_equality_A01_t01: Fail
 LibTest/isolate/IsolateStream/any_A01_t01: Fail
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail
@@ -195,25 +79,6 @@
 LibTest/isolate/SendPort/send_A02_t06: Fail
 LibTest/isolate/SendPort/send_A03_t01: Fail
 LibTest/isolate/SendPort/send_A03_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t01: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t03: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t04: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t05: Fail
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: Fail
-LibTest/isolate/isolate_api/spawnFunction_A04_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A04_t03: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t04: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t05: Fail
-LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: Fail
-LibTest/isolate/isolate_api/stream_A01_t01: Fail
-LibTest/isolate/isolate_api/port_A01_t01: Fail
-LibTest/isolate/IsolateSink/addError_A01_t01: Fail
-LibTest/isolate/IsolateSink/addError_A01_t02: Fail
 LibTest/isolate/IsolateStream/any_A02_t01: Fail
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail
@@ -221,44 +86,12 @@
 LibTest/isolate/SendPort/send_A01_t01: Fail
 LibTest/isolate/SendPort/send_A02_t02: Fail
 LibTest/isolate/SendPort/send_A02_t03: Fail
-LibTest/isolate/isolate_api/spawnFunction_A02_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A04_t01: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t01: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail
-LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: Fail
-LibTest/isolate/isolate_api/streamSpawnFunction_A02_t02: Fail
-
-#co19 issue 631
-Language/12_Expressions/30_Identifier_Reference_A02_t01: Fail
-Language/13_Statements/03_Variable_Declaration_A01_t09: Fail
-Language/13_Statements/03_Variable_Declaration_A01_t16: Fail
-
-Language/13_Statements/09_Switch_A02_t04: Fail  # Issue 629
 
 # co19 issue 642, The argument type 'int' cannot be assigned to the parameter type 'Iterable'
 LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Fail, OK
 LibTest/collection/ListQueue/ListQueue_class_A01_t01: Fail, OK
 LibTest/collection/Queue/Queue_class_A01_t01: Fail, OK
 
-# co19 issue 644, The argument type 'int' cannot be assigned to the parameter type '(String, Object) -> void'
-LibTest/collection/LinkedHashMap/allTests_A01_t01: Fail, OK
-
-# co19 issue 645, "15.7 Type Void". Likewise, passing the result of a void method as a parameter or assigning it to a variable will cause a warning unless the variable/formal parameter has type dynamic.
-Language/06_Functions/06_Functions_A04_t01: Fail, OK
-
-# co19 issue 646, I don't see where Spec requires any warning for boolean conversion
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: MissingStaticWarning
-
-# co19 issue #652, test is invalid, class "C" is not inherited from "A"
-Language/07_Classes/1_Instance_Methods_A07_t02: MissingStaticWarning, OK
-
-# co19 issue #653, instance method setter with the same name
-Language/07_Classes/3_Setters_A04_t02: StaticWarning, OK
-Language/07_Classes/3_Setters_A04_t03: StaticWarning, OK
-Language/07_Classes/3_Setters_A04_t04: StaticWarning, OK
-
-
 
 Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: MissingStaticWarning
 Language/12_Expressions/19_Conditional_A01_t14: MissingStaticWarning
@@ -278,7 +111,6 @@
 Language/12_Expressions/26_Multiplicative_Expressions_A01_t17: MissingStaticWarning
 Language/12_Expressions/27_Unary_Expressions_A01_t21: MissingStaticWarning
 Language/12_Expressions/29_Assignable_Expressions_A01_t09: MissingStaticWarning
-Language/12_Expressions/30_Identifier_Reference_A07_t01: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t07: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t08: MissingStaticWarning
 Language/13_Statements/09_Switch_A10_t03: MissingStaticWarning
@@ -292,11 +124,15 @@
 Language/05_Variables/05_Variables_A06_t01: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/05_Variables/05_Variables_A06_t02: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/05_Variables/05_Variables_A06_t03: MissingCompileTimeError # co19-roll r651: Please triage this failure
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t03: MissingStaticWarning # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t13: CompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # co19-roll r651: Please triage this failure
 
+Language/07_Classes/10_Superinterfaces_A07_t05: StaticWarning # co19-roll r667: Please triage this failure
+LibTest/convert/JsonEncoder/JsonEncoder_A01_t01: StaticWarning # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnFunction_A02_t02: CompileTimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t01: CompileTimeError # co19-roll r667: Please triage this failure
+
 # co19 issue 656
 LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
@@ -306,4 +142,4 @@
 LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
\ No newline at end of file
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 99b4ee0..b93b952 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -13,9 +13,6 @@
 # TBF: infinite look: class A {const A();final m = const A();}
 Language/12_Expressions/01_Constants_A17_t03: fail
 
-# TBF: malformed or malbounded type in "conts" is static warning
-Language/12_Expressions/12_Instance_Creation_A01_t08: Fail
-
 # TBF: it seems that "12.15.3 Unqualied Invocation" was changed, so it may be not an error anymore to call unknown function from top-level
 Language/13_Statements/04_Local_Function_Declaration_A04_t02: Fail # co19-roll r641: Please triage this failure
 
@@ -23,55 +20,24 @@
 Language/07_Classes/1_Instance_Methods_A04_t02: MissingStaticWarning
 Language/07_Classes/4_Abstract_Instance_Members_A07_t04: MissingStaticWarning
 
-# TBF: It is a static warning if a class C declares an instance method named n and has a setter named n=.
-Language/07_Classes/1_Instance_Methods_A07_t01: MissingStaticWarning
-Language/07_Classes/1_Instance_Methods_A07_t02: MissingStaticWarning
-
 # TBF: Static members should not be accessible via subclasses.
-Language/07_Classes/7_Static_Methods_A01_t03: MissingStaticWarning
 Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t05: MissingStaticWarning
-Language/08_Interfaces/5_Superinterfaces/1_Inheritance_and_Overriding_A01_t02: MissingStaticWarning
-
-
 
 # co19 issue #442, undefined name "Expect"
 Language/15_Types/4_Interface_Types_A08_t03: fail, OK
 
 # co19 issue #455, undeclared identifier is static warning
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: fail, OK
-Language/13_Statements/04_Local_Function_Declaration_A02_t02: fail, OK
 Language/14_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
 Language/14_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
 
-# co19 issue #513, rules for finals were loosened, contradiction in spec was fixed
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A21_t01: fail, OK
-
-# co19 issue #515, it is a compile-time error if there is more than one entity with the same name declared in the same scope
-Language/07_Classes/3_Setters_A08_t03: fail, OK
-
-# co19 issue #593: Conditional expressions are now allowed as constant expressions
-Language/12_Expressions/01_Constants_A15_t16: fail, OK
-
 # co19 issue #438, Static variables are initialized lazily, need not be constants
 Language/12_Expressions/01_Constants_A16_t01: fail, OK
 Language/12_Expressions/01_Constants_A16_t02: fail, OK
 
-# co19 issue #420, "throw" requires expression, "rethrow" should be used instead
-Language/12_Expressions/08_Throw_A05_t01: fail, OK
-Language/12_Expressions/08_Throw_A05_t02: fail, OK
-Language/12_Expressions/08_Throw_A05_t03: fail, OK
-
 # co19 issue #454 (wrongly closed)
 Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail, OK
 
-# co19 issue #528, Const: wrong number of type arguments
-Language/12_Expressions/12_Instance_Creation_A01_t05: fail, OK
-Language/12_Expressions/12_Instance_Creation_A01_t06: fail, OK
-
-# co19 issue #541: tests contain unqualified reference to static members defined in superclass
-Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: fail, OK
-Language/12_Expressions/30_Identifier_Reference_A14_t03: fail, OK
-
 # co19 issue #543: invocation of a non-function
 Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t02: fail, OK
 
@@ -82,97 +48,7 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue #617: "hasNext" is not a function; "Expec"
-LibTest/collection/HasNextIterator/HasNextIterator_A01_t01: Fail, OK
-
-# co19 issue #623: main() { {}; } is block and empty statement, not a map
-Language/13_Statements/02_Expression_Statements_A01_t13: Fail, OK
-
-# co19 issue #626: StreamTransformers have been refactored.
-LibTest/async/EventTransformStream/EventTransformStream_A01_t01: Fail
-LibTest/async/EventTransformStream/EventTransformStream_A01_t02: Fail
-LibTest/async/EventTransformStream/any_A01_t01: Fail
-LibTest/async/EventTransformStream/any_A02_t01: Fail
-LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: Fail
-LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: Fail
-LibTest/async/EventTransformStream/asBroadcastStream_A02_t01: Fail
-LibTest/async/EventTransformStream/contains_A01_t01: Fail
-LibTest/async/EventTransformStream/contains_A02_t01: Fail
-LibTest/async/EventTransformStream/contains_A03_t01: Fail
-LibTest/async/EventTransformStream/distinct_A01_t01: Fail
-LibTest/async/EventTransformStream/distinct_A01_t02: Fail
-LibTest/async/EventTransformStream/drain_A01_t01: Fail
-LibTest/async/EventTransformStream/drain_A02_t01: Fail
-LibTest/async/EventTransformStream/drain_A02_t02: Fail
-LibTest/async/EventTransformStream/elementAt_A01_t01: Fail
-LibTest/async/EventTransformStream/elementAt_A02_t01: Fail
-LibTest/async/EventTransformStream/elementAt_A03_t01: Fail
-LibTest/async/EventTransformStream/every_A01_t01: Fail
-LibTest/async/EventTransformStream/every_A02_t01: Fail
-LibTest/async/EventTransformStream/expand_A01_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A01_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A02_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A03_t01: Fail
-LibTest/async/EventTransformStream/firstWhere_A03_t02: Fail
-LibTest/async/EventTransformStream/first_A01_t01: Fail
-LibTest/async/EventTransformStream/first_A02_t01: Fail
-LibTest/async/EventTransformStream/first_A03_t01: Fail
-LibTest/async/EventTransformStream/fold_A01_t01: Fail
-LibTest/async/EventTransformStream/fold_A01_t02: Fail
-LibTest/async/EventTransformStream/forEach_A01_t01: Fail
-LibTest/async/EventTransformStream/forEach_A02_t01: Fail
-LibTest/async/EventTransformStream/forEach_A02_t02: Fail
-LibTest/async/EventTransformStream/handleError_A01_t01: Fail
-LibTest/async/EventTransformStream/handleError_A02_t01: Fail
-LibTest/async/EventTransformStream/handleError_A03_t01: Fail
-LibTest/async/EventTransformStream/isBroadcast_A01_t01: Fail
-LibTest/async/EventTransformStream/isBroadcast_A01_t02: Fail
-LibTest/async/EventTransformStream/isEmpty_A01_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A01_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A02_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A03_t01: Fail
-LibTest/async/EventTransformStream/lastWhere_A04_t01: Fail
-LibTest/async/EventTransformStream/last_A01_t01: Fail
-LibTest/async/EventTransformStream/last_A02_t01: Fail
-LibTest/async/EventTransformStream/length_A01_t01: Fail
-LibTest/async/EventTransformStream/listen_A01_t01: Fail
-LibTest/async/EventTransformStream/listen_A02_t01: Fail
-LibTest/async/EventTransformStream/listen_A03_t01: Fail
-LibTest/async/EventTransformStream/listen_A04_t01: Fail
-LibTest/async/EventTransformStream/map_A01_t01: Fail
-LibTest/async/EventTransformStream/reduce_A01_t01: Fail
-LibTest/async/EventTransformStream/reduce_A01_t02: Fail
-LibTest/async/EventTransformStream/reduce_A01_t03: Fail
-LibTest/async/EventTransformStream/singleWhere_A01_t01: Fail
-LibTest/async/EventTransformStream/singleWhere_A02_t01: Fail
-LibTest/async/EventTransformStream/single_A01_t01: Fail
-LibTest/async/EventTransformStream/single_A02_t01: Fail
-LibTest/async/EventTransformStream/skipWhile_A01_t01: Fail
-LibTest/async/EventTransformStream/skip_A01_t01: Fail
-LibTest/async/EventTransformStream/takeWhile_A01_t01: Fail
-LibTest/async/EventTransformStream/take_A01_t01: Fail
-LibTest/async/EventTransformStream/take_A01_t02: Fail
-LibTest/async/EventTransformStream/take_A01_t03: Fail
-LibTest/async/EventTransformStream/toList_A01_t01: Fail
-LibTest/async/EventTransformStream/toSet_A01_t01: Fail
-LibTest/async/EventTransformStream/transform_A01_t01: Fail
-LibTest/async/EventTransformStream/where_A01_t01: Fail
-LibTest/async/EventTransformStream/where_A01_t02: Fail
-LibTest/async/StreamEventTransformer/bind_A01_t01: Fail
-LibTest/async/StreamEventTransformer/handleData_A01_t01: Fail
-LibTest/async/StreamEventTransformer/handleDone_A01_t01: Fail
-LibTest/async/StreamEventTransformer/handleError_A01_t01: Fail
-
 # co19 issue 639.
-Language/12_Expressions/12_Spawning_an_Isolate_A01_t01: Fail
-LibTest/isolate/IsolateSink/add_A01_t01: Fail
-LibTest/isolate/IsolateSink/add_A01_t02: Fail
-LibTest/isolate/IsolateSink/add_A02_t01: Fail
-LibTest/isolate/IsolateSink/close_A01_t01: Fail
-LibTest/isolate/IsolateSink/close_A01_t02: Fail
-LibTest/isolate/IsolateSink/close_A01_t03: Fail
-LibTest/isolate/IsolateSink/close_A01_t04: Fail
-LibTest/isolate/IsolateSink/operator_equality_A01_t01: Fail
 LibTest/isolate/IsolateStream/any_A01_t01: Fail
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail
@@ -203,25 +79,6 @@
 LibTest/isolate/SendPort/send_A02_t06: Fail
 LibTest/isolate/SendPort/send_A03_t01: Fail
 LibTest/isolate/SendPort/send_A03_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t01: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t03: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t04: Fail
-LibTest/isolate/isolate_api/spawnFunction_A01_t05: Fail
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: Fail
-LibTest/isolate/isolate_api/spawnFunction_A04_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A04_t03: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t04: Fail
-LibTest/isolate/isolate_api/spawnUri_A01_t05: Fail
-LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: Fail
-LibTest/isolate/isolate_api/stream_A01_t01: Fail
-LibTest/isolate/isolate_api/port_A01_t01: Fail
-LibTest/isolate/IsolateSink/addError_A01_t01: Fail
-LibTest/isolate/IsolateSink/addError_A01_t02: Fail
 LibTest/isolate/IsolateStream/any_A02_t01: Fail
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail
@@ -229,41 +86,14 @@
 LibTest/isolate/SendPort/send_A01_t01: Fail
 LibTest/isolate/SendPort/send_A02_t02: Fail
 LibTest/isolate/SendPort/send_A02_t03: Fail
-LibTest/isolate/isolate_api/spawnFunction_A02_t02: Fail
-LibTest/isolate/isolate_api/spawnFunction_A04_t01: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t01: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail
-LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail
-LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: Fail
-LibTest/isolate/isolate_api/streamSpawnFunction_A02_t02: Fail
-
-#co19 issue 631
-Language/12_Expressions/30_Identifier_Reference_A02_t01: Fail
-Language/13_Statements/03_Variable_Declaration_A01_t09: Fail
-Language/13_Statements/03_Variable_Declaration_A01_t16: Fail
-
-Language/13_Statements/09_Switch_A02_t04: Fail  # Issue 629
-
-
-
 
 # co19 issue 642, The argument type 'int' cannot be assigned to the parameter type 'Iterable'
 LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Fail, OK
 LibTest/collection/ListQueue/ListQueue_class_A01_t01: Fail, OK
 LibTest/collection/Queue/Queue_class_A01_t01: Fail, OK
 
-# co19 issue 644, The argument type 'int' cannot be assigned to the parameter type '(String, Object) -> void'
-LibTest/collection/LinkedHashMap/allTests_A01_t01: Fail, OK
-
-# co19 issue 645, "15.7 Type Void". Likewise, passing the result of a void method as a parameter or assigning it to a variable will cause a warning unless the variable/formal parameter has type dynamic.
-Language/06_Functions/06_Functions_A04_t01: Fail, OK
-
-# co19 issue 646, I don't see where Spec requires any warning for boolean conversion
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: MissingStaticWarning
 
 Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: MissingStaticWarning
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t02: MissingStaticWarning
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: MissingStaticWarning
 Language/12_Expressions/19_Conditional_A01_t14: MissingStaticWarning
 Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t10: MissingStaticWarning
 Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t11: MissingStaticWarning
@@ -281,7 +111,6 @@
 Language/12_Expressions/26_Multiplicative_Expressions_A01_t17: MissingStaticWarning
 Language/12_Expressions/27_Unary_Expressions_A01_t21: MissingStaticWarning
 Language/12_Expressions/29_Assignable_Expressions_A01_t09: MissingStaticWarning
-Language/12_Expressions/30_Identifier_Reference_A07_t01: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t07: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t08: MissingStaticWarning
 Language/13_Statements/09_Switch_A10_t03: MissingStaticWarning
@@ -295,9 +124,24 @@
 Language/05_Variables/05_Variables_A06_t01: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/05_Variables/05_Variables_A06_t02: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/05_Variables/05_Variables_A06_t03: MissingCompileTimeError # co19-roll r651: Please triage this failure
-Language/07_Classes/8_Static_Variables_A01_t01: MissingStaticWarning # co19-roll r651: Please triage this failure
-Language/12_Expressions/01_Constants_A20_t04: CompileTimeError # co19-roll r651: Please triage this failure
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t03: MissingStaticWarning # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t13: CompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # co19-roll r651: Please triage this failure
+
+Language/07_Classes/10_Superinterfaces_A07_t05: StaticWarning # co19-roll r667: Please triage this failure
+LibTest/convert/JsonEncoder/JsonEncoder_A01_t01: StaticWarning # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnFunction_A02_t02: CompileTimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t01: CompileTimeError # co19-roll r667: Please triage this failure
+  
+
+
+# co19 issue 656
+LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index f6dd40e..c35487e 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -11,73 +11,37 @@
 [ $runtime == vm || $runtime != vm ]
 # Tests that fail everywhere, including the analyzer.
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # Issue 635
+LibTest/core/Stopwatch/start_A01_t01: PASS, FAIL, OK # co19 issue 657
+LibTest/core/Stopwatch/start_A01_t02: PASS, FAIL, OK # co19 issue 657
+LibTest/core/Stopwatch/elapsedTicks_A01_t01: PASS, FAIL, OK # co19 issue 657
 
-LibTest/StreamTransformer/StreamTransformer.fromHandlers_A01_t01: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer.fromHandlers_A01_t02: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer.fromHandlers_A01_t03: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer.fromHandlers_A01_t04: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer_A01_t02: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer_A01_t03: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer_A02_t01: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer_A02_t02: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer_A03_t01: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/StreamTransformer_A03_t02: Fail, CompileTimeError # co19-roll r641: Please triage this failure
-LibTest/StreamTransformer/bind_A01_t01: Fail # co19-roll r641: Please triage this failure
-
-LibTest/json/BuildJsonListener/BuildJsonListener_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/JsonParser_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/constants_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/fail_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/parseFalse_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/parseNull_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/parseNumber_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/parseString_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/parseTrue_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/parse_A01_t01: Fail, OK # Issue 637
-LibTest/json/JsonParser/properties_A01_t01: Fail, OK # Issue 637
-LibTest/json/ReviverJsonListener/ReviverJsonListener_A01_t01: Fail, OK # Issue 637
-LibTest/json/parse_A01_t01: Fail, OK # Issue 637
-LibTest/json/parse_A02_t01: Fail, OK # Issue 637
-LibTest/json/parse_A03_t01: Fail, OK # Issue 637
-LibTest/json/printOn_A01_t01: Fail, OK # Issue 637
-LibTest/json/printOn_A02_t01: Fail, OK # Issue 637
-LibTest/json/printOn_A03_t01: Fail, OK # Issue 637
-LibTest/json/printOn_A03_t02: Fail, OK # Issue 637
-LibTest/json/printOn_A03_t03: Fail, OK # Issue 637
-LibTest/json/printOn_A04_t01: Fail, OK # Issue 637
-LibTest/json/stringify_A01_t01: Fail, OK # Issue 637
-LibTest/json/stringify_A02_t01: Fail, OK # Issue 637
-LibTest/json/stringify_A03_t01: Fail, OK # Issue 637
-LibTest/json/stringify_A03_t02: Fail, OK # Issue 637
-LibTest/json/stringify_A03_t03: Fail, OK # Issue 637
-LibTest/json/stringify_A04_t01: Fail, OK # Issue 637
+LibTest/isolate/Isolate/spawnUri_A01_t01: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t02: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t03: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t04: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t05: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnFunction_A02_t01: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnFunction_A03_t01: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnFunction_A04_t01: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnFunction_A04_t02: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnFunction_A04_t03: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t02: Fail # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t03: Fail # co19-roll r667: Please triage this failure
 
 
 [ $runtime == vm || $runtime == dartium || $compiler == dart2dart || $compiler == dart2js ]
-Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: fail # co19 issue 648
-
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t04: fail, pass, ok # co19 issue 634
-Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail, pass, ok # co19 issue 634
-Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail, pass, ok # co19 issue 634
 Language/12_Expressions/30_Identifier_Reference_A02_t01: fail, pass, ok # co19 issue 649
 
 Language/05_Variables/05_Variables_A06_t01: fail, pass, ok # co19 issue 624
 Language/05_Variables/05_Variables_A06_t02: fail, pass, ok # co19 issue 624
 Language/05_Variables/05_Variables_A06_t03: fail, pass, ok # co19 issue 624
-Language/05_Variables/05_Variables_A06_t04: fail, pass, ok # co19 issue 624
-Language/05_Variables/05_Variables_A06_t05: fail, pass, ok # co19 issue 624
-Language/05_Variables/05_Variables_A06_t06: fail, pass, ok # co19 issue 624
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # co19-roll r587: Please triage this failure
 
-# Maybe we should wait until isolate library is sealed before triaging these.
-LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail, timeout # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/streamSpawnFunction_A02_t01: fail, timeout # co19-roll r546: Please triage this failure
-
-Language/12_Expressions/18_Assignment_A04_t09: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/forEach_A02_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Symbol/Symbol_A01_t04: RuntimeError # co19-roll r607: Please triage this failure
+LibTest/core/Set/intersection_A02_t01: Fail, OK # Issue 659
 
 Language/07_Classes/07_Classes_A13_t01: Pass, MissingCompileTimeError, Fail # co19-roll r623: Please triage this failure
 Language/07_Classes/07_Classes_A13_t04: Pass, MissingCompileTimeError, Fail # co19-roll r623: Please triage this failure
@@ -85,22 +49,19 @@
 LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
 LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
 LibTest/core/Set/IterableBase_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
-LibTest/typed_data/ByteData/elementSizeInBytes_A01_t01: fail # co19-roll r569: Please triage this failure
 
 LibTest/core/Uri/toFilePath_A01_t01: pass, fail, ok # co19 Issue 592
 
-LibTest/async/StreamSink/addStream_A01_t02: Timeout, Fail, OK # Dart issue 14334 - test is also incorrect.
 LibTest/collection/ListBase/ListBase_class_A01_t01: Fail, Timeout # co19-roll r641: Please triage this failure
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Fail, Timeout # co19-roll r641: Please triage this failure
 
-
 [ $runtime == vm || $runtime == dartium || $compiler == dart2js ]
-Language/14_Libraries_and_Scripts/4_Scripts_A03_t02: FAIL, OK # co19 issue 654
-
 LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/atan_A01_t01: PASS, FAIL, OK # co19 issue 44
 
+LibTest/math/cos_A01_t01: PASS, FAIL, OK # co19 issue 44
+
 LibTest/core/double/ceil_A01_t03: FAIL, OK # co19 issue 389
 LibTest/core/double/ceil_A01_t04: FAIL, OK # co19 issue 389
 LibTest/core/double/floor_A01_t03: FAIL, OK # co19 issue 389
@@ -112,7 +73,6 @@
 
 LibTest/isolate/SendPort/send_A02_t02: SKIP # co19 issue 493
 LibTest/isolate/SendPort/send_A02_t03: SKIP # co19 issue 495
-LibTest/isolate/isolate_api/streamSpawnFunction_A02_t02: PASS, FAIL, TIMEOUT, OK # co19 issue 540
 
 LibTest/typed_data/Int8List/Int8List.fromList_A01_t02: Fail # co19-roll r559: Please triage this failure
 
@@ -121,7 +81,6 @@
 Language/07_Classes/6_Constructors_A02_t01: SKIP # co19 issue 415.
 Language/14_Libraries_and_Scripts/1_Imports_A03_t65: PASS, FAIL, OK # co19 issue 560
 
-LibTest/math/cos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/exp_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/sin_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/tan_A01_t01: PASS, FAIL, OK  # co19 issue 44
@@ -133,94 +92,11 @@
 LibTest/async/Timer/Timer.periodic_A01_t01: PASS, FAIL, OK # co19 issue 537
 LibTest/async/Timer/Timer.periodic_A02_t01: PASS, FAIL, OK # co19 issue 538
 LibTest/async/Future/Future.delayed_A01_t02: PASS, FAIL, OK # co19 issue 536
-LibTest/async/EventTransformStream/listen_A04_t01: Pass, Timeout # co19 issue 542
 
 LibTest/isolate/IsolateStream/contains_A02_t01: PASS, FAIL, OK # co19 issue 540
 
 
 [ $runtime == vm || $compiler == none || $compiler == dart2js ]
-LibTest/async/EventTransformStream/EventTransformStream_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/EventTransformStream_A01_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/any_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/any_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/contains_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/contains_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/contains_A03_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/distinct_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/distinct_A01_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/drain_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/drain_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/drain_A02_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/elementAt_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/elementAt_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/elementAt_A03_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/every_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/every_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/expand_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/firstWhere_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/firstWhere_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/firstWhere_A03_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/firstWhere_A03_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/first_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/first_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/first_A03_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/fold_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/fold_A01_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/forEach_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/forEach_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/forEach_A02_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/handleError_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/handleError_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/handleError_A03_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/isBroadcast_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/isBroadcast_A01_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/isEmpty_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/lastWhere_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/lastWhere_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/lastWhere_A03_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/lastWhere_A04_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/last_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/last_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/length_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/listen_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/listen_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/listen_A03_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/listen_A04_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/map_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/reduce_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/reduce_A01_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/reduce_A01_t03: Fail # co19 issue 626
-LibTest/async/EventTransformStream/singleWhere_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/singleWhere_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/single_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/single_A02_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/skipWhile_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/skip_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/takeWhile_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/take_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/take_A01_t02: Fail # co19 issue 626
-LibTest/async/EventTransformStream/take_A01_t03: Fail # co19 issue 626
-LibTest/async/EventTransformStream/toList_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/toSet_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/transform_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/where_A01_t01: Fail # co19 issue 626
-LibTest/async/EventTransformStream/where_A01_t02: Fail # co19 issue 626
-LibTest/async/StreamEventTransformer/bind_A01_t01: Fail # co19 issue 626
-LibTest/async/StreamEventTransformer/handleData_A01_t01: Fail # co19 issue 626
-LibTest/async/StreamEventTransformer/handleDone_A01_t01: Fail # co19 issue 626
-LibTest/async/StreamEventTransformer/handleError_A01_t01: Fail # co19 issue 626
-
-Language/12_Expressions/12_Spawning_an_Isolate_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/add_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/add_A01_t02: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/add_A02_t01: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/close_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/close_A01_t02: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/close_A01_t03: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/close_A01_t04: Fail # Co19 issue 639
-LibTest/isolate/IsolateSink/operator_equality_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # Co19 issue 639
@@ -251,43 +127,9 @@
 LibTest/isolate/SendPort/send_A02_t06: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A03_t01: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A03_t02: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A01_t02: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A01_t03: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A01_t04: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A01_t05: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A04_t02: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnFunction_A04_t03: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnUri_A01_t04: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/spawnUri_A01_t05: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/stream_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/isolate_api/port_A01_t01: Fail # Co19 issue 639
 
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: MissingRuntimeError, OK # co19 issue 638
 
-[ $compiler == dart2js ]
-Language/10_Generics/10_Generics_A05_t01: Fail # Co19 issue 655
-Language/12_Expressions/32_Type_Test_A04_t01: Fail # Co19 issue 655
-Language/12_Expressions/32_Type_Test_A04_t02: Fail # Co19 issue 655
-Language/12_Expressions/33_Type_Cast_A03_t01: Fail # Co19 issue 655
-Language/12_Expressions/33_Type_Cast_A03_t03: Fail # Co19 issue 655
-Language/14_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Co19 issue 655
-
-[ $compiler == dart2js && $unchecked ]
-Language/15_Types/1_Static_Types_A03_t01: Fail # Co19 issue 655
-
-[ $compiler == dart2js && $checked ]
-Language/10_Generics/10_Generics_A05_t02: Fail # Co19 issue 655
-Language/14_Libraries_and_Scripts/1_Imports_A03_t31: Fail # Co19 issue 655
-Language/15_Types/1_Static_Types_A03_t02: Fail # Co19 issue 655
-Language/15_Types/1_Static_Types_A03_t03: Fail # Co19 issue 655
-Language/15_Types/1_Static_Types_A03_t04: Fail # Co19 issue 655
 
 ### CHECKED MODE FAILURES ###
 
@@ -296,10 +138,7 @@
 LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
 LibTest/typed_data/Float32x4List/reduce_A01_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/async/Future/catchError_A03_t05: RuntimeError # co19-roll r641: Please triage this failure
 
 [ ($runtime == vm || $compiler == dart2js) && $checked]
 Language/14_Libraries_and_Scripts/1_Imports_A03_t46: PASS, FAIL, OK # co19 issue 560
 Language/14_Libraries_and_Scripts/1_Imports_A03_t66: PASS, FAIL, OK # co19 issue 560
-LibTest/async/EventTransformStream/contains_A01_t01: FAIL, OK  # co19 issue 498
-
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 0045ac0..c03f3c0 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -10,14 +10,6 @@
 Language/07_Classes/07_Classes_A13_t08: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t09: Fail # Missing CT error on member with same name a type parameter
 
-Language/10_Generics/10_Generics_A05_t01: Fail # Issue 463
-Language/14_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Issue 463
-Language/15_Types/1_Static_Types_A03_t01: Fail # Issue 463
-Language/12_Expressions/32_Type_Test_A04_t01: Fail # Issue 463
-Language/12_Expressions/32_Type_Test_A04_t02: Fail # Issue 463
-Language/12_Expressions/33_Type_Cast_A03_t01: Fail # Issue 463
-Language/12_Expressions/33_Type_Cast_A03_t03: Fail # Issue 463
-
 Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
 
 LibTest/async/Stream/Stream.periodic_A01_t01: Pass, Fail # Issue 12562.
@@ -31,6 +23,12 @@
 LibTest/core/Symbol/Symbol_A01_t03: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # co19-roll r607: Please triage this failure
 
+Language/12_Expressions/01_Constants_A20_t05: CompileTimeError # co19-roll r667: Please triage this failure
+Language/12_Expressions/18_Assignment_A04_t09: RuntimeError # co19-roll r667: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A07_t02: RuntimeError # co19-roll r667: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A07_t03: RuntimeError # co19-roll r667: Please triage this failure
+Language/14_Libraries_and_Scripts/1_Imports_A07_t04: RuntimeError # co19-roll r667: Please triage this failure
+
 Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
 
 Language/03_Overview/2_Privacy_A01_t19: Fail # Calling unresolved class constructor.
@@ -66,22 +64,10 @@
 LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
 LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
-LibTest/isolate/isolate_api/port_A01_t01: Skip # Times out.
-LibTest/isolate/isolate_api/spawnUri_A01_t01: Fail, OK # Problems with the test: encoded file name
-LibTest/isolate/isolate_api/spawnUri_A01_t02: Fail, OK # Problems with the test: encoded file name
-LibTest/isolate/isolate_api/spawnUri_A01_t03: Fail, OK # Problems with the test: encoded file name
-LibTest/isolate/isolate_api/spawnUri_A01_t04: Fail, OK # Problems with the test: encoded file name
-LibTest/isolate/isolate_api/spawnUri_A01_t05: Fail, OK # Problems with the test: encoded file name
-LibTest/isolate/IsolateSink/add_A01_t01: CompileTimeError # Issue 13683
 LibTest/isolate/SendPort/send_A02_t01: CompileTimeError # Issue 13683
 LibTest/math/exp_A01_t01: Fail # Issue co19 - 44
 LibTest/math/sin_A01_t01: Fail # Inherited from VM.
 LibTest/math/tan_A01_t01: Fail # Issue co19 - 44
-LibTest/typed_data/Float32x4/interleaveZWPairs_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveZW_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/withZWInXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXYPairs_A01_t01: Fail # co19 issue 650
 LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
@@ -92,8 +78,6 @@
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
 
-Language/14_Libraries_and_Scripts/4_Scripts_A03_t02: Fail # co19 issue 654
-
 
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
@@ -172,16 +156,13 @@
 LibTest/async/Stream/Stream.periodic_A03_t01: fail, pass # co19-roll r546: Please triage this failure
 LibTest/async/Timer/Timer.periodic_A02_t01: fail, pass # co19-roll r546: Please triage this failure
 LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnUri_A02_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnUri_A02_t03: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A02_t02: timeout # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A02_t03: timeout # co19-roll r546: Please triage this failure
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: RuntimeError # co19-roll r623: Please triage this failure
 LibTest/core/Function/Function_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # co19-roll r667: Please triage this failure
 
 [ $compiler == dart2dart && $minified ]
 Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r559: Please triage this failure
@@ -189,7 +170,7 @@
 Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r559: Please triage this failure
 Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r559: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # co19-roll r641: Please triage this failure
-LibTest/json/printOn_A02_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A03_t02: fail # co19-roll r587: Please triage this failure
-LibTest/json/stringify_A02_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/stringify_A03_t02: fail # co19-roll r587: Please triage this failure
+Language/12_Expressions/32_Type_Test_A02_t04: RuntimeError # co19-roll to r667: Please triage this failure
+
+[ $compiler == dart2dart && $unminified ]
+Language/14_Libraries_and_Scripts/1_Imports_A03_t31: RuntimeError # co19-roll r667: Please triage this failure
\ No newline at end of file
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index f9355da..bcc9b79 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -7,14 +7,15 @@
 LibTest/core/RegExp/Pattern_semantics/splitQueryString_A02_t01: RuntimeError # co19-roll r607: Please triage this failure
 
 [ $compiler == dart2js && $checked && $runtime == ie9 ]
+LibTest/core/Uri/encodeFull_A01_t02: Pass, Slow
 LibTest/core/Uri/encodeQueryComponent_A01_t02: Pass, Timeout # co19-roll r576: Please triage this failure
-LibTest/isolate/isolate_api/spawnUri_A02_t03: Pass, Fail # Issue 8920
 
 
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
 [ $compiler == dart2js ]
-Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A04_t01: MissingCompileTimeError # co19-roll r607: Please triage this failure
+Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # co19-roll r667: Please triage this failure
 Language/07_Classes/07_Classes_A13_t02: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t03: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t05: Fail # Missing CT error on member with same name a type parameter
@@ -23,7 +24,6 @@
 Language/07_Classes/07_Classes_A13_t09: Fail # Missing CT error on member with same name a type parameter
 Language/03_Overview/1_Scoping_A02_t05: CompileTimeError # TODO(ahe): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: CompileTimeError # TODO(ahe): Please triage this failure.
-Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: fail # co19-roll r576: Please triage this failure
 Language/05_Variables/05_Variables_A11_t01: fail
 LibTest/core/double/INFINITY_A01_t04: RuntimeError # TODO(ahe): Please triage this failure.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # TODO(ahe): Please triage this failure.
@@ -55,11 +55,6 @@
 LibTest/typed_data/Uint32List/Uint32List_A02_t01: fail # co19-roll r576: Please triage this failure
 LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A02_t01: fail # co19-roll r576: Please triage this failure
 LibTest/typed_data/Uint8List/Uint8List_A02_t01: fail # co19-roll r576: Please triage this failure
-LibTest/typed_data/Float32x4/interleaveZWPairs_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveZW_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/withZWInXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXYPairs_A01_t01: Fail # co19 issue 650
 LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
@@ -76,14 +71,6 @@
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/isolate/SendPort/send_A02_t05: Fail, Pass # TODO(ahe): Please triage this failure.
 LibTest/isolate/SendPort/send_A02_t06: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A01_t01: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A01_t02: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A01_t03: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A01_t04: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A01_t05: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail, Pass # TODO(ahe): Please triage this failure.
-LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail, Pass # TODO(ahe): Please triage this failure.
 LibTest/core/Uri/Uri_A06_t03: Pass, Slow
 
 [ $compiler == dart2js ]
@@ -95,7 +82,6 @@
 [ $compiler == dart2js && $runtime == ie9 ]
 LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 8920
 LibTest/async/Stream/listen_A04_t01: Pass, Timeout # Issue: 8920
-LibTest/core/DateTime/timeZoneName_A01_t01: Fail # Issue: 8920
 LibTest/core/double/round_A01_t01: Fail # Issue: 8920
 LibTest/core/double/toStringAsExponential_A01_t04: Fail # Issue: 8920
 LibTest/core/double/toStringAsPrecision_A01_t04: Fail # Issue: 8920
@@ -152,14 +138,8 @@
 LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
 
 [ $compiler == dart2js ]
-LibTest/isolate/IsolateSink/add_A01_t01: CompileTimeError # Issue 13683
 LibTest/isolate/SendPort/send_A02_t01: CompileTimeError # Issue 13683
 
-LibTest/isolate/isolate_api/spawnUri_A01_t01: RuntimeError # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
-LibTest/isolate/isolate_api/spawnUri_A01_t02: RuntimeError # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
-LibTest/isolate/isolate_api/spawnUri_A01_t03: RuntimeError # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
-LibTest/isolate/isolate_api/spawnUri_A01_t04: RuntimeError # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
-LibTest/isolate/isolate_api/spawnUri_A01_t05: RuntimeError # Runtime error: UnsupportedError: Currently spawnUri is not supported without web workers.
 LibTest/isolate/SendPort/send_A02_t04: RuntimeError # Runtime error: TypeError: Cannot call method 'toSendPort$0' of undefined.
 
 LibTest/core/int/operator_NOT_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
@@ -181,6 +161,7 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
+Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: fail # co19 issue 648
 Language/03_Overview/2_Privacy_A01_t09: RuntimeError, OK # co19 issue 198
 Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
 Language/06_Functions/4_External_Functions_A01_t01: CompileTimeError, OK # http://dartbug.com/5021
@@ -274,6 +255,9 @@
 LibTest/core/Uri/Uri_A06_t03: Pass, Timeout # Issue 13511
 LibTest/math/cos_A01_t01: Fail # co19 issue 44
 
+[ $compiler == dart2js && $runtime == ie9 && $checked ]
+LibTest/async/Future/catchError_A03_t05: Pass, RuntimeError # Issue 14712
+
 #
 # The following tests are failing. Please add the error message
 # (either a compiler error or exception message). The error messages
@@ -290,9 +274,6 @@
 
 
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
-LibTest/isolate/IsolateSink/add_A01_t02: Pass # TODO(kasperl): Please triage.
-LibTest/isolate/IsolateSink/operator_equality_A01_t01: Pass # TODO(kasperl): Please triage.
-
 Language/12_Expressions/05_Strings_A06_t01: Pass, Slow # TODO(kasperl): Please triage.
 LibTest/core/Set/removeAll_A01_t02: Pass, Slow # TODO(kasperl): Please triage.
 LibTest/typed_data/Float64List/join_A01_t01: Pass, Slow # TODO(kasperl): Please triage.
@@ -300,12 +281,6 @@
 LibTest/typed_data/Int16List/single_A01_t02: Pass, Slow # TODO(kasperl): Please triage.
 LibTest/typed_data/Uint8ClampedList/map_A02_t01: Pass, Slow # TODO(kasperl): Please triage.
 
-LibTest/isolate/isolate_api/spawnUri_A01_t01: Timeout # TODO(kasperl): Please triage.
-LibTest/isolate/isolate_api/spawnUri_A01_t02: Timeout # TODO(kasperl): Please triage.
-LibTest/isolate/isolate_api/spawnUri_A01_t03: Timeout # TODO(kasperl): Please triage.
-LibTest/isolate/isolate_api/spawnUri_A01_t04: Timeout # TODO(kasperl): Please triage.
-LibTest/isolate/isolate_api/spawnUri_A01_t05: Timeout # TODO(kasperl): Please triage.
-
 LibTest/core/int/compareTo_A01_t01: Fail # TODO(kasperl): Please triage.
 LibTest/core/int/operator_left_shift_A01_t01: Fail # TODO(kasperl): Please triage.
 LibTest/core/int/operator_remainder_A01_t03: Fail # TODO(kasperl): Please triage.
@@ -416,6 +391,7 @@
 LibTest/typed_data/ByteData/setUint32_A01_t01: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/setUint8_A01_t01: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/toString_A01_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/elementSizeInBytes_A01_t01: fail # co19-roll r569: Please triage this failure
 
 [ $compiler == dart2js ]
 Language/03_Overview/1_Scoping_A02_t28: fail # co19-roll r559: Please triage this failure
@@ -466,14 +442,6 @@
 LibTest/core/List/List_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Match/pattern_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/core/RegExp/allMatches_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnFunction_A04_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnFunction_A04_t03: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnUri_A02_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnUri_A02_t03: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/streamSpawnFunction_A02_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -522,7 +490,6 @@
 
 [ $compiler == dart2js && $checked ]
 Language/12_Expressions/03_Numbers_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A12_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/19_Conditional_A04_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/27_Unary_Expressions_A02_t03: fail # co19-roll r546: Please triage this failure
@@ -597,6 +564,7 @@
 LibTest/typed_data/Uint8List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
 
 [ $compiler == dart2js || $compiler == dart2dart ]
+Language/07_Classes/1_Instance_Methods_A07_t02: CompileTimeError # co19-roll r667: Please triage this failure
 Language/07_Classes/1_Instance_Methods_A03_t06: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/1_Instance_Methods_A07_t01: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/2_Factories_A08_t02: fail # co19-roll r587: Please triage this failure
@@ -614,11 +582,13 @@
 
 [ $compiler == dart2js ]
 LibTest/core/List/List_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
+Language/03_Overview/2_Privacy_A01_t02: RuntimeError # co19-roll r667: Please triage this failure
+Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Pass # co19-roll r667: Please triage this failure
+Language/12_Expressions/20_Logical_Boolean_Expressions_A06_t16: RuntimeError # co19-roll r667: Please triage this failure
+Language/12_Expressions/20_Logical_Boolean_Expressions_A06_t17: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/convert/JsonDecoder/fuse_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/convert/JsonEncoder/convert_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
 
-LibTest/json/stringify_A01_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/stringify_A02_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A01_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A02_t01: fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A04_t01: fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A14_t01: fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A16_t01: fail # co19-roll r587: Please triage this failure
@@ -627,4 +597,3 @@
 LibTest/async/Stream/listen_A05_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # co19-roll r641: Please triage this failure
-
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 72af666..554f5ae 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -7,43 +7,26 @@
 
 [ $compiler == none && $runtime == dartium ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
-Language/12_Expressions/12_Spawning_an_Isolate_A01_t01: Fail # Issue 13921
 Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Pass, Timeout # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
 LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 13719: Please triage this failure.
 LibTest/async/Future/Future_A01_t03: Fail # co19-roll r641: Please triage this failure
 LibTest/core/int/operator_left_shift_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A01_t01: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A01_t02: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A01_t03: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A01_t04: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A01_t05: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A04_t02: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A04_t02: Timeout # Issue 13719: Please triage this failure.
-LibTest/isolate/isolate_api/spawnFunction_A04_t03: Fail # Issue 13921
-LibTest/isolate/isolate_api/spawnFunction_A04_t03: Timeout # Issue 13719: Please triage this failure.
-LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: Fail # Issue 13921
-LibTest/isolate/IsolateSink/add_A01_t01: Fail # Issue 13921
-LibTest/isolate/IsolateSink/add_A01_t02: Fail # Issue 13921
-LibTest/isolate/IsolateSink/add_A02_t01: Fail # Issue 13921
-LibTest/isolate/IsolateSink/close_A01_t03: Fail # Issue 13921
-LibTest/isolate/IsolateSink/close_A01_t04: Fail # Issue 13921
-LibTest/isolate/IsolateSink/operator_equality_A01_t01: Fail # Issue 13921
 LibTest/isolate/ReceivePort/toSendPort_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
 LibTest/isolate/SendPort/send_A02_t01: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t06: Fail # Issue 13921
 
-LibTest/isolate/isolate_api/spawnUri_A01_t01: Skip # Issue 13992
-LibTest/isolate/isolate_api/spawnUri_A01_t02: Skip # Issue 13992
-LibTest/isolate/isolate_api/spawnUri_A01_t03: Skip # Issue 13992
-LibTest/isolate/isolate_api/spawnUri_A01_t04: Skip # Issue 13992
-LibTest/isolate/isolate_api/spawnUri_A01_t05: Skip # Issue 13992
+
+Language/12_Expressions/13_Spawning_an_Isolate_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawn_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawn_A01_t02: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawn_A01_t03: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/Isolate/spawn_A01_t05: RuntimeError # co19-roll r667: Please triage this failure
+
 
 [ $compiler == none && $runtime == dartium && $checked ]
 Language/13_Statements/09_Switch_A09_t01: Fail # Please triage this failure (enabled checked mode tests on dartium)
-Language/12_Expressions/12_Instance_Creation_A01_t08: Fail # Please triage this failure (enabled checked mode tests on dartium)
-LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
+LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
\ No newline at end of file
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index bb615bd..b9241e7 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -3,16 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 
-[ $compiler == none && ($runtime == vm || $runtime == dartium) && $unchecked]
-
-
 [ $compiler == none && ($runtime == vm || $runtime == dartium) ]
-Language/13_Statements/03_Variable_Declaration_A04_t01: Fail, MissingCompileTimeError # Issue 7052
-Language/13_Statements/03_Variable_Declaration_A04_t02: Fail, MissingCompileTimeError # Issue 7052
-Language/13_Statements/03_Variable_Declaration_A04_t05: Fail, MissingCompileTimeError # Issue 7052
-Language/13_Statements/03_Variable_Declaration_A04_t06: Fail, MissingCompileTimeError # Issue 7052
-Language/13_Statements/03_Variable_Declaration_A04_t07: Fail # co19 issue 535
-Language/13_Statements/03_Variable_Declaration_A04_t08: Fail # co19 issue 535
 
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # Issue 12508
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # Issue 12508
@@ -27,14 +18,6 @@
 LibTest/core/RegExp/firstMatch_A01_t01: Fail # Issue 12508
 LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
 
-Language/10_Generics/10_Generics_A05_t01: Fail # Issue 463
-Language/14_Libraries_and_Scripts/1_Imports_A03_t05: Fail # Issue 463
-Language/15_Types/1_Static_Types_A03_t01: Fail # Issue 463
-Language/12_Expressions/33_Type_Cast_A03_t01: Fail # Issue 463
-Language/12_Expressions/33_Type_Cast_A03_t03: Fail # Issue 463
-Language/12_Expressions/32_Type_Test_A04_t01: Fail # Issue 463
-Language/12_Expressions/32_Type_Test_A04_t02: Fail # Issue 463
-
 LibTest/async/Timer/Timer.periodic_A02_t01: Pass, Fail # co19 issue 537
 
 Language/05_Variables/05_Variables_A05_t01: fail # Dart issue 12539
@@ -48,10 +31,6 @@
 LibTest/core/DateTime/parse_A03_t01: fail # Issue 12514
 
 # All isolate are being ignored at the moment as the library will go through some changes.
-LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail, Timeout # VM triage, check spec.
-LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail, Timeout # VM triage, check spec.
-LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateSink/addError_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/contains_A02_t01: fail, pass # co19-roll r546: Please triage this failure
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail # VM triage, check spec.
@@ -62,11 +41,6 @@
 LibTest/core/Symbol/Symbol_A01_t03: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/typed_data/Float32x4/clamp_A01_t01: Pass, Fail # co19 issue 636
-LibTest/typed_data/Float32x4/interleaveZWPairs_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveZW_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/withZWInXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXY_A01_t01: Fail # co19 issue 650
-LibTest/typed_data/Float32x4/interleaveXYPairs_A01_t01: Fail # co19 issue 650
 LibTest/typed_data/Uint32x4/*: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/Float32x4.fromUint32x4Bits_A01_t02: Skip # co19 issue 656
@@ -94,7 +68,6 @@
 #end [ $compiler == none && $runtime == vm && $checked ]
 
 [ $compiler == none && $runtime == vm && $mode == debug ]
-LibTest/isolate/isolate_api/spawnFunction_A02_t01: Crash
 LibTest/async/Stream/Stream.periodic_A03_t01: Fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: Pass, Slow
@@ -111,11 +84,6 @@
 LibTest/core/Uri/Uri_A06_t03: Pass, Timeout # co19-roll r576: Please triage this failure
 
 [ $compiler == none && $checked && ($runtime == vm || $runtime == dartium) ]
-Language/10_Generics/10_Generics_A05_t02: Fail # Issue 463
-Language/15_Types/1_Static_Types_A03_t02: Fail # Issue 463
-Language/15_Types/1_Static_Types_A03_t03: Fail # Issue 463
-Language/15_Types/1_Static_Types_A03_t04: Fail # Issue 463
-Language/14_Libraries_and_Scripts/1_Imports_A03_t31: Fail # Issue 14006, discussion on-going
 LibTest/typed_data/Float32x4List/elementAt_A01_t01: Fail # Dart issue 12861
 LibTest/typed_data/Float32x4List/fillRange_A01_t01: Fail # Dart issue 12861
 LibTest/typed_data/Float32x4List/first_A01_t01: Fail # Dart issue 12861
@@ -137,9 +105,8 @@
 LibTest/typed_data/Float32x4List/skip_A01_t01: Fail # Dart issue 12861
 LibTest/typed_data/Float32x4List/take_A01_t01: Fail # Dart issue 12861
 LibTest/typed_data/Float32x4List/take_A02_t01: Fail # Dart issue 12861
-Language/12_Expressions/12_Instance_Creation_A01_t08: CompileTimeError # co19-roll r607: Please triage this failure
+Language/15_Types/1_Static_Types_A03_t01: RuntimeError # co19-roll r667: Please triage this failure
 
 [ $compiler == none && $runtime == vm && $system == windows && $mode == debug ]
 Language/15_Types/4_Interface_Types_A11_t01: pass, timeout # Issue 13349
 Language/15_Types/4_Interface_Types_A11_t02: pass, timeout # Issue 13349
-
diff --git a/tests/compiler/dart2js/class_codegen_test.dart b/tests/compiler/dart2js/class_codegen_test.dart
index 9a57c80..d2af8f7 100644
--- a/tests/compiler/dart2js/class_codegen_test.dart
+++ b/tests/compiler/dart2js/class_codegen_test.dart
@@ -67,15 +67,15 @@
 
 twoClasses() {
   asyncTest(() => compileAll(TEST_ONE).then((generated) {
-    Expect.isTrue(generated.contains('A: {"": "Object;"'));
-    Expect.isTrue(generated.contains('B: {"": "Object;"'));
+    Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"": "Object;"')));
+    Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"": "Object;"')));
   }));
 }
 
 subClass() {
   checkOutput(String generated) {
-    Expect.isTrue(generated.contains('A: {"": "Object;"'));
-    Expect.isTrue(generated.contains('B: {"": "A;"'));
+    Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"": "Object;"')));
+    Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"": "A;"')));
   }
 
   asyncTest(() => compileAll(TEST_TWO).then(checkOutput));
@@ -84,7 +84,8 @@
 
 fieldTest() {
   asyncTest(() => compileAll(TEST_FOUR).then((generated) {
-    Expect.isTrue(generated.contains(r"""B: {"": "A;y,z,x", static:"""));
+    Expect.isTrue(generated.contains(
+        new RegExp('B: {[ \n]*"": "A;y,z,x",[ \n]*static:')));
   }));
 }
 
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 30d7484..d601c2c 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -52,7 +52,8 @@
                              String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
                              bool enableTypeAssertions: false,
                              bool minify: false,
-                             bool analyzeAll: false}) {
+                             bool analyzeAll: false,
+                             bool disableInlining: true}) {
   MockCompiler compiler =
       new MockCompiler(enableTypeAssertions: enableTypeAssertions,
                        coreSource: coreSource,
@@ -60,7 +61,8 @@
                        // compiling a method.
                        disableTypeInference: true,
                        interceptorsSource: interceptorsSource,
-                       enableMinification: minify);
+                       enableMinification: minify,
+                       disableInlining: disableInlining);
   compiler.parseScript(code);
   lego.Element element = compiler.mainApp.find(entry);
   if (element == null) return null;
@@ -84,19 +86,24 @@
 MockCompiler compilerFor(String code, Uri uri,
                          {bool analyzeAll: false,
                           bool analyzeOnly: false,
-                          String coreSource: DEFAULT_CORELIB}) {
+                          String coreSource: DEFAULT_CORELIB,
+                          bool disableInlining: true}) {
   MockCompiler compiler = new MockCompiler(
       analyzeAll: analyzeAll,
       analyzeOnly: analyzeOnly,
-      coreSource: coreSource);
+      coreSource: coreSource,
+      disableInlining: disableInlining);
   compiler.sourceFiles[uri.toString()] =
       new StringSourceFile(uri.toString(), code);
   return compiler;
 }
 
-Future<String> compileAll(String code, {String coreSource: DEFAULT_CORELIB}) {
+Future<String> compileAll(String code,
+                          {String coreSource: DEFAULT_CORELIB,
+                          bool disableInlining: true}) {
   Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = compilerFor(code, uri, coreSource: coreSource);
+  MockCompiler compiler = compilerFor(
+      code, uri, coreSource: coreSource, disableInlining: disableInlining);
   return compiler.runCompiler(uri).then((_) {
     Expect.isFalse(compiler.compilationFailed,
                    'Unexpected compilation error');
diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
index 1356bc11..d6dd1f6 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
@@ -458,6 +458,24 @@
   }
 """;
 
+const String TEST_27 = r"""
+  class A {
+    var f1;
+    var f2;
+    A() {
+      this.f1 = 42;
+      this.f2 = 42;
+    }
+  }
+  class B extends A {
+    set f2(value) {}
+  }
+  main() {
+    new A();
+    new B();
+  }
+""";
+
 void doTest(String test, bool disableInlining, Map<String, Function> fields) {
   fields.forEach((String name, Function f) {
     compileAndFind(
@@ -546,6 +564,8 @@
 
   runTest(TEST_25, {'f1': (compiler) => compiler.typesTask.intType });
   runTest(TEST_26, {'f1': (compiler) => compiler.typesTask.intType });
+  runTest(TEST_27, {'f1': (compiler) => compiler.typesTask.intType,
+                    'f2': (compiler) => compiler.typesTask.intType.nullable()});
 }
 
 void main() {
diff --git a/tests/compiler/dart2js/list_tracer_length_test.dart b/tests/compiler/dart2js/list_tracer_length_test.dart
index 89d3405..51ffdcf 100644
--- a/tests/compiler/dart2js/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/list_tracer_length_test.dart
@@ -71,6 +71,22 @@
 }
 """;
 
+const String TEST8 = r"""
+var b = 42;
+var a = new List(b);
+main() {
+  return a[1];
+}
+""";
+
+const String TEST9 = r"""
+const b = 42;
+var a = new List(b);
+main() {
+  return a[1];
+}
+""";
+
 void checkRangeError(String test, {bool hasRangeError}) {
   asyncTest(() => compileAll(test).then((generated) {
     Expect.equals(hasRangeError, generated.contains('ioore'));
@@ -88,4 +104,6 @@
   checkRangeError(TEST5, hasRangeError: true);
   checkRangeError(TEST6, hasRangeError: true);
   checkRangeError(TEST7, hasRangeError: false);
+  checkRangeError(TEST8, hasRangeError: true);
+  checkRangeError(TEST9, hasRangeError: false);
 }
diff --git a/tests/compiler/dart2js/list_tracer_node_type_test.dart b/tests/compiler/dart2js/list_tracer_node_type_test.dart
index 4296d74..da1e3ae 100644
--- a/tests/compiler/dart2js/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/list_tracer_node_type_test.dart
@@ -25,7 +25,7 @@
 const String TEST3 = r"""
 main() {
   var a = new List(42);
-  a[0] = 42;
+  a[a.length - 1] = 42;
   return a[0] + 42;
 }
 """;
@@ -33,7 +33,7 @@
 const String TEST4 = r"""
 main() {
   var a = new List.filled(42, null);
-  a[0] = 42;
+  a[a.length - 1] = 42;
   return 42 + a[0];
 }
 """;
diff --git a/tests/compiler/dart2js/load_elimination_test.dart b/tests/compiler/dart2js/load_elimination_test.dart
new file mode 100644
index 0000000..8104757
--- /dev/null
+++ b/tests/compiler/dart2js/load_elimination_test.dart
@@ -0,0 +1,261 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import 'compiler_helper.dart';
+
+const String TEST_1 = """
+class A {
+  var a = 42;
+}
+
+void main() {
+  new A().a = 54;
+  return new A().a;
+}
+""";
+
+const String TEST_2 = """
+class A {
+  var a = 42;
+}
+
+void main() {
+  return new A().a;
+}
+""";
+
+const String TEST_3 = """
+class A {
+  var a = 42;
+}
+
+void main() {
+  var a = new A();
+  return a.a + a.a;
+}
+""";
+
+const String TEST_4 = """
+class A {
+  var a = 42;
+}
+
+var list = [];
+void main() {
+  new A().a = 54;
+  var a = new A();
+  list.add(a);
+  return a.a + a.a;
+}
+""";
+
+const String TEST_5 = """
+class A {
+  var a = 42;
+}
+
+var list = [];
+void main() {
+  var a = new A();
+  list.add(a);
+  return a.a + a.a;
+}
+""";
+
+const String TEST_6 = """
+class A {
+  var a = 42;
+}
+
+var list = [new A()];
+void main() {
+  var a = new A();
+  var b = list[0];
+  b.a = 52;
+  return a.a + a.a;
+}
+""";
+
+const String TEST_7 = """
+class A {
+  var a = 42;
+}
+
+var list = [new A(), new A()];
+void main() {
+  var a = list[0];
+  a.a = 32;
+  return a.a;
+}
+""";
+
+const String TEST_8 = """
+class A {
+  var a = 42;
+}
+
+var list = [new A(), new A()];
+void main() {
+  var a = list[0];
+  a.a = 32;
+  var b = list[1];
+  b.a = 42;
+  return a.a;
+}
+""";
+
+const String TEST_9 = """
+class A {
+  var a = 42;
+}
+
+void main() {
+  var a = new A();
+  (() => a.a = 2)();
+  return a.a;
+}
+""";
+
+const String TEST_10 = """
+class A {
+  var a = 42;
+}
+
+void main() {
+  var a = new A();
+  a.a = 2;
+  return a.a;
+}
+""";
+
+const String TEST_11 = """
+class A {
+  var a;
+  var b;
+  A(this.a);
+  A.bar(this.b);
+
+  foo() {
+    () => 42;
+    b.a = 2;
+  }
+}
+
+void main() {
+  var a = new A(42);
+  var b = new A.bar(a);
+  b.foo();
+  return a.a;
+}
+""";
+
+const String TEST_12 = """
+var a;
+var b;
+
+void main() {
+  a = 10;
+  b = 4;
+  return a - b;
+}
+""";
+
+const String TEST_13 = """
+var a = [1, 2];
+
+void main() {
+  a[0] = 10;
+  a[1] = 4;
+  return a[0] - a[1];
+}
+""";
+
+const String TEST_14 = """
+var a = [1, 2];
+var b = [1, 2];
+
+void main() {
+  a[0] = 10;
+  b[0] = 4;
+  return a[0];
+}
+""";
+
+const String TEST_15 = """
+var a;
+
+void main() {
+  a = 42;
+  if (true) {
+  }
+  return a;
+}
+""";
+
+const String TEST_16 = """
+var a;
+
+void main() {
+  a = false;
+  if (main() && main()) {
+    a = true;
+  }
+  return a;
+}
+""";
+
+const String TEST_17 = """
+var a;
+
+void main() {
+  if (main()) {
+    a = true;
+  } else {
+    a = false;
+  }
+  return a;
+}
+""";
+
+const String TEST_18 = """
+
+void main() {
+  var a = [42, true];
+  if (a[1]) {
+    a[0] = 1;
+  } else {
+    a[0] = 2;
+  }
+  return a[0];
+}
+""";
+
+
+main() {
+  test(String code, Function f) {
+    asyncTest(() => compileAll(code, disableInlining: false).then((generated) {
+      Expect.isTrue(f(generated));
+    }));
+  }
+  test(TEST_1, (generated) => generated.contains('return 42'));
+  test(TEST_2, (generated) => generated.contains('return 42'));
+  test(TEST_3, (generated) => generated.contains('return 84'));
+  test(TEST_4, (generated) => generated.contains('return t1 + t1'));
+  test(TEST_5, (generated) => generated.contains('return 84'));
+  test(TEST_6, (generated) => generated.contains('return 84'));
+  test(TEST_7, (generated) => generated.contains('return 32'));
+  test(TEST_8, (generated) => generated.contains('return a.a'));
+  test(TEST_9, (generated) => generated.contains('return a.a'));
+  test(TEST_10, (generated) => generated.contains('return 2'));
+  test(TEST_11, (generated) => generated.contains('return a.a'));
+  test(TEST_12, (generated) => generated.contains('return 6'));
+  test(TEST_13, (generated) => generated.contains('return 6'));
+  test(TEST_14, (generated) => generated.contains('return t1[0]'));
+  test(TEST_15, (generated) => generated.contains('return 42'));
+  test(TEST_16, (generated) => generated.contains('return \$.a'));
+  test(TEST_17, (generated) => generated.contains('return t1'));
+  test(TEST_18, (generated) => generated.contains('return t1'));
+}
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/message_kind_test.dart
index 6610e12..505fe5b 100644
--- a/tests/compiler/dart2js/message_kind_test.dart
+++ b/tests/compiler/dart2js/message_kind_test.dart
@@ -16,7 +16,9 @@
 main() {
   ClassMirror cls = reflectClass(MessageKind);
   Map<String, MessageKind> kinds = <String, MessageKind>{};
-  cls.variables.forEach((Symbol name, VariableMirror variable) {
+  cls.declarations.forEach((Symbol name, DeclarationMirror declaration) {
+    if (declaration is! VariableMirror) return;
+    VariableMirror variable = declaration;
     if (variable.isStatic) {
       var value = cls.getField(name).reflectee;
       if (value is MessageKind) {
diff --git a/tests/compiler/dart2js/mirrors_exports_test.dart b/tests/compiler/dart2js/mirrors_exports_test.dart
new file mode 100644
index 0000000..412014c
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors_exports_test.dart
@@ -0,0 +1,156 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file

+// for details. All rights reserved. Use of this source code is governed by a

+// BSD-style license that can be found in the LICENSE file.

+

+import 'package:expect/expect.dart';

+import 'package:async_helper/async_helper.dart';

+import 'dart:async';

+import 'memory_compiler.dart';

+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';

+

+const SOURCE_FILES = const {

+'main.dart': '''

+import 'a.dart' show A1, A2;

+import 'b.dart' as b hide B1;

+export 'a.dart' show A2 hide A3, A1;

+export 'b.dart' hide B1, B2 show B3;

+import 'dart:core' as core;

+

+main() {}

+''',

+'a.dart': '''

+class A1 {}

+class A2 {}

+class A3 {}

+''',

+'b.dart': '''

+class B1 {}

+class B2 {}

+class B3 {}

+'''

+};

+

+void main() {

+  asyncTest(() => mirrorSystemFor(SOURCE_FILES).then((MirrorSystem mirrors) {

+    LibraryMirror mainLibrary =

+        mirrors.libraries[Uri.parse('memory:main.dart')];

+    Expect.isNotNull(mainLibrary);

+

+    LibraryMirror aLibrary =

+        mirrors.libraries[Uri.parse('memory:a.dart')];

+    Expect.isNotNull(aLibrary);

+

+    LibraryMirror bLibrary =

+        mirrors.libraries[Uri.parse('memory:b.dart')];

+    Expect.isNotNull(bLibrary);

+

+    LibraryMirror coreLibrary =

+        mirrors.libraries[Uri.parse('dart:core')];

+    Expect.isNotNull(coreLibrary);

+

+    var dependencies = mainLibrary.libraryDependencies;

+    Expect.isNotNull(dependencies);

+    Expect.equals(5, dependencies.length);

+

+    // import 'a.dart' show A1, A2;

+    var dependency = dependencies[0];

+    Expect.isNotNull(dependency);

+    Expect.isTrue(dependency.isImport);

+    Expect.isFalse(dependency.isExport);

+    Expect.equals(mainLibrary, dependency.sourceLibrary);

+    Expect.equals(aLibrary, dependency.targetLibrary);

+    Expect.isNull(dependency.prefix);

+

+    var combinators = dependency.combinators;

+    Expect.isNotNull(combinators);

+    Expect.equals(1, combinators.length);

+

+    var combinator = combinators[0];

+    Expect.isNotNull(combinator);

+    Expect.isTrue(combinator.isShow);

+    Expect.isFalse(combinator.isHide);

+    Expect.listEquals(['A1', 'A2'], combinator.identifiers);

+

+    // import 'b.dart' as b hide B1;

+    dependency = dependencies[1];

+    Expect.isNotNull(dependency);

+    Expect.isTrue(dependency.isImport);

+    Expect.isFalse(dependency.isExport);

+    Expect.equals(mainLibrary, dependency.sourceLibrary);

+    Expect.equals(bLibrary, dependency.targetLibrary);

+    Expect.equals('b', dependency.prefix);

+

+    combinators = dependency.combinators;

+    Expect.isNotNull(combinators);

+    Expect.equals(1, combinators.length);

+

+    combinator = combinators[0];

+    Expect.isNotNull(combinator);

+    Expect.isFalse(combinator.isShow);

+    Expect.isTrue(combinator.isHide);

+    Expect.listEquals(['B1'], combinator.identifiers);

+

+    // export 'a.dart' show A2 hide A3, A1;

+    dependency = dependencies[2];

+    Expect.isNotNull(dependency);

+    Expect.isFalse(dependency.isImport);

+    Expect.isTrue(dependency.isExport);

+    Expect.equals(mainLibrary, dependency.sourceLibrary);

+    Expect.equals(aLibrary, dependency.targetLibrary);

+    Expect.isNull(dependency.prefix);

+

+    combinators = dependency.combinators;

+    Expect.isNotNull(combinators);

+    Expect.equals(2, combinators.length);

+

+    combinator = combinators[0];

+    Expect.isNotNull(combinator);

+    Expect.isTrue(combinator.isShow);

+    Expect.isFalse(combinator.isHide);

+    Expect.listEquals(['A2'], combinator.identifiers);

+

+    combinator = combinators[1];

+    Expect.isNotNull(combinator);

+    Expect.isFalse(combinator.isShow);

+    Expect.isTrue(combinator.isHide);

+    Expect.listEquals(['A3', 'A1'], combinator.identifiers);

+

+    // export 'b.dart' hide B1, B2 show B3;

+    dependency = dependencies[3];

+    Expect.isNotNull(dependency);

+    Expect.isFalse(dependency.isImport);

+    Expect.isTrue(dependency.isExport);

+    Expect.equals(mainLibrary, dependency.sourceLibrary);

+    Expect.equals(bLibrary, dependency.targetLibrary);

+    Expect.isNull(dependency.prefix);

+

+    combinators = dependency.combinators;

+    Expect.isNotNull(combinators);

+    Expect.equals(2, combinators.length);

+

+    combinator = combinators[0];

+    Expect.isNotNull(combinator);

+    Expect.isFalse(combinator.isShow);

+    Expect.isTrue(combinator.isHide);

+    Expect.listEquals(['B1', 'B2'], combinator.identifiers);

+

+    combinator = combinators[1];

+    Expect.isNotNull(combinator);

+    Expect.isTrue(combinator.isShow);

+    Expect.isFalse(combinator.isHide);

+    Expect.listEquals(['B3'], combinator.identifiers);

+

+    // import 'dart:core' as core;

+    dependency = dependencies[4];

+    Expect.isNotNull(dependency);

+    Expect.isTrue(dependency.isImport);

+    Expect.isFalse(dependency.isExport);

+    Expect.equals(mainLibrary, dependency.sourceLibrary);

+    Expect.equals(coreLibrary, dependency.targetLibrary);

+    Expect.equals('core', dependency.prefix);

+

+    combinators = dependency.combinators;

+    Expect.isNotNull(combinators);

+    Expect.equals(0, combinators.length);

+  }));

+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 183b122..37e0729 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -58,7 +58,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 342;
+    int expectedMethodCount = 344;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index f028c33..15ce07c 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -102,11 +102,13 @@
     operator[](index);
   }
   abstract class JSMutableIndexable extends JSIndexable {}
-  class JSArray extends Interceptor implements List, JSIndexable {
+  class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
+    JSArray();
+    factory JSArray.typed(a) => a;
     var length;
     operator[](index) => this[index];
-    operator[]=(index, value) {}
-    add(value) {}
+    operator[]=(index, value) { this[index] = value; }
+    add(value) { this[length + 1] = value; }
     removeAt(index) {}
     insert(index, value) {}
     removeLast() {}
@@ -230,7 +232,10 @@
                 bool analyzeAll: false,
                 bool analyzeOnly: false,
                 bool emitJavaScript: true,
-                bool preserveComments: false})
+                bool preserveComments: false,
+                // Our unit tests check code generation output that is
+                // affected by inlining support.
+                bool disableInlining: true})
       : warnings = [], errors = [], hints = [], infos = [],
         sourceFiles = new Map<String, SourceFile>(),
         super(enableTypeAssertions: enableTypeAssertions,
@@ -269,9 +274,7 @@
     // wasn't resolved.
     objectClass.ensureResolved(this);
 
-    // Our unit tests check code generation output that is affected by
-    // inlining support.
-    disableInlining = true;
+    this.disableInlining = disableInlining;
 
     deferredLoadTask = new MockDeferredLoadTask(this);
   }
diff --git a/tests/compiler/dart2js/no_constructor_body_test.dart b/tests/compiler/dart2js/no_constructor_body_test.dart
index 0a3b388..ddafc6c 100644
--- a/tests/compiler/dart2js/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/no_constructor_body_test.dart
@@ -19,6 +19,7 @@
 
 main() {
   asyncTest(() => compileAll(TEST).then((generated) {
-    Expect.isTrue(generated.contains('A: {"": "Object;", static:'));
+    Expect.isTrue(generated.contains(
+        new RegExp('A: {[ \n]*"": "Object;",[ \n]*static:')));
   }));
 }
diff --git a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
index bad4b4c..127be93 100644
--- a/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
+++ b/tests/compiler/dart2js/no_duplicate_constructor_body_test.dart
@@ -17,7 +17,7 @@
 
 main() {
   asyncTest(() => compileAll(CODE).then((generated) {
-    RegExp regexp = new RegExp(r'\A: {"": "[A-za-z]+;"');
+    RegExp regexp = new RegExp(r'\A: {[ \n]*"": "[A-za-z]+;"');
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
   }));
diff --git a/tests/compiler/dart2js/null_check_test.dart b/tests/compiler/dart2js/null_check_test.dart
new file mode 100644
index 0000000..bba2b5e
--- /dev/null
+++ b/tests/compiler/dart2js/null_check_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import 'compiler_helper.dart';
+import "package:async_helper/async_helper.dart";
+
+const String TEST1 = r"""
+main() {
+  var foo;
+  if (main() == 5) {
+    foo = [0];
+  }
+  return foo[0];
+}
+""";
+
+main() {
+  asyncTest(() => compileAll(TEST1).then((generated) {
+    Expect.isFalse(generated.contains('foo.length'));
+  }));
+}
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index a0d433e..9081c3d 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -811,7 +811,7 @@
          class String {}
          class num {}
          class Function {}
-         class List {}
+         class List<E> {}
          class Map {}
          class Closure {}
          class Null {}
diff --git a/tests/compiler/dart2js/type_mask_test.dart b/tests/compiler/dart2js/type_mask_test.dart
new file mode 100644
index 0000000..b0a190b
--- /dev/null
+++ b/tests/compiler/dart2js/type_mask_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'compiler_helper.dart';
+import 'parser_helper.dart';
+import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
+
+const String CODE = """
+class A {}
+class B extends A {}
+class C implements A {}
+main() {
+  print([new A(), new B(), new C()]);
+}
+""";
+
+main() {
+  Uri uri = new Uri(scheme: 'source');
+  var compiler = compilerFor(CODE, uri);
+
+  asyncTest(() => compiler.runCompiler(uri).then((_) {
+    var classA = findElement(compiler, 'A');
+    var classB = findElement(compiler, 'B');
+    var classC = findElement(compiler, 'C');
+
+    var exactA = new TypeMask.exact(classA);
+    var exactB = new TypeMask.exact(classB);
+    var exactC = new TypeMask.exact(classC);
+
+    var subclassA = new TypeMask.subclass(classA);
+    var subtypeA = new TypeMask.subtype(classA);
+
+    rule(a, b, c) => Expect.equals(c, a.isInMask(b, compiler));
+
+    rule(exactA, exactA, true);
+    rule(exactA, exactB, false);
+    rule(exactA, exactC, false);
+    rule(exactA, subclassA, true);
+    rule(exactA, subtypeA, true);
+
+    rule(exactB, exactA, false);
+    rule(exactB, exactB, true);
+    rule(exactB, exactC, false);
+    rule(exactB, subclassA, true);
+    rule(exactB, subtypeA, true);
+
+    rule(exactC, exactA, false);
+    rule(exactC, exactB, false);
+    rule(exactC, exactC, true);
+    rule(exactC, subclassA, false);
+    rule(exactC, subtypeA, true);
+
+    rule(subclassA, exactA, false);
+    rule(subclassA, exactB, false);
+    rule(subclassA, exactC, false);
+    rule(subclassA, subclassA, true);
+    rule(subclassA, subtypeA, true);
+
+    rule(subtypeA, exactA, false);
+    rule(subtypeA, exactB, false);
+    rule(subtypeA, exactC, false);
+    rule(subtypeA, subclassA, false);
+    rule(subtypeA, subtypeA, true);
+  }));
+}
diff --git a/tests/compiler/dart2js/type_promotion_test.dart b/tests/compiler/dart2js/type_promotion_test.dart
index f94b7c2..a25c221 100644
--- a/tests/compiler/dart2js/type_promotion_test.dart
+++ b/tests/compiler/dart2js/type_promotion_test.dart
@@ -16,22 +16,27 @@
 import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';

 import 'dart:convert';

 

-const List<String> TESTS = const [

-    'language/type_promotion_assign_test.dart',

-    'language/type_promotion_closure_test.dart',

-    'language/type_promotion_functions_test.dart',

-    'language/type_promotion_local_test.dart',

-    'language/type_promotion_logical_and_test.dart',

-    'language/type_promotion_more_specific_test.dart',

-    'language/type_promotion_multiple_test.dart',

-    'language/type_promotion_parameter_test.dart',

-];

+/// Map from test files to a map of their expected status. If the status map is

+/// `null` no warnings must be missing or unexpected, otherwise the status map

+/// can contain a list of line numbers for keys 'missing' and 'unexpected' for

+/// the warnings of each category.

+const Map<String, dynamic> TESTS = const {

+    'language/type_promotion_assign_test.dart': null,

+    'language/type_promotion_closure_test.dart': null,

+    'language/type_promotion_functions_test.dart':

+        const {'missing': const [62, 63, 64]}, // Issue 14933.

+    'language/type_promotion_local_test.dart': null,

+    'language/type_promotion_logical_and_test.dart': null,

+    'language/type_promotion_more_specific_test.dart': null,

+    'language/type_promotion_multiple_test.dart': null,

+    'language/type_promotion_parameter_test.dart': null,

+};

 

 void main() {

   bool isWindows = Platform.isWindows;

   Uri script = currentDirectory.resolveUri(Platform.script);

   bool warningsMismatch = false;

-  Future.forEach(TESTS, (String test) {

+  Future.forEach(TESTS.keys, (String test) {

     Uri uri = script.resolve('../../$test');

     String source = UTF8.decode(readAll(uriPathToNative(uri.path)));

     SourceFile file = new StringSourceFile(

@@ -51,12 +56,23 @@
          options: ['--analyze-only'],

          showDiagnostics: false);

     return compiler.run(uri).then((_) {

+      Map<String, List<int>> statusMap = TESTS[test];

+      // Line numbers with known unexpected warnings.

+      List<int> unexpectedStatus = [];

+      if (statusMap != null && statusMap.containsKey('unexpected')) {

+        unexpectedStatus = statusMap['unexpected'];

+      }

+      // Line numbers with known missing warnings.

+      List<int> missingStatus = [];

+      if (statusMap != null && statusMap.containsKey('missing')) {

+        missingStatus = statusMap['missing'];

+      }

       for (DiagnosticMessage message in collector.warnings) {

         Expect.equals(uri, message.uri);

         int lineNo = file.getLine(message.begin);

         if (expectedWarnings.containsKey(lineNo)) {

           unseenWarnings.remove(lineNo);

-        } else {

+        } else if (!unexpectedStatus.contains(lineNo+1)) {

           warningsMismatch = true;

           print(file.getLocationMessage(

               'Unexpected warning: ${message.message}',

@@ -64,11 +80,13 @@
         }

       }

       if (!unseenWarnings.isEmpty) {

-        warningsMismatch = true;

         for (int lineNo in unseenWarnings) {

-          String line = expectedWarnings[lineNo];

-          print('$uri [${lineNo+1}]: Missing static type warning.');

-          print(line);

+          if (!missingStatus.contains(lineNo+1)) {

+            warningsMismatch = true;

+            String line = expectedWarnings[lineNo];

+            print('$uri [${lineNo+1}]: Missing static type warning.');

+            print(line);

+          }

         }

       }

     });

diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index 3825bee..e4b9572 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -292,6 +292,8 @@
   }
   abstract class JSMutableIndexable extends JSIndexable {}
   class JSArray implements JSIndexable {
+    JSArray() {}
+    JSArray.typed(a) => a;
     var length;
     var removeLast;
     operator[] (_) {}
diff --git a/tests/compiler/dart2js_native/call_on_native_class_test.dart b/tests/compiler/dart2js_native/call_on_native_class_test.dart
new file mode 100644
index 0000000..3b07cf6
--- /dev/null
+++ b/tests/compiler/dart2js_native/call_on_native_class_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+class A native '*A' {
+}
+
+class B extends A{
+  call() => 42;
+}
+
+main() {
+  new B()();
+}
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index c8e3e7f..10785bb 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -8,14 +8,13 @@
 [ $compiler == dart2js ]
 native_no_such_method_exception4_frog_test: Fail  # Issue 9631
 native_no_such_method_exception5_frog_test: Fail  # Issue 9631
-subclassing_super_field_1_test: Fail  # Issue 14096
-subclassing_super_field_2_test: Fail  # Issue 14096
+call_on_native_class_test: CompileTimeError # Issue 14813
 
 [ $compiler == dart2js && $unminified ]
 fake_thing_test: Fail # Issue 13010
 
 [ $compiler == dart2js && $minified ]
-fake_thing_test: Skip # Test relies on unminified names.
+optimization_hints_test: Fail, OK # Test relies on unminified names.
 
 [ $browser || $runtime == jsshell ]
 only_pass_on_d8_test: Fail, OK # This test should only pass on D8.
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index 23257e9..8509685 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_test.dart
@@ -6,6 +6,7 @@
 // number of arguments in the call site AND the call site is inlined.
 
 import "package:expect/expect.dart";
+import 'dart:_js_helper' show NoInline;
 
 typedef int Int2Int(int x);
 
@@ -18,6 +19,7 @@
 
 class B {
   static var g;
+  @NoInline()
   method1(a) {
     g = '(Method1Tag)';  // Tag to identify compiled JavaScript method.
     A x = makeA();
@@ -27,6 +29,7 @@
     x.foo(2, 10);
     return x.foo(3, 10, 30);
   }
+  @NoInline()
   method2() {
     g = '(Method2Tag)';
     A x = makeA();
@@ -34,10 +37,11 @@
     var r2 = x.callFun();
     return r1 + r2;
   }
+  @NoInline()
   method3() {
     g = '(Method3Tag)';
     A x = makeA();
-    var r1 = x.callFun((x) => x * 2);   // Can't ne inlined due to conversion.
+    var r1 = x.callFun((x) => x * 2);   // Can't be inlined due to conversion.
     var r2 = x.callFun((x) => x * 0);
     return r1 + r2;
   }
diff --git a/tests/compiler/dart2js_native/native_mixin_field_test.dart b/tests/compiler/dart2js_native/native_mixin_field_test.dart
index 322381f..8ccda28 100644
--- a/tests/compiler/dart2js_native/native_mixin_field_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field_test.dart
@@ -16,7 +16,7 @@
 }
 
 class M1 {
-  var baz;
+  var baz;  // This field is not a native field, even when mixed in.
 }
 
 class M2 {
@@ -45,7 +45,8 @@
   B b = makeB();
   Expect.equals("A-foo", b.foo);
   Expect.equals("B-bar", b.bar);
-  Expect.equals("M1-baz", b.baz);
+  // Expect.equals("M1-baz", b.baz);  // not true, see M1.
+  Expect.isNull(b.baz);  // native b.baz is not the same as dart b.baz.
   Expect.isNull(b.buz);
 
   M1 m1 = new M1();
diff --git a/tests/compiler/dart2js_native/optimization_hints_test.dart b/tests/compiler/dart2js_native/optimization_hints_test.dart
new file mode 100644
index 0000000..8577f14
--- /dev/null
+++ b/tests/compiler/dart2js_native/optimization_hints_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:_js_helper' as js;
+
+import 'dart:_foreign_helper' show
+    JS;
+
+import 'package:expect/expect.dart';
+
+var x;
+
+foo(c) {
+  x = "in foo function";
+  c.c_field = x;
+}
+
+@js.NoSideEffects()
+@js.NoInline()
+bar(d) {
+  x = "in bar function";
+  d.d_field = x;
+}
+
+class C {
+  var c_field;
+  m() => c_field;
+}
+
+class D {
+  var d_field;
+  m() => d_field;
+}
+
+@js.NoSideEffects()
+@js.NoInline()
+@js.NoThrows()
+baz() {
+  throw 'in baz function';
+}
+
+main() {
+  JS('', 'String("in main function")');
+  var c;
+  if (new DateTime.now().millisecondsSinceEpoch != 42) {
+    c = new C();
+    print(c.m());
+    foo(c);
+    print(c.m());
+  } else {
+    var d = new D();
+    print(d.m());
+    bar(d);
+    print(d.m());
+  }
+  print(c.m());
+  simple();
+  noinline();
+  baz(); // This call should be eliminated by the optimizer.
+  check(JS('', 'arguments.callee'));
+}
+
+@js.NoInline()
+check(func) {
+  JS('', 'String("in check function")');
+  var source = JS('String', 'String(#)', func);
+  print(source);
+  Expect.isTrue(source.contains('"in main function"'),
+                "should contain 'main'");
+  Expect.isTrue(source.contains('"in simple function"'),
+                "should inline 'simple'");
+  Expect.isTrue(source.contains('"in foo function"'),
+                "should inline 'foo'");
+  Expect.isFalse(source.contains('"in bar function"'),
+                 "should not inline 'bar'");
+  Expect.isFalse(source.contains('"in check function"'),
+                 "should not inline 'check'");
+  Expect.isFalse(source.contains('"in noinline function"'),
+                 "should not inline 'noinline'");
+  Expect.equals(2, new RegExp(r'\.c_field').allMatches(source).length,
+                "should contain r'\.c_field' exactly twice");
+  Expect.isFalse(source.contains('.d_field'),
+                 "should not contain r'\.d_field'");
+}
+
+simple() {
+  JS('', 'String("in simple function")');
+}
+
+@js.NoInline()
+noinline() {
+  JS('', 'String("in noinline function")');
+}
diff --git a/tests/corelib/collection_to_string_test.dart b/tests/corelib/collection_to_string_test.dart
index 2f3d4bd..97f25bc 100644
--- a/tests/corelib/collection_to_string_test.dart
+++ b/tests/corelib/collection_to_string_test.dart
@@ -241,8 +241,8 @@
         if (startIndex - start > MAX_LENGTH - 6) {  // Limit - ", ...)".length.
           String prefix = stringRep.toString().substring(0, startIndex);
           stringRep.clear();
-          stringRep.add(prefix);
-          stringRep.add(", ...");
+          stringRep.write(prefix);
+          stringRep.write(", ...");
         }
       }
     } else if (stringRep.length - start > MAX_LENGTH - 1) {  // 80 - ")".length.
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index cf4eb74..7e0a5e1 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -74,8 +74,7 @@
 [ $runtime == opera ]
 core_runtime_types_test: Fail
 null_nosuchmethod_test: Fail # Issue: 7413
-date_time7_test: Fail
-unicode_test: Fail
+unicode_test: Fail # Issue 14694
 
 [ $compiler == dart2js ]
 error_stack_trace1_test: RuntimeError # Issue 12399
@@ -93,7 +92,6 @@
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
 [ $compiler == dart2js && $runtime == ie9 ]
-date_time7_test: Fail # BUG(3304): Maybe this doesn't time out?
 string_base_vm_test: Fail # BUG(3304): Maybe this doesn't time out?
 list_test: Fail # IE doesn't support typed data.
 shuffle_test: Fail # IE doesn't support typed data.
@@ -107,17 +105,6 @@
 compare_to2_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
 
-# Library changes
-[ $compiler == none || $compiler == dart2js || $compiler == dart2dart ]
-map_keys2_test: RuntimeError # Generic types aren't right.
-
-[ $compiler == dart2js ]
-map_values2_test: RuntimeError # Issue 8210
-
-## Tests failing after merge of experimental library branch.
-[ $compiler == dart2js ]
-# Tests fail due to bug in generics on constants, issue 6827
-
 [ $compiler == dart2dart && $minified ]
 error_stack_trace1_test: Fail # Fails in minified mode, test depends on method names.
 
@@ -153,12 +140,7 @@
 collection_to_string_test: Pass, Crash # Issue: 11207
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-collection_to_string_test: StaticWarning
-error_stack_trace_test: StaticWarning
-iterable_element_at_test: StaticWarning
-iterable_test: StaticWarning
-list_map_test: StaticWarning
-num_clamp_test: StaticWarning
-queue_test: StaticWarning
-string_codeunits_test: StaticWarning
-string_test: StaticWarning
+error_stack_trace_test: StaticWarning, OK # Test generates errors on purpose.
+iterable_element_at_test: StaticWarning, OK # Test generates errors on purpose.
+num_clamp_test: StaticWarning, OK # Test generates errors on purpose.
+string_test: StaticWarning, OK # Test generates error on purpose.
diff --git a/tests/corelib/iterable_test.dart b/tests/corelib/iterable_test.dart
index f99bba6..e7f6299 100644
--- a/tests/corelib/iterable_test.dart
+++ b/tests/corelib/iterable_test.dart
@@ -9,7 +9,7 @@
 
 import 'dart:collection';
 
-class MyIterable implements IterableBase {
+class MyIterable extends IterableBase {
   get iterator => [].iterator;
 }
 
diff --git a/tests/corelib/iterable_to_list_test.dart b/tests/corelib/iterable_to_list_test.dart
index 6a5c454..3ee443a 100644
--- a/tests/corelib/iterable_to_list_test.dart
+++ b/tests/corelib/iterable_to_list_test.dart
@@ -4,6 +4,12 @@
 
 import "package:expect/expect.dart";
 
+dynamicCheck(input, {isInt, isString}) {
+  var copy = input.toList();
+  Expect.isTrue(isInt == copy is List<int>);
+  Expect.isTrue(isString == copy is List<String>);
+}
+
 main() {
   List<int> list1 = <int>[1, 2, 3];
   List<int> list2 = const <int>[4, 5];
@@ -23,18 +29,21 @@
   Expect.isTrue(listCopy is List<int>);
   Expect.isFalse(listCopy is List<String>);
   Expect.isFalse(identical(list1, listCopy));
+  dynamicCheck(list1, isInt: true, isString: false);
 
   listCopy = list2.toList();
   Expect.listEquals(list2, listCopy);
   Expect.isTrue(listCopy is List<int>);
   Expect.isFalse(listCopy is List<String>);
   Expect.isFalse(identical(list2, listCopy));
+  dynamicCheck(list2, isInt: true, isString: false);
 
   listCopy = list3.toList();
   Expect.listEquals(list3, listCopy);
   Expect.isTrue(listCopy is List<String>);
   Expect.isFalse(listCopy is List<int>);
   Expect.isFalse(identical(list3, listCopy));
+  dynamicCheck(list3, isInt: false, isString: true);
 
   listCopy = set1.toList();
   Expect.equals(3, listCopy.length);
@@ -43,6 +52,7 @@
   Expect.isTrue(listCopy.contains(13));
   Expect.isTrue(listCopy is List<int>);
   Expect.isFalse(listCopy is List<String>);
+  dynamicCheck(set1, isInt: true, isString: false);
 
   listCopy = set2.toList();
   Expect.equals(3, listCopy.length);
@@ -51,9 +61,11 @@
   Expect.isTrue(listCopy.contains("toto"));
   Expect.isTrue(listCopy is List<String>);
   Expect.isFalse(listCopy is List<int>);
+  dynamicCheck(set2, isInt: false, isString: true);
 
   listCopy = set3.toList();
   Expect.isTrue(listCopy.isEmpty);
   Expect.isTrue(listCopy is List<int>);
   Expect.isTrue(listCopy is List<String>);
+  dynamicCheck(set3, isInt: true, isString: true);
 }
diff --git a/tests/corelib/list_map_test.dart b/tests/corelib/list_map_test.dart
index 8bd05eb..947f40a 100644
--- a/tests/corelib/list_map_test.dart
+++ b/tests/corelib/list_map_test.dart
@@ -20,7 +20,7 @@
   // Function that reverses l and r lists when used to map.
   int rev(x) => 11 - x;
   // A base list that starts out like l, but isn't const.
-  Iterable base = l.map((x) => x).toList();
+  List base = l.map((x) => x).toList();
 
   Iterable reversed = l.map(rev);
 
diff --git a/tests/corelib/map_keys2_test.dart b/tests/corelib/map_keys2_test.dart
index 8d623eb..d297c2d 100644
--- a/tests/corelib/map_keys2_test.dart
+++ b/tests/corelib/map_keys2_test.dart
@@ -15,16 +15,16 @@
   var map6 = new Map<String, bool>();
 
   Expect.isTrue(map1.keys is Iterable<String>);
-  Expect.isFalse(map1.keys is Iterable<bool>);
+  Expect.isTrue(map1.keys is Iterable<bool>);
 
   Expect.isTrue(map2.keys is Iterable<String>);
-  Expect.isFalse(map2.keys is Iterable<bool>);
+  Expect.isTrue(map2.keys is Iterable<bool>);
 
   Expect.isTrue(map3.keys is Iterable<String>);
-  Expect.isFalse(map3.keys is Iterable<bool>);
+  Expect.isTrue(map3.keys is Iterable<bool>);
 
   Expect.isTrue(map4.keys is Iterable<String>);
-  Expect.isFalse(map4.keys is Iterable<bool>);
+  Expect.isTrue(map4.keys is Iterable<bool>);
 
   Expect.isTrue(map5.keys is Iterable<String>);
   Expect.isFalse(map5.keys is Iterable<bool>);
diff --git a/tests/corelib/map_values3_test.dart b/tests/corelib/map_values3_test.dart
new file mode 100644
index 0000000..617f1fc
--- /dev/null
+++ b/tests/corelib/map_values3_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+main() {
+  var map1 = <int, String>{ 1: "42", 2: "499" };
+  var map2 = <int, String>{};
+  var map3 = const <int, String>{ 3: "42", 4: "499" };
+  var map4 = const <int, String>{};
+  var map5 = new Map<int, String>();
+  map5[5] = "43";
+  map5[6] = "500";
+  var map6 = new Map<int, String>();
+
+  Expect.isTrue(map1.values is Iterable<String>);
+  Expect.isFalse(map1.values is Iterable<bool>);
+  Expect.isFalse(map1.values is List);
+  Expect.equals(2, map1.values.length);
+  Expect.equals("42", map1.values.first);
+  Expect.equals("499", map1.values.last);
+
+  Expect.isTrue(map2.values is Iterable<String>);
+  Expect.isFalse(map2.values is Iterable<bool>);
+  Expect.isFalse(map2.values is List);
+  Expect.equals(0, map2.values.length);
+
+  Expect.isTrue(map3.values is Iterable<String>);
+  Expect.isFalse(map3.values is Iterable<bool>);
+  Expect.isFalse(map3.values is List);
+  Expect.equals(2, map3.values.length);
+  Expect.equals("42", map3.values.first);
+  Expect.equals("499", map3.values.last);
+
+  Expect.isTrue(map4.values is Iterable<String>);
+  Expect.isFalse(map4.values is Iterable<bool>);
+  Expect.isFalse(map4.values is List);
+  Expect.equals(0, map4.values.length);
+
+  Expect.isTrue(map5.values is Iterable<String>);
+  Expect.isFalse(map5.values is Iterable<bool>);
+  Expect.isFalse(map5.values is List);
+  Expect.equals(2, map5.values.length);
+  // new Map gives a LinkedHashMap, so we know the order.
+  Expect.isTrue(map5.values.first == "43");
+  Expect.isTrue(map5.values.last == "500");
+
+  Expect.isTrue(map6.values is Iterable<String>);
+  Expect.isFalse(map6.values is Iterable<bool>);
+  Expect.isFalse(map6.values is List);
+  Expect.equals(0, map6.values.length);
+}
diff --git a/tests/corelib/map_values4_test.dart b/tests/corelib/map_values4_test.dart
new file mode 100644
index 0000000..7e8b7fd
--- /dev/null
+++ b/tests/corelib/map_values4_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Dart2js had a bug where the type information was not set correctly if the
+// generic type of the map was not directly used (but only indirectly through
+// map.values).
+
+main() {
+  var map1 = <int, String>{ 1: "42", 2: "499" };
+  Expect.isTrue(map1.values is Iterable<String>);
+  Expect.isFalse(map1.values is Iterable<bool>);
+}
diff --git a/tests/corelib/print_test.dart b/tests/corelib/print_test.dart
new file mode 100644
index 0000000..7139d75
--- /dev/null
+++ b/tests/corelib/print_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class A {
+  toString() {
+    if (false
+          || true  /// 01: runtime error
+        ) {
+      return 499;
+    } else {
+      return "ok";
+    }
+  }
+}
+
+main() {
+  print(new A());
+}
diff --git a/tests/corelib/set_test.dart b/tests/corelib/set_test.dart
index b59d746..32ec520 100644
--- a/tests/corelib/set_test.dart
+++ b/tests/corelib/set_test.dart
@@ -243,7 +243,7 @@
   testLength(1, set);
 }
 
-void testRetainWhere(Set create([equals, hashCode, validKey])) {
+void testRetainWhere(Set create([equals, hashCode, validKey, compare])) {
   // The retainWhere method must not collapse the argument Iterable
   // in a way that doesn't match the equality of the set.
   // It must not throw away equal elements that are different in the
@@ -255,17 +255,17 @@
   // must work. Can't use an identity set internally (as was done at some point
   // during development).
   Set set = create();
-  set.addAll([new EO(0), new EO(1), new EO(2)]);
+  set.addAll([new CE(0), new CE(1), new CE(2)]);
   Expect.equals(3, set.length);  // All different.
-  set.retainAll([new EO(0), new EO(2)]);
+  set.retainAll([new CE(0), new CE(2)]);
   Expect.equals(2, set.length);
-  Expect.isTrue(set.contains(new EO(0)));
-  Expect.isTrue(set.contains(new EO(2)));
+  Expect.isTrue(set.contains(new CE(0)));
+  Expect.isTrue(set.contains(new CE(2)));
 
   // If equality of set is identity, we can't internally use a non-identity
   // based set because it might throw away equal objects that are not identical.
-  var elems = [new EO(0), new EO(1), new EO(2), new EO(0)];
-  set = create(identical);
+  var elems = [new CE(0), new CE(1), new CE(2), new CE(0)];
+  set = create(identical, null, null, identityCompare);
   set.addAll(elems);
   Expect.equals(4, set.length);
   set.retainAll([elems[0], elems[2], elems[3]]);
@@ -276,37 +276,88 @@
 
   // If set equality is less precise than equality, we must not use equality
   // internally to see if the element is there:
-  set = create(customEq(3), customHash(3), validKey);
-  set.addAll([new EO(0), new EO(1), new EO(2)]);
+  set = create(customEq(3), customHash(3), validKey, customCompare(3));
+  set.addAll([new CE(0), new CE(1), new CE(2)]);
   Expect.equals(3, set.length);
-  set.retainAll([new EO(3), new EO(5)]);
+  set.retainAll([new CE(3), new CE(5)]);
   Expect.equals(2, set.length);
-  Expect.isTrue(set.contains(new EO(6)));
-  Expect.isTrue(set.contains(new EO(8)));
+  Expect.isTrue(set.contains(new CE(6)));
+  Expect.isTrue(set.contains(new CE(8)));
 
   // It shouldn't matter if the input is a set.
   set.clear();
-  set.addAll([new EO(0), new EO(1), new EO(2)]);
+  set.addAll([new CE(0), new CE(1), new CE(2)]);
   Expect.equals(3, set.length);
-  set.retainAll(new Set.from([new EO(3), new EO(5)]));
+  set.retainAll(new Set.from([new CE(3), new CE(5)]));
   Expect.equals(2, set.length);
-  Expect.isTrue(set.contains(new EO(6)));
-  Expect.isTrue(set.contains(new EO(8)));
+  Expect.isTrue(set.contains(new CE(6)));
+  Expect.isTrue(set.contains(new CE(8)));
+}
+
+void testDifferenceIntersection(create([equals, hashCode, validKey, compare])) {
+  // Test that elements of intersection comes from receiver set.
+  CE ce1a = new CE(1);
+  CE ce1b = new CE(1);
+  CE ce2 = new CE(2);
+  CE ce3 = new CE(3);
+  Expect.equals(ce1a, ce1b);  // Sanity check.
+
+  var set1 = create();
+  var set2 = create();
+  set1.add(ce1a);
+  set1.add(ce2);
+  set2.add(ce1b);
+  set2.add(ce3);
+
+  var difference = set1.difference(set2);
+  testLength(1, difference);
+  Expect.identical(ce2, difference.lookup(ce2));
+
+  difference = set2.difference(set1);
+  testLength(1, difference);
+  Expect.identical(ce3, difference.lookup(ce3));
+
+  // Difference uses other.contains to check for equality.
+  var set3 = create(identical, identityHashCode, null, identityCompare);
+  set3.add(ce1b);
+  difference = set1.difference(set3);
+  testLength(2, difference);  // ce1a is not identical to element in set3.
+  Expect.identical(ce1a, difference.lookup(ce1a));
+  Expect.identical(ce2, difference.lookup(ce2));
+
+  // Intesection always takes elements from receiver set.
+  var intersection = set1.intersection(set2);
+  testLength(1, intersection);
+  Expect.identical(ce1a, intersection.lookup(ce1a));
+
+  intersection = set1.intersection(set3);
+  testLength(0, intersection);
 }
 
 // Objects that are equal based on data.
-class EO {
+class CE implements Comparable<CE> {
   final int id;
-  const EO(this.id);
+  const CE(this.id);
   int get hashCode => id;
-  bool operator==(Object other) => other is EO && id == (other as EO).id;
+  bool operator==(Object other) => other is CE && id == (other as CE).id;
+  int compareTo(CE other) => id - other.id;
+  String toString() => "CE($id)";
 }
 
 // Equality of Id objects based on id modulo value.
-Function customEq(int mod) => (EO e1, EO e2) => ((e1.id - e2.id) % mod) == 0;
-Function customHash(int mod) => (EO e) => e.id % mod;
-bool validKey(Object o) => o is EO;
-
+Function customEq(int mod) => (CE e1, CE e2) => ((e1.id - e2.id) % mod) == 0;
+Function customHash(int mod) => (CE e) => e.id % mod;
+Function customCompare(int mod) => (CE e1, CE e2) =>
+    (e1.id % mod) - (e2.id % mod);
+bool validKey(Object o) => o is CE;
+final customId = new Map.identity();
+int counter = 0;
+int identityCompare(e1, e2) {
+  if (identical(e1, e2)) return 0;
+  int i1 = customId.putIfAbsent(e1, () => ++counter);
+  int i2 = customId.putIfAbsent(e2, () => ++counter);
+  return i1 - i2;
+}
 
 main() {
   testMain(() => new HashSet());
@@ -320,6 +371,7 @@
       equals: (a, b) => a == b,
       hashCode: (a) => -a.hashCode,
       isValidKey: (a) => true));
+  testMain(() => new SplayTreeSet());
 
   testTypeAnnotations(new HashSet<int>());
   testTypeAnnotations(new LinkedHashSet<int>());
@@ -331,10 +383,22 @@
   testTypeAnnotations(new LinkedHashSet<int>(equals: (int a, int b) => a == b,
                                              hashCode: (int a) => a.hashCode,
                                              isValidKey: (a) => a is int));
+  testTypeAnnotations(new SplayTreeSet<int>());
 
-  testRetainWhere(([equals, hashCode, validKey]) =>
+  testRetainWhere(([equals, hashCode, validKey, comparator]) =>
       new HashSet(equals: equals, hashCode: hashCode, isValidKey: validKey));
-  testRetainWhere(([equals, hashCode, validKey]) =>
+  testRetainWhere(([equals, hashCode, validKey, comparator]) =>
       new LinkedHashSet(equals: equals, hashCode: hashCode,
                         isValidKey: validKey));
+  testRetainWhere(([equals, hashCode, validKey, comparator]) =>
+      new SplayTreeSet(comparator, validKey));
+
+  testDifferenceIntersection(([equals, hashCode, validKey, comparator]) =>
+      new HashSet(equals: equals, hashCode: hashCode, isValidKey: validKey));
+  testDifferenceIntersection(([equals, hashCode, validKey, comparator]) =>
+      new LinkedHashSet(equals: equals, hashCode: hashCode,
+                        isValidKey: validKey));
+  testDifferenceIntersection(([equals, hashCode, validKey, comparator]) =>
+      new SplayTreeSet(comparator, validKey));
+
 }
diff --git a/tests/corelib/string_codeunits_test.dart b/tests/corelib/string_codeunits_test.dart
index 46db21f..30b7f40 100644
--- a/tests/corelib/string_codeunits_test.dart
+++ b/tests/corelib/string_codeunits_test.dart
@@ -6,7 +6,7 @@
 
 main() {
   test(String s) {
-    Iterable<int> units = s.codeUnits;
+    List<int> units = s.codeUnits;
     List<int> expectedUnits = <int>[];
     for (int i = 0; i < s.length; i++) {
       expectedUnits.add(s.codeUnitAt(i));
diff --git a/tests/corelib/unicode2_test.dart b/tests/corelib/unicode2_test.dart
new file mode 100755
index 0000000..1bbe82b
--- /dev/null
+++ b/tests/corelib/unicode2_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+const String testPhrase =
+    "The quick brown fox jumps over the lazy dog.";
+
+const List<int> testCodepoints = const<int> [
+    84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110,
+    32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114,
+    32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103, 46];
+
+main() {
+  testCodepointsToString();
+  testStringCharCodes();
+  testEmptyStringFromCharCodes();
+  testEmptyStringCharCodes();
+}
+
+void testStringCharCodes() {
+  Expect.listEquals(testCodepoints, testPhrase.codeUnits);
+}
+
+void testCodepointsToString() {
+  Expect.stringEquals(testPhrase, new String.fromCharCodes(testCodepoints));
+}
+
+void testEmptyStringFromCharCodes() {
+  Expect.stringEquals("", new String.fromCharCodes(<int>[]));
+}
+
+void testEmptyStringCharCodes() {
+  Expect.listEquals([], "".codeUnits);
+}
diff --git a/tests/html/html.status b/tests/html/html.status
index 0792441..850c938 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -5,7 +5,7 @@
 async_window_test: Skip #TODO(gram): investigating
 event_test: Skip  # Issue 1996
 interactive_test: Skip # Must be run manually.
-dromaeo_smoke_test: Fail, Pass # Issue 14521
+dromaeo_smoke_test: Skip # Issue 14521, 8257
 
 [ $compiler == dart2js && $csp ]
 custom/js_custom_test: Fail # Issue 14643
@@ -54,7 +54,6 @@
 audiobuffersourcenode_test/supported: Fail # TODO(kasperl): Please triage.
 canvasrenderingcontext2d_test/drawImage_video_element: Fail # TODO(kasperl): Please triage.
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # TODO(kasperl): Please triage.
-dromaeo_smoke_test: Fail # TODO(kasperl): Please triage.
 element_types_test/supported_datalist: Fail # TODO(kasperl): Please triage.
 fileapi_test/directoryReader: Fail # TODO(kasperl): Please triage.
 input_element_test/supported_week: Fail # TODO(kasperl): Please triage.
@@ -107,7 +106,6 @@
 audiobuffersourcenode_test: Pass, Fail
 
 [$runtime == ie10 ]
-dromaeo_smoke_test: Skip #TODO(efortuna): investigating.
 element_test/click: Fail                # IE does not support firing this event.
 history_test/history: Pass, Fail # issue 8183
 native_gc_test: Fail, Pass # BUG(7774): Untriaged.
@@ -173,7 +171,6 @@
 custom/document_register_type_extensions_test/namespaces: Fail # Issue 13193
 document_test/document: Pass, Fail # BUG(9654) need per-instance patching
 dom_constructors_test: Fail
-dromaeo_smoke_test: Skip #TODO(efortuna): investigating.
 element_test/click: Fail                # IE does not support firing this event.
 form_element_test: Fail # Issue 4793.
 localstorage_test: Fail
@@ -323,8 +320,6 @@
 form_data_test: Fail # Issue: 7413
 htmlelement_test: Fail
 isolates_test: Skip # Timeout.
-js_interop_3_test: Skip # Timeout.
-js_interop_4_test: Skip # Timeout.
 keyboard_event_test: Fail # Issue: 7413
 serialized_script_value_test: Fail
 typed_arrays_arraybuffer_test: Fail
@@ -348,7 +343,6 @@
 [ $runtime == ff ]
 xhr_test/xhr: Pass, Fail # Issue 11602
 dart_object_local_storage_test: Skip  # sessionStorage NS_ERROR_DOM_NOT_SUPPORTED_ERR
-dromaeo_smoke_test: Pass, Fail # Issue: 8257
 webgl_1_test: Pass, Fail   # Issue 8219
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Firefox does not like dataUrl videos for drawImage
 
@@ -393,17 +387,14 @@
 # Note: these tests are all injecting scripts by design.  This is not allowed under CSP.
 event_customevent_test: Fail       # Test cannot run under CSP restrictions.
 js_interop_1_test: Skip            # Test cannot run under CSP restrictions (times out).
-js_interop_2_test: Fail, OK        # Test cannot run under CSP restrictions.
-js_interop_3_test: Skip            # Test cannot run under CSP restrictions (times out).
 js_test: Skip                      # Test cannot run under CSP restrictions (times out).
 postmessage_structured_test: Skip  # Test cannot run under CSP restrictions (times out).
 
-[ $compiler == dart2js && $runtime == drt ]
+[ $compiler == dart2js && ($runtime == drt || $runtime ==chrome) ]
 wheelevent_test: Fail # http://dartbug.com/12958
 
 [ $compiler == none && $runtime == dartium ]
 async_test: Timeout # Issue 13719: Please triage this failure.
-dromaeo_smoke_test: Fail # Issue 13719: Please triage this failure.
 element_offset_test/offset: Pass, Fail # Issue 13719, 13296
 touchevent_test/supported: Fail # Issue 13719: Please triage this failure.
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index a31db8c..e87e71a 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -15,7 +15,6 @@
 isolate2_negative_test: Fail
 isolate_import_negative_test: Fail
 unresolved_ports_test: Pass
-mandel_isolate_test: StaticWarning  # test issue 14782; unittestConfiguration.timeout has only getter in Configuration
 
 [ $compiler == dart2js && $jscl ]
 browser/*: SkipByDesign  # Browser specific tests
@@ -27,9 +26,6 @@
 [ $compiler == dart2js ]
 serialization_test: RuntimeError # Issue 1882, tries to access class TestingOnly declared in isolate_patch.dart
 
-global_error_handler_test: Pass, RuntimeError # Issue 9012, Issue 9024
-global_error_handler2_test: Pass, RuntimeError # Issue 9012, Issue 9024
-
 [ $compiler == dart2js && $runtime == ie9 ]
 browser/typed_data_message_test: Fail # Issue 12624
 
@@ -92,7 +88,6 @@
 spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
 
 [ $compiler == none && $runtime == dartium ]
-global_error_handler2_test: Fail # Issue 13719: Please triage this failure.
 spawn_uri_nested_vm_test: Skip # Issue 14479: This test is timing out.
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
@@ -101,8 +96,6 @@
 browser/typed_data_message_test: Skip # 13961
 count_test: Fail
 cross_isolate_message_test: Fail
-global_error_handler2_test: Fail
-global_error_handler_test: Fail
 illegal_msg_function_test: Fail
 illegal_msg_mirror_test: Fail
 isolate_complex_messages_test: Fail
@@ -113,11 +106,13 @@
 mint_maker_test: Fail
 nested_spawn2_test: Fail
 nested_spawn_test: Fail
+raw_port_test: Fail
 request_reply_test: Fail
 spawn_function_custom_class_test: Fail
 spawn_function_test: Fail
 stacktrace_message_test: Fail
 unresolved_ports_test: Fail
+static_function_test: Fail
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 browser/typed_data_message_test: StaticWarning
@@ -125,6 +120,5 @@
 isolate_import_negative_test: CompileTimeError
 mint_maker_test: StaticWarning
 serialization_test: StaticWarning
-isolate/unresolved_ports_test: StaticWarning
-mandel_isolate_stream_test: StaticWarning
+unresolved_ports_test: StaticWarning
 
diff --git a/tests/isolate/mandel_isolate_test.dart b/tests/isolate/mandel_isolate_test.dart
index 241ff29..b1e3656 100644
--- a/tests/isolate/mandel_isolate_test.dart
+++ b/tests/isolate/mandel_isolate_test.dart
@@ -14,7 +14,8 @@
 
 main() {
   // Test is really slow in debug builds of the VM.
-  unittestConfiguration.timeout = const Duration(seconds: 480);
+  SimpleConfiguration configuration = unittestConfiguration;
+  configuration.timeout = const Duration(seconds: 480);
   test("Render Mandelbrot in parallel", () {
     final state = new MandelbrotState();
     state._validated.future.then(expectAsync1((result) {
diff --git a/tests/isolate/raw_port_test.dart b/tests/isolate/raw_port_test.dart
new file mode 100644
index 0000000..8e334ca
--- /dev/null
+++ b/tests/isolate/raw_port_test.dart
@@ -0,0 +1,57 @@
+// 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.
+
+// Test RawReceivePort.
+
+library raw_port_test;
+import 'dart:isolate';
+import 'dart:async';
+import '../../pkg/unittest/lib/unittest.dart';
+
+
+void remote(SendPort port) { port.send("reply"); }
+void remote2(SendPort port) {
+  port.send("reply 1");
+  port.send("reply 2");
+}
+
+main() {
+  test("raw receive", () {
+    RawReceivePort port = new RawReceivePort();
+    Isolate.spawn(remote, port.sendPort);
+    port.handler = expectAsync1((v) {
+      expect(v, "reply");
+      port.close();
+    });
+  });
+  test("raw receive twice - change handler", () {
+    RawReceivePort port = new RawReceivePort();
+    Isolate.spawn(remote2, port.sendPort);
+    port.handler = expectAsync1((v) {
+      expect(v, "reply 1");
+      port.handler = expectAsync1((v) {
+        expect(v, "reply 2");
+        port.close();
+      });
+    });
+  });
+  test("from-raw-port", () {
+    RawReceivePort rawPort = new RawReceivePort();
+    Isolate.spawn(remote, rawPort.sendPort);
+    rawPort.handler = expectAsync1((v) {
+      expect(v, "reply");
+      ReceivePort port = new ReceivePort.fromRawReceivePort(rawPort);
+      Isolate.spawn(remote, rawPort.sendPort);
+      Isolate.spawn(remote, port.sendPort);
+      int ctr = 2;
+      port.listen(expectAsync1((v) {
+                    expect(v, "reply");
+                    ctr--;
+                    if (ctr == 0) port.close();
+                  }, count: 2),
+                  onDone: expectAsync0((){}));
+    });
+  });
+
+}
diff --git a/tests/isolate/static_function_lib.dart b/tests/isolate/static_function_lib.dart
new file mode 100644
index 0000000..e0b6597
--- /dev/null
+++ b/tests/isolate/static_function_lib.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library static_function_testlib;
+import "dart:isolate" show SendPort;
+
+// Used by static_function_test.dart.
+
+void function(port) { port.send("LIBTOP"); }
+void _function(port) { port.send("_LIBTOP"); }
+
+Function get privateFunction => _function;
+
+class C {
+  static void function(SendPort port) { port.send("LIB"); }
+  static void _function(SendPort port) { port.send("LIBPRIVATE"); }
+  static Function get privateFunction => _function;
+}
+
+Function get privateClassFunction => _C.function;
+Function get privateClassAndFunction => _C._function;
+
+class _C {
+  static void function(SendPort port) { port.send("_LIB"); }
+  static void _function(SendPort port) { port.send("_LIBPRIVATE"); }
+}
diff --git a/tests/isolate/static_function_test.dart b/tests/isolate/static_function_test.dart
new file mode 100644
index 0000000..d5745cc
--- /dev/null
+++ b/tests/isolate/static_function_test.dart
@@ -0,0 +1,106 @@
+// 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.
+
+// Test starting isolate with static functions (and toplevel ones, for sanity).
+
+library static_function_test;
+import 'dart:isolate';
+import 'dart:async';
+import 'static_function_lib.dart' as lib;
+import '../../pkg/unittest/lib/unittest.dart';
+
+void function(SendPort port) { port.send("TOP"); }
+void _function(SendPort port) { port.send("_TOP"); }
+
+// A closure created at top-level (not inside a method), but not by a top-level
+// function declaration.
+var staticClosure = (SendPort port) { port.send("WHAT?"); };
+
+// An unnamed closure created inside a function.
+get dynamicClosure => (SendPort port) { port.send("WHAT??"); };
+
+// A named closure created inside a function.
+get namedDynamicClosure {
+  void foo(SendPort port) { port.send("WHAT FOO??"); };
+  return foo;
+}
+
+class C {
+  // Unnamed closure created during object initialization, but not inside
+  // a method or constructor.
+  final Function instanceClosure = (SendPort port) { port.send("C WHAT?"); };
+  // Unnamed closure created during object initializer list evaluation.
+  final Function constructorInitializerClosure;
+  // Unnamed closure created inside constructor body.
+  Function constructorBodyClosure;
+  // Named closure created inside constructor body.
+  Function namedConstructorBodyClosure;
+
+  C() : constructorInitializerClosure =
+            ((SendPort port) { port.send("Init?"); }) {
+    constructorBodyClosure = (SendPort port) {
+      port.send("bodyClosure?");
+    };
+    void foo(SendPort port) {
+      port.send("namedBodyClosure?");
+    }
+    namedConstructorBodyClosure = foo;
+  }
+
+  static void function(SendPort port) { port.send("YES"); }
+  static void _function(SendPort port) { port.send("PRIVATE"); }
+  void instanceMethod(SendPort port) { port.send("INSTANCE WHAT?"); }
+}
+
+class _C {
+  static void function(SendPort port) { port.send("_YES"); }
+  static void _function(SendPort port) { port.send("_PRIVATE"); }
+}
+
+void spawnTest(name, function, response) {
+  test(name, () {
+    ReceivePort r = new ReceivePort();
+      Isolate.spawn(function, r.sendPort);
+      r.listen(expectAsync1((v) {
+        expect(v, response);
+        r.close();
+      }));
+  });
+}
+
+void throwsTest(name, function) {
+  test("throws on $name", () {
+    expect(() { Isolate.spawn(function, null); }, throws);
+  });
+}
+
+void main() {
+  // Sanity check.
+  spawnTest("function", function, "TOP");
+  spawnTest("_function", _function, "_TOP");
+  spawnTest("lib.function", lib.function, "LIBTOP");
+  spawnTest("lib._function", lib.privateFunction, "_LIBTOP");
+
+  // Local static functions.
+  spawnTest("class.function", C.function, "YES");
+  spawnTest("class._function", C._function, "PRIVATE");
+  spawnTest("_class._function", _C.function, "_YES");
+  spawnTest("_class._function", _C._function, "_PRIVATE");
+
+  // Imported static functions.
+  spawnTest("lib.class.function", lib.C.function, "LIB");
+  spawnTest("lib.class._function", lib.C.privateFunction, "LIBPRIVATE");
+  spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
+  spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");
+
+  // Negative tests
+  throwsTest("static closure", staticClosure);
+  throwsTest("dynamic closure", dynamicClosure);
+  throwsTest("named dynamic closure", namedDynamicClosure);
+  throwsTest("instance closure", new C().instanceClosure);
+  throwsTest("initializer closure", new C().constructorInitializerClosure);
+  throwsTest("constructor closure", new C().constructorBodyClosure);
+  throwsTest("named constructor closure", new C().namedConstructorBodyClosure);
+  throwsTest("instance method", new C().instanceMethod);
+}
diff --git a/tests/language/arithmetic_test.dart b/tests/language/arithmetic_test.dart
index c24dcb9..20e4802 100644
--- a/tests/language/arithmetic_test.dart
+++ b/tests/language/arithmetic_test.dart
@@ -423,6 +423,15 @@
     var b = -1;
     for (var i = 0; i < 10; i++) Expect.equals(0x40000000, div(a, b));
   }
+  
+  
+  static int divMod(a, b) => a ~/ b + a % b;
+  
+  static void testSmiDivModDeopt() {
+    var a = -0x40000000;
+    var b = -1;
+    for (var i = 0; i < 10; i++) Expect.equals(0x40000000, divMod(a, b));
+  }
 
   static mySqrt(var x) => sqrt(x);
 
@@ -448,6 +457,7 @@
     for (int i = 0; i < 20; i++) {
       runOne();
       testSmiDivDeopt();
+      testSmiDivModDeopt();
       testSqrtDeopt();
       testDoubleEquality();
     }
diff --git a/tests/language/bailout3_test.dart b/tests/language/bailout3_test.dart
new file mode 100644
index 0000000..6fc0923
--- /dev/null
+++ b/tests/language/bailout3_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Test that the return type of a method is being registered for both
+// its bailout and optimized version in dart2js.
+
+var a;
+
+bar() {
+  if (a[0] == 0) {
+    // Force bailout version.
+    bar();
+    // Avoid inlining.
+    throw 0;
+  }
+  for (int i = 0; i < 10; i++) {
+    a[0] = 42;
+  }
+  // This return should say that bar can return an array or unknown.
+  return a;
+}
+
+foo() {
+  if (a[0] == 0) {
+    // Avoid inlining.
+    throw 0;
+  }
+  var b = bar();
+  // This check used to fail because dart2js was assuming [b] was an
+  // array.
+  Expect.equals(1, b.length);
+}
+
+main() {
+  a = new Map();
+  bar();
+  foo();
+}
diff --git a/tests/language/built_in_identifier_test.dart b/tests/language/built_in_identifier_test.dart
index 5116416..fc1c9be 100644
--- a/tests/language/built_in_identifier_test.dart
+++ b/tests/language/built_in_identifier_test.dart
@@ -38,7 +38,7 @@
     // attempt at complete coverage.
     {
       void factory(set) {
-        return 0;  /// 01: ok
+        return;  /// 01: ok
       }
     }
 
diff --git a/tests/language/checked_setter3_test.dart b/tests/language/checked_setter3_test.dart
new file mode 100644
index 0000000..7a3e697
--- /dev/null
+++ b/tests/language/checked_setter3_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+bool get inCheckedMode {
+  try {
+    var i = 42;
+    String a = i;
+  } catch (e) {
+    return true;
+  }
+  return false;
+}
+
+class A<T> {
+  T field;
+}
+
+class B<T> {
+  T field = 42;
+}
+
+class C<T> {
+  T field = 42;
+}
+
+main() {
+  var a = new A<String>();
+  var c = new C<int>();
+  if (inCheckedMode) {
+    Expect.throws(() => a.field = 42, (e) => e is TypeError);
+    Expect.throws(() => new B<String>(), (e) => e is TypeError);
+    Expect.throws(() => c.field = 'foo', (e) => e is TypeError);
+  } else {
+    a.field = 42;
+    new B<String>();
+    c.field = 'foo';
+  }
+}
diff --git a/tests/language/const_list_test.dart b/tests/language/const_list_test.dart
index e8f95f2..dd7c183 100644
--- a/tests/language/const_list_test.dart
+++ b/tests/language/const_list_test.dart
@@ -34,6 +34,12 @@
     a = const [1, 2, 3.1];
     b = const [1, 2, 3.1];
     Expect.equals(true, a == b);
+    a = const <num>[1, 2, 3.1];
+    b = const [1, 2, 3.1];
+    Expect.equals(false, a == b);
+    a = const <dynamic>[1, 2, 3.1];
+    b = const [1, 2, 3.1];
+    Expect.equals(true, a == b);
   }
 }
 
diff --git a/tests/language/deopt_lazy_finalization_test.dart b/tests/language/deopt_lazy_finalization_test.dart
new file mode 100644
index 0000000..a069634
--- /dev/null
+++ b/tests/language/deopt_lazy_finalization_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test deoptimziation caused by lazy finalization.
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+
+import "package:expect/expect.dart";
+
+main() {
+  Expect.equals(20000, part1());
+  // Trigger lazy finalization of class B, which should invalidate
+  // optimized code for A.loop.
+  Expect.equals(-20000, part2());
+}
+
+part1() {
+  var a = new A();
+  a.loop();
+  // Second invocation calls optimized code.
+  return a.loop();
+}
+
+part2() {
+  var b = new B();
+  b.loop();
+  // Second invocation calls optimized code.
+  return b.loop();
+}
+
+class A {
+  foo() => 2;
+  
+  loop() {
+    var sum = 0;
+    for (int i = 0; i < 10000; i++) {
+      sum += foo();
+    }
+    return sum;
+  }
+}
+
+class Aa extends A {
+
+}
+
+class B extends Aa {
+  foo() => -2;
+}
\ No newline at end of file
diff --git a/tests/language/double_nan_comparison_test.dart b/tests/language/double_nan_comparison_test.dart
new file mode 100644
index 0000000..007e83d
--- /dev/null
+++ b/tests/language/double_nan_comparison_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Tests double comparisons with NaN in different contexts.
+// VMOptions=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+
+test_expr(a, b) => a != b;
+
+test_conditional(a, b) => a != b ? true : false;
+
+test_branch(a, b) {
+  if (a != b) {
+    return true;
+  }
+  return false;
+}
+
+
+main() {
+  Expect.equals(true, test_expr(0.5, double.NAN));
+  for (var i = 0; i < 20; i++) test_expr(0.5, double.NAN);
+  Expect.equals(true, test_expr(0.5, double.NAN));
+
+  Expect.equals(true, test_conditional(0.5, double.NAN));
+  for (var i = 0; i < 20; i++) test_conditional(0.5, double.NAN);
+  Expect.equals(true, test_conditional(0.5, double.NAN));
+
+  Expect.equals(true, test_branch(0.5, double.NAN));
+  for (var i = 0; i < 20; i++) test_branch(0.5, double.NAN);
+  Expect.equals(true, test_branch(0.5, double.NAN));
+}
diff --git a/tests/language/inferrer_constructor4_test.dart b/tests/language/inferrer_constructor4_test.dart
new file mode 100644
index 0000000..858b6ad
--- /dev/null
+++ b/tests/language/inferrer_constructor4_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+escape(object) {
+  print(object.field + 42);
+}
+
+class A {
+  A() {
+    escape(this);
+  }
+}
+
+class B extends A {
+  var field;
+  B() {
+    field = 42;
+  }
+}
+
+main() {
+  Expect.throws(() => new B(), (e) => e is NoSuchMethodError);
+}
diff --git a/tests/language/inferrer_constructor5_test.dart b/tests/language/inferrer_constructor5_test.dart
new file mode 100644
index 0000000..37b62f1
--- /dev/null
+++ b/tests/language/inferrer_constructor5_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {
+  A() {
+    print(field + 42); /// 01: static type warning
+  }
+}
+
+class B extends A {
+  var field;
+  B() {
+    field = 42;
+  }
+}
+
+main() {
+  Expect.throws(() => new B(), (e) => e is NoSuchMethodError); /// 01: continued
+}
diff --git a/tests/language/inferrer_synthesized_super_constructor2_test.dart b/tests/language/inferrer_synthesized_super_constructor2_test.dart
new file mode 100644
index 0000000..bb183af
--- /dev/null
+++ b/tests/language/inferrer_synthesized_super_constructor2_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+bool inConstructor = false;
+
+class A {
+  A._() {
+    inConstructor = true;
+  }
+}
+
+class B extends A {
+  B() : super._();
+}
+
+main() {
+  new B();
+  if (!inConstructor) throw 'Test failed';
+}
diff --git a/tests/language/inferrer_synthesized_super_constructor_test.dart b/tests/language/inferrer_synthesized_super_constructor_test.dart
new file mode 100644
index 0000000..ccffde9
--- /dev/null
+++ b/tests/language/inferrer_synthesized_super_constructor_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'compiler_annotations.dart';
+
+class A {
+  @DontInline()
+  A([a]) {
+    () => 42;
+    if (a != null) throw 'Test failed';
+  }
+}
+
+class B extends A {
+  B();
+}
+
+main() {
+  new B();
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 9597d5f..198b732 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -6,6 +6,7 @@
 # current state of the language.
 
 [ $compiler == none ]
+mixin_regress_13688_test: RuntimeError # Issue 15244
 mixin_super_constructor_named_test: Fail # Issue 12631
 mixin_super_constructor_positionals_test: Fail # Issue 12631
 built_in_identifier_prefix_test: Fail # Issue 6970
@@ -81,3 +82,6 @@
 [ $compiler == none && ( $runtime == dartium || $runtime == drt ) ]
 typed_message_test: Crash, Fail # Issue 13921, 14400
 vm/optimized_guarded_field_isolates_test: Fail # Issue 13921.
+
+[ $arch == simarm || $arch == simmips ]
+vm/optimized_identical_test: Pass, Crash # http://dartbug.com/15235
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index e5498ee..1ce4a22 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -6,15 +6,13 @@
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
-# TBD: using built-in identifers
-built_in_identifier_prefix_test: fail # Issue 12694
+# Test issue 12694 (was analyzer issue), (1) when "abstract" is import prefix using it as type is warning; (2) currently analyzer resolves prefix as field (don't ask)
+built_in_identifier_prefix_test: CompileTimeError # Issue 12694
 
 # TBD: these look like bad tests, no issue number
 class_literal_test: fail
 constructor_call_as_function_test/01: fail
 
-function_type_alias9_test/00: crash # Issue 11987
-
 # TBF: we should check conflicts not only for methods, but for accessors too
 override_field_test/03: fail
 method_override7_test/03: Fail # Issue 11496
@@ -55,6 +53,8 @@
 type_variable_bounds_test/none: fail # Issue 11578
 type_variable_scope_test/none: fail # Issue 11578
 factory_implementation_test/none: fail # Issue 11578
+malbounded_redirecting_factory_test/none: fail # Issue 11578
+malbounded_redirecting_factory2_test/none: fail # Issue 11578
 
 # test issue 11579, assignment, no setter
 getter_no_setter_test/none: fail
@@ -166,7 +166,6 @@
 bad_named_parameters_test: StaticWarning
 bit_operations_test: StaticWarning
 body_less_constructor_wrong_arg_negative_test: CompileTimeError
-built_in_identifier_test/01: CompileTimeError
 call_constructor_on_unresolvable_class_test/04: StaticWarning
 call_constructor_on_unresolvable_class_test/05: StaticWarning
 call_constructor_on_unresolvable_class_test/06: StaticWarning
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 9f967f0..11c06e8 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -6,8 +6,8 @@
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
-# TBD: using built-in identifers
-built_in_identifier_prefix_test: fail # Issue 12694
+# Test issue 12694 (was analyzer issue), (1) when "abstract" is import prefix using it as type is warning; (2) currently analyzer resolves prefix as field (don't ask)
+built_in_identifier_prefix_test: CompileTimeError # Issue 12694
 
 # TBD: these look like bad tests, no issue number
 class_literal_test: fail
@@ -16,20 +16,16 @@
 function_type_alias9_test/00: crash # Issue 11987
 
 # TBF: we should check conflicts not only for methods, but for accessors too
-override_field_test/02: fail
 override_field_test/03: fail
 method_override7_test/03: Fail # Issue 11496
-method_override8_test/03: Fail # Issue 11496
-
-built_in_identifier_test/none: Fail # Issue 13023
-
-export_double_same_main_test: Fail # Issue 14772
 
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
 #
 
+ref_before_declaration_test/none: fail # test issue 14879, "P" is not defined
+bad_initializer2_negative_test: fail # tester issue 14880, Analyzer reports compile-time error, but test runner is not satisfied
 
 # test issue 11124, It is warning, not error to don't initialize final field
 field3a_negative_test: Fail # Issue 11124
@@ -59,6 +55,8 @@
 type_variable_bounds_test/none: fail # Issue 11578
 type_variable_scope_test/none: fail # Issue 11578
 factory_implementation_test/none: fail # Issue 11578
+malbounded_redirecting_factory_test/none: fail # Issue 11578
+malbounded_redirecting_factory2_test/none: fail # Issue 11578
 
 # test issue 11579, assignment, no setter
 getter_no_setter_test/none: fail
@@ -71,15 +69,9 @@
 constructor_call_wrong_argument_count_negative_test: fail
 instance_call_wrong_argument_count_negative_test: fail
 
-# test issue 11589, export D from 2 export directives
-export_cyclic_test: fail
-
 # test issue 11590, runtime only negative test
 field_method4_negative_test: fail
 
-# test issue 11592, Function type alias (typedef) is not a constant
-first_class_types_constants_test: fail
-
 # test issue 11594, Reference to a not resolve identifier is static warning
 import_combinators_negative_test: fail
 interface_static_non_final_fields_negative_test: fail
@@ -130,14 +122,11 @@
 static_field_test/03: fail # Issue 12541
 static_field_test/04: fail # Issue 12541
 
-# test issue 13787; duplicate exports of the same declaration is not handled
-duplicate_export_test: fail # Issue 13787
-
 # test issue 13916, Looks as no warning should be in this redirecting factory
 redirecting_factory_infinite_steps_test/01: fail
 
-# test issue  , disallow default values in redirecting factories
-redirecting_factory_default_values_test/none: fail # Issue 14471
+# test issue 14471, has (legitimate) static warning; but not annotated
+redirecting_factory_default_values_test/none: StaticWarning # Test issue 14471; has (legitimate) static warning; but not annotated
 
 # test issue 13956, It is a static type warning if any of the type arguments to k' are not subtypes of the bounds of the corresponding formal type parameters of type.
 default_factory2_test/none: fail
@@ -161,6 +150,11 @@
 # test issue 14410, "typedef C = " is now really illegal syntax
 mixin_illegal_syntax_test/none: fail
 
+# test issue 14736, It is a static warning if a class C declares an instance method named n and has a setter named n=.
+setter4_test: StaticWarning
+
+
+
 
 abstract_exact_selector_test: StaticWarning
 abstract_getter_test: StaticWarning
@@ -174,7 +168,6 @@
 bad_named_parameters_test: StaticWarning
 bit_operations_test: StaticWarning
 body_less_constructor_wrong_arg_negative_test: CompileTimeError
-built_in_identifier_test/01: CompileTimeError
 call_constructor_on_unresolvable_class_test/04: StaticWarning
 call_constructor_on_unresolvable_class_test/05: StaticWarning
 call_constructor_on_unresolvable_class_test/06: StaticWarning
@@ -312,6 +305,7 @@
 method_override5_test: StaticWarning
 method_override6_test: StaticWarning
 method_override_test: StaticWarning
+mixin_illegal_static_access_test: StaticWarning
 mixin_illegal_syntax_test/13: CompileTimeError
 mixin_typedef_constructor_test: StaticWarning
 mixin_type_parameter2_test: StaticWarning
@@ -391,7 +385,6 @@
 prefix23_test: StaticWarning
 prefix7_negative_test: CompileTimeError
 property_field_override_test: StaticWarning
-redirecting_factory_default_values_test/none: StaticWarning
 redirecting_factory_incompatible_signature_test: StaticWarning
 regress_13494_test: StaticWarning
 return_type_test: StaticWarning
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 7e671f6..42c7dd2 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -35,19 +35,21 @@
 vm/*: Skip # Issue 12699
 
 [ $compiler == dart2js && $checked ]
-checked_setter2_test: Fail # Issue 11273
 type_variable_bounds_test/02: Fail # Issue 12702
 type_variable_bounds2_test/01: Fail # Issue 12702
 type_variable_bounds2_test/04: Fail # Issue 12702
 type_variable_bounds2_test/06: Pass # Issue 12702 (pass for the wrong reasons).
 type_variable_bounds3_test/00: Fail # Issue 12702
 closure_type_test: Fail # Issue 12745
-function_subtype_setter0_test: Fail # Issue 11273
-redirecting_factory_malbounded_test/01: Fail # Issue 12825
+malbounded_redirecting_factory_test/02: Fail # Issue 12825
+malbounded_redirecting_factory_test/03: Fail # Issue 12825
+malbounded_redirecting_factory2_test/02: Fail # Issue 12825
+malbounded_redirecting_factory2_test/03: Fail # Issue 12825
 malbounded_instantiation_test/01: Fail # Issue 12702
 malbounded_type_cast_test: Fail # Issue 14121
 malbounded_type_test_test/03: Fail # Issue 14121
 malbounded_type_test_test/04: Fail # Issue 14121
+default_factory2_test/01: Fail # Issue 14121
 
 [ $compiler == dart2js && $unchecked ]
 type_checks_in_factory_method_test: RuntimeError # Issue 12746
@@ -125,13 +127,13 @@
 not_enough_positional_arguments_test/02: CompileTimeError # Issue 12838
 not_enough_positional_arguments_test/05: CompileTimeError # Issue 12838
 metadata_test: CompileTimeError # Issue 5841
-metadata_syntax_test/05: MissingCompileTimeError # Issue 14548
 infinity_test: RuntimeError # Issue 4984
 positive_bit_operations_test: RuntimeError # Issue 12795
 mixin_mixin2_test: RuntimeError # Issue 13109.
 mixin_mixin3_test: RuntimeError # Issue 13109.
 mixin_mixin7_test: RuntimeError # Issue 13109.
 mixin_regress_13688_test: RuntimeError # Issue 13109.
+modulo_test: RuntimeError # Issue 15246
 
 # Compilation errors.
 const_var_test: CompileTimeError # Issue 12793
@@ -187,12 +189,14 @@
 [ $compiler == dart2dart ]
 regress_13494_test: Fail # Issue 13494
 malformed_test/none: CompileTimeError # Issue 12695
+mixin_regress_13688_test: RuntimeError # Issue 15244
 mixin_super_constructor_named_test: Fail # Issue 12631
 mixin_super_constructor_positionals_test: Fail # Issue 12631
 
 built_in_identifier_prefix_test: Fail # Issue 6972
 constructor_initializer_test/none: Fail # Issue 12633
 factory3_test: Fail # Issue 13077
+redirecting_factory_long_test: Fail # Issue 13077
 type_checks_in_factory_method_test: Fail # Issue 12747
 
 # Mixins fail on the VM.
@@ -233,7 +237,6 @@
 not_enough_positional_arguments_test/05: Fail # Issue 12839
 
 metadata_test: Fail # Issue 12762
-metadata_syntax_test/05: MissingCompileTimeError # Issue 14548
 const_var_test: Pass, Fail # Issue 12794
 map_literal3_test: Fail # Issue 12794
 external_test/13: Fail # Issue 12888
diff --git a/tests/language/malbounded_redirecting_factory2_test.dart b/tests/language/malbounded_redirecting_factory2_test.dart
new file mode 100644
index 0000000..cac0c0a
--- /dev/null
+++ b/tests/language/malbounded_redirecting_factory2_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class A<Ta
+           extends num  /// 02: continued
+                      > implements B<Ta>, C<Ta> { }
+
+class B<Tb
+           extends num  /// 03: continued
+                      > {
+  factory B() = A<Tb>;
+}
+
+class C<Tc
+           extends num  /// 04: continued
+                      > {
+  factory C() = B<Tc>;
+}
+
+class D<Td> {
+  test() => new C<Td>();
+}
+
+main() {
+  new D<int>().test();
+  new D<String>().test();  /// 01: static type warning
+  new D<String>().test();  /// 02: static type warning, dynamic type error
+  new D<String>().test();  /// 03: static type warning, dynamic type error
+  new D<String>().test();  /// 04: static type warning, dynamic type error
+}
diff --git a/tests/language/malbounded_redirecting_factory_test.dart b/tests/language/malbounded_redirecting_factory_test.dart
new file mode 100644
index 0000000..d0e3d02
--- /dev/null
+++ b/tests/language/malbounded_redirecting_factory_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class A<Ta
+           extends num  /// 02: continued
+                      > implements B<Ta>, C<Ta> { }
+
+class B<Tb
+           extends num  /// 03: continued
+                      > {
+  factory B() = A<Tb>;
+}
+
+class C<Tc
+           extends num  /// 04: continued
+                      > {
+  factory C() = B<Tc>;
+}
+
+main() {
+  new C<int>();
+  new C<String>();  /// 01: static type warning
+  new C<String>();  /// 02: static type warning, dynamic type error
+  new C<String>();  /// 03: static type warning, dynamic type error
+  new C<String>();  /// 04: static type warning, dynamic type error
+}
diff --git a/tests/language/minify_closure_variable_collision_test.dart b/tests/language/minify_closure_variable_collision_test.dart
new file mode 100644
index 0000000..e2ee730
--- /dev/null
+++ b/tests/language/minify_closure_variable_collision_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js, that used to minify a captured
+// variable's name to the same name as inherited Object methods.
+
+var array = [new A()];
+
+class A {
+  operator==(other) {
+    return true;
+  }
+}
+
+foo() {
+  // Use lots of variables, to maximize the chance of collisions.
+  var a = 42;
+  var b = 42;
+  var c = 42;
+  var d = 42;
+  var e = 42;
+  var f = 42;
+  var g = 42;
+  var h = 42;
+  var i = 42;
+  var j = 42;
+  var k = 42;
+  var l = 42;
+  var m = 42;
+  var n = 42;
+  array[0] = () {
+    return a + b + c + d + e + f + g + h + i + j + k + l + m + n;
+  };
+}
+
+main() {
+  foo();
+  if (array[0] == new A()) {
+    throw 'Test failed';
+  }
+  if (array[0]() != 42 * 14) {
+    throw 'Test failed';
+  }
+}
diff --git a/tests/language/modulo_test.dart b/tests/language/modulo_test.dart
index 28444c6..939d7c0 100644
--- a/tests/language/modulo_test.dart
+++ b/tests/language/modulo_test.dart
@@ -8,26 +8,57 @@
 
 
 main() {
+  // Prime IC cache.
+  noDom(1);
+  noDom(-1);
   for (int i = -30; i < 30; i++) {
     Expect.equals(i % 256, foo(i));
     Expect.equals(i % -256, boo(i));
-    try {
-      hoo(i);
-      Expect.fail("Exception expected.");
-    } catch (e) {}
+    Expect.throws(() => hoo(i), (e) => e is IntegerDivisionByZeroException);
+    
+    Expect.equals(i ~/ 254 + i % 254, fooTwo(i));
+    Expect.equals(i ~/ -254 + i % -254, booTwo(i));
+    Expect.throws(() => hooTwo(i), (e) => e is IntegerDivisionByZeroException);
+    if (i > 0) {
+      Expect.equals(i % 10, noDom(i));
+    } else {
+      Expect.equals(i ~/ 10, noDom(i));
+    }
+    Expect.equals((i ~/ 10) + (i ~/ 10) + (i % 10), threeOp(i));
+    Expect.equals((i ~/ 10) + (i ~/ 12) + (i % 10) + (i % 12), fourOp(i));
   }
 }
 
-foo(i) {
-  return i % 256;  // This will get optimized to AND instruction.
+foo(i) => i % 256;  // This will get optimized to AND instruction.
+boo(i) => i % -256;
+hoo(i) => i % 0;
+
+fooTwo(i) => i ~/ 254 + i % 254;
+booTwo(i) => i ~/ -254 + i % -254;
+hooTwo(i) => i ~/ 0 + i % 0;
+
+noDom(a) {
+  var x;
+  if (a > 0) {
+    x = a % 10;
+  } else {
+    x = a ~/ 10;
+  }
+  return x;
+}
+
+threeOp(a) {
+  var x = a ~/ 10;
+  var y = a ~/ 10;
+  var z = a % 10;
+  return x + y + z;
 }
 
 
-boo(i) {
-  return i % -256;
-}
-
-
-hoo(i) {
-  return i % 0;
-}
+fourOp(a) {
+  var x0 = a ~/ 10;
+  var x1 = a ~/ 12;
+  var y0 = a % 10; 
+  var y1 = a % 12;
+  return x0 + x1 + y0 + y1;
+}
\ No newline at end of file
diff --git a/tests/language/redirecting_factory_long_test.dart b/tests/language/redirecting_factory_long_test.dart
new file mode 100644
index 0000000..d776df0
--- /dev/null
+++ b/tests/language/redirecting_factory_long_test.dart
@@ -0,0 +1,81 @@
+// 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.
+
+// Test long substitution of long redirection chains.
+
+import 'package:expect/expect.dart';
+
+class C {
+  const factory C() = D<int>;
+}
+
+class D<T> implements C {
+  const factory D() = E<double, int>;
+}
+
+class E<S, T> implements D<T> {
+  final field = 42;
+  const E();
+}
+
+class X<T> {
+  const factory X() = Y<T>;
+}
+
+class X1<T1> {
+  const factory X1() = Y<T1>;
+}
+
+class X2 {
+  const factory X2() = Y<int>;
+}
+
+class Y<S> implements X<S>, X1<S>, X2 {
+  const factory Y() = Y1<S>;
+}
+
+class Y1<U> implements Y<U> {
+  const factory Y1() = Z<U>;
+}
+
+class Z<V> implements Y1<V> {
+  final field = 87;
+  const Z();
+}
+
+void main() {
+  testC(new C());
+  testC(const C());
+  testZ(new X<int>());
+  testZ(new X1<int>());
+  testZ(new X2());
+  testZ(const X<int>());
+  testZ(const X1<int>());
+  testZ(const X2());
+}
+
+void testC(var c) {
+  Expect.isTrue(c is C);
+  Expect.isTrue(c is D<int>);
+  Expect.isTrue(c is! D<String>);
+  Expect.isTrue(c is E<double, int>);
+  Expect.isTrue(c is! E<String, int>);
+  Expect.isTrue(c is! E<double, String>);
+  Expect.equals(42, c.field);
+}
+
+void testZ(var z) {
+  Expect.isTrue(z is X<int>);
+  Expect.isTrue(z is! X<String>);
+  Expect.isTrue(z is X1<int>);
+  Expect.isTrue(z is! X1<String>);
+  Expect.isTrue(z is X2);
+  Expect.isTrue(z is Y<int>);
+  Expect.isTrue(z is! Y<String>);
+  Expect.isTrue(z is Y1<int>);
+  Expect.isTrue(z is! Y1<String>);
+  Expect.isTrue(z is Z<int>);
+  Expect.isTrue(z is! Z<String>);
+  Expect.equals(87, z.field);
+}
diff --git a/tests/language/super_field_2_test.dart b/tests/language/super_field_2_test.dart
new file mode 100644
index 0000000..7c53c43
--- /dev/null
+++ b/tests/language/super_field_2_test.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {
+  var foo;
+  A(this.foo);
+
+  B_Sfoo() => 'A.B_Sfoo()';
+}
+
+class B extends A {
+  B(x) : super(x);
+
+  B_Sfoo() => super.foo;
+  BC_Sfoo() => super.foo;
+  BCD_Sfoo() => super.foo;
+}
+
+class C extends B {
+  var foo;
+  C(x, this.foo) : super(x);
+
+  BC_Sfoo() => super.foo;
+  BCD_Sfoo() => super.foo;
+}
+
+class D extends C {
+  D(x, y) : super(x, y);
+
+  BCD_Sfoo() => super.foo;
+}
+
+
+var inscrutable;
+
+main() {
+  inscrutable = (x) => x;
+
+  var b = new B('Ba');
+  var c = new C('Ca', 'Cc');
+  var d = new D('Da', 'Dc');
+
+  // Check access via plain getter.
+  var b_bc = inscrutable(true) ? b : c;  // B, but compiler thinks can also be C
+  var c_bc = inscrutable(true) ? c : b;  // C, but compiler thinks can also be B
+
+  Expect.equals('Ba', b.foo);
+  Expect.equals('Cc', c.foo);
+  Expect.equals('Dc', d.foo);
+  Expect.equals('Ba', b_bc.foo);
+  Expect.equals('Cc', c_bc.foo);
+
+  Expect.equals('Ba', inscrutable(b).foo);
+  Expect.equals('Cc', inscrutable(c).foo);
+  Expect.equals('Dc', inscrutable(d).foo);
+  Expect.equals('Ba', inscrutable(b_bc).foo);
+  Expect.equals('Cc', inscrutable(c_bc).foo);
+
+  // Check access via super.foo in various contexts
+  Expect.equals('Ba', b.B_Sfoo());
+  Expect.equals('Ca', c.B_Sfoo());
+  Expect.equals('Da', d.B_Sfoo());
+
+  Expect.equals('Ba', b.BC_Sfoo());
+  Expect.equals('Ca', c.BC_Sfoo());
+  Expect.equals('Da', d.BC_Sfoo());
+
+  Expect.equals('Ba', b.BCD_Sfoo());
+  Expect.equals('Ca', c.BCD_Sfoo());
+  Expect.equals('Dc', d.BCD_Sfoo());
+
+  Expect.equals('Ba', inscrutable(b).B_Sfoo());
+  Expect.equals('Ca', inscrutable(c).B_Sfoo());
+  Expect.equals('Da', inscrutable(d).B_Sfoo());
+
+  Expect.equals('Ba', inscrutable(b).BC_Sfoo());
+  Expect.equals('Ca', inscrutable(c).BC_Sfoo());
+  Expect.equals('Da', inscrutable(d).BC_Sfoo());
+
+  Expect.equals('Ba', inscrutable(b).BCD_Sfoo());
+  Expect.equals('Ca', inscrutable(c).BCD_Sfoo());
+  Expect.equals('Dc', inscrutable(d).BCD_Sfoo());
+
+
+}
diff --git a/tests/language/try_catch_test.dart b/tests/language/try_catch_test.dart
index 347d706..fb36300 100644
--- a/tests/language/try_catch_test.dart
+++ b/tests/language/try_catch_test.dart
@@ -138,6 +138,42 @@
     Expect.equals("s", e);
   }
 
+  static void test10() {
+    try {
+      throw "up";
+    } on String catch (e) {
+      var e = 1;  // ok, shadows exception variable.
+      Expect.equals(1, e);
+    }
+  }
+
+  static void test11() {
+    var e0 = 11;
+    try {
+      throw "up";
+    } on int catch (e0) {
+      Expect.fail("unreachable");
+    } on String catch (e1) {
+      // e0 from the other catch clause is not in scope.
+      Expect.equals(11, e0);
+    }
+  }
+
+  static void test12() {
+    const x = const [];
+    try {
+      throw "up";
+    } catch (e) {
+      Expect.equals("up", e);
+    } on String catch (e) {
+      // Compile-time constants in unreachable catch blocks are still
+      // compiled.
+      const y = x[0];  /// 01: compile-time error
+      Expect.fail("unreachable");
+    }
+  }
+      
+
   static void testMain() {
     test1();
     test2();
@@ -148,6 +184,9 @@
     test7();
     test8();
     test9();
+    test10();
+    test11();
+    test12();
   }
 }
 
diff --git a/tests/language/type_conversion_ssa_test.dart b/tests/language/type_conversion_ssa_test.dart
new file mode 100644
index 0000000..8a1230c
--- /dev/null
+++ b/tests/language/type_conversion_ssa_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js, that used to generate bad code in
+// checked mode. The pattern that lead to an error was:
+//
+// t1 = GeneratedAtUseSite instruction
+// t2 = check(t1)
+// t3 = check(t2)
+// t4 = use(t3)
+// t5 = use(t3)
+// t6 = use(t2)
+//
+// The SSA variable allocator used to allocate the same variable for
+// t5 and t2, because of a bogus optimization with check instructions.
+
+expect(a, b) {
+  if (a != b) throw 'Failed';
+}
+
+var array =
+    [new SelectorGroup(
+      [new Selector([new SimpleSelectorSequence(new ClassSelector())]),
+       new Selector([new SimpleSelectorSequence(new ClassSelector())]),
+       new Selector([new SimpleSelectorSequence(new ClassSelector())])]),
+     new Object()];
+
+class RuleSet {
+  final SelectorGroup _selectorGroup;
+  RuleSet(this._selectorGroup);
+  SelectorGroup get selectorGroup => _selectorGroup;
+}
+
+class SelectorGroup {
+  List<Selector> _selectors;
+  SelectorGroup(this._selectors);
+  List<Selector> get selectors => _selectors;
+}
+
+class Selector {
+  final List<SimpleSelectorSequence> _simpleSelectorSequences;
+  Selector(this._simpleSelectorSequences);
+  List<SimpleSelectorSequence> get simpleSelectorSequences =>
+      _simpleSelectorSequences;
+}
+
+class SimpleSelectorSequence {
+  final SimpleSelector _selector;
+  SimpleSelectorSequence(this._selector);
+  get simpleSelector => _selector;
+}
+
+class SimpleSelector {}
+class ClassSelector extends SimpleSelector {}
+
+
+void testSelectorGroups() {
+  // Fetch the rule set from an array to trick the type inferrer.
+  var ruleset = new RuleSet(array[0]);
+  expect(ruleset.selectorGroup.selectors.length, 3);
+
+  var groupSelector0 = ruleset.selectorGroup.selectors[0];
+  var selector0 = groupSelector0.simpleSelectorSequences[0];
+  var simpleSelector0 = selector0.simpleSelector;
+
+  var groupSelector1 = ruleset.selectorGroup.selectors[1];
+  var selector1 = groupSelector1.simpleSelectorSequences[0];
+  var simpleSelector1 = selector1.simpleSelector;
+  expect(simpleSelector1 is ClassSelector, true);
+  var groupSelector2 = ruleset.selectorGroup.selectors[2];
+}
+
+main() {
+  testSelectorGroups();
+  // Trick the type inferrer.
+  new SimpleSelectorSequence(new SimpleSelector());
+  new SelectorGroup([]);
+  new Selector([]);
+}
diff --git a/tests/language/type_promotion_functions_test.dart b/tests/language/type_promotion_functions_test.dart
index daa317d..bcf12b3 100644
--- a/tests/language/type_promotion_functions_test.dart
+++ b/tests/language/type_promotion_functions_test.dart
@@ -58,10 +58,10 @@
   }
 
   if (funcDynToDyn is FuncDynToVoid) {
-    // No promotion: FuncDynToVoid !<< FuncDynToDyn.
-    a = funcDynToDyn(new A());
-    b = funcDynToDyn(new B());
-    c = funcDynToDyn(new C());
+    // Promotion: FuncDynToVoid << FuncDynToDyn.
+    a = funcDynToDyn(new A()); /// 12: static type warning
+    b = funcDynToDyn(new B()); /// 13: static type warning
+    c = funcDynToDyn(new C()); /// 14: static type warning
   }
 
   if (funcDynToDyn is FuncDynToA) { // Promotion: FuncDynToA << FuncDynToDyn.
diff --git a/tests/language/vm/regress_14903_test.dart b/tests/language/vm/regress_14903_test.dart
new file mode 100644
index 0000000..b7eaaaa
--- /dev/null
+++ b/tests/language/vm/regress_14903_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=10 
+
+import "package:expect/expect.dart";
+
+// Test identical comparisons in optimized code. Registers must be preserved
+// when calling the runtime.
+
+cmp(a, b, c) {
+  var v = c + 1;
+  var w = v + 1;
+  var x = w + 1;
+  var y = x + 1;
+  var z = y + 1;
+  if (identical(a, b)) {
+    c++;
+  }
+  return c + v + w + x + y + z;
+}
+
+
+main() {
+  var big = 100000000000000000000000000000000000;
+  var before = cmp(big, big, 0);
+  Expect.equals(16, before);
+  for (var i = 0; i < 20; i++) cmp(big, big + 1, 0);
+  Expect.equals(before, cmp(big, big, 0));
+}
+
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 84c66b4..b3c0c30 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -3,15 +3,14 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
-lib: Skip # Slow like a hell - timeouts.
+lib/_internal: Skip # Slow like a hell - timeouts.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-lib/core/bool: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
-lib/core/int: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
-lib/core/string: CompileTimeError, OK # Issue 14684. Only redirecting factory constructors can be declared to be 'const'
 lib/_chrome/dart2js/chrome_dart2js: CompileTimeError
 lib/html/dart2js/html_dart2js: CompileTimeError
 lib/html/dartium/html_dartium: CompileTimeError
+lib/html/html_common/html_common: CompileTimeError
+lib/html/html_common/html_common_dart2js: CompileTimeError
 lib/html/html_common/lists: Pass, CompileTimeError
 lib/indexed_db/dart2js/indexed_db_dart2js: CompileTimeError
 lib/indexed_db/dartium/indexed_db_dartium: CompileTimeError
@@ -23,47 +22,59 @@
 lib/_internal/compiler/samples/leap/request_cache: CompileTimeError
 lib/_internal/dartdoc/bin/dartdoc: CompileTimeError
 lib/_internal/dartdoc/lib/dartdoc: CompileTimeError
-lib/_internal/dartdoc/lib/src/dartdoc/utils: CompileTimeError
-lib/_internal/dartdoc/lib/src/export_map: CompileTimeError
+lib/_internal/dartdoc/lib/src/client/client-live-nav: CompileTimeError
+lib/_internal/dartdoc/lib/src/client/client-shared: CompileTimeError
+lib/_internal/dartdoc/lib/src/client/dropdown: CompileTimeError
+lib/_internal/dartdoc/lib/src/client/search: CompileTimeError
 lib/_internal/dartdoc/lib/universe_serializer: CompileTimeError
 lib/_internal/pub/bin/pub: CompileTimeError
-lib/_internal/pub/lib/src/barback: CompileTimeError
+lib/_internal/pub/lib/src/barback: Pass, CompileTimeError # Pass necessary, since CompileTimeError is valid for everything in that directory (not only for src/barback.dart)
 lib/_internal/pub/lib/src/barback/dart2js_transformer: CompileTimeError
 lib/_internal/pub/lib/src/barback/dart_forwarding_transformer: CompileTimeError
 lib/_internal/pub/lib/src/barback/load_all_transformers: CompileTimeError
 lib/_internal/pub/lib/src/barback/load_transformers: CompileTimeError
-lib/_internal/pub/lib/src/barback/pub_barback_logger: CompileTimeError
 lib/_internal/pub/lib/src/barback/pub_package_provider: CompileTimeError
-lib/_internal/pub/lib/src/barback/rewrite_import_transformer: CompileTimeError
 lib/_internal/pub/lib/src/barback/server: CompileTimeError
-lib/_internal/pub/lib/src/barback/watch_sources: CompileTimeError
-lib/_internal/pub/lib/src/command: Pass, CompileTimeError # Pass necessary, since CompileTimeError is valid for everything in that directory (not only for src/command.dart)
+lib/_internal/pub/lib/src/barback/sources: CompileTimeError
 lib/_internal/pub/lib/src/command/build: CompileTimeError
 lib/_internal/pub/lib/src/command/lish: CompileTimeError
 lib/_internal/pub/lib/src/command/list_package_dirs: CompileTimeError
+lib/_internal/pub/lib/src/command: Pass, CompileTimeError # Pass necessary, since CompileTimeError is valid for everything in that directory (not only for src/command.dart)
 lib/_internal/pub/lib/src/command/uploader: CompileTimeError
 lib/_internal/pub/lib/src/dart: CompileTimeError
 lib/_internal/pub/lib/src/directory_tree: CompileTimeError
 lib/_internal/pub/lib/src/entrypoint: CompileTimeError
+lib/_internal/pub/lib/src/git: CompileTimeError
 lib/_internal/pub/lib/src/http: CompileTimeError
 lib/_internal/pub/lib/src/io: CompileTimeError
 lib/_internal/pub/lib/src/lock_file: CompileTimeError
+lib/_internal/pub/lib/src/log: CompileTimeError
 lib/_internal/pub/lib/src/oauth2: CompileTimeError
 lib/_internal/pub/lib/src/package: CompileTimeError
+lib/_internal/pub/lib/src/package_graph: CompileTimeError
 lib/_internal/pub/lib/src/pubspec: CompileTimeError
 lib/_internal/pub/lib/src/safe_http_server: CompileTimeError
 lib/_internal/pub/lib/src/sdk: CompileTimeError
+lib/_internal/pub/lib/src/solver/backtracking_solver: CompileTimeError
+lib/_internal/pub/lib/src/solver/version_solver: CompileTimeError
 lib/_internal/pub/lib/src/source: CompileTimeError
 lib/_internal/pub/lib/src/source/git: CompileTimeError
 lib/_internal/pub/lib/src/source/hosted: CompileTimeError
 lib/_internal/pub/lib/src/source/path: CompileTimeError
+lib/_internal/pub/lib/src/source_registry: CompileTimeError
 lib/_internal/pub/lib/src/system_cache: CompileTimeError
 lib/_internal/pub/lib/src/utils: CompileTimeError
 lib/_internal/pub/lib/src/validator/compiled_dartdoc: CompileTimeError
+lib/_internal/pub/lib/src/validator: CompileTimeError
+lib/_internal/pub/lib/src/validator/dependency: CompileTimeError
+lib/_internal/pub/lib/src/validator/dependency_override: CompileTimeError
 lib/_internal/pub/lib/src/validator/directory: CompileTimeError
 lib/_internal/pub/lib/src/validator/lib: CompileTimeError
 lib/_internal/pub/lib/src/validator/license: CompileTimeError
 lib/_internal/pub/lib/src/validator/name: CompileTimeError
+lib/_internal/pub/lib/src/validator/pubspec_field: CompileTimeError
+lib/_internal/pub/lib/src/validator/size: CompileTimeError
+lib/_internal/pub/lib/src/validator/utf8_readme: CompileTimeError
 lib/_internal/pub/test/descriptor: CompileTimeError
 lib/_internal/pub/test/descriptor/git: CompileTimeError
 lib/_internal/pub/test/descriptor/tar: CompileTimeError
@@ -72,96 +83,14 @@
 lib/_internal/pub/test/serve/utils: CompileTimeError
 lib/_internal/pub/test/test_pub: CompileTimeError
 lib/_internal/pub/test/validator/utils: CompileTimeError
+lib/js/dart2js/js_dart2js: CompileTimeError
 lib/js/dartium/js_dartium: CompileTimeError
 lib/svg/dart2js/svg_dart2js: CompileTimeError
 lib/svg/dartium/svg_dartium: CompileTimeError
 lib/typed_data/dart2js/typed_data_dart2js: CompileTimeError
+lib/web_audio/dart2js/web_audio_dart2js: CompileTimeError
 lib/web_audio/dartium/web_audio_dartium: CompileTimeError
 lib/web_gl/dart2js/web_gl_dart2js: CompileTimeError
 lib/web_gl/dartium/web_gl_dartium: CompileTimeError
 lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError
 lib/web_sql/dartium/web_sql_dartium: CompileTimeError
-
-
-[ $compiler == dart2analyzer ]
-lib/async/async_error: CompileTimeError
-lib/async/deferred_load: CompileTimeError
-lib/async/future: CompileTimeError
-lib/async/future_impl: CompileTimeError
-lib/async/schedule_microtask: CompileTimeError
-lib/async/stream: CompileTimeError
-lib/async/stream_controller: CompileTimeError
-lib/async/stream_impl: CompileTimeError
-lib/async/timer: CompileTimeError
-lib/async/zone: CompileTimeError
-lib/collection/collections: CompileTimeError
-lib/_collection_dev/iterable: CompileTimeError
-lib/_collection_dev/list: CompileTimeError
-lib/_collection_dev/symbol: CompileTimeError
-lib/collection/hash_map: CompileTimeError
-lib/collection/iterable: CompileTimeError
-lib/collection/linked_hash_map: CompileTimeError
-lib/collection/list: CompileTimeError
-lib/collection/queue: CompileTimeError
-lib/collection/splay_tree: CompileTimeError
-lib/convert/ascii: CompileTimeError
-lib/convert/byte_conversion: CompileTimeError
-lib/convert/converter: CompileTimeError
-lib/convert/encoding: CompileTimeError
-lib/convert/html_escape: CompileTimeError
-lib/convert/json: CompileTimeError
-lib/convert/latin1: CompileTimeError
-lib/convert/line_splitter: CompileTimeError
-lib/convert/string_conversion: CompileTimeError
-lib/convert/utf: CompileTimeError
-lib/core/iterable: CompileTimeError
-lib/core/list: CompileTimeError
-lib/core/map: CompileTimeError
-lib/core/print: CompileTimeError
-lib/core/set: CompileTimeError
-lib/core/string: CompileTimeError
-lib/core/symbol: CompileTimeError
-lib/core/uri: CompileTimeError
-lib/html/html_common/conversions: CompileTimeError
-lib/html/html_common/css_class_set: CompileTimeError
-lib/html/html_common/device: CompileTimeError
-lib/html/html_common/filtered_element_list: CompileTimeError
-lib/html/html_common/lists: CompileTimeError
-lib/io/bytes_builder: CompileTimeError
-lib/io/common: CompileTimeError
-lib/io/crypto: CompileTimeError
-lib/io/data_transformer: CompileTimeError
-lib/io/directory: CompileTimeError
-lib/io/directory_impl: CompileTimeError
-lib/io/eventhandler: CompileTimeError
-lib/io/file: CompileTimeError
-lib/io/file_impl: CompileTimeError
-lib/io/file_system_entity: CompileTimeError
-lib/io/http: CompileTimeError
-lib/io/http_date: CompileTimeError
-lib/io/http_headers: CompileTimeError
-lib/io/http_impl: CompileTimeError
-lib/io/http_parser: CompileTimeError
-lib/io/http_session: CompileTimeError
-lib/io/io_service: CompileTimeError
-lib/io/io_sink: CompileTimeError
-lib/io/link: CompileTimeError
-lib/io/options: CompileTimeError
-lib/io/platform: CompileTimeError
-lib/io/platform_impl: CompileTimeError
-lib/io/process: CompileTimeError
-lib/io/secure_server_socket: CompileTimeError
-lib/io/secure_socket: CompileTimeError
-lib/io/socket: CompileTimeError
-lib/io/stdio: CompileTimeError
-lib/io/string_transformer: CompileTimeError
-lib/io/timer_impl: CompileTimeError
-lib/io/websocket: CompileTimeError
-lib/io/websocket_impl: CompileTimeError
-lib/math/point: CompileTimeError
-lib/math/rectangle: CompileTimeError
-lib/utf/utf16: CompileTimeError
-lib/utf/utf32: CompileTimeError
-lib/utf/utf8: CompileTimeError
-lib/utf/utf_stream: CompileTimeError
-
diff --git a/tests/lib/async/catch_errors13_test.dart b/tests/lib/async/catch_errors13_test.dart
index 0889f2e..1723f87 100644
--- a/tests/lib/async/catch_errors13_test.dart
+++ b/tests/lib/async/catch_errors13_test.dart
@@ -19,16 +19,36 @@
 
   // Test that errors are caught by nested `catchErrors`. Also uses
   // `scheduleMicrotask` in the body of a Timer.
+  bool outerTimerRan = false;
+  int outerTimerCounterDelayCount = 0;
   catchErrors(() {
     events.add("catch error entry");
     catchErrors(() {
       events.add("catch error entry2");
       Timer.run(() { throw "timer error"; });
-      new Timer(const Duration(milliseconds: 50),
-                () {
-                     scheduleMicrotask(() { throw "scheduleMicrotask"; });
-                     throw "delayed error";
-                   });
+
+      // We want this timer to run after the timer below. When the machine is
+      // slow we saw that the timer below was scheduled more than 50ms after
+      // this line. A duration of 50ms was therefore not enough to guarantee
+      // that this timer runs before the timer below.
+      // Instead of increasing the duration to a bigger amount we decided to
+      // verify that the other timer already ran, and reschedule if not.
+      // This way we could reduce the timeout (to 10ms now), while still
+      // allowing for more time, in case the machine is slow.
+      void runDelayed() {
+        new Timer(const Duration(milliseconds: 10),
+                  () {
+                    if (outerTimerRan) {
+                      scheduleMicrotask(() { throw "scheduleMicrotask"; });
+                      throw "delayed error";
+                    } else if (outerTimerCounterDelayCount < 100) {
+                      outerTimerCounterDelayCount++;
+                      runDelayed();
+                    }
+                  });
+      }
+
+      runDelayed();
     }).listen((x) {
       events.add(x);
       if (x == "scheduleMicrotask") {
@@ -36,7 +56,10 @@
       }
     });
     events.add("after inner");
-    Timer.run(() { throw "timer outer"; });
+    Timer.run(() {
+      outerTimerRan = true;
+      throw "timer outer";
+    });
     throw "inner throw";
   }).listen((x) {
       events.add(x);
diff --git a/tests/lib/async/event_helper.dart b/tests/lib/async/event_helper.dart
index 08a6b8f..a13bac0 100644
--- a/tests/lib/async/event_helper.dart
+++ b/tests/lib/async/event_helper.dart
@@ -158,8 +158,8 @@
                                  cancelOnError: cancelOnError);
   }
 
-  void addError(error) {
-    super.addError(error);
+  void addError(error, [stackTrace]) {
+    super.addError(error, stackTrace);
     if (cancelOnError) {
       onDoneSignal.complete();
     }
diff --git a/tests/lib/async/future_test.dart b/tests/lib/async/future_test.dart
index b497f1d..ed342bc 100644
--- a/tests/lib/async/future_test.dart
+++ b/tests/lib/async/future_test.dart
@@ -55,8 +55,8 @@
 void testNeverComplete() {
   final completer = new Completer<int>();
   final future = completer.future;
-  future.then((v) => Expect.fails("Value not expected"));
-  future.catchError((e) => Expect.fails("Value not expected"));
+  future.then((v) => Expect.fail("Value not expected"));
+  future.catchError((e) => Expect.fail("Value not expected"));
 }
 
 void testComplete() {
diff --git a/tests/lib/async/future_value_chain4_test.dart b/tests/lib/async/future_value_chain4_test.dart
index 2f09cfe..8e640b5 100644
--- a/tests/lib/async/future_value_chain4_test.dart
+++ b/tests/lib/async/future_value_chain4_test.dart
@@ -10,8 +10,9 @@
   then(valueHandler, {onError}) {
     scheduleMicrotask(() { valueHandler(499); });
   }
-  catchError(_) => null;
+  catchError(_, {test}) => null;
   whenComplete(_) => null;
+  asStream() => null;
 }
 
 main() {
diff --git a/tests/lib/async/futures_test.dart b/tests/lib/async/futures_test.dart
index 936c5187..2112120 100644
--- a/tests/lib/async/futures_test.dart
+++ b/tests/lib/async/futures_test.dart
@@ -53,8 +53,9 @@
 
   return Future.wait(futures).then((_) {
     throw 'incorrect error';
-  }).catchError((error) {
+  }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
+    Expect.isNull(stackTrace);
   });
 }
 
@@ -69,11 +70,106 @@
 
   return Future.wait(futures).then((_) {
     throw 'incorrect error 2';
-  }).catchError((error) {
+  }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
+    Expect.isNull(stackTrace);
   });
 }
 
+Future testWaitWithMultipleErrorsEager() {
+  List<Future> futures = new List<Future>();
+  Completer c1 = new Completer();
+  Completer c2 = new Completer();
+  futures.add(c1.future);
+  futures.add(c2.future);
+  c1.completeError('correct error');
+  c2.completeError('incorrect error 1');
+
+  return Future.wait(futures, eagerError: true).then((_) {
+    throw 'incorrect error 2';
+  }).catchError((error, stackTrace) {
+    Expect.equals('correct error', error);
+    Expect.isNull(stackTrace);
+  });
+}
+
+StackTrace get currentStackTrace {
+  try {
+    throw 0;
+  } catch(e, st) {
+    return st;
+  }
+  return null;
+}
+
+Future testWaitWithSingleErrorWithStackTrace() {
+  List<Future> futures = new List<Future>();
+  Completer c1 = new Completer();
+  Completer c2 = new Completer();
+  futures.add(c1.future);
+  futures.add(c2.future);
+  c1.complete();
+  c2.completeError('correct error', currentStackTrace);
+
+  return Future.wait(futures).then((_) {
+    throw 'incorrect error';
+  }).catchError((error, stackTrace) {
+    Expect.equals('correct error', error);
+    Expect.isNotNull(stackTrace);
+  });
+}
+
+Future testWaitWithMultipleErrorsWithStackTrace() {
+  List<Future> futures = new List<Future>();
+  Completer c1 = new Completer();
+  Completer c2 = new Completer();
+  futures.add(c1.future);
+  futures.add(c2.future);
+  c1.completeError('correct error', currentStackTrace);
+  c2.completeError('incorrect error 1');
+
+  return Future.wait(futures).then((_) {
+    throw 'incorrect error 2';
+  }).catchError((error, stackTrace) {
+    Expect.equals('correct error', error);
+    Expect.isNotNull(stackTrace);
+  });
+}
+
+Future testWaitWithMultipleErrorsWithStackTraceEager() {
+  List<Future> futures = new List<Future>();
+  Completer c1 = new Completer();
+  Completer c2 = new Completer();
+  futures.add(c1.future);
+  futures.add(c2.future);
+  c1.completeError('correct error', currentStackTrace);
+  c2.completeError('incorrect error 1');
+
+  return Future.wait(futures, eagerError: true).then((_) {
+    throw 'incorrect error 2';
+  }).catchError((error, stackTrace) {
+    Expect.equals('correct error', error);
+    Expect.isNotNull(stackTrace);
+  });
+}
+
+Future testEagerWait() {
+  var st;
+  try { throw 0; } catch (e, s) { st = s; }
+  Completer c1 = new Completer();
+  Completer c2 = new Completer();
+  List<Future> futures = <Future>[c1.future, c2.future];
+  Future waited = Future.wait(futures, eagerError: true);
+  var result = waited.then((v) { throw "should not be called"; },
+                           onError: (e, s) {
+                             Expect.equals(e, 42);
+                             Expect.identical(st, s);
+                             return true;
+                           });
+  c1.completeError(42, st);
+  return result;
+}
+
 Future testForEachEmpty() {
   return Future.forEach([], (_) {
     throw 'should not be called';
@@ -110,13 +206,18 @@
   futures.add(testWaitWithMultipleValues());
   futures.add(testWaitWithSingleError());
   futures.add(testWaitWithMultipleErrors());
+  futures.add(testWaitWithMultipleErrorsEager());
+  futures.add(testWaitWithSingleErrorWithStackTrace());
+  futures.add(testWaitWithMultipleErrorsWithStackTrace());
+  futures.add(testWaitWithMultipleErrorsWithStackTraceEager());
+  futures.add(testEagerWait());
   futures.add(testForEachEmpty());
   futures.add(testForEach());
   futures.add(testForEachWithException());
 
   asyncStart();
   Future.wait(futures).then((List list) {
-    Expect.equals(9, list.length);
+    Expect.equals(14, list.length);
     asyncEnd();
   });
 }
diff --git a/tests/lib/async/print_test.dart b/tests/lib/async/print_test.dart
new file mode 100644
index 0000000..8c4d538
--- /dev/null
+++ b/tests/lib/async/print_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test tests a core-library property, but uses zones to do this.
+// Verifies that print(x) works with bad toString methods.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+class A {
+  toString() {
+    if (false
+          || true  /// 01: runtime error
+        ) {
+      return 499;
+    } else {
+      return "ok";
+    }
+  }
+}
+
+void interceptedPrint(self, parent, zone, message) {
+  Expect.isTrue(message is String);
+}
+
+main() {
+  runZoned(() { print(new A()); },
+           zoneSpecification: new ZoneSpecification(print: interceptedPrint));
+}
diff --git a/tests/lib/async/schedule_microtask3_test.dart b/tests/lib/async/schedule_microtask3_test.dart
index 950d8e0..a93e52b 100644
--- a/tests/lib/async/schedule_microtask3_test.dart
+++ b/tests/lib/async/schedule_microtask3_test.dart
@@ -5,7 +5,8 @@
 library run_async_test;
 
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:expect/expect.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   test("run async timer after async test", () {
diff --git a/tests/lib/async/stream_controller_test.dart b/tests/lib/async/stream_controller_test.dart
index be9e975..f729edc 100644
--- a/tests/lib/async/stream_controller_test.dart
+++ b/tests/lib/async/stream_controller_test.dart
@@ -18,7 +18,7 @@
       ..error("error!")
       ..error("error too!")
       ..close();
-  Events actualEvents = new Events.capture(c.stream.asBroadcastStream());
+  CaptureEvents actualEvents = new Events.capture(c.stream.asBroadcastStream());
   expectedEvents.replay(c);
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
@@ -167,7 +167,7 @@
       ..error("error!")
       ..error("error too!")
       ..close();
-  Events actualEvents = new Events.capture(c.stream);
+  CaptureEvents actualEvents = new Events.capture(c.stream);
   expectedEvents.replay(c);
   Expect.listEquals(expectedEvents.events, actualEvents.events);
 
diff --git a/tests/lib/async/stream_event_transformed_test.dart b/tests/lib/async/stream_event_transformed_test.dart
index 0cda9c8..62d1967 100644
--- a/tests/lib/async/stream_event_transformed_test.dart
+++ b/tests/lib/async/stream_event_transformed_test.dart
@@ -13,7 +13,7 @@
   DecrementingTransformerSink(this.outSink);
 
   void add(int i) => outSink.add(i - 1);
-  void addError(int e, st) => outSink.addError(e - 1, st);
+  void addError(int e, [st]) => outSink.addError(e - 1, st);
   void close() => outSink.close();
 }
 
@@ -23,7 +23,7 @@
   FutureWaitingTransformerSink(this.outSink, this.closeFuture);
 
   void add(Future future) { future.then(outSink.add); }
-  void addError(Future e, st) { e.then((val) { outSink.addError(val, st); }); }
+  void addError(Future e, [st]) { e.then((val) { outSink.addError(val, st); }); }
   void close() { closeFuture.whenComplete(outSink.close); }
 }
 
@@ -32,7 +32,7 @@
   ZoneTransformerSink(this.outSink);
 
   void add(_) { outSink.add(Zone.current); }
-  void addError(_, st) { outSink.add(Zone.current); }
+  void addError(_, [st]) { outSink.add(Zone.current); }
   void close() {
     outSink.add(Zone.current);
     outSink.close();
@@ -44,7 +44,7 @@
   TypeChangingSink(this.outSink);
 
   void add(int data) { outSink.add(data.toString()); }
-  void addError(error, st) { outSink.addError(error, st); }
+  void addError(error, [st]) { outSink.addError(error, st); }
   void close() { outSink.close(); }
 }
 
diff --git a/tests/lib/async/stream_transformer_test.dart b/tests/lib/async/stream_transformer_test.dart
index 8029a65..3088076 100644
--- a/tests/lib/async/stream_transformer_test.dart
+++ b/tests/lib/async/stream_transformer_test.dart
@@ -21,7 +21,7 @@
 
   MyStreamSubscription(this.stream, this.cancelOnError);
 
-  void cancel() {}
+  Future cancel() => null;
   void onData(void handleData(T data)) {
     this.handleData = handleData == null ? _defaultData: handleData;
   }
@@ -33,6 +33,8 @@
   }
 
   void pause([Future resumeSignal]) {}
+  void resume() {}
+
   final isPaused = false;
   Future asFuture([var futureValue]) => null;
 }
diff --git a/tests/lib/async/timer_isolate_test.dart b/tests/lib/async/timer_isolate_test.dart
index 31776c5..8c6c5fb 100644
--- a/tests/lib/async/timer_isolate_test.dart
+++ b/tests/lib/async/timer_isolate_test.dart
@@ -10,6 +10,11 @@
 
 const Duration TIMEOUT = const Duration(milliseconds: 100);
 
+// Some browsers (Firefox and IE so far) can trigger too early. Add a safety
+// margin. We use identical(1, 1.0) as an easy way to know if the test is
+// compiled by dart2js.
+int get safetyMargin => identical(1, 1.0) ? 100 : 1;
+
 createTimer(replyTo) {
   new Timer(TIMEOUT, () {
     replyTo.send("timer_fired");
@@ -26,7 +31,7 @@
     port.first.then(expectAsync1((msg) {
       expect("timer_fired", msg);
       int endTime = (new DateTime.now()).millisecondsSinceEpoch;
-      expect(endTime - startTime, greaterThanOrEqualTo(TIMEOUT.inMilliseconds));
+      expect(endTime - startTime + safetyMargin, greaterThanOrEqualTo(TIMEOUT.inMilliseconds));
     }));
 
     startTime = (new DateTime.now()).millisecondsSinceEpoch;
diff --git a/tests/lib/async/zone_debug_test.dart b/tests/lib/async/zone_debug_test.dart
index fca0a5e..6b6e490 100644
--- a/tests/lib/async/zone_debug_test.dart
+++ b/tests/lib/async/zone_debug_test.dart
@@ -28,7 +28,7 @@
 debugZoneRegisterUnaryCallback(Zone self, ZoneDelegate parent, Zone origin,
                                f(arg)) {
   List savedTrace = [stackTrace]..addAll(restoredStackTrace);
-  return parent.registerCallback(origin, (arg) {
+  return parent.registerUnaryCallback(origin, (arg) {
     restoredStackTrace = savedTrace;
     return f(arg);
   });
@@ -43,7 +43,7 @@
 debugZoneRunUnary(Zone self, ZoneDelegate parent, Zone origin, f(arg), arg) {
   stackTrace++;
   restoredStackTrace = [];
-  return parent.run1(origin, f, arg);
+  return parent.runUnary(origin, f, arg);
 }
 
 List expectedDebugTrace;
diff --git a/tests/lib/convert/chunked_conversion1_test.dart b/tests/lib/convert/chunked_conversion1_test.dart
index 70d82f2..0bbe44b 100644
--- a/tests/lib/convert/chunked_conversion1_test.dart
+++ b/tests/lib/convert/chunked_conversion1_test.dart
@@ -32,7 +32,7 @@
   specialI(o) => add(o);
 }
 
-class MyChunkedBoolSink extends ChunkedConversionSink<bool> {
+abstract class MyChunkedBoolSink extends ChunkedConversionSink<bool> {
   MyChunkedBoolSink();
   factory MyChunkedBoolSink.from(sink) = BoolAdapterSink;
   factory MyChunkedBoolSink.withCallback(callback) {
diff --git a/tests/lib/convert/chunked_conversion_json_decode1_test.dart b/tests/lib/convert/chunked_conversion_json_decode1_test.dart
index 932eae4..0ef8ff3 100644
--- a/tests/lib/convert/chunked_conversion_json_decode1_test.dart
+++ b/tests/lib/convert/chunked_conversion_json_decode1_test.dart
@@ -118,7 +118,7 @@
       new ChunkedConversionSink.withCallback((x) => result = x.single);
   var stringConversionSink = decoder.startChunkedConversion(objectSink);
   ByteConversionSink inputByteSink = stringConversionSink.asUtf8Sink(false);
-  Object tmpBytes = UTF8.encode(str);
+  var tmpBytes = UTF8.encode(str);
   tmpBytes.forEach((b) => inputByteSink.addSlice([0, b, 1], 1, 2, false));
   inputByteSink.close();
   return result;
diff --git a/tests/lib/convert/utf84_test.dart b/tests/lib/convert/utf84_test.dart
new file mode 100755
index 0000000..37f0e2c
--- /dev/null
+++ b/tests/lib/convert/utf84_test.dart
@@ -0,0 +1,441 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'dart:convert';
+
+const String testEnglishPhrase =
+    "The quick brown fox jumps over the lazy dog.";
+
+const List<int> testEnglishUtf8 = const<int> [
+    0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
+    0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
+    0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
+    0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
+    0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20,
+    0x64, 0x6f, 0x67, 0x2e];
+
+const String testDanishPhrase = "Quizdeltagerne spiste jordbær med "
+    "fløde mens cirkusklovnen Wolther spillede på xylofon.";
+
+const List<int> testDanishUtf8 = const<int>[
+    0x51, 0x75, 0x69, 0x7a, 0x64, 0x65, 0x6c, 0x74,
+    0x61, 0x67, 0x65, 0x72, 0x6e, 0x65, 0x20, 0x73,
+    0x70, 0x69, 0x73, 0x74, 0x65, 0x20, 0x6a, 0x6f,
+    0x72, 0x64, 0x62, 0xc3, 0xa6, 0x72, 0x20, 0x6d,
+    0x65, 0x64, 0x20, 0x66, 0x6c, 0xc3, 0xb8, 0x64,
+    0x65, 0x20, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x63,
+    0x69, 0x72, 0x6b, 0x75, 0x73, 0x6b, 0x6c, 0x6f,
+    0x76, 0x6e, 0x65, 0x6e, 0x20, 0x57, 0x6f, 0x6c,
+    0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x69,
+    0x6c, 0x6c, 0x65, 0x64, 0x65, 0x20, 0x70, 0xc3,
+    0xa5, 0x20, 0x78, 0x79, 0x6c, 0x6f, 0x66, 0x6f,
+    0x6e, 0x2e];
+
+// unusual formatting due to strange editor interaction w/ text direction.
+const String
+    testHebrewPhrase = "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה";
+
+const List<int> testHebrewUtf8 = const<int>[
+    0xd7, 0x93, 0xd7, 0x92, 0x20, 0xd7, 0xa1, 0xd7,
+    0xa7, 0xd7, 0xa8, 0xd7, 0x9f, 0x20, 0xd7, 0xa9,
+    0xd7, 0x98, 0x20, 0xd7, 0x91, 0xd7, 0x99, 0xd7,
+    0x9d, 0x20, 0xd7, 0x9e, 0xd7, 0x90, 0xd7, 0x95,
+    0xd7, 0x9b, 0xd7, 0x96, 0xd7, 0x91, 0x20, 0xd7,
+    0x95, 0xd7, 0x9c, 0xd7, 0xa4, 0xd7, 0xaa, 0xd7,
+    0xa2, 0x20, 0xd7, 0x9e, 0xd7, 0xa6, 0xd7, 0x90,
+    0x20, 0xd7, 0x9c, 0xd7, 0x95, 0x20, 0xd7, 0x97,
+    0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x94, 0x20, 0xd7,
+    0x90, 0xd7, 0x99, 0xd7, 0x9a, 0x20, 0xd7, 0x94,
+    0xd7, 0xa7, 0xd7, 0x9c, 0xd7, 0x99, 0xd7, 0x98,
+    0xd7, 0x94];
+
+const String testRussianPhrase = "Съешь же ещё этих мягких "
+    "французских булок да выпей чаю";
+
+const List<int> testRussianUtf8 = const<int>[
+    0xd0, 0xa1, 0xd1, 0x8a, 0xd0, 0xb5, 0xd1, 0x88,
+    0xd1, 0x8c, 0x20, 0xd0, 0xb6, 0xd0, 0xb5, 0x20,
+    0xd0, 0xb5, 0xd1, 0x89, 0xd1, 0x91, 0x20, 0xd1,
+    0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0x20,
+    0xd0, 0xbc, 0xd1, 0x8f, 0xd0, 0xb3, 0xd0, 0xba,
+    0xd0, 0xb8, 0xd1, 0x85, 0x20, 0xd1, 0x84, 0xd1,
+    0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, 0x86, 0xd1,
+    0x83, 0xd0, 0xb7, 0xd1, 0x81, 0xd0, 0xba, 0xd0,
+    0xb8, 0xd1, 0x85, 0x20, 0xd0, 0xb1, 0xd1, 0x83,
+    0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xba, 0x20, 0xd0,
+    0xb4, 0xd0, 0xb0, 0x20, 0xd0, 0xb2, 0xd1, 0x8b,
+    0xd0, 0xbf, 0xd0, 0xb5, 0xd0, 0xb9, 0x20, 0xd1,
+    0x87, 0xd0, 0xb0, 0xd1, 0x8e];
+
+const String testGreekPhrase = "Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ "
+    "στὸ χρυσαφὶ ξέφωτο";
+
+const List<int> testGreekUtf8 = const<int>[
+    0xce, 0x93, 0xce, 0xb1, 0xce, 0xb6, 0xce, 0xad,
+    0xce, 0xb5, 0xcf, 0x82, 0x20, 0xce, 0xba, 0xce,
+    0xb1, 0xe1, 0xbd, 0xb6, 0x20, 0xce, 0xbc, 0xcf,
+    0x85, 0xcf, 0x81, 0xcf, 0x84, 0xce, 0xb9, 0xe1,
+    0xbd, 0xb2, 0xcf, 0x82, 0x20, 0xce, 0xb4, 0xe1,
+    0xbd, 0xb2, 0xce, 0xbd, 0x20, 0xce, 0xb8, 0xe1,
+    0xbd, 0xb0, 0x20, 0xce, 0xb2, 0xcf, 0x81, 0xe1,
+    0xbf, 0xb6, 0x20, 0xcf, 0x80, 0xce, 0xb9, 0xe1,
+    0xbd, 0xb0, 0x20, 0xcf, 0x83, 0xcf, 0x84, 0xe1,
+    0xbd, 0xb8, 0x20, 0xcf, 0x87, 0xcf, 0x81, 0xcf,
+    0x85, 0xcf, 0x83, 0xce, 0xb1, 0xcf, 0x86, 0xe1,
+    0xbd, 0xb6, 0x20, 0xce, 0xbe, 0xce, 0xad, 0xcf,
+    0x86, 0xcf, 0x89, 0xcf, 0x84, 0xce, 0xbf];
+
+const String testKatakanaPhrase = """
+イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム
+ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン""";
+
+const List<int> testKatakanaUtf8 = const<int>[
+    0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xad, 0xe3, 0x83,
+    0x8f, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x9b, 0xe3,
+    0x83, 0x98, 0xe3, 0x83, 0x88, 0x20, 0xe3, 0x83,
+    0x81, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0x8c, 0xe3,
+    0x83, 0xab, 0xe3, 0x83, 0xb2, 0x20, 0xe3, 0x83,
+    0xaf, 0xe3, 0x82, 0xab, 0xe3, 0x83, 0xa8, 0xe3,
+    0x82, 0xbf, 0xe3, 0x83, 0xac, 0xe3, 0x82, 0xbd,
+    0x20, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x8d, 0xe3,
+    0x83, 0x8a, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0,
+    0x0a, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
+    0x83, 0x8e, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xaf,
+    0xe3, 0x83, 0xa4, 0xe3, 0x83, 0x9e, 0x20, 0xe3,
+    0x82, 0xb1, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xb3,
+    0xe3, 0x82, 0xa8, 0xe3, 0x83, 0x86, 0x20, 0xe3,
+    0x82, 0xa2, 0xe3, 0x82, 0xb5, 0xe3, 0x82, 0xad,
+    0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xa1, 0xe3, 0x83,
+    0x9f, 0xe3, 0x82, 0xb7, 0x20, 0xe3, 0x83, 0xb1,
+    0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa2, 0xe3, 0x82,
+    0xbb, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0xb3];
+
+void main() {
+  testUtf8bytesToCodepoints();
+  testUtf8BytesToString();
+  testEncodeToUtf8();
+}
+
+List<int> encodeUtf8(String str) => UTF8.encode(str);
+List<int> utf8ToRunes(List<int> codeUnits) {
+  return UTF8.decode(codeUnits, allowMalformed: true).runes.toList();
+}
+String decodeUtf8(List<int> codeUnits) => UTF8.decode(codeUnits);
+
+void testEncodeToUtf8() {
+  Expect.listEquals(testEnglishUtf8, encodeUtf8(testEnglishPhrase),
+      "english to utf8");
+
+  Expect.listEquals(testDanishUtf8, encodeUtf8(testDanishPhrase),
+      "encode danish to utf8");
+
+  Expect.listEquals(testHebrewUtf8, encodeUtf8(testHebrewPhrase),
+      "Hebrew to utf8");
+
+  Expect.listEquals(testRussianUtf8, encodeUtf8(testRussianPhrase),
+      "Russian to utf8");
+
+  Expect.listEquals(testGreekUtf8, encodeUtf8(testGreekPhrase),
+      "Greek to utf8");
+
+  Expect.listEquals(testKatakanaUtf8, encodeUtf8(testKatakanaPhrase),
+      "Katakana to utf8");
+}
+
+void testUtf8bytesToCodepoints() {
+  Expect.listEquals([954, 972, 963, 956, 949],
+      utf8ToRunes([0xce, 0xba, 0xcf, 0x8c, 0xcf,
+      0x83, 0xce, 0xbc, 0xce, 0xb5]), "κόσμε");
+
+  // boundary conditions: First possible sequence of a certain length
+  Expect.listEquals([], utf8ToRunes([]), "no input");
+  Expect.listEquals([0x0], utf8ToRunes([0x0]), "0");
+  Expect.listEquals([0x80], utf8ToRunes([0xc2, 0x80]), "80");
+  Expect.listEquals([0x800],
+      utf8ToRunes([0xe0, 0xa0, 0x80]), "800");
+  Expect.listEquals([0x10000],
+      utf8ToRunes([0xf0, 0x90, 0x80, 0x80]), "10000");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf8, 0x88, 0x80, 0x80, 0x80]), "200000");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfc, 0x84, 0x80, 0x80, 0x80, 0x80]),
+      "4000000");
+
+  // boundary conditions: Last possible sequence of a certain length
+  Expect.listEquals([0x7f], utf8ToRunes([0x7f]), "7f");
+  Expect.listEquals([0x7ff], utf8ToRunes([0xdf, 0xbf]), "7ff");
+  Expect.listEquals([0xffff],
+      utf8ToRunes([0xef, 0xbf, 0xbf]), "ffff");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf7, 0xbf, 0xbf, 0xbf]), "1fffff");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfb, 0xbf, 0xbf, 0xbf, 0xbf]), "3ffffff");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "4000000");
+
+  // other boundary conditions
+  Expect.listEquals([0xd7ff],
+      utf8ToRunes([0xed, 0x9f, 0xbf]), "d7ff");
+  Expect.listEquals([0xe000],
+      utf8ToRunes([0xee, 0x80, 0x80]), "e000");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xef, 0xbf, 0xbd]), "fffd");
+  Expect.listEquals([0x10ffff],
+      utf8ToRunes([0xf4, 0x8f, 0xbf, 0xbf]), "10ffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf4, 0x90, 0x80, 0x80]), "110000");
+
+  // unexpected continuation bytes
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0x80]), "80 => replacement character");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xbf]), "bf => replacement character");
+
+  List<int> allContinuationBytes = <int>[];
+  List<int> matchingReplacementChars = <int>[];
+  for (int i = 0x80; i < 0xc0; i++) {
+    allContinuationBytes.add(i);
+    matchingReplacementChars.add(UNICODE_REPLACEMENT_CHARACTER_RUNE);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToRunes(allContinuationBytes),
+      "80 - bf => replacement character x 64");
+
+  List<int> allFirstTwoByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xc0; i < 0xe0; i++) {
+    allFirstTwoByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_RUNE, 0x20]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToRunes(allFirstTwoByteSeq),
+      "c0 - df + space => replacement character + space x 32");
+
+  List<int> allFirstThreeByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xe0; i < 0xf0; i++) {
+    allFirstThreeByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_RUNE, 0x20]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToRunes(allFirstThreeByteSeq),
+      "e0 - ef + space => replacement character x 16");
+
+  List<int> allFirstFourByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xf0; i < 0xf8; i++) {
+    allFirstFourByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_RUNE, 0x20]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToRunes(allFirstFourByteSeq),
+      "f0 - f7 + space => replacement character x 8");
+
+  List<int> allFirstFiveByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xf8; i < 0xfc; i++) {
+    allFirstFiveByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_RUNE, 0x20]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToRunes(allFirstFiveByteSeq),
+      "f8 - fb + space => replacement character x 4");
+
+  List<int> allFirstSixByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xfc; i < 0xfe; i++) {
+    allFirstSixByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_RUNE, 0x20]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToRunes(allFirstSixByteSeq),
+      "fc - fd + space => replacement character x 2");
+
+  // Sequences with last continuation byte missing
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xc2]),
+      "2-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xe0, 0x80]),
+      "3-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf0, 0x80, 0x80]),
+      "4-byte sequence with last byte missing");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf8, 0x88, 0x80, 0x80]),
+      "5-byte sequence with last byte missing");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfc, 0x80, 0x80, 0x80, 0x80]),
+      "6-byte sequence with last byte missing");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xdf]),
+      "2-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xef, 0xbf]),
+      "3-byte sequence with last byte missing (hi)");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf7, 0xbf, 0xbf]),
+      "4-byte sequence with last byte missing (hi)");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfb, 0xbf, 0xbf, 0xbf]),
+      "5-byte sequence with last byte missing (hi)");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfd, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "6-byte sequence with last byte missing (hi)");
+
+  // Concatenation of incomplete sequences
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes(
+          [ 0xc2,
+            0xe0, 0x80,
+            0xf0, 0x80, 0x80,
+            0xf8, 0x88, 0x80, 0x80,
+            0xfc, 0x80, 0x80, 0x80, 0x80,
+            0xdf,
+            0xef, 0xbf,
+            0xf7, 0xbf, 0xbf,
+            0xfb, 0xbf, 0xbf, 0xbf,
+            0xfd, 0xbf, 0xbf, 0xbf, 0xbf ]),
+          "Concatenation of incomplete sequences");
+
+  // Impossible bytes
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfe]), "fe");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xff]), "ff");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_RUNE,
+      UNICODE_REPLACEMENT_CHARACTER_RUNE,
+      UNICODE_REPLACEMENT_CHARACTER_RUNE,
+      UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfe, 0xfe, 0xff, 0xff]), "fe fe ff ff");
+
+  // Overlong sequences
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xc0, 0xaf]), "c0 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xe0, 0x80, 0xaf]), "e0 80 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf0, 0x80, 0x80, 0xaf]), "f0 80 80 af");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf8, 0x80, 0x80, 0x80, 0xaf]), "f8 80 80 80 af");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfc, 0x80, 0x80, 0x80, 0x80, 0xaf]),
+      "fc 80 80 80 80 af");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xc1, 0xbf]), "c1 bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xe0, 0x9f, 0xbf]), "e0 9f bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf0, 0x8f, 0xbf, 0xbf]), "f0 8f bf bf");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf8, 0x87, 0xbf, 0xbf, 0xbf]), "f8 87 bf bf bf");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfc, 0x83, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "fc 83 bf bf bf bf");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xc0, 0x80]), "c0 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xe0, 0x80, 0x80]), "e0 80 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf0, 0x80, 0x80, 0x80]), "f0 80 80 80");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xf8, 0x80, 0x80, 0x80, 0x80]), "f8 80 80 80 80");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE,
+       UNICODE_REPLACEMENT_CHARACTER_RUNE, UNICODE_REPLACEMENT_CHARACTER_RUNE],
+      utf8ToRunes([0xfc, 0x80, 0x80, 0x80, 0x80, 0x80]),
+      "fc 80 80 80 80 80");
+
+  // Other illegal code positions (???)
+  Expect.listEquals([0xfffe], utf8ToRunes([0xef, 0xbf, 0xbe]),
+      "U+FFFE");
+  Expect.listEquals([0xffff], utf8ToRunes([0xef, 0xbf, 0xbf]),
+      "U+FFFF");
+}
+
+void testUtf8BytesToString() {
+  Expect.stringEquals(testEnglishPhrase,
+      decodeUtf8(testEnglishUtf8), "English");
+
+  Expect.stringEquals(testDanishPhrase,
+      decodeUtf8(testDanishUtf8), "Danish");
+
+  Expect.stringEquals(testHebrewPhrase,
+      decodeUtf8(testHebrewUtf8), "Hebrew");
+
+  Expect.stringEquals(testRussianPhrase,
+      decodeUtf8(testRussianUtf8), "Russian");
+
+  Expect.stringEquals(testGreekPhrase,
+      decodeUtf8(testGreekUtf8), "Greek");
+
+  Expect.stringEquals(testKatakanaPhrase,
+      decodeUtf8(testKatakanaUtf8), "Katakana");
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 520fa72..75bf9c5 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -6,7 +6,6 @@
 mirrors/delegate_test: RuntimeError # Issue 13864
 
 [ $compiler == dart2js ]
-async/schedule_microtask3_test: RuntimeError # _enqueueImmediate runs after Timer. http://dartbug.com/9002
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. http://dartbug.com/5958
 
 math/double_pow_test: RuntimeError
@@ -17,6 +16,7 @@
 mirrors/class_declarations_test/none: RuntimeError # Issue 13440
 mirrors/closures_test/none: RuntimeError # Issue 6490
 mirrors/constructor_kinds_test: RuntimeError # Issue 13799
+mirrors/constructor_private_name_test: CompileTimeError # Issue 13597
 mirrors/equality_test/02: RuntimeError # Issue 12333
 mirrors/fake_function_with_call_test: RuntimeError # Issue 11612
 mirrors/fake_function_without_call_test: RuntimeError # Issue 11612
@@ -28,6 +28,7 @@
 mirrors/generic_f_bounded_mixin_application_test: RuntimeError # Issue 12087
 mirrors/generic_function_typedef_test: RuntimeError # Issue 12333
 mirrors/generic_interface_test: RuntimeError # Issue 12087
+mirrors/generic_local_function_test: RuntimeError # Issue 12333
 mirrors/generic_mixin_test: RuntimeError # Issue 12333
 mirrors/generic_mixin_applications_test: RuntimeError # Issue 12333
 mirrors/generics_substitution_test/01: RuntimeError # Issue 12087
@@ -44,10 +45,10 @@
 mirrors/invoke_closurization_test: RuntimeError # Issue 13002
 mirrors/invoke_named_test/none: RuntimeError # Issue 12863
 mirrors/invoke_private_test: CompileTimeError # Issue 12164
+mirrors/invoke_private_wrong_library_test: CompileTimeError # Issue 12164
 mirrors/invoke_subscript_test: RuntimeError # Issue 13002
 mirrors/invoke_throws_test: RuntimeError # Issue 11954
 mirrors/library_declarations_test/none: RuntimeError # Issue 13439, Issue 13733
-mirrors/library_metadata2_test/01: CompileTimeError # Issue 13633
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
 mirrors/metadata_allowed_values_test/01: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/05: MissingCompileTimeError # Issue 14548
@@ -71,8 +72,9 @@
 mirrors/redirecting_factory_test/none: RuntimeError # Issue 6490
 mirrors/redirecting_factory_test/02: RuntimeError # Issue 6490
 mirrors/reflected_type_test: RuntimeError # Issue 12607
+mirrors/repeated_private_anon_mixin_app_test: RuntimeError # Issue 14670
+mirrors/removed_api_test: RuntimeError # Issue 14878
 mirrors/static_members_test: CompileTimeError # Issue 14633, Issue 12164
-mirrors/set_field_with_final_inheritance_test: RuntimeError # Issue 13919
 mirrors/symbol_validation_test: RuntimeError # Issue 13597
 mirrors/toplevel_members_test: CompileTimeError # Issue 14633, Issue 12164
 mirrors/type_argument_is_type_variable_test: RuntimeError # Issue 12333
@@ -80,7 +82,8 @@
 mirrors/typedef_metadata_test: RuntimeError # Issue 12785
 mirrors/typevariable_mirror_metadata_test: CompileTimeError # Issue 10905
 mirrors/type_variable_owner_test/01: RuntimeError # Issue 12785
-mirrors/generic_type_mirror_test/01: RuntimeError # 6490
+mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
+mirrors/variable_is_const_test/01: MissingCompileTimeError # Issue 5519
 
 [ $runtime == safari ]
 mirrors/return_type_test: Pass, Timeout # Issue 12858
@@ -127,6 +130,9 @@
 async/run_zoned8_test: Fail # Timer interface not supported: dartbug.com/7728.
 
 
+[ $compiler == dart2js && $checked ]
+convert/utf85_test: Pass, Slow # Issue 12029.
+
 [ $compiler == dart2js && $browser ]
 async/timer_not_available_test: Fail, OK # only meant to test when there is no way to
                                          # implement timer (currently only in d8)
@@ -134,7 +140,6 @@
 [ $compiler == dart2dart ]
 mirrors/*: Skip # http://dartbug.com/11511
 async/schedule_microtask6_test: Fail             # Issue 10957 - may be related to issue 10910
-async/schedule_microtask3_test: RuntimeError # Issue 13719: Please triage this failure.
 
 [ $compiler == dart2dart && $minified ]
 json/json_test: Fail                            # Issue 10961
@@ -144,9 +149,9 @@
 
 [ $runtime == ff ]
 # FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
-async/multiple_timer_test: Pass, Fail
-async/timer_isolate_test: Pass, Fail
-async/timer_test: Pass, Fail
+async/multiple_timer_test: Pass, Fail # Issue 14734
+async/timer_isolate_test: Pass, Fail # Issue 14734
+async/timer_test: Pass, Fail # Issue 14734
 convert/chunked_conversion_utf88_test: Pass, Timeout  # Issue 12029
 convert/streamed_conversion_utf8_encode_test: Pass, Timeout  # Issue 12029
 convert/streamed_conversion_utf8_decode_test: Pass, Slow  # Issue 12029
@@ -159,12 +164,13 @@
 async/deferred/deferred_api_test: Pass, Timeout # http://dartbug.com/12635
 convert/streamed_conversion_utf8_decode_test: Pass, Timeout # http://dartbug.com/12768
 convert/utf85_test: Skip # Issue 12029.
+async/timer_isolate_test: Pass, Fail # Issue 14734
 
 [ $compiler == dart2js ]
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
 
 [ $runtime == opera ]
-async/multiple_timer_test: Pass, Fail
+async/multiple_timer_test: Pass, Fail # Probably issue 14734
 
 [ $runtime == opera && $system == windows]
 # TODO(efortuna): Investigate.
@@ -175,18 +181,19 @@
 mirrors/native_class_test: Fail, OK # This test is meant to run in a browser.
 
 [ $compiler == none  ]
-async/schedule_microtask3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9001.
 mirrors/hierarchy_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
 mirrors/mixin_application_test/01: Fail, OK # TODO(ahe): Slight broken test to ensure test coverage on dart2js.
 mirrors/intercepted_object_test: Fail, OK # TODO(ahe): Slight broken test to ensure test coverage on dart2js.
 mirrors/typedef_test/01: Fail, OK # Incorrect dart2js behavior.
 
-mirrors/generic_f_bounded_test/01: RuntimeError # Issue 14000
-mirrors/generic_superclass_test/01: RuntimeError # Issue 14000
-mirrors/generic_type_mirror_test/02: RuntimeError # Issue 14613
+mirrors/generics_double_substitution_test/01: RuntimeError # Issue 14869
+
+mirrors/generic_local_function_test: RuntimeError # Issue 14913
 
 mirrors/symbol_validation_test: RuntimeError # Issue 13596
 
+mirrors/removed_api_test: RuntimeError # Issue 14931
+
 mirrors/static_members_test: RuntimeError # Issue 14632
 mirrors/toplevel_members_test: RuntimeError # Issue 14632
 mirrors/instance_members_test: RuntimeError # Issue 14632
@@ -201,9 +208,6 @@
 mirrors/library_uri_io_test: Skip # Not intended for drt as it uses dart:io.
 mirrors/local_isolate_test: Skip # http://dartbug.com/12188
 
-[ $compiler == none && $runtime == drt && $mode == debug ]
-mirrors/hierarchy_invariants_test: Pass, Slow # Issue 14449
-
 [ $compiler == none && $runtime == drt && $system == windows ]
 async/multiple_timer_test: Fail, Pass # See Issue 10982
 async/timer_test: Fail, Pass # See Issue 10982
@@ -231,33 +235,8 @@
 async/schedule_microtask_test: Fail # Issue 9001, Issue 9002
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-async/future_test: StaticWarning
-async/future_value_chain4_test: StaticWarning
-async/schedule_microtask3_test: StaticWarning
-async/stream_controller_async_test: StaticWarning
-async/stream_controller_test: StaticWarning
-async/stream_event_transformed_test: StaticWarning
-async/stream_first_where_test: StaticWarning
-async/stream_from_iterable_test: StaticWarning
-async/stream_join_test: StaticWarning
-async/stream_last_where_test: StaticWarning
-async/stream_single_test: StaticWarning
-async/stream_single_to_multi_subscriber_test: StaticWarning
-async/stream_transform_test: StaticWarning
-async/stream_transformer_from_handlers_test: StaticWarning
-async/stream_transformer_test: StaticWarning
-async/zone_debug_test: StaticWarning
-convert/chunked_conversion1_test: StaticWarning
-convert/chunked_conversion_json_decode1_test: StaticWarning
-math/min_max_test: StaticWarning
-mirrors/equality_test/02: StaticWarning # Issue 14524
 mirrors/generic_f_bounded_mixin_application_test: CompileTimeError # Issue 14116
 mirrors/invoke_named_test: StaticWarning # Issue 14522
-mirrors/private_symbol_test: StaticWarning # Issue 14524
-mirrors/reflect_class_test: StaticWarning # Issue 14524
-mirrors/type_variable_owner_test: StaticWarning # Issue 14524
-mirrors/typedef_metadata_test: StaticWarning # Issue 14524
-mirrors/typevariable_mirror_metadata_test: StaticWarning # Issue 14524
 
 mirrors/redirecting_factory_test/01: StaticWarning # test issue X, The return type 'Class<T2, T1>' of the redirected constructor is not assignable to 'Class<T1, T2>'
 mirrors/redirecting_factory_test/none: StaticWarning # test issue X, The return type 'Class<T2, T1>' of the redirected constructor is not assignable to 'Class<T1, T2>
@@ -266,44 +245,5 @@
 mirrors/find_in_context_fake_function_test: StaticWarning, OK # Implements Function without defining call.
 mirrors/immutable_collections_test: StaticWarning, OK # Expect failure for any type of Iterable.
 mirrors/inference_and_no_such_method_test: StaticWarning, OK # Expect to trigger noSuchMethod.
-mirrors/library_metadata2_test/01: CompileTimeError # Test issue 14682
-
-mirrors/basic_types_in_dart_core_test: StaticWarning, OK # API being removed.
-mirrors/constructor_kinds_test/01: StaticWarning, OK # API being removed.
-mirrors/constructor_kinds_test/none: StaticWarning, OK # API being removed.
-mirrors/constructors_test: StaticWarning, OK # API being removed.
-mirrors/equality_test/01: StaticWarning, OK # API being removed.
-mirrors/equality_test/none: StaticWarning, OK # API being removed.
-mirrors/fake_function_with_call_test: StaticWarning, OK # API being removed.
-mirrors/generic_function_typedef_test: StaticWarning, OK # API being removed.
-mirrors/generic_type_mirror_test/01: StaticWarning, OK # API being removed.
-mirrors/generic_type_mirror_test/02: StaticWarning, OK # API being removed.
-mirrors/generic_type_mirror_test/none: StaticWarning, OK # API being removed.
-mirrors/generics_substitution_test: StaticWarning, OK # API being removed.
-mirrors/inherit_field_test: StaticWarning, OK # API being removed.
-mirrors/initializing_formals_test/01: StaticWarning, OK # API being removed.
-mirrors/initializing_formals_test/02: StaticWarning, OK # API being removed.
-mirrors/initializing_formals_test/03: StaticWarning, OK # API being removed.
-mirrors/initializing_formals_test/none: StaticWarning, OK # API being removed.
-mirrors/intercepted_class_test: StaticWarning, OK # API being removed.
-mirrors/intercepted_object_test: StaticWarning, OK # API being removed.
-mirrors/lazy_static_test: StaticWarning, OK # API being removed.
-mirrors/libraries_test: StaticWarning, OK # API being removed.
-mirrors/library_metadata_test: StaticWarning, OK # API being removed.
-mirrors/metadata_constructed_constant_test: StaticWarning, OK # API being removed.
-mirrors/metadata_test: StaticWarning, OK # API being removed.
-mirrors/method_mirror_returntype_test: StaticWarning, OK # API being removed.
-mirrors/method_mirror_source_test: StaticWarning, OK # API being removed.
-mirrors/mixin_application_test/01: StaticWarning, OK # API being removed.
-mirrors/mixin_application_test/none: StaticWarning, OK # API being removed.
-mirrors/mixin_members_test: StaticWarning, OK # API being removed.
-mirrors/operator_test: StaticWarning, OK # API being removed.
-mirrors/parameter_metadata_test: StaticWarning, OK # API being removed.
-mirrors/parameter_test/01: StaticWarning, OK # API being removed.
-mirrors/parameter_test/none: StaticWarning, OK # API being removed.
-mirrors/reflect_runtime_type_test: StaticWarning, OK # API being removed.
-mirrors/reflect_uninstantiated_class_test: StaticWarning, OK # API being removed.
-mirrors/regress_14304_test: StaticWarning, OK # API being removed.
-mirrors/return_type_test: StaticWarning, OK # API being removed.
-mirrors/static_test: StaticWarning, OK # API being removed.
-mirrors/to_string_test: StaticWarning, OK # API being removed.
+mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
+mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
diff --git a/tests/lib/math/min_max_test.dart b/tests/lib/math/min_max_test.dart
index 2b16176..1f89185 100644
--- a/tests/lib/math/min_max_test.dart
+++ b/tests/lib/math/min_max_test.dart
@@ -15,12 +15,12 @@
 class Wrap implements Comparable {
   final value;
   Wrap(this.value);
-  int compare(Wrap other) => value.compare(other.value);
-  bool operator<(Wrap other) => compare(other) < 0;
-  bool operator<=(Wrap other) => compare(other) <= 0;
-  bool operator>(Wrap other) => compare(other) > 0;
-  bool operator>=(Wrap other) => compare(other) >= 0;
-  bool operator==(other) => other is Wrap && compare(other) == 0;
+  int compareTo(Wrap other) => value.compareTo(other.value);
+  bool operator<(Wrap other) => compareTo(other) < 0;
+  bool operator<=(Wrap other) => compareTo(other) <= 0;
+  bool operator>(Wrap other) => compareTo(other) > 0;
+  bool operator>=(Wrap other) => compareTo(other) >= 0;
+  bool operator==(other) => other is Wrap && compareTo(other) == 0;
   String toString() => 'Wrap($value)';
   int get hashCode => value.hashCode;
 }
diff --git a/tests/lib/mirrors/basic_types_in_dart_core_test.dart b/tests/lib/mirrors/basic_types_in_dart_core_test.dart
index 9e15b84..4ef60f8 100644
--- a/tests/lib/mirrors/basic_types_in_dart_core_test.dart
+++ b/tests/lib/mirrors/basic_types_in_dart_core_test.dart
@@ -11,41 +11,41 @@
   LibraryMirror dartcore = currentMirrorSystem().findLibrary(#dart.core);
   ClassMirror cm;
 
-  cm = dartcore.classes[#int];
+  cm = dartcore.declarations[#int];
   Expect.equals(reflectClass(int), cm);
   Expect.equals(#int, cm.simpleName);
 
-  cm = dartcore.classes[#double];
+  cm = dartcore.declarations[#double];
   Expect.equals(reflectClass(double), cm);
   Expect.equals(#double, cm.simpleName);
 
-  cm = dartcore.classes[#num];
+  cm = dartcore.declarations[#num];
   Expect.equals(reflectClass(num), cm);
   Expect.equals(#num, cm.simpleName);
 
-  cm = dartcore.classes[#bool];
+  cm = dartcore.declarations[#bool];
   Expect.equals(reflectClass(bool), cm);
   Expect.equals(#bool, cm.simpleName);
 
-  cm = dartcore.classes[#String];
+  cm = dartcore.declarations[#String];
   Expect.equals(reflectClass(String), cm);
   Expect.equals(#String, cm.simpleName);
 
-  cm = dartcore.classes[#List];
+  cm = dartcore.declarations[#List];
   Expect.equals(reflectClass(List), cm);
   Expect.equals(#List, cm.simpleName);
 
-  cm = dartcore.classes[#Null];
+  cm = dartcore.declarations[#Null];
   Expect.equals(reflectClass(Null), cm);
   Expect.equals(#Null, cm.simpleName);
 
-  cm = dartcore.classes[#Object];
+  cm = dartcore.declarations[#Object];
   Expect.equals(reflectClass(Object), cm);
   Expect.equals(#Object, cm.simpleName);
 
-  cm = dartcore.classes[#dynamic];
+  cm = dartcore.declarations[#dynamic];
   Expect.isNull(cm);
 
-  cm = dartcore.classes[const Symbol('void')];
+  cm = dartcore.declarations[const Symbol('void')];
   Expect.isNull(cm);
 }
diff --git a/tests/lib/mirrors/constructor_kinds_test.dart b/tests/lib/mirrors/constructor_kinds_test.dart
index febac1f..e083d0e 100644
--- a/tests/lib/mirrors/constructor_kinds_test.dart
+++ b/tests/lib/mirrors/constructor_kinds_test.dart
@@ -42,7 +42,8 @@
   const Class.constRedirectingFactoryConstructor();  /// 01: ok
 
   cm = reflectClass(ClassWithDefaultConstructor);
-  mm = cm.constructors.values.single;
+  mm = cm.declarations.values
+      .where((d) => d is MethodMirror && d.isConstructor).single;
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
@@ -51,42 +52,42 @@
 
   cm = reflectClass(Class);
 
-  mm = cm.constructors[#Class.generativeConstructor];
+  mm = cm.declarations[#Class.generativeConstructor];
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
   Expect.isFalse(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.constructors[#Class.redirectingGenerativeConstructor];
+  mm = cm.declarations[#Class.redirectingGenerativeConstructor];
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
   Expect.isTrue(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.constructors[#Class.factoryConstructor];
+  mm = cm.declarations[#Class.factoryConstructor];
   Expect.isTrue(mm.isConstructor);
   Expect.isFalse(mm.isGenerativeConstructor);
   Expect.isTrue(mm.isFactoryConstructor);
   Expect.isFalse(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.constructors[#Class.redirectingFactoryConstructor];
+  mm = cm.declarations[#Class.redirectingFactoryConstructor];
   Expect.isTrue(mm.isConstructor);
   Expect.isFalse(mm.isGenerativeConstructor);
   Expect.isTrue(mm.isFactoryConstructor);
   Expect.isTrue(mm.isRedirectingConstructor);
   Expect.isFalse(mm.isConstConstructor);
 
-  mm = cm.constructors[#Class.constGenerativeConstructor];
+  mm = cm.declarations[#Class.constGenerativeConstructor];
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
   Expect.isFalse(mm.isRedirectingConstructor);
   Expect.isTrue(mm.isConstConstructor);
 
-  mm = cm.constructors[#Class.constRedirectingGenerativeConstructor];
+  mm = cm.declarations[#Class.constRedirectingGenerativeConstructor];
   Expect.isTrue(mm.isConstructor);
   Expect.isTrue(mm.isGenerativeConstructor);
   Expect.isFalse(mm.isFactoryConstructor);
@@ -94,14 +95,14 @@
   Expect.isTrue(mm.isConstConstructor);
 
   // Not legal.
-  // mm = cm.constructors[#Class.constFactoryConstructor];
+  // mm = cm.declarations[#Class.constFactoryConstructor];
   // Expect.isTrue(mm.isConstructor);
   // Expect.isFalse(mm.isGenerativeConstructor);
   // Expect.isTrue(mm.isFactoryConstructor);
   // Expect.isFalse(mm.isRedirectingConstructor);
   // Expect.isTrue(mm.isConstConstructor);
 
-  mm = cm.constructors[#Class.constRedirectingFactoryConstructor];
+  mm = cm.declarations[#Class.constRedirectingFactoryConstructor];
   Expect.isTrue(mm.isConstructor);
   Expect.isFalse(mm.isGenerativeConstructor);
   Expect.isTrue(mm.isFactoryConstructor);
diff --git a/tests/lib/mirrors/constructor_private_name_test.dart b/tests/lib/mirrors/constructor_private_name_test.dart
new file mode 100644
index 0000000..c0db651
--- /dev/null
+++ b/tests/lib/mirrors/constructor_private_name_test.dart
@@ -0,0 +1,31 @@
+// 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 test.constructors_test;
+
+// Regression test for C1 bug.
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class Foo {
+  Foo._private();
+}
+
+class _Foo {
+  _Foo._private();
+}
+
+main() {
+  ClassMirror fooMirror = reflectClass(Foo);
+  Symbol constructorName =
+      (fooMirror.declarations[#Foo._private] as MethodMirror).constructorName;
+  fooMirror.newInstance(constructorName, []);
+
+  ClassMirror _fooMirror = reflectClass(_Foo);
+  constructorName =
+      (_fooMirror.declarations[#_Foo._private] as MethodMirror).constructorName;
+  _fooMirror.newInstance(constructorName, []);
+}
diff --git a/tests/lib/mirrors/constructors_test.dart b/tests/lib/mirrors/constructors_test.dart
index b55e440a..ac13e3b 100644
--- a/tests/lib/mirrors/constructors_test.dart
+++ b/tests/lib/mirrors/constructors_test.dart
@@ -10,6 +10,14 @@
 
 import 'stringify.dart';
 
+constructorsOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if(v is MethodMirror && v.isConstructor) result[k] = v;
+  });
+  return result;
+}
+
 class Foo {
 }
 
@@ -28,13 +36,13 @@
 
 main() {
   ClassMirror fooMirror = reflectClass(Foo);
-  Map<Symbol, MethodMirror> fooConstructors = fooMirror.constructors;
+  Map<Symbol, MethodMirror> fooConstructors = constructorsOf(fooMirror);
   ClassMirror barMirror = reflectClass(Bar);
-  Map<Symbol, MethodMirror> barConstructors = barMirror.constructors;
+  Map<Symbol, MethodMirror> barConstructors = constructorsOf(barMirror);
   ClassMirror bazMirror = reflectClass(Baz);
-  Map<Symbol, MethodMirror> bazConstructors = bazMirror.constructors;
+  Map<Symbol, MethodMirror> bazConstructors = constructorsOf(bazMirror);
   ClassMirror bizMirror = reflectClass(Biz);
-  Map<Symbol, MethodMirror> bizConstructors = bizMirror.constructors;
+  Map<Symbol, MethodMirror> bizConstructors = constructorsOf(bizMirror);
 
   expect('{Foo: Method(s(Foo) in s(Foo), constructor)}', fooConstructors);
   expect('{Bar: Method(s(Bar) in s(Bar), constructor)}', barConstructors);
diff --git a/tests/lib/mirrors/equality_test.dart b/tests/lib/mirrors/equality_test.dart
index ffd1583..b99c311 100644
--- a/tests/lib/mirrors/equality_test.dart
+++ b/tests/lib/mirrors/equality_test.dart
@@ -100,15 +100,15 @@
     {'currentMirrorSystem().voidType' : currentMirrorSystem().voidType},  /// 01: ok
 
     {'currentMirrorSystem().voidType' : currentMirrorSystem().voidType,   /// 02: ok
-     'thisLibrary.functions[#subroutine].returnType' :                    /// 02: ok
-          thisLibrary.functions[#subroutine].returnType},  /// 02: ok
+     'thisLibrary.declarations[#subroutine].returnType' :                    /// 02: ok
+          (thisLibrary.declarations[#subroutine] as MethodMirror).returnType},  /// 02: ok
 
     {'currentMirrorSystem().dynamicType' : currentMirrorSystem().dynamicType,
-     'thisLibrary.functions[#main].returnType' :
-          thisLibrary.functions[#main].returnType},
+     'thisLibrary.declarations[#main].returnType' :
+          (thisLibrary.declarations[#main] as MethodMirror).returnType},
 
     {'reflectClass(A)' : reflectClass(A),
-     'thisLibrary.classes[#A]' : thisLibrary.classes[#A],
+     'thisLibrary.declarations[#A]' : thisLibrary.declarations[#A],
      'reflect(new A<int>()).type.originalDeclaration' :
           reflect(new A<int>()).type.originalDeclaration},
 
@@ -116,31 +116,31 @@
      'reflect(new A<int>()).type' : reflect(new A<int>()).type}, /// 02: ok
 
     {'reflectClass(B)' : reflectClass(B),
-     'thisLibrary.classes[#B]' : thisLibrary.classes[#B],
+     'thisLibrary.declarations[#B]' : thisLibrary.declarations[#B],
      'reflect(new B()).type' : reflect(new B()).type},
 
-    {'reflectClass(BadEqualityHash).methods[#==]'  /// 02: ok
-        : reflectClass(BadEqualityHash).methods[#==],  /// 02: ok
-     'reflect(new BadEqualityHash()).type.methods[#==]'  /// 02: ok
-        : reflect(new BadEqualityHash()).type.methods[#==]},  /// 02: ok
+    {'reflectClass(BadEqualityHash).declarations[#==]'  /// 02: ok
+        : reflectClass(BadEqualityHash).declarations[#==],  /// 02: ok
+     'reflect(new BadEqualityHash()).type.declarations[#==]'  /// 02: ok
+        : reflect(new BadEqualityHash()).type.declarations[#==]},  /// 02: ok
 
-    {'reflectClass(BadEqualityHash).methods[#==].parameters[0]'  /// 02: ok
-        : reflectClass(BadEqualityHash).methods[#==].parameters[0],  /// 02: ok
-     'reflect(new BadEqualityHash()).type.methods[#==].parameters[0]'  /// 02: ok
-        : reflect(new BadEqualityHash()).type.methods[#==].parameters[0]},  /// 02: ok
+    {'reflectClass(BadEqualityHash).declarations[#==].parameters[0]'  /// 02: ok
+        : (reflectClass(BadEqualityHash).declarations[#==] as MethodMirror).parameters[0],  /// 02: ok
+     'reflect(new BadEqualityHash()).type.declarations[#==].parameters[0]'  /// 02: ok
+        : (reflect(new BadEqualityHash()).type.declarations[#==] as MethodMirror).parameters[0]},  /// 02: ok
 
-    {'reflectClass(BadEqualityHash).variables[#count]'  /// 02: ok
-        : reflectClass(BadEqualityHash).variables[#count],  /// 02: ok
-     'reflect(new BadEqualityHash()).type.variables[#count]'  /// 02: ok
-        : reflect(new BadEqualityHash()).type.variables[#count]},  /// 02: ok
+    {'reflectClass(BadEqualityHash).declarations[#count]'  /// 02: ok
+        : reflectClass(BadEqualityHash).declarations[#count],  /// 02: ok
+     'reflect(new BadEqualityHash()).type.declarations[#count]'  /// 02: ok
+        : reflect(new BadEqualityHash()).type.declarations[#count]},  /// 02: ok
 
     {'reflectType(Predicate)' : reflectType(Predicate),  /// 02: ok
-     'thisLibrary.variables[#somePredicate].type'  /// 02: ok
-        : thisLibrary.variables[#somePredicate].type},  /// 02: ok
+     'thisLibrary.declarations[#somePredicate].type'  /// 02: ok
+        : (thisLibrary.declarations[#somePredicate] as VariableMirror).type},  /// 02: ok
 
     {'reflectType(Predicate).referent' : (reflectType(Predicate) as TypedefMirror).referent,  /// 02: ok
-     'thisLibrary.variables[#somePredicate].type.referent'  /// 02: ok
-        : (thisLibrary.variables[#somePredicate].type as TypedefMirror).referent},  /// 02: ok
+     'thisLibrary.declarations[#somePredicate].type.referent'  /// 02: ok
+        : ((thisLibrary.declarations[#somePredicate] as VariableMirror).type as TypedefMirror).referent},  /// 02: ok
 
     {'reflectClass(A).typeVariables.single'  /// 02: ok
         : reflectClass(A).typeVariables.single,  /// 02: ok
diff --git a/tests/lib/mirrors/fake_function_with_call_test.dart b/tests/lib/mirrors/fake_function_with_call_test.dart
index 058a567..05523ef 100644
--- a/tests/lib/mirrors/fake_function_with_call_test.dart
+++ b/tests/lib/mirrors/fake_function_with_call_test.dart
@@ -6,6 +6,15 @@
 
 import "package:expect/expect.dart";
 
+membersOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if(v is MethodMirror && !v.isConstructor) result[k] = v;
+    if(v is VariableMirror) result[k] = v;
+  });
+  return result;
+}
+
 class WannabeFunction {
   int call(int a, int b) => a + b;
   method(x) => x * x;
@@ -39,6 +48,6 @@
   ClassMirror km = cm.type;
   Expect.equals(reflectClass(WannabeFunction), km);
   Expect.equals(#WannabeFunction, km.simpleName);
-  Expect.equals(mm, km.members[#call]);
-  Expect.setEquals([#call, #method], km.members.keys);
+  Expect.equals(mm, km.declarations[#call]);
+  Expect.setEquals([#call, #method], membersOf(km).keys);
 }
diff --git a/tests/lib/mirrors/field_type_test.dart b/tests/lib/mirrors/field_type_test.dart
new file mode 100644
index 0000000..a5e6b71
--- /dev/null
+++ b/tests/lib/mirrors/field_type_test.dart
@@ -0,0 +1,77 @@
+// 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 field_test;
+
+import 'dart:mirrors';
+import "package:expect/expect.dart";
+
+String toplevelVariable;
+class C {
+  final int i;
+  const C(this.i);
+}
+class A<T> {
+  static int staticField;
+  @C(42)
+  @C(44)
+  String field;
+  var dynamicTypeField;
+  T typeVariableField;
+  H<int> parameterizedTypeField;
+}
+
+class H<T> {}
+
+testOriginalDeclaration() {
+  ClassMirror a = reflectClass(A);
+  VariableMirror staticField = a.declarations[#staticField];
+  VariableMirror field = a.declarations[#field];
+  VariableMirror dynamicTypeField = a.declarations[#dynamicTypeField];
+  VariableMirror typeVariableField = a.declarations[#typeVariableField];
+  VariableMirror parameterizedTypeField =
+      a.declarations[#parameterizedTypeField];
+
+  Expect.equals(reflectType(int), staticField.type);
+  Expect.equals(reflectClass(String), field.type);
+  Expect.equals(reflectType(dynamic), dynamicTypeField.type);
+  Expect.equals(a.typeVariables.single, typeVariableField.type);
+  Expect.equals(reflect(new H<int>()).type, parameterizedTypeField.type);
+
+  Expect.equals(2, field.metadata.length);
+  Expect.equals(reflect(const C(42)), field.metadata.first);
+  Expect.equals(reflect(const C(44)), field.metadata.last);
+}
+
+testInstance() {
+  ClassMirror aOfString = reflect(new A<String>()).type;
+  VariableMirror staticField = aOfString.declarations[#staticField];
+  VariableMirror field = aOfString.declarations[#field];
+  VariableMirror dynamicTypeField = aOfString.declarations[#dynamicTypeField];
+  VariableMirror typeVariableField = aOfString.declarations[#typeVariableField];
+  VariableMirror parameterizedTypeField =
+      aOfString.declarations[#parameterizedTypeField];
+
+  Expect.equals(reflectType(int), staticField.type);
+  Expect.equals(reflectClass(String), field.type);
+  Expect.equals(reflectType(dynamic), dynamicTypeField.type);
+  Expect.equals(reflectClass(String), typeVariableField.type);
+  Expect.equals(reflect(new H<int>()).type, parameterizedTypeField.type);
+
+  Expect.equals(2, field.metadata.length);
+  Expect.equals(reflect(const C(42)), field.metadata.first);
+  Expect.equals(reflect(const C(44)), field.metadata.last);
+}
+
+testTopLevel() {
+  LibraryMirror currentLibrary = currentMirrorSystem().findLibrary(#field_test);
+  VariableMirror topLevel = currentLibrary.declarations[#toplevelVariable];
+  Expect.equals(reflectClass(String), topLevel.type);
+}
+
+main() {
+  testOriginalDeclaration();
+  testInstance();
+  testTopLevel();
+}
\ No newline at end of file
diff --git a/tests/lib/mirrors/generic_function_typedef_test.dart b/tests/lib/mirrors/generic_function_typedef_test.dart
index 3f6853b..7f11d22 100644
--- a/tests/lib/mirrors/generic_function_typedef_test.dart
+++ b/tests/lib/mirrors/generic_function_typedef_test.dart
@@ -25,10 +25,10 @@
 main() {
   TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;
 
-  TypedefMirror predicateOfNum = reflectClass(C).variables[#predicateOfNum].type;
-  TypedefMirror transformOfString = reflectClass(C).variables[#transformOfString].type;
-  TypedefMirror transformOfR = reflectClass(C).variables[#transformOfR].type;
-  TypedefMirror transformOfDouble = reflect(new C<double>()).type.variables[#transformOfR].type;
+  TypedefMirror predicateOfNum = (reflectClass(C).declarations[#predicateOfNum] as VariableMirror).type;
+  TypedefMirror transformOfString = (reflectClass(C).declarations[#transformOfString] as VariableMirror).type;
+  TypedefMirror transformOfR = (reflectClass(C).declarations[#transformOfR] as VariableMirror).type;
+  TypedefMirror transformOfDouble = (reflect(new C<double>()).type.declarations[#transformOfR] as VariableMirror).type;
 
   TypeVariableMirror tFromGenericPredicate = reflectTypeDeclaration(GenericPredicate).typeVariables[0];
   TypeVariableMirror sFromGenericTransform = reflectTypeDeclaration(GenericTransform).typeVariables[0];
diff --git a/tests/lib/mirrors/generic_local_function_test.dart b/tests/lib/mirrors/generic_local_function_test.dart
new file mode 100644
index 0000000..7a79aae
--- /dev/null
+++ b/tests/lib/mirrors/generic_local_function_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.generic_function_typedef;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+import 'generics_helper.dart';
+
+class C<T> {
+  makeClosure1() {
+    T closure1(T t) {}
+    return closure1;
+  }
+
+  makeClosure2() {
+    enclosing() {
+      T closure2(T t) {}
+      return closure2;
+    };
+    return enclosing();
+  }
+}
+
+main() {
+  ClosureMirror closure1 = reflect(new C<String>().makeClosure1());
+  Expect.equals(reflectClass(String), closure1.function.returnType);
+  Expect.equals(reflectClass(String), closure1.function.parameters[0].type);
+
+  ClosureMirror closure2 = reflect(new C<String>().makeClosure2());
+  Expect.equals(reflectClass(String), closure2.function.returnType);
+  Expect.equals(reflectClass(String), closure2.function.parameters[0].type);
+}
diff --git a/tests/lib/mirrors/generic_type_mirror_test.dart b/tests/lib/mirrors/generic_type_mirror_test.dart
index 6b38328..e48892f 100644
--- a/tests/lib/mirrors/generic_type_mirror_test.dart
+++ b/tests/lib/mirrors/generic_type_mirror_test.dart
@@ -23,13 +23,13 @@
   ClassMirror bar = reflect(new Bar()).type;
   ClassMirror baz = reflect(new Baz()).type;
   ClassMirror hOfBaz = reflect(new H<Baz>()).type;
-  VariableMirror field = foo.variables.values.single;
-  MethodMirror getter = foo.getters.values.single;
-  MethodMirror setter = foo.setters.values.single;
-  MethodMirror m = foo.methods[const Symbol('m')];
-  MethodMirror n = foo.methods[const Symbol('n')];
-  MethodMirror o = foo.methods[const Symbol('o')];
-  MethodMirror p = foo.methods[const Symbol('p')];
+  VariableMirror field = foo.declarations[#field];
+  MethodMirror getter = foo.declarations[#bar];
+  MethodMirror setter = foo.declarations[const Symbol('bar=')];
+  MethodMirror m = foo.declarations[#m];
+  MethodMirror n = foo.declarations[#n];
+  MethodMirror o = foo.declarations[#o];
+  MethodMirror p = foo.declarations[#p];
 
   Expect.equals(foo, field.owner);
   Expect.equals(foo, getter.owner);
@@ -39,14 +39,14 @@
   Expect.equals(foo, o.owner);
   Expect.equals(foo, p.owner);
 
-  Expect.equals(baz, field.type); /// 01: ok
+  Expect.equals(baz, field.type);
   Expect.equals(baz, getter.returnType);
   Expect.equals(bar, m.returnType);
   Expect.equals(baz, n.returnType);
   Expect.equals(bar, o.parameters.single.type);
-  Expect.equals(hOfBaz, p.returnType);  /// 02: ok
+  Expect.equals(hOfBaz, p.returnType);
   Expect.equals(1, p.returnType.typeArguments.length);
-  Expect.equals(baz, p.returnType.typeArguments[0]); /// 02: ok
+  Expect.equals(baz, p.returnType.typeArguments[0]);
 
   Expect.equals(baz, setter.parameters.single.type);
 
@@ -55,13 +55,13 @@
 void testOriginalDeclaration() {
   ClassMirror foo = reflectClass(Foo);
 
-  VariableMirror field = foo.variables.values.single;
-  MethodMirror getter = foo.getters.values.single;
-  MethodMirror setter = foo.setters.values.single;
-  MethodMirror m = foo.methods[const Symbol('m')];
-  MethodMirror n = foo.methods[const Symbol('n')];
-  MethodMirror o = foo.methods[const Symbol('o')];
-  MethodMirror p = foo.methods[const Symbol('p')];
+  VariableMirror field = foo.declarations[#field];
+  MethodMirror getter = foo.declarations[#bar];
+  MethodMirror setter = foo.declarations[const Symbol('bar=')];
+  MethodMirror m = foo.declarations[#m];
+  MethodMirror n = foo.declarations[#n];
+  MethodMirror o = foo.declarations[#o];
+  MethodMirror p = foo.declarations[#p];
   TypeVariableMirror w = foo.typeVariables[0];
   TypeVariableMirror v = foo.typeVariables[1];
 
@@ -73,7 +73,7 @@
   Expect.equals(foo, o.owner);
   Expect.equals(foo, p.owner);
 
-  Expect.equals(v, field.type); /// 01: ok
+  Expect.equals(v, field.type);
   Expect.equals(v, getter.returnType);
   Expect.equals(w, m.returnType);
   Expect.equals(v, n.returnType);
diff --git a/tests/lib/mirrors/generics_double_substitution_test.dart b/tests/lib/mirrors/generics_double_substitution_test.dart
new file mode 100644
index 0000000..e9ee9de
--- /dev/null
+++ b/tests/lib/mirrors/generics_double_substitution_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.generics_double_substitution;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+class A<R> {}
+class B<S> {}
+class C<T> extends B<A<T>> {
+  A<T> field;
+  A<T> returnType() {}
+  parameterType(A<T> param) {}
+}
+
+main() {
+  ClassMirror cOfString = reflect(new C<String>()).type;
+  ClassMirror aOfString = reflect(new A<String>()).type;
+
+  VariableMirror field = cOfString.declarations[#field];
+  Expect.equals(aOfString, field.type);
+
+  MethodMirror returnType = cOfString.declarations[#returnType];
+  Expect.equals(aOfString, returnType.returnType);
+
+  MethodMirror parameterType = cOfString.declarations[#parameterType];
+  Expect.equals(aOfString, parameterType.parameters.single.type);
+
+  ClassMirror typeArgOfSuperclass = cOfString.superclass.typeArguments.single;
+  Expect.equals(aOfString, typeArgOfSuperclass);  /// 01: ok
+}
diff --git a/tests/lib/mirrors/generics_substitution_test.dart b/tests/lib/mirrors/generics_substitution_test.dart
index 1d0e924..58a0269 100644
--- a/tests/lib/mirrors/generics_substitution_test.dart
+++ b/tests/lib/mirrors/generics_substitution_test.dart
@@ -29,9 +29,12 @@
   Expect.isFalse(superOfTAndInt.isOriginalDeclaration);
   Expect.isFalse(superOfStringAndInt.isOriginalDeclaration);
 
-  Symbol r(ClassMirror cm) => cm.variables[#r].type.simpleName;
-  Symbol s(ClassMirror cm) => cm.methods[#s].parameters[0].type.simpleName;
-  Symbol t(ClassMirror cm) => cm.methods[#t].returnType.simpleName;
+  Symbol r(ClassMirror cm) =>
+      (cm.declarations[#r] as VariableMirror).type.simpleName;
+  Symbol s(ClassMirror cm) =>
+      (cm.declarations[#s] as MethodMirror).parameters[0].type.simpleName;
+  Symbol t(ClassMirror cm) =>
+      (cm.declarations[#t] as MethodMirror).returnType.simpleName;
 
   Expect.equals(#T, r(genericDecl.superclass)); /// 01: ok
   Expect.equals(#int, s(genericDecl.superclass));
diff --git a/tests/lib/mirrors/generics_test.dart b/tests/lib/mirrors/generics_test.dart
index ec2d49a..085dc37 100644
--- a/tests/lib/mirrors/generics_test.dart
+++ b/tests/lib/mirrors/generics_test.dart
@@ -145,11 +145,10 @@
 
   // Library members are all uninstantaited generics or non-generics.
   currentMirrorSystem().libraries.values.forEach((libraryMirror) {
-    libraryMirror.classes.values.forEach((classMirror) {
-      // Generic typedefs are considered in a separate test.
-      if (classMirror is! TypedefMirror) {
-        Expect.isTrue(classMirror.isOriginalDeclaration);
-        Expect.equals(classMirror, classMirror.originalDeclaration);
+    libraryMirror.declarations.values.forEach((declaration) {
+      if (declaration is ClassMirror) {
+        Expect.isTrue(declaration.isOriginalDeclaration);
+        Expect.equals(declaration, declaration.originalDeclaration);
       }
     });
   });
diff --git a/tests/lib/mirrors/hierarchy_invariants_test.dart b/tests/lib/mirrors/hierarchy_invariants_test.dart
index 19d3152..e35a076 100644
--- a/tests/lib/mirrors/hierarchy_invariants_test.dart
+++ b/tests/lib/mirrors/hierarchy_invariants_test.dart
@@ -12,34 +12,30 @@
   return MirrorSystem.getName(classMirror.simpleName).contains(' with ');
 }
 
-check(classMirror) {
-  if (classMirror is TypedefMirror) return;
-
+checkClass(classMirror) {
   Expect.isTrue(classMirror.simpleName is Symbol);
   Expect.notEquals(null, classMirror.owner);
   Expect.isTrue(classMirror.owner is LibraryMirror);
   if (!isAnonymousMixinApplication(classMirror)) {
     Expect.equals(classMirror.originalDeclaration,
-                  classMirror.owner.classes[classMirror.simpleName]);
+                  classMirror.owner.declarations[classMirror.simpleName]);
   } else {
-    Expect.isNull(classMirror.owner.classes[classMirror.simpleName]);
+    Expect.isNull(classMirror.owner.declarations[classMirror.simpleName]);
   }
   Expect.isTrue(classMirror.superinterfaces is List);
   if (classMirror.superclass == null) {
     Expect.equals(reflectClass(Object), classMirror);
   } else {
-    check(classMirror.superclass);
+    checkClass(classMirror.superclass);
   }
 }
 
-main() {
-  currentMirrorSystem().libraries.values.forEach((libraryMirror) {
-    libraryMirror.classes.values.forEach((classMirror) {
-      check(classMirror);
-    });
-  });
+checkLibrary(libraryMirror) {
+  libraryMirror.declarations.values
+      .where((d) => d is ClassMirror)
+      .forEach(checkClass);
+}
 
-  Expect.throws(() => reflectClass(dynamic),
-                (e) => e is ArgumentError,
-                'dynamic is not a class');
+main() {
+  currentMirrorSystem().libraries.values.forEach(checkLibrary);
 }
diff --git a/tests/lib/mirrors/immutable_collections_test.dart b/tests/lib/mirrors/immutable_collections_test.dart
index 391fce4..7f9ea0b 100644
--- a/tests/lib/mirrors/immutable_collections_test.dart
+++ b/tests/lib/mirrors/immutable_collections_test.dart
@@ -41,22 +41,13 @@
 }
 
 checkClass(ClassMirror cm) {
-  checkMap(cm.members, 'ClassMirror.members');
-  checkMap(cm.variables, 'ClassMirror.variables');
-  checkMap(cm.methods, 'ClassMirror.methods');
-  checkMap(cm.getters, 'ClassMirror.getters');
-  checkMap(cm.setters, 'ClassMirror.setters');
-  checkMap(cm.constructors, 'ClassMirror.constructors');
+  checkMap(cm.declarations, 'ClassMirror.declarations');
   checkList(cm.metadata, 'ClassMirror.metadata');
   checkList(cm.superinterfaces, 'ClassMirror.superinterfaces');
   checkList(cm.typeArguments, 'ClassMirror.typeArguments');
   checkList(cm.typeVariables, 'ClassMirror.typeVariables');
 
-  cm.methods.values.forEach(checkMethod);
-  cm.getters.values.forEach(checkMethod);
-  cm.setters.values.forEach(checkMethod);
-  cm.constructors.values.forEach(checkMethod);
-  cm.variables.values.forEach(checkVariable);
+  cm.declarations.values.forEach(checkDeclaration);
   cm.typeVariables.forEach(checkTypeVariable);
 }
 
@@ -64,22 +55,19 @@
   checkList(tm.metadata, 'TypeMirror.metadata');
 }
 
+checkDeclaration(DeclarationMirror dm) {
+  if (dm is MethodMirror) checkMethod(dm);
+  if (dm is ClassMirror) checkClass(dm);
+  if (dm is TypeMirror) checkType(dm);
+  if (dm is VariableMirror) checkVariable(dm);
+  if (dm is TypeVariableMirror) checkTypeVariable(dm);
+}
+
 checkLibrary(LibraryMirror lm) {
-  checkMap(lm.members, 'LibraryMirror.members');
-  checkMap(lm.variables, 'LibraryMirror.variables');
-  checkMap(lm.classes, 'LibraryMirror.classes');
-  checkMap(lm.types, 'LibraryMirror.types');
-  checkMap(lm.functions, 'LibraryMirror.functions');
-  checkMap(lm.getters, 'LibraryMirror.getters');
-  checkMap(lm.setters, 'LibraryMirror.setters');
+  checkMap(lm.declarations, 'LibraryMirror.declarations');
   checkList(lm.metadata, 'LibraryMirror.metadata');
 
-  lm.types.values.forEach(checkType);
-  lm.classes.values.forEach(checkClass);
-  lm.functions.values.forEach(checkMethod);
-  lm.getters.values.forEach(checkMethod);
-  lm.setters.values.forEach(checkMethod);
-  lm.variables.values.forEach(checkVariable);
+  lm.declarations.values.forEach(checkDeclaration);
 }
 
 main() {
diff --git a/tests/lib/mirrors/inherit_field_test.dart b/tests/lib/mirrors/inherit_field_test.dart
index 8fc1e5e..9fd8309 100644
--- a/tests/lib/mirrors/inherit_field_test.dart
+++ b/tests/lib/mirrors/inherit_field_test.dart
@@ -19,7 +19,7 @@
 
 void main() {
   expect('Variable(s(field) in s(Foo))',
-         reflectClass(Foo).members[#field]);
+         reflectClass(Foo).declarations[#field]);
   expect('<null>',
-         reflectClass(Bar).members[#field]);
+         reflectClass(Bar).declarations[#field]);
 }
diff --git a/tests/lib/mirrors/initializing_formals_test.dart b/tests/lib/mirrors/initializing_formals_test.dart
index d1c42d8..3afb39d 100644
--- a/tests/lib/mirrors/initializing_formals_test.dart
+++ b/tests/lib/mirrors/initializing_formals_test.dart
@@ -32,9 +32,11 @@
 }
 
 main() {
+  MethodMirror mm;
   ParameterMirror pm;
 
-  pm = reflectClass(Class).constructors[#Class.nongeneric].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.nongeneric];
+  pm = mm.parameters.single;
   Expect.equals(#intField, pm.simpleName);
   Expect.equals(reflectClass(int), pm.type);
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -45,7 +47,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
   
-  pm = reflectClass(Class).constructors[#Class.named].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.named];
+  pm = mm.parameters.single;
   Expect.equals(#boolField, pm.simpleName);
   Expect.equals(reflectClass(bool), pm.type);
   Expect.isTrue(pm.isNamed);  /// 01: ok
@@ -56,7 +59,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  pm = reflectClass(Class).constructors[#Class.optPos].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.optPos];
+  pm = mm.parameters.single;
   Expect.equals(#stringField, pm.simpleName);
   Expect.equals(reflectClass(String), pm.type);
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -68,7 +72,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
   
-  pm = reflectClass(Class).constructors[#Class.generic].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.generic];
+  pm = mm.parameters.single;
   Expect.equals(#tField, pm.simpleName);
   Expect.equals(reflectClass(Class).typeVariables.single, pm.type);  /// 02: ok
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -79,7 +84,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  pm = reflectClass(Class).constructors[#Class.private].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.private];
+  pm = mm.parameters.single;
   Expect.equals(#_privateField, pm.simpleName);  /// 03: ok
   Expect.equals(currentMirrorSystem().dynamicType, pm.type);
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -90,7 +96,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  pm = reflectClass(Class).constructors[#Class.explicitType].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.explicitType];
+  pm = mm.parameters.single;
   Expect.equals(#intField, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -101,7 +108,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  pm = reflectClass(Class).constructors[#Class.withVar].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.withVar];
+  pm = mm.parameters.single;
   Expect.equals(#intField, pm.simpleName);
   Expect.equals(reflectClass(int), pm.type);  // N.B.   /// 02: ok
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -112,7 +120,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  pm = reflectClass(Class).constructors[#Class.withDynamic].parameters.single;
+  mm = reflectClass(Class).declarations[#Class.withDynamic];
+  pm = mm.parameters.single;
   Expect.equals(#intField, pm.simpleName);
   Expect.equals(currentMirrorSystem().dynamicType, pm.type);  // N.B.
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -123,7 +132,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  pm = reflectClass(Constant).constructors[#Constant].parameters.single;
+  mm = reflectClass(Constant).declarations[#Constant];
+  pm = mm.parameters.single;
   Expect.equals(#value, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
   Expect.isFalse(pm.isNamed);  /// 01: ok
@@ -134,7 +144,8 @@
   Expect.isFalse(pm.isStatic);
   Expect.isFalse(pm.isTopLevel);
 
-  pm = reflectClass(Constant).constructors[#Constant.marked].parameters.single;
+  mm = reflectClass(Constant).declarations[#Constant.marked];
+  pm = mm.parameters.single;
   Expect.equals(#value, pm.simpleName);
   Expect.equals(reflectClass(num), pm.type);
   Expect.isFalse(pm.isNamed);  /// 01: ok
diff --git a/tests/lib/mirrors/intercepted_class_test.dart b/tests/lib/mirrors/intercepted_class_test.dart
index 2fde1b7..9c820ec 100644
--- a/tests/lib/mirrors/intercepted_class_test.dart
+++ b/tests/lib/mirrors/intercepted_class_test.dart
@@ -13,8 +13,8 @@
 checkClassMirror(ClassMirror cls, String name) {
   expect('s($name)', cls.simpleName);
   var variables = new Map();
-  cls.variables.forEach((Symbol key, VariableMirror value) {
-    if (!value.isStatic && !value.isPrivate) {
+  cls.declarations.forEach((Symbol key, DeclarationMirror value) {
+    if (value is VariableMirror && !value.isStatic && !value.isPrivate) {
       variables[key] = value;
     }
   });
diff --git a/tests/lib/mirrors/invoke_private_wrong_library_test.dart b/tests/lib/mirrors/invoke_private_wrong_library_test.dart
new file mode 100644
index 0000000..c9e9387
--- /dev/null
+++ b/tests/lib/mirrors/invoke_private_wrong_library_test.dart
@@ -0,0 +1,43 @@
+// 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 test.invoke_test;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+
+import 'invoke_private_test.dart' show C;
+
+expectThrowsNSM(f) {
+  Expect.throws(f, (e) => e is NoSuchMethodError);
+}
+
+main() {
+  var result;
+
+  C c = new C();
+  InstanceMirror im = reflect(c);
+  expectThrowsNSM(() => im.invoke(#_method, [2,4,8]));
+  expectThrowsNSM(() => im.getField(#_getter));
+  expectThrowsNSM(() => im.getField(#_field));
+  expectThrowsNSM(() => im.setField(#_setter, 'foo'));
+  expectThrowsNSM(() => im.setField(#_field, 'bar'));
+
+  ClassMirror cm = reflectClass(C);
+  expectThrowsNSM(() => cm.invoke(#_staticFunction, [3,4]));
+  expectThrowsNSM(() => cm.getField(#_staticGetter));
+  expectThrowsNSM(() => cm.getField(#_staticField));
+  expectThrowsNSM(() => cm.setField(#_staticSetter, 'sfoo'));
+  expectThrowsNSM(() => cm.setField(#_staticField, 'sbar'));
+  expectThrowsNSM(() => cm.newInstance(#_named, ['my value']));
+
+  LibraryMirror lm = cm.owner;
+  expectThrowsNSM(() => lm.invoke(#_libraryFunction, [':',')']));
+  expectThrowsNSM(() => lm.getField(#_libraryGetter));
+  expectThrowsNSM(() => lm.getField(#_libraryField));
+  expectThrowsNSM(() => lm.setField(#_librarySetter, 'lfoo'));
+  expectThrowsNSM(() => lm.setField(#_libraryField, 'lbar'));
+}
diff --git a/tests/lib/mirrors/lazy_static_test.dart b/tests/lib/mirrors/lazy_static_test.dart
index 6420e8e..3cfba8d 100644
--- a/tests/lib/mirrors/lazy_static_test.dart
+++ b/tests/lib/mirrors/lazy_static_test.dart
@@ -19,7 +19,7 @@
 
 void main() {
   expect('Variable(s(hello) in s(Foo), static)',
-         reflectClass(Foo).members[#hello]);
+         reflectClass(Foo).declarations[#hello]);
   var reflectee = reflectClass(Foo).getField(#hello).reflectee;
   Expect.stringEquals('a, c', reflectee.keys.join(', '));
   // Call the lazy getter twice as different things probably happen in the
diff --git a/tests/lib/mirrors/libraries_test.dart b/tests/lib/mirrors/libraries_test.dart
index c9613d6..1fd5d33 100644
--- a/tests/lib/mirrors/libraries_test.dart
+++ b/tests/lib/mirrors/libraries_test.dart
@@ -18,7 +18,7 @@
   LibraryMirror mirrorsLibrary = libraries[Uri.parse('dart:mirrors')];
   Expect.isNotNull(mirrorsLibrary, 'mirrorsLibrary is null');
 
-  ClassMirror cls = mirrorsLibrary.classes[#LibraryMirror];
+  ClassMirror cls = mirrorsLibrary.declarations[#LibraryMirror];
   Expect.isNotNull(cls, 'cls is null');
 
   Expect.equals(#dart.mirrors.LibraryMirror, cls.qualifiedName);
diff --git a/tests/lib/mirrors/library_metadata2_test.dart b/tests/lib/mirrors/library_metadata2_test.dart
index 55d3b68..8c4000c 100644
--- a/tests/lib/mirrors/library_metadata2_test.dart
+++ b/tests/lib/mirrors/library_metadata2_test.dart
@@ -6,11 +6,11 @@
 
 import 'library_metadata2_lib1.dart';
 
-import 'library_metadata2_lib2.dart'; /// 01: runtime error
+import 'library_metadata2_lib2.dart'; /// 01: compile-time error
 
 void main() {
   for (var library in currentMirrorSystem().libraries.values) {
     print(library.metadata);  // Processing @MyConst() in lib2 results in a
-                              // runtime error here.
+                              // delayed compilation error here.
   }
 }
diff --git a/tests/lib/mirrors/metadata_constructed_constant_test.dart b/tests/lib/mirrors/metadata_constructed_constant_test.dart
index 0d5e01e..2b4cc42 100644
--- a/tests/lib/mirrors/metadata_constructed_constant_test.dart
+++ b/tests/lib/mirrors/metadata_constructed_constant_test.dart
@@ -21,6 +21,6 @@
 
 main() {
   var value =
-      reflectClass(Foo).methods[#m].metadata.single.reflectee;
+      reflectClass(Foo).declarations[#m].metadata.single.reflectee;
   Expect.stringEquals('ConstructedConstant($StateError)', '$value');
 }
diff --git a/tests/lib/mirrors/metadata_test.dart b/tests/lib/mirrors/metadata_test.dart
index 24998d2..2e1c854 100644
--- a/tests/lib/mirrors/metadata_test.dart
+++ b/tests/lib/mirrors/metadata_test.dart
@@ -54,17 +54,17 @@
   ClassMirror myClassMirror = reflectClass(MyClass);
   checkMetadata(myClassMirror, [symbol, string]);
   LibraryMirror lib = mirrors.findLibrary(#test.metadata_test);
-  MethodMirror function = lib.functions[#main];
+  MethodMirror function = lib.declarations[#main];
   checkMetadata(function, [symbol, string, symbol]);
-  MethodMirror method = myClassMirror.methods[#myMethod];
+  MethodMirror method = myClassMirror.declarations[#myMethod];
   checkMetadata(method, [string, symbol, string]);
-  method = myClassMirror.methods[#myOtherMethod];
+  method = myClassMirror.declarations[#myOtherMethod];
   checkMetadata(method, []);
 
-  VariableMirror xMirror = myClassMirror.variables[#x];
+  VariableMirror xMirror = myClassMirror.declarations[#x];
   checkMetadata(xMirror, [hest, hest, symbol]);
 
-  VariableMirror yMirror = myClassMirror.variables[#y];
+  VariableMirror yMirror = myClassMirror.declarations[#y];
   checkMetadata(yMirror, []);
 
   // TODO(ahe): Test local functions.
diff --git a/tests/lib/mirrors/method_mirror_properties_test.dart b/tests/lib/mirrors/method_mirror_properties_test.dart
index 950a2a8..9b44145 100644
--- a/tests/lib/mirrors/method_mirror_properties_test.dart
+++ b/tests/lib/mirrors/method_mirror_properties_test.dart
@@ -48,31 +48,31 @@
   checkKinds(closureMirror.function,
       [true, false, false, false, false]);
   var libraryMirror = reflectClass(C).owner;
-  checkKinds(libraryMirror.getters[#topGetter],
+  checkKinds(libraryMirror.declarations[#topGetter],
       [true, false, true, false, false]);
-  checkKinds(libraryMirror.setters[const Symbol("topSetter=")],
+  checkKinds(libraryMirror.declarations[const Symbol("topSetter=")],
       [true, false, false, true, false]);
   var classMirror;
   classMirror = reflectClass(C);
-  checkKinds(classMirror.members[#foo],
+  checkKinds(classMirror.declarations[#foo],
       [true, false, false, false, false]);
-  checkKinds(classMirror.members[#priv],
+  checkKinds(classMirror.declarations[#priv],
       [false, false, true, false, false]);
-  checkKinds(classMirror.members[const Symbol("priv=")],
+  checkKinds(classMirror.declarations[const Symbol("priv=")],
       [false, false, false, true, false]);
-  checkKinds(classMirror.constructors[#C],
+  checkKinds(classMirror.declarations[#C],
       [false, false, false, false, true]);
-  checkKinds(classMirror.constructors[#C.other],
+  checkKinds(classMirror.declarations[#C.other],
       [false, false, false, false, true]);
-  checkKinds(classMirror.constructors[#C.other2],
+  checkKinds(classMirror.declarations[#C.other2],
       [false, false, false, false, true]);
   classMirror = reflectClass(AbstractC);
-  checkKinds(classMirror.constructors[#AbstractC],
+  checkKinds(classMirror.declarations[#AbstractC],
       [false, false, false, false, true]);
-  checkKinds(classMirror.members[#bar],
+  checkKinds(classMirror.declarations[#bar],
       [false, true, false, false, false]);
-  checkKinds(classMirror.members[#priv],
+  checkKinds(classMirror.declarations[#priv],
       [false, true, true, false, false]);
-  checkKinds(classMirror.members[const Symbol("priv=")],
+  checkKinds(classMirror.declarations[const Symbol("priv=")],
       [false, true, false, true, false]);
 }
diff --git a/tests/lib/mirrors/method_mirror_returntype_test.dart b/tests/lib/mirrors/method_mirror_returntype_test.dart
index be55156..42ccda2 100644
--- a/tests/lib/mirrors/method_mirror_returntype_test.dart
+++ b/tests/lib/mirrors/method_mirror_returntype_test.dart
@@ -39,7 +39,7 @@
   Expect.equals(const Symbol("void"), mm.returnType.simpleName);
 
   ClassMirror cm = reflectClass(C);
-  mm = cm.members[#getE];
+  mm = cm.declarations[#getE];
   Expect.equals(true, mm.returnType is TypeMirror);
   // The spec for this is ambigious and needs to be updated before it is clear
   // what has to be returned.
diff --git a/tests/lib/mirrors/method_mirror_source_test.dart b/tests/lib/mirrors/method_mirror_source_test.dart
index 2507915..d0aad92 100644
--- a/tests/lib/mirrors/method_mirror_source_test.dart
+++ b/tests/lib/mirrors/method_mirror_source_test.dart
@@ -58,35 +58,35 @@
 main() {
   // Top-level members
   LibraryMirror lib = reflectClass(C).owner;
-  expectSource(lib.members[#foo1],
+  expectSource(lib.declarations[#foo1],
       "foo1() {}");
-  expectSource(lib.members[#x],
+  expectSource(lib.declarations[#x],
       "int get x => 42;");
-  expectSource(lib.members[const Symbol("x=")],
+  expectSource(lib.declarations[const Symbol("x=")],
       "set x(value) { }");
 
   // Class members
   ClassMirror cm = reflectClass(C);
-  expectSource(cm.members[#foo],
+  expectSource(cm.declarations[#foo],
       "static dynamic foo() {\n"
       "    // Happy foo.\n"
       "  }");
-  expectSource(cm.members[#bar],
+  expectSource(cm.declarations[#bar],
       "void bar() { /* Not so happy bar. */ }");
-  expectSource(cm.members[#someX],
+  expectSource(cm.declarations[#someX],
       "num get someX =>\n"
       "    181;");
-  expectSource(cm.members[const Symbol("someX=")],
+  expectSource(cm.declarations[const Symbol("someX=")],
       "set someX(v) {\n"
       "    // Discard this one.\n"
       "  }");
-  expectSource(cm.constructors[#C],
+  expectSource(cm.declarations[#C],
       "C(this._x, y)\n"
       "    : _y = y,\n"
       "      super();");
-  expectSource(cm.constructors[#C.other],
+  expectSource(cm.declarations[#C.other],
       "factory C.other(num z) {}");
-  expectSource(cm.constructors[#C.other3],
+  expectSource(cm.declarations[#C.other3],
       "factory C.other3() = C.other2;");
 
   // Closures
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 2cfde98..0dead1e 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -91,9 +91,9 @@
   var instance = new Class();
 
   var libMirror = mirrors.findLibrary(#MirrorsTest);
-  var classMirror = libMirror.classes[#Class];
+  var classMirror = libMirror.declarations[#Class];
   var instMirror = reflect(instance);
-  var fieldMirror = classMirror.members[#field];
+  var fieldMirror = classMirror.declarations[#field];
   var future;
 
   expect(fieldMirror is VariableMirror, isTrue);
@@ -166,10 +166,10 @@
 
 testNames(mirrors) {
   var libMirror = mirrors.findLibrary(#MirrorsTest);
-  var classMirror = libMirror.classes[#Class];
-  var typedefMirror = libMirror.members[#Typedef];
-  var methodMirror = libMirror.functions[#testNames];
-  var variableMirror = classMirror.variables[#field];
+  var classMirror = libMirror.declarations[#Class];
+  var typedefMirror = libMirror.declarations[#Typedef];
+  var methodMirror = libMirror.declarations[#testNames];
+  var variableMirror = classMirror.declarations[#field];
 
   expect(libMirror.simpleName, equals(#MirrorsTest));
   expect(libMirror.qualifiedName, equals(#MirrorsTest));
diff --git a/tests/lib/mirrors/mixin_application_test.dart b/tests/lib/mirrors/mixin_application_test.dart
index 953850c..10b7866 100644
--- a/tests/lib/mirrors/mixin_application_test.dart
+++ b/tests/lib/mirrors/mixin_application_test.dart
@@ -47,6 +47,23 @@
   ga() {}
 }
 
+membersOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if(v is MethodMirror && !v.isConstructor) result[k] = v;
+    if(v is VariableMirror) result[k] = v;
+  });
+  return result;
+}
+
+constructorsOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if(v is MethodMirror && v.isConstructor) result[k] = v;
+  });
+  return result;
+}
+
 checkClass(Type type, List<String> expectedSuperclasses) {
   int i = 0;
   for (var cls = reflectClass(type); cls != null; cls = cls.superclass) {
@@ -70,10 +87,10 @@
   expect(
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
-      reflectClass(Mixin).members);
+      membersOf(reflectClass(Mixin)));
 
   expect('{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
-         reflectClass(Mixin).constructors);
+         constructorsOf(reflectClass(Mixin)));
 }
 
 testMixin2() {
@@ -85,10 +102,10 @@
   expect(
       '{i2: Variable(s(i2) in s(Mixin2)),'
       ' m2: Method(s(m2) in s(Mixin2))}',
-      reflectClass(Mixin2).members);
+      membersOf(reflectClass(Mixin2)));
 
   expect('{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
-         reflectClass(Mixin2).constructors);
+         constructorsOf(reflectClass(Mixin2)));
 }
 
 testMixinApplication() {
@@ -105,11 +122,11 @@
   expect(
       '{i: Variable(s(i) in s($owner)),'
       ' m: Method(s(m) in s($owner))}',
-      reflectClass(MixinApplication).members);
+      membersOf(reflectClass(MixinApplication)));
 
   expect('{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
          ' constructor)}',
-         reflectClass(MixinApplication).constructors);
+         constructorsOf(reflectClass(MixinApplication)));
 
   expectSame(reflectClass(C), reflectClass(MixinApplication).superclass);
 }
@@ -134,17 +151,17 @@
   expect(
       '{i2: Variable(s(i2) in s($owner)),'
       ' m2: Method(s(m2) in s($owner))}',
-      reflectClass(MixinApplicationA).members);
+      membersOf(reflectClass(MixinApplicationA)));
 
   expect(
       '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
       ' constructor)}',
-      reflectClass(MixinApplicationA).constructors);
+      constructorsOf(reflectClass(MixinApplicationA)));
 
   expect(
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
-      reflectClass(MixinApplicationA).superclass.members);
+      membersOf(reflectClass(MixinApplicationA).superclass));
 
   String name = 'test.model.C with test.mixin_application_test.Mixin';
   name = 'Mixin'; /// 01: ok
@@ -152,7 +169,7 @@
       '{$name:'
       ' Method(s($name)'
       ' in s($name), constructor)}',
-      reflectClass(MixinApplicationA).superclass.constructors);
+      constructorsOf(reflectClass(MixinApplicationA).superclass));
 
   expectSame(
       reflectClass(C),
@@ -174,12 +191,12 @@
   expect(
       '{i: Variable(s(i) in s($owner)),'
       ' m: Method(s(m) in s($owner))}',
-      reflectClass(UnusedMixinApplication).members);
+      membersOf(reflectClass(UnusedMixinApplication)));
 
   expect(
       '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
       ' in s(UnusedMixinApplication), constructor)}',
-      reflectClass(UnusedMixinApplication).constructors);
+      constructorsOf(reflectClass(UnusedMixinApplication)));
 
   expectSame(reflectClass(C), reflectClass(UnusedMixinApplication).superclass);
 }
@@ -199,16 +216,16 @@
 
   expect(
       '{f: Method(s(f) in s(Subclass))}',
-      reflectClass(Subclass).members);
+      membersOf(reflectClass(Subclass)));
 
   expect(
       '{Subclass: Method(s(Subclass) in s(Subclass), constructor)}',
-      reflectClass(Subclass).constructors);
+      constructorsOf(reflectClass(Subclass)));
 
   expect(
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
-      reflectClass(Subclass).superclass.members);
+      membersOf(reflectClass(Subclass).superclass));
 
   String name = 'test.model.C with test.mixin_application_test.Mixin';
   name = 'Mixin'; /// 01: ok
@@ -216,7 +233,7 @@
       '{$name:'
       ' Method(s($name)'
       ' in s($name), constructor)}',
-      reflectClass(Subclass).superclass.constructors);
+      constructorsOf(reflectClass(Subclass).superclass));
 
   expectSame(
       reflectClass(C),
@@ -235,11 +252,11 @@
 
   expect(
       '{g: Method(s(g) in s(Subclass2))}',
-      reflectClass(Subclass2).members);
+      membersOf(reflectClass(Subclass2)));
 
   expect(
       '{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor)}',
-      reflectClass(Subclass2).constructors);
+      constructorsOf(reflectClass(Subclass2)));
 
   expectSame(
       reflectClass(MixinApplication),
@@ -264,16 +281,16 @@
 
   expect(
       '{fa: Method(s(fa) in s(SubclassA))}',
-      reflectClass(SubclassA).members);
+      membersOf(reflectClass(SubclassA)));
 
   expect(
       '{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor)}',
-      reflectClass(SubclassA).constructors);
+      constructorsOf(reflectClass(SubclassA)));
 
   expect(
       '{i2: Variable(s(i2) in s(Mixin2)),'
       ' m2: Method(s(m2) in s(Mixin2))}',
-      reflectClass(SubclassA).superclass.members);
+      membersOf(reflectClass(SubclassA).superclass));
 
   String name =
       'test.model.C with test.mixin_application_test.Mixin,'
@@ -281,12 +298,12 @@
   name = 'Mixin2'; /// 01: ok
   expect(
       '{$name: Method(s($name) in s($name), constructor)}',
-      reflectClass(SubclassA).superclass.constructors);
+      constructorsOf(reflectClass(SubclassA).superclass));
 
   expect(
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
-      reflectClass(SubclassA).superclass.superclass.members);
+      membersOf(reflectClass(SubclassA).superclass.superclass));
 
   name = 'test.model.C with test.mixin_application_test.Mixin';
   name = 'Mixin'; /// 01: ok
@@ -294,7 +311,7 @@
       '{$name:'
       ' Method(s($name)'
       ' in s($name), constructor)}',
-      reflectClass(SubclassA).superclass.superclass.constructors);
+      constructorsOf(reflectClass(SubclassA).superclass.superclass));
 
   expectSame(
       reflectClass(C),
@@ -319,11 +336,11 @@
 
   expect(
       '{ga: Method(s(ga) in s(Subclass2A))}',
-      reflectClass(Subclass2A).members);
+      membersOf(reflectClass(Subclass2A)));
 
   expect(
       '{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor)}',
-      reflectClass(Subclass2A).constructors);
+      constructorsOf(reflectClass(Subclass2A)));
 
   expectSame(reflectClass(MixinApplicationA),
              reflectClass(Subclass2A).superclass);
diff --git a/tests/lib/mirrors/mixin_members_test.dart b/tests/lib/mirrors/mixin_members_test.dart
index 12c4192..2655892 100644
--- a/tests/lib/mirrors/mixin_members_test.dart
+++ b/tests/lib/mirrors/mixin_members_test.dart
@@ -31,26 +31,35 @@
 
 class C extends S with M1, M2 {}
 
+membersOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if(v is MethodMirror && !v.isConstructor) result[k] = v;
+    if(v is VariableMirror) result[k] = v;
+  });
+  return result;
+}
+
 main() {
   ClassMirror cm = reflectClass(C);
   ClassMirror sM1M2 = cm.superclass;
   ClassMirror sM1 = sM1M2.superclass;
   ClassMirror s = sM1.superclass;
-  expect('{}', cm.members);
+  expect('{}', membersOf(cm));
   expect('[s(baz1), s(baz2)]',
          // TODO(ahe): Shouldn't have to sort.
-         sort(sM1M2.members.keys),
+         sort(membersOf(sM1M2).keys),
          '(S with M1, M2).members');
   expect('[s(M2)]', simpleNames(sM1M2.superinterfaces),
          '(S with M1, M2).superinterfaces');
   expect('[s(bar1), s(bar2)]',
          // TODO(ahe): Shouldn't have to sort.
-         sort(sM1.members.keys), '(S with M1).members');
+         sort(membersOf(sM1).keys), '(S with M1).members');
   expect('[s(M1)]', simpleNames(sM1.superinterfaces),
          '(S with M1).superinterfaces');
   expect('[s(foo1), s(foo2)]',
          // TODO(ahe): Shouldn't have to sort.
-         sort(s.members.keys), 's.members');
+         sort(membersOf(s).keys), 's.members');
   expect('[s(Fooer)]', simpleNames(s.superinterfaces), 's.superinterfaces');
   Expect.equals(s, reflectClass(S));
 }
diff --git a/tests/lib/mirrors/operator_test.dart b/tests/lib/mirrors/operator_test.dart
index 54367b1..c534f1f 100644
--- a/tests/lib/mirrors/operator_test.dart
+++ b/tests/lib/mirrors/operator_test.dart
@@ -42,7 +42,8 @@
   var operators = new Map<Symbol, MethodMirror>();
   var operatorParameters = new Map<Symbol, List>();
   var returnTypes =  new Map<Symbol, Mirror>();
-  for (MethodMirror method in cls.methods.values) {
+  for (MethodMirror method in cls.declarations.values.where(
+      (d) => d is MethodMirror && !d.isConstructor)) {
     Expect.isTrue(method.isRegularMethod);
     Expect.isTrue(method.isOperator);
     Expect.isFalse(method.isGetter);
diff --git a/tests/lib/mirrors/parameter_is_const_test.dart b/tests/lib/mirrors/parameter_is_const_test.dart
new file mode 100644
index 0000000..45185a9
--- /dev/null
+++ b/tests/lib/mirrors/parameter_is_const_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.parameter_is_const;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class Class {
+  foo(
+  const /// 01: compile-time error
+  param) {}
+}
+
+main() {
+  MethodMirror mm = reflectClass(Class).declarations[#foo];
+  Expect.isFalse(mm.parameters.single.isConst);
+}
diff --git a/tests/lib/mirrors/parameter_metadata_test.dart b/tests/lib/mirrors/parameter_metadata_test.dart
index fdb1fc6..9f49450 100644
--- a/tests/lib/mirrors/parameter_metadata_test.dart
+++ b/tests/lib/mirrors/parameter_metadata_test.dart
@@ -32,24 +32,32 @@
 
 main() {
   ClassMirror cm = reflectClass(B);
+  MethodMirror mm;
 
-  checkMetadata(cm.constructors[#B.foo].parameters[0], []);
+  mm = cm.declarations[#B.foo];
+  checkMetadata(mm.parameters[0], []);
 
-  checkMetadata(cm.constructors[#B.bar].parameters[0], [m3, m2]);
-  checkMetadata(cm.constructors[#B.bar].parameters[1], []);
+  mm = cm.declarations[#B.bar];
+  checkMetadata(mm.parameters[0], [m3, m2]);
+  checkMetadata(mm.parameters[1], []);
 
-  checkMetadata(cm.methods[#baz].parameters[0], [m1]);
-  checkMetadata(cm.methods[#baz].parameters[1], [m2]);
-  checkMetadata(cm.methods[#baz].parameters[2], [m3]);
+  mm = cm.declarations[#baz];
+  checkMetadata(mm.parameters[0], [m1]);
+  checkMetadata(mm.parameters[1], [m2]);
+  checkMetadata(mm.parameters[2], [m3]);
 
-  checkMetadata(cm.methods[#qux].parameters[0], []);
-  checkMetadata(cm.methods[#qux].parameters[1], [m3, m2, m1]);
+  mm = cm.declarations[#qux];
+  checkMetadata(mm.parameters[0], []);
+  checkMetadata(mm.parameters[1], [m3, m2, m1]);
 
-  checkMetadata(cm.methods[#quux].parameters[0], []);
-  checkMetadata(cm.methods[#quux].parameters[1], []);
+  mm = cm.declarations[#quux];
+  checkMetadata(mm.parameters[0], []);
+  checkMetadata(mm.parameters[1], []);
 
-  checkMetadata(cm.methods[#corge].parameters[0], [m1]);
-  checkMetadata(cm.methods[#corge].parameters[1], [m2]);
+  mm = cm.declarations[#corge];
+  checkMetadata(mm.parameters[0], [m1]);
+  checkMetadata(mm.parameters[1], [m2]);
 
-  checkMetadata(cm.setters[const Symbol('x=')].parameters[0], [m2]);
+  mm = cm.declarations[const Symbol('x=')];
+  checkMetadata(mm.parameters[0], [m2]);
 }
diff --git a/tests/lib/mirrors/parameter_test.dart b/tests/lib/mirrors/parameter_test.dart
index ac395bd..c9e5f93 100644
--- a/tests/lib/mirrors/parameter_test.dart
+++ b/tests/lib/mirrors/parameter_test.dart
@@ -45,7 +45,10 @@
 
 main() {
   ClassMirror cm = reflectClass(B);
-  Map<Symbol, MethodMirror> constructors = cm.constructors;
+  var constructors = new Map<Symbol, MethodMirror>();
+  cm.declarations.forEach((k, v) {
+    if (v is MethodMirror && v.isConstructor) constructors[k] = v;
+  });
 
   List<Symbol> constructorKeys =
       [#B, #B.bar, #B.baz, #B.foo, #B.quux, #B.qux, #B.corge];
@@ -124,31 +127,31 @@
   expect('Class(s(B) in s(test.parameter_test), top-level)',
          corgeConstructor.returnType);
 
-  MethodMirror xGetter = cm.getters[#x];
+  MethodMirror xGetter = cm.declarations[#x];
   expect('Method(s(x) in s(B), getter)', xGetter);
   expect('[]', xGetter.parameters);
 
-  MethodMirror xSetter = cm.setters[const Symbol('x=')];
+  MethodMirror xSetter = cm.declarations[const Symbol('x=')];
   expect('Method(s(x=) in s(B), setter)', xSetter);
   expect('[Parameter(s(value) in s(x=), final,'
          ' type = Type(s(dynamic), top-level))]',
          xSetter.parameters);
 
-  MethodMirror grault = cm.members[#grault];
+  MethodMirror grault = cm.declarations[#grault];
   expect('Method(s(grault) in s(B))', grault);
   expect('[Parameter(s(x) in s(grault), optional,'
          ' type = Class(s(int) in s(dart.core), top-level))]',
          grault.parameters);
   expect('Instance(value = <null>)', grault.parameters[0].defaultValue);
 
-  MethodMirror garply = cm.members[#garply];
+  MethodMirror garply = cm.declarations[#garply];
   expect('Method(s(garply) in s(B))', garply);
   expect('[Parameter(s(y) in s(garply), optional, named,'
          ' type = Class(s(int) in s(dart.core), top-level))]',
          garply.parameters);
   expect('Instance(value = <null>)', garply.parameters[0].defaultValue);
 
-  MethodMirror waldo = cm.members[#waldo];
+  MethodMirror waldo = cm.declarations[#waldo];
   expect('Method(s(waldo) in s(B))', waldo);
   expect('[Parameter(s(z) in s(waldo),' 
          ' type = Class(s(int) in s(dart.core), top-level))]',
@@ -157,7 +160,7 @@
 
   cm = reflectClass(C);
 
-  MethodMirror fooInC = cm.members[#foo];
+  MethodMirror fooInC = cm.declarations[#foo];
   expect('Method(s(foo) in s(C))', fooInC);
   expect('[Parameter(s(a) in s(foo),'
          ' type = Class(s(int) in s(dart.core), top-level)), '
@@ -166,7 +169,7 @@
          ' upperBound = Class(s(int) in s(dart.core), top-level)))]',
          fooInC.parameters);
 
-  MethodMirror barInC = cm.members[#bar];
+  MethodMirror barInC = cm.declarations[#bar];
   expect('Method(s(bar) in s(C))', barInC);
   expect('[Parameter(s(a) in s(bar),'
          ' type = TypeVariable(s(S) in s(C),'
diff --git a/tests/lib/mirrors/private_symbol_test.dart b/tests/lib/mirrors/private_symbol_test.dart
index 6b10d80..156381a 100644
--- a/tests/lib/mirrors/private_symbol_test.dart
+++ b/tests/lib/mirrors/private_symbol_test.dart
@@ -29,15 +29,21 @@
   Symbol corefoo = MirrorSystem.getSymbol('foo', libcore);
   Symbol mathfoo = MirrorSystem.getSymbol('foo', libmath);
   Symbol testfoo = MirrorSystem.getSymbol('foo', libtest);
+  Symbol nullfoo1 = MirrorSystem.getSymbol('foo');
+  Symbol nullfoo2 = MirrorSystem.getSymbol('foo', null);
 
   Expect.equals(corefoo, mathfoo);
   Expect.equals(mathfoo, testfoo);
   Expect.equals(testfoo, corefoo);
+  Expect.equals(nullfoo1, corefoo);
+  Expect.equals(nullfoo2, corefoo);
 
   Expect.equals('foo', MirrorSystem.getName(corefoo));
   Expect.equals('foo', MirrorSystem.getName(mathfoo));
   Expect.equals('foo', MirrorSystem.getName(testfoo));
   Expect.equals('foo', MirrorSystem.getName(#foo));
+  Expect.equals('foo', MirrorSystem.getName(nullfoo1));
+  Expect.equals('foo', MirrorSystem.getName(nullfoo2));
 
   Symbol core_foo = MirrorSystem.getSymbol('_foo', libcore);
   Symbol math_foo = MirrorSystem.getSymbol('_foo', libmath);
@@ -64,37 +70,37 @@
   Expect.equals(#_C, cm.simpleName);
   Expect.equals('_C', MirrorSystem.getName(cm.simpleName));
 
-  MethodMirror mm = cm.members[#g];
+  MethodMirror mm = cm.declarations[#g];
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isGetter);
   Expect.equals(#g, mm.simpleName);
   Expect.equals('g', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.members[const Symbol('s=')];
+  mm = cm.declarations[const Symbol('s=')];
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isSetter);
   Expect.equals(const Symbol('s='), mm.simpleName);
   Expect.equals('s=', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.members[#m];
+  mm = cm.declarations[#m];
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isRegularMethod);
   Expect.equals(#m, mm.simpleName);
   Expect.equals('m', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.members[#_g];
+  mm = cm.declarations[#_g];
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isGetter);
   Expect.equals(#_g, mm.simpleName);
   Expect.equals('_g', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.members[MirrorSystem.getSymbol('_s=', libtest)];
+  mm = cm.declarations[MirrorSystem.getSymbol('_s=', libtest)];
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isSetter);
   Expect.equals(MirrorSystem.getSymbol('_s=', libtest), mm.simpleName);
   Expect.equals('_s=', MirrorSystem.getName(mm.simpleName));
 
-  mm = cm.members[#_m];
+  mm = cm.declarations[#_m];
   Expect.isNotNull(mm);
   Expect.isTrue(mm.isRegularMethod);
   Expect.equals(#_m, mm.simpleName);
@@ -109,7 +115,7 @@
   Expect.equals(#_F, tdm.simpleName);
   Expect.equals('_F', MirrorSystem.getName(tdm.simpleName));
 
-  ParameterMirror pm = (cm.members[#m] as MethodMirror).parameters[0];
+  ParameterMirror pm = (cm.declarations[#m] as MethodMirror).parameters[0];
   Expect.equals(#_p, pm.simpleName);
   Expect.equals('_p', MirrorSystem.getName(pm.simpleName));
 
diff --git a/tests/lib/mirrors/reflect_class_test.dart b/tests/lib/mirrors/reflect_class_test.dart
index f1dff09..29f5466 100644
--- a/tests/lib/mirrors/reflect_class_test.dart
+++ b/tests/lib/mirrors/reflect_class_test.dart
@@ -12,7 +12,7 @@
   Function expectedError = (e) => e is ArgumentError || e is TypeError;
 
   Expect.throws(() => reflectClass(dynamic), expectedError);
-  Expect.throws(() => reflectClass(1), expectedError);
-  Expect.throws(() => reflectClass("string"), expectedError);
+  Expect.throws(() => reflectClass(1), expectedError);  /// 01: static type warning
+  Expect.throws(() => reflectClass("string"), expectedError);  /// 02: static type warning
   Expect.throws(() => reflectClass(FooFunction), expectedError);
 }
diff --git a/tests/lib/mirrors/reflect_model_test.dart b/tests/lib/mirrors/reflect_model_test.dart
index 69239e1..b1fe3b3 100644
--- a/tests/lib/mirrors/reflect_model_test.dart
+++ b/tests/lib/mirrors/reflect_model_test.dart
@@ -13,6 +13,38 @@
 
 isNoSuchMethodError(e) => e is NoSuchMethodError;
 
+variablesOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if (v is VariableMirror) result[k] = v;
+  });
+  return result;
+}
+
+gettersOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if (v is MethodMirror && v.isGetter) result[k] = v;
+  });
+  return result;
+}
+
+settersOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if (v is MethodMirror && v.isSetter) result[k] = v;
+  });
+  return result;
+}
+
+methodsOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if (v is MethodMirror && v.isRegularMethod) result[k] = v;
+  });
+  return result;
+}
+
 main() {
   var unnamed = new Symbol('');
   var field = new Symbol('field');
@@ -29,9 +61,9 @@
   var b = bClass.newInstance(unnamed, []);
   var c = cClass.newInstance(unnamed, []);
 
-  expect('{field: Variable(s(field) in s(A))}', aClass.variables);
-  expect('{}', bClass.variables);
-  expect('{}', cClass.variables);
+  expect('{field: Variable(s(field) in s(A))}', variablesOf(aClass));
+  expect('{}', variablesOf(bClass));
+  expect('{}', variablesOf(cClass));
 
   Expect.isNull(a.getField(field).reflectee);
   Expect.equals('B:get field', b.getField(field).reflectee);
@@ -48,21 +80,21 @@
 
   expect('{accessor: Method(s(accessor) in s(A), getter)'
          '}',
-         aClass.getters);
+         gettersOf(aClass));
   expect('{accessor: Method(s(accessor) in s(B), getter)'
          ', field: Method(s(field) in s(B), getter)}',
-         bClass.getters);
+         gettersOf(bClass));
   expect('{accessor: Method(s(accessor) in s(C), getter)}',
-         cClass.getters);
+         gettersOf(cClass));
 
   expect('{accessor=: Method(s(accessor=) in s(A), setter)'
          '}',
-         aClass.setters);
+         settersOf(aClass));
   expect('{accessor=: Method(s(accessor=) in s(B), setter)}',
-         bClass.setters);
+         settersOf(bClass));
   expect('{accessor=: Method(s(accessor=) in s(C), setter)'
          ', field=: Method(s(field=) in s(C), setter)}',
-         cClass.setters);
+         settersOf(cClass));
 
   Expect.equals('A:instanceMethod(7)', a.invoke(instanceMethod, [7]).reflectee);
   Expect.equals('B:instanceMethod(9)', b.invoke(instanceMethod, [9]).reflectee);
@@ -72,16 +104,16 @@
   expect(
       '{aMethod: Method(s(aMethod) in s(A))'
       ', instanceMethod: Method(s(instanceMethod) in s(A))}',
-      aClass.methods);
+      methodsOf(aClass));
 
   expect(
       '{bMethod: Method(s(bMethod) in s(B))'
       ', instanceMethod: Method(s(instanceMethod) in s(B))}',
-      bClass.methods);
+      methodsOf(bClass));
   expect(
       '{cMethod: Method(s(cMethod) in s(C))'
       ', instanceMethod: Method(s(instanceMethod) in s(C))}',
-      cClass.methods);
+      methodsOf(cClass));
 
   Expect.equals('A:get accessor', a.getField(accessor).reflectee);
   Expect.equals('B:get accessor', b.getField(accessor).reflectee);
diff --git a/tests/lib/mirrors/reflect_runtime_type_test.dart b/tests/lib/mirrors/reflect_runtime_type_test.dart
index c766c2d..dbc225a 100644
--- a/tests/lib/mirrors/reflect_runtime_type_test.dart
+++ b/tests/lib/mirrors/reflect_runtime_type_test.dart
@@ -20,5 +20,6 @@
   print(field);
 }
 
-Iterable<VariableMirror> publicFields(ClassMirror mirror) =>
-    mirror.variables.values.where((x) => !(x.isPrivate || x.isStatic));
+publicFields(ClassMirror mirror) =>
+    mirror.declarations.values.where(
+        (x) => x is VariableMirror && !(x.isPrivate || x.isStatic));
diff --git a/tests/lib/mirrors/reflect_uninstantiated_class_test.dart b/tests/lib/mirrors/reflect_uninstantiated_class_test.dart
index 15479b5..1a2b8e9 100644
--- a/tests/lib/mirrors/reflect_uninstantiated_class_test.dart
+++ b/tests/lib/mirrors/reflect_uninstantiated_class_test.dart
@@ -20,5 +20,6 @@
   print(field);
 }
 
-Iterable<VariableMirror> publicFields(ClassMirror mirror) =>
-    mirror.variables.values.where((x) => !(x.isPrivate || x.isStatic));
+publicFields(ClassMirror mirror) =>
+    mirror.declarations.values.where(
+        (x) => x is VariableMirror && !(x.isPrivate || x.isStatic));
diff --git a/tests/lib/mirrors/regress_14304_test.dart b/tests/lib/mirrors/regress_14304_test.dart
index e63cae0..af974a4 100644
--- a/tests/lib/mirrors/regress_14304_test.dart
+++ b/tests/lib/mirrors/regress_14304_test.dart
@@ -14,7 +14,7 @@
 main() {
   ClassMirror a = reflectClass(A);
   TypeVariableMirror t = a.typeVariables[0];
-  MethodMirror m = a.methods.values.single;
+  MethodMirror m = a.declarations[#m];
   
   Expect.equals(t, m.returnType);
 }
\ No newline at end of file
diff --git a/tests/lib/mirrors/removed_api_test.dart b/tests/lib/mirrors/removed_api_test.dart
new file mode 100644
index 0000000..800d4e4
--- /dev/null
+++ b/tests/lib/mirrors/removed_api_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+class C {}
+
+expectThrowsNSM(f) {
+  Expect.throws(f, (e) => e is NoSuchMethodError);
+}
+
+main() {
+  expectThrowsNSM(() => reflectClass(C).newInstanceAsync(const Symbol(''), []));
+  expectThrowsNSM(() => reflect(() => 3).applyAsync([]));
+
+  expectThrowsNSM(() => reflectClass(C).owner.members);
+  expectThrowsNSM(() => reflectClass(C).owner.classes);
+  expectThrowsNSM(() => reflectClass(C).owner.types);
+  expectThrowsNSM(() => reflectClass(C).owner.functions);
+  expectThrowsNSM(() => reflectClass(C).owners.getters);
+  expectThrowsNSM(() => reflectClass(C).owners.setters);
+  expectThrowsNSM(() => reflectClass(C).owners.variables);
+
+  expectThrowsNSM(() => reflectClass(C).members);
+  expectThrowsNSM(() => reflectClass(C).methods);
+  expectThrowsNSM(() => reflectClass(C).getters);
+  expectThrowsNSM(() => reflectClass(C).setters);
+  expectThrowsNSM(() => reflectClass(C).variables);
+  expectThrowsNSM(() => reflectClass(C).constructors);
+
+  expectThrowsNSM(() => MirroredError);
+  expectThrowsNSM(() => MirrorException);
+  expectThrowsNSM(() => MirroredUncaughtExceptionError);
+  // Don't ask about MirroredCompilationError.
+}
diff --git a/tests/lib/mirrors/repeated_private_anon_mixin_app1.dart b/tests/lib/mirrors/repeated_private_anon_mixin_app1.dart
new file mode 100644
index 0000000..5425920
--- /dev/null
+++ b/tests/lib/mirrors/repeated_private_anon_mixin_app1.dart
@@ -0,0 +1,11 @@
+// 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 lib;
+
+class _S {}
+class _M {}
+class _M2 {}
+class MA extends _S with _M {}
+class MA2 extends _S with _M, _M2 {}
diff --git a/tests/lib/mirrors/repeated_private_anon_mixin_app2.dart b/tests/lib/mirrors/repeated_private_anon_mixin_app2.dart
new file mode 100644
index 0000000..5425920
--- /dev/null
+++ b/tests/lib/mirrors/repeated_private_anon_mixin_app2.dart
@@ -0,0 +1,11 @@
+// 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 lib;
+
+class _S {}
+class _M {}
+class _M2 {}
+class MA extends _S with _M {}
+class MA2 extends _S with _M, _M2 {}
diff --git a/tests/lib/mirrors/repeated_private_anon_mixin_app_test.dart b/tests/lib/mirrors/repeated_private_anon_mixin_app_test.dart
new file mode 100644
index 0000000..7a7a5ad
--- /dev/null
+++ b/tests/lib/mirrors/repeated_private_anon_mixin_app_test.dart
@@ -0,0 +1,40 @@
+// 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 test.repeated_private_anon_mixin_app;
+
+// Regression test for symbol mangling.
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+import 'repeated_private_anon_mixin_app1.dart' as lib1;
+import 'repeated_private_anon_mixin_app2.dart' as lib2;
+
+testMA() {
+  Symbol name1 = reflectClass(lib1.MA).superclass.simpleName;
+  Symbol name2 = reflectClass(lib2.MA).superclass.simpleName;
+
+  Expect.equals('lib._S with lib._M', MirrorSystem.getName(name1));
+  Expect.equals('lib._S with lib._M', MirrorSystem.getName(name2));
+
+  Expect.notEquals(name1, name2);
+  Expect.notEquals(name2, name1);
+}
+
+testMA2() {
+  Symbol name1 = reflectClass(lib1.MA2).superclass.simpleName;
+  Symbol name2 = reflectClass(lib2.MA2).superclass.simpleName;
+
+  Expect.equals('lib._S with lib._M, lib._M2', MirrorSystem.getName(name1));
+  Expect.equals('lib._S with lib._M, lib._M2', MirrorSystem.getName(name2));
+
+  Expect.notEquals(name1, name2);
+  Expect.notEquals(name2, name1);
+}
+
+main() {
+  testMA();
+  testMA2();
+}
diff --git a/tests/lib/mirrors/return_type_test.dart b/tests/lib/mirrors/return_type_test.dart
index 6b90061..547e761 100644
--- a/tests/lib/mirrors/return_type_test.dart
+++ b/tests/lib/mirrors/return_type_test.dart
@@ -20,8 +20,16 @@
   // List<int> j() {}
 }
 
+methodsOf(ClassMirror cm) {
+  var result = new Map();
+  cm.declarations.forEach((k,v) {
+    if(v is MethodMirror && v.isRegularMethod) result[k] = v;
+  });
+  return result;
+}
+
 main() {
-  var methods = reflectClass(B).methods;
+  var methods = methodsOf(reflectClass(B));
 
   expect('{f: Method(s(f) in s(B)), '
          'g: Method(s(g) in s(B)), '
@@ -37,6 +45,4 @@
   expect('Class(s(int) in s(dart.core), top-level)', g.returnType);
   expect('Class(s(List) in s(dart.core), top-level)', h.returnType);
   expect('Class(s(B) in s(test.return_type_test), top-level)', i.returnType);
-
-  print(methods);
 }
diff --git a/tests/lib/mirrors/static_test.dart b/tests/lib/mirrors/static_test.dart
index b238e24..45daea4 100644
--- a/tests/lib/mirrors/static_test.dart
+++ b/tests/lib/mirrors/static_test.dart
@@ -17,13 +17,13 @@
 
 void main() {
   expect('Variable(s(aux) in s(Foo))',
-         reflectClass(Foo).members[new Symbol('aux')]);
+         reflectClass(Foo).declarations[new Symbol('aux')]);
   expect('Method(s(baz) in s(Foo))',
-         reflectClass(Foo).members[new Symbol('baz')]);
+         reflectClass(Foo).declarations[new Symbol('baz')]);
   expect('<null>',
-         reflectClass(Foo).setters[new Symbol('aux=')]);
+         reflectClass(Foo).declarations[new Symbol('aux=')]);
   expect('Method(s(foo) in s(Foo), static)',
-         reflectClass(Foo).members[new Symbol('foo')]);
+         reflectClass(Foo).declarations[new Symbol('foo')]);
   expect('Variable(s(bar) in s(Foo), static)',
-         reflectClass(Foo).members[new Symbol('bar')]);
+         reflectClass(Foo).declarations[new Symbol('bar')]);
 }
diff --git a/tests/lib/mirrors/to_string_test.dart b/tests/lib/mirrors/to_string_test.dart
index b553caa..8344bc4 100644
--- a/tests/lib/mirrors/to_string_test.dart
+++ b/tests/lib/mirrors/to_string_test.dart
@@ -24,8 +24,9 @@
   expect("InstanceMirror on 1", reflect(1));
   expect("ClassMirror on 'Foo'", reflectClass(Foo));
   expect("VariableMirror on 'field'",
-         reflectClass(Foo).variables.values.single);
-  expect("MethodMirror on 'method'", reflectClass(Foo).methods.values.single);
+         reflectClass(Foo).declarations[#field]);
+  expect("MethodMirror on 'method'",
+         reflectClass(Foo).declarations[#method]);
   String s = reflect(main).toString();
   Expect.isTrue(s.startsWith("ClosureMirror on '"), s);
 }
diff --git a/tests/lib/mirrors/type_variable_owner_test.dart b/tests/lib/mirrors/type_variable_owner_test.dart
index a6deb62..023139c 100644
--- a/tests/lib/mirrors/type_variable_owner_test.dart
+++ b/tests/lib/mirrors/type_variable_owner_test.dart
@@ -40,7 +40,7 @@
 
   TypedefMirror predicateOfDynamic = reflectType(Predicate);
   TypedefMirror predicateOfList =
-      thisLibrary.variables[#somePredicateOfList].type;
+      (thisLibrary.declarations[#somePredicateOfList] as VariableMirror).type;
   TypedefMirror predicateDecl = predicateOfList.originalDeclaration;
   
   Expect.equals(predicateDecl, predicateOfDynamic.typeVariables[0].owner);
diff --git a/tests/lib/mirrors/variable_is_const_test.dart b/tests/lib/mirrors/variable_is_const_test.dart
new file mode 100644
index 0000000..fc90fae
--- /dev/null
+++ b/tests/lib/mirrors/variable_is_const_test.dart
@@ -0,0 +1,35 @@
+// 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 test.variable_is_const;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class Class {
+  const /// 01: compile-time error
+      int instanceWouldBeConst = 1;
+  var instanceNonConst = 2;
+
+  static const staticConst = 3;
+  static var staticNonConst = 4;
+}
+
+const topLevelConst = 5;
+var topLevelNonConst = 6;
+
+main() {
+  bool isConst(m, Symbol s) => (m.declarations[s] as VariableMirror).isConst;
+
+  ClassMirror cm = reflectClass(Class);
+  Expect.isFalse(isConst(cm, #instanceWouldBeConst));
+  Expect.isFalse(isConst(cm, #instanceNonConst));
+  Expect.isTrue(isConst(cm, #staticConst));
+  Expect.isFalse(isConst(cm, #staticNonConst));
+
+  LibraryMirror lm = cm.owner;
+  Expect.isTrue(isConst(lm, #topLevelConst));
+  Expect.isFalse(isConst(lm, #topLevelNonConst));
+}
diff --git a/tests/lib/typed_data/simd_type_check_removal.dart b/tests/lib/typed_data/simd_type_check_removal.dart
new file mode 100644
index 0000000..fc6fa17
--- /dev/null
+++ b/tests/lib/typed_data/simd_type_check_removal.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+
+// Library tag to be able to run in html test framework.
+library simd_store_to_load_forward_test;
+
+import "package:expect/expect.dart";
+import 'dart:typed_data';
+
+bool testFloat32x4TypeCheck(Float32x4 v) {
+  if (v == null) {
+    v = new Float32x4.zero();
+  }
+  var l = v * v;
+  var b = v + l;
+  return b is Float32x4;
+}
+
+
+main() {
+  Float32x4List l = new Float32x4List(4);
+  Float32x4 a = new Float32x4(1.0, 2.0, 3.0, 4.0);
+  var b;
+  for (int i = 0; i < 8000; i++) {
+    b = testFloat32x4TypeCheck(null);
+  }
+  Expect.equals(true, b);
+}
diff --git a/tests/lib/typed_data/typed_data_from_list_test.dart b/tests/lib/typed_data/typed_data_from_list_test.dart
new file mode 100644
index 0000000..a0e38a6
--- /dev/null
+++ b/tests/lib/typed_data/typed_data_from_list_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+import 'dart:typed_data';
+
+main() {
+ var list = new UnmodifiableListView([1, 2]);
+ var typed = new Uint8List.fromList(list);
+ if (typed[0] != 1 || typed[1] != 2 || typed.length != 2) {
+   throw 'Test failed';
+ }
+}
diff --git a/tests/lib/typed_data/typed_data_load_test.dart b/tests/lib/typed_data/typed_data_load_test.dart
new file mode 100644
index 0000000..55a0808
--- /dev/null
+++ b/tests/lib/typed_data/typed_data_load_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// Test that the compiler's load elimination phase does not re-use the
+// value that was stored in a typed array.
+
+import "dart:typed_data";
+
+main() {
+  var list = new Int8List(1);
+  list[0] = 300;
+  if (list[0] != 44) {
+    throw 'Test failed';
+  }
+
+  var a = list[0];
+  list[0] = 0;
+  if (list[0] != 0) {
+    throw 'Test failed';
+  }
+}
diff --git a/tests/standalone/io/directory_uri_test.dart b/tests/standalone/io/directory_uri_test.dart
new file mode 100644
index 0000000..70e8861
--- /dev/null
+++ b/tests/standalone/io/directory_uri_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void testFromUri() {
+  asyncStart();
+  Directory originalWorkingDirectory = Directory.current;
+  Directory.systemTemp.createTemp('directory_uri').then((temp) {
+    String dirname = temp.path + '/from_uri';
+    Uri dirUri = new Uri.file(dirname);
+    Directory dir = new Directory.fromUri(dirUri);
+    Expect.isTrue(dirUri.isAbsolute);
+    Expect.isTrue(dirUri.path.startsWith('/'));
+    dir.createSync();
+    Expect.isTrue(new Directory.fromUri(dirUri).existsSync());
+    Expect.isTrue(
+        new Directory.fromUri(Uri.base.resolveUri(dirUri)).existsSync());
+    Directory.current = temp.path;
+    Expect.isTrue(new Directory.fromUri(Uri.parse('from_uri')).existsSync());
+    Expect.isTrue(
+        new Directory.fromUri(Uri.base.resolve('from_uri')).existsSync());
+    Directory.current = originalWorkingDirectory;
+    dir.deleteSync();
+    temp.deleteSync(recursive: true);
+    asyncEnd();
+  });
+}
+
+void testFromUriUnsupported() {
+  Expect.throws(
+      () => new Directory.fromUri(
+          Uri.parse('http://localhost:8080/index.html')),
+      (e) => e is UnsupportedError);
+  Expect.throws(
+      () => new Directory.fromUri(Uri.parse('ftp://localhost/tmp/xxx')),
+      (e) => e is UnsupportedError);
+  Expect.throws(() => new Directory.fromUri(Uri.parse('name#fragment')),
+                (e) => e is UnsupportedError);
+}
+
+void main() {
+  testFromUri();
+  testFromUriUnsupported();
+}
diff --git a/tests/standalone/io/file_stream_test.dart b/tests/standalone/io/file_stream_test.dart
index 99dcce8..f7da717 100644
--- a/tests/standalone/io/file_stream_test.dart
+++ b/tests/standalone/io/file_stream_test.dart
@@ -1,57 +1,57 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file

-// for details. All rights reserved. Use of this source code is governed by a

-// BSD-style license that can be found in the LICENSE file.

-

-import "dart:async";

-import "dart:io";

-

-import "package:async_helper/async_helper.dart";

-import "package:expect/expect.dart";

-

-void testPauseResumeCancelStream() {

-  asyncStart();

-  Directory.systemTemp.createTemp('file_stream').then((d) {

-    var file = new File("${d.path}/file");

-    new File(Platform.executable).openRead().pipe(file.openWrite())

-      .then((_) {

-        var subscription;

-        subscription = file.openRead().listen((data) {

-          subscription.pause();

-          subscription.resume();

-          void close() {

-            d.deleteSync(recursive: true);

-            asyncEnd();

-          }

-          var future = subscription.cancel();

-          if (future != null) {

-            future.whenComplete(close);

-          } else {

-            close();

-          }

-        }, onDone: () {

-          Expect.fail('the stream was canceled, onDone should not happend');

-        });

-      });

-  });

-}

-

-void testStreamIsEmpty() {

-  asyncStart();

-  Directory.systemTemp.createTemp('file_stream').then((d) {

-    var file = new File("${d.path}/file");

-    new File(Platform.executable).openRead().pipe(file.openWrite())

-      .then((_) {

-        // isEmpty will cancel the stream after first data event.

-        file.openRead().isEmpty.then((empty) {

-          Expect.isFalse(empty);

-          d.deleteSync(recursive: true);

-          asyncEnd();

-        });

-      });

-  });

-}

-

-void main() {

-  testPauseResumeCancelStream();

-  testStreamIsEmpty();

-}

+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:io";
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void testPauseResumeCancelStream() {
+  asyncStart();
+  Directory.systemTemp.createTemp('dart_file_stream').then((d) {
+    var file = new File("${d.path}/file");
+    new File(Platform.executable).openRead().pipe(file.openWrite())
+      .then((_) {
+        var subscription;
+        subscription = file.openRead().listen((data) {
+          subscription.pause();
+          subscription.resume();
+          void close() {
+            d.deleteSync(recursive: true);
+            asyncEnd();
+          }
+          var future = subscription.cancel();
+          if (future != null) {
+            future.whenComplete(close);
+          } else {
+            close();
+          }
+        }, onDone: () {
+          Expect.fail('the stream was canceled, onDone should not happend');
+        });
+      });
+  });
+}
+
+void testStreamIsEmpty() {
+  asyncStart();
+  Directory.systemTemp.createTemp('dart_file_stream').then((d) {
+    var file = new File("${d.path}/file");
+    new File(Platform.executable).openRead().pipe(file.openWrite())
+      .then((_) {
+        // isEmpty will cancel the stream after first data event.
+        file.openRead().isEmpty.then((empty) {
+          Expect.isFalse(empty);
+          d.deleteSync(recursive: true);
+          asyncEnd();
+        });
+      });
+  });
+}
+
+void main() {
+  testPauseResumeCancelStream();
+  testStreamIsEmpty();
+}
diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart
index 926d63f..de0c3b4 100644
--- a/tests/standalone/io/file_test.dart
+++ b/tests/standalone/io/file_test.dart
@@ -108,7 +108,7 @@
         var file2 = new File(outFilename);
         var output = file2.openWrite();
         output.add(buffer);
-        output.close();
+        output.flush().then((_) => output.close());
         output.done.then((_) {
           // Now read the contents of the file just written.
           List<int> buffer2 = new List<int>();
@@ -147,7 +147,7 @@
     IOSink output = file.openWrite();
     output.add(buffer);
     output.add(buffer);
-    output.close();
+    output.flush().then((_) => output.close());
     output.done.then((_) {
       Stream input = file.openRead();
       int position = 0;
diff --git a/tests/standalone/io/file_uri_test.dart b/tests/standalone/io/file_uri_test.dart
new file mode 100644
index 0000000..00fa755
--- /dev/null
+++ b/tests/standalone/io/file_uri_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void testFromUri() {
+  asyncStart();
+  Directory originalWorkingDirectory = Directory.current;
+  Directory.systemTemp.createTemp('file_uri').then((temp) {
+    String filename = temp.path + '/from_uri';
+    Uri fileUri = new Uri.file(filename);
+    File file = new File.fromUri(fileUri);
+    Expect.isTrue(fileUri.isAbsolute);
+    Expect.isTrue(fileUri.path.startsWith('/'));
+    file.createSync();
+    Expect.isTrue(new File.fromUri(fileUri).existsSync());
+    Expect.isTrue(new File.fromUri(Uri.base.resolveUri(fileUri)).existsSync());
+    Directory.current = temp.path;
+    Expect.isTrue(new File.fromUri(Uri.parse('from_uri')).existsSync());
+    Expect.isTrue(new File.fromUri(Uri.base.resolve('from_uri')).existsSync());
+    Directory.current = originalWorkingDirectory;
+    file.deleteSync();
+    temp.deleteSync(recursive: true);
+    asyncEnd();
+  });
+}
+
+void testFromUriUnsupported() {
+  Expect.throws(
+      () => new File.fromUri(
+          Uri.parse('http://localhost:8080/index.html')),
+      (e) => e is UnsupportedError);
+  Expect.throws(() => new File.fromUri(Uri.parse('ftp://localhost/tmp/xxx')),
+                (e) => e is UnsupportedError);
+  Expect.throws(() => new File.fromUri(Uri.parse('name#fragment')),
+                (e) => e is UnsupportedError);
+}
+
+void main() {
+  testFromUri();
+  testFromUriUnsupported();
+}
diff --git a/tests/standalone/io/file_write_as_test.dart b/tests/standalone/io/file_write_as_test.dart
index 462292d..a5fb96b 100644
--- a/tests/standalone/io/file_write_as_test.dart
+++ b/tests/standalone/io/file_write_as_test.dart
@@ -10,10 +10,10 @@
 
 testWriteAsBytesSync(dir) {
   var f = new File('${dir.path}/bytes_sync.txt');
-  var data = [50,50,50];
+  var data = [50, 50, 50];
   f.writeAsBytesSync(data);
   Expect.listEquals(data, f.readAsBytesSync());
-  f.writeAsBytesSync(data, mode: FileMode.APPEND);
+  f.writeAsBytesSync(data, mode: FileMode.APPEND, flush: true);
   var expected = [50, 50, 50, 50, 50, 50];
   Expect.listEquals(expected, f.readAsBytesSync());
 }
@@ -23,19 +23,19 @@
   var data = 'asdf';
   f.writeAsStringSync(data);
   Expect.equals(data, f.readAsStringSync());
-  f.writeAsStringSync(data, mode: FileMode.APPEND);
+  f.writeAsStringSync(data, mode: FileMode.APPEND, flush: true);
   Expect.equals('$data$data', f.readAsStringSync());
 }
 
 Future testWriteAsBytes(dir) {
   var completer = new Completer();
   var f = new File('${dir.path}/bytes.txt');
-  var data = [50,50,50];
+  var data = [50, 50, 50];
   f.writeAsBytes(data).then((file){
     Expect.equals(f, file);
     f.readAsBytes().then((bytes) {
       Expect.listEquals(data, bytes);
-      f.writeAsBytes(data, mode: FileMode.APPEND).then((file) {
+      f.writeAsBytes(data, mode: FileMode.APPEND, flush: true).then((file) {
         Expect.equals(f, file);
         f.readAsBytes().then((bytes) {
           var expected = [50, 50, 50, 50, 50, 50];
@@ -56,7 +56,7 @@
     Expect.equals(f, file);
     f.readAsString().then((str) {
       Expect.equals(data, str);
-      f.writeAsString(data, mode: FileMode.APPEND).then((file) {
+      f.writeAsString(data, mode: FileMode.APPEND, flush: true).then((file) {
         Expect.equals(f, file);
         f.readAsString().then((str) {
           Expect.equals('$data$data', str);
diff --git a/tests/standalone/io/http_10_test.dart b/tests/standalone/io/http_10_test.dart
index fb53de0..a82413e 100644
--- a/tests/standalone/io/http_10_test.dart
+++ b/tests/standalone/io/http_10_test.dart
@@ -128,6 +128,7 @@
           Expect.equals(-1, request.contentLength);
           var response = request.response;
           response.contentLength = 1;
+          response.persistentConnection = true;
           Expect.equals("1.0", request.protocolVersion);
           response.write("Z");
           response.close();
diff --git a/tests/standalone/io/http_client_exception_test.dart b/tests/standalone/io/http_client_exception_test.dart
index e557e8d..e3e5957 100644
--- a/tests/standalone/io/http_client_exception_test.dart
+++ b/tests/standalone/io/http_client_exception_test.dart
@@ -11,7 +11,26 @@
 void testInvalidUrl() {
   HttpClient client = new HttpClient();
   Expect.throws(
-      () => client.getUrl(Uri.parse('ftp://www.google.com')));
+      () => client.getUrl(Uri.parse('ftp://www.google.com')),
+      (e) => e.toString().contains("Unsupported scheme"));
+  Expect.throws(
+      () => client.getUrl(Uri.parse('httpx://www.google.com')),
+      (e) => e.toString().contains("Unsupported scheme"));
+  Expect.throws(
+      () => client.getUrl(Uri.parse('http://::1')),
+      (e) => e.toString().contains("No host specified"));
+  Expect.throws(
+      () => client.getUrl(Uri.parse('http:///')),
+      (e) => e.toString().contains("No host specified"));
+  Expect.throws(
+      () => client.getUrl(Uri.parse('http:///index.html')),
+      (e) => e.toString().contains("No host specified"));
+  Expect.throws(
+      () => client.getUrl(Uri.parse('///')),
+      (e) => e.toString().contains("No host specified"));
+  Expect.throws(
+      () => client.getUrl(Uri.parse('///index.html')),
+      (e) => e.toString().contains("No host specified"));
 }
 
 void testBadHostName() {
diff --git a/tests/standalone/io/http_client_request_test.dart b/tests/standalone/io/http_client_request_test.dart
index fb6dcd6..9015b9f 100644
--- a/tests/standalone/io/http_client_request_test.dart
+++ b/tests/standalone/io/http_client_request_test.dart
@@ -9,6 +9,7 @@
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
+
 void testClientRequest(Future handler(request)) {
   HttpServer.bind("127.0.0.1", 0).then((server) {
     server.listen((request) {
@@ -31,6 +32,7 @@
   });
 }
 
+
 void testResponseDone() {
   testClientRequest((request) {
     request.close().then((res1) {
@@ -42,6 +44,7 @@
   });
 }
 
+
 void testBadResponseAdd() {
   asyncStart();
   testClientRequest((request) {
@@ -80,6 +83,7 @@
   });
 }
 
+
 void testBadResponseClose() {
   asyncStart();
   testClientRequest((request) {
@@ -103,8 +107,26 @@
   });
 }
 
+
+void testBadHeaders() {
+  asyncStart();
+  testClientRequest((request) {
+    var value = "a";
+    for (int i = 0; i < 8 * 1024; i++) {
+      value += 'a';
+    }
+    request.headers.set('name', value);
+    request.done.catchError((error) {
+      asyncEnd();
+    }, test: (e) => e is HttpException);
+    return request.close();
+  });
+}
+
+
 void main() {
   testResponseDone();
   testBadResponseAdd();
   testBadResponseClose();
+  testBadHeaders();
 }
diff --git a/tests/standalone/io/http_parser_test.dart b/tests/standalone/io/http_parser_test.dart
index 6757633..c35fcfb 100644
--- a/tests/standalone/io/http_parser_test.dart
+++ b/tests/standalone/io/http_parser_test.dart
@@ -12,6 +12,7 @@
 part '../../../sdk/lib/io/common.dart';
 part '../../../sdk/lib/io/io_sink.dart';
 part '../../../sdk/lib/io/http.dart';
+part '../../../sdk/lib/io/http_date.dart';
 part '../../../sdk/lib/io/http_impl.dart';
 part '../../../sdk/lib/io/http_headers.dart';
 part '../../../sdk/lib/io/http_parser.dart';
@@ -45,7 +46,7 @@
 
       String method;
       Uri uri;
-      HttpHeaders headers;
+      _HttpHeaders headers;
       int contentLength;
       int bytesReceived;
       int unparsedBytesReceived;
@@ -124,7 +125,7 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> requestData = request.codeUnits;
+    List<int> requestData = new Uint8List.fromList(request.codeUnits);
     testWrite(requestData);
     testWrite(requestData, 10);
     testWrite(requestData, 1);
@@ -167,7 +168,7 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> requestData = request.codeUnits;
+    List<int> requestData = new Uint8List.fromList(request.codeUnits);
     testWrite(requestData);
     testWrite(requestData, 10);
     testWrite(requestData, 1);
@@ -196,7 +197,7 @@
       bool dataEndClose;
       int statusCode;
       String reasonPhrase;
-      HttpHeaders headers;
+      _HttpHeaders headers;
       int contentLength;
       int bytesReceived;
       httpParser = new _HttpParser.responseParser();
@@ -273,7 +274,7 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> responseData = response.codeUnits;
+    List<int> responseData = new Uint8List.fromList(response.codeUnits);
     testWrite(responseData);
     testWrite(responseData, 10);
     testWrite(responseData, 1);
@@ -318,7 +319,7 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> responseData = response.codeUnits;
+    List<int> responseData = new Uint8List.fromList(response.codeUnits);
     testWrite(responseData);
     testWrite(responseData, 10);
     testWrite(responseData, 1);
diff --git a/tests/standalone/io/http_proxy_configuration_test.dart b/tests/standalone/io/http_proxy_configuration_test.dart
index 4bff020..64aa3b0 100644
--- a/tests/standalone/io/http_proxy_configuration_test.dart
+++ b/tests/standalone/io/http_proxy_configuration_test.dart
@@ -19,6 +19,8 @@
 
 main() {
   expectDirect("http://www.google.com", {});
+  expectDirect("http://www.google.com", {"http_proxy": ""});
+  expectDirect("http://www.google.com", {"http_proxy": " "});
 
   expect("PROXY www.proxy.com:1080",
          "http://www.google.com",
@@ -35,12 +37,33 @@
   expect("PROXY www.proxy.com:8080",
          "http://www.google.com",
          {"http_proxy": "www.proxy.com:8080",
-          "https_proxy": "www.proxy.com:8080"});
+          "https_proxy": "www.proxys.com:8080"});
   expect("PROXY www.proxys.com:8080",
          "https://www.google.com",
          {"http_proxy": "www.proxy.com:8080",
           "https_proxy": "www.proxys.com:8080"});
 
+  expect("PROXY [::FFFF:1]:1080",
+         "http://www.google.com",
+         {"http_proxy": "[::FFFF:1]"});
+  expect("PROXY [::FFFF:2]:1080",
+         "https://www.google.com",
+         {"https_proxy": "[::FFFF:2]"});
+  expect("PROXY [::FFFF:1]:8080",
+         "http://www.google.com",
+         {"http_proxy": "[::FFFF:1]:8080"});
+  expect("PROXY [::FFFF:2]:8080",
+         "https://www.google.com",
+         {"https_proxy": "[::FFFF:2]:8080"});
+  expect("PROXY [::FFFF:1]:8080",
+         "http://www.google.com",
+         {"http_proxy": "[::FFFF:1]:8080",
+          "https_proxy": "[::FFFF:2]:8080"});
+  expect("PROXY [::FFFF:2]:8080",
+         "https://www.google.com",
+         {"http_proxy": "[::FFFF:1]:8080",
+          "https_proxy": "[::FFFF:2]:8080"});
+
   expect("PROXY www.proxy.com:1080",
          "http://www.google.com",
          {"http_proxy": "http://www.proxy.com"});
@@ -56,7 +79,7 @@
   expect("PROXY www.proxy.com:8080",
          "http://www.google.com",
          {"http_proxy": "http://www.proxy.com:8080/",
-          "https_proxy": "http://www.proxy.com:8080/"});
+          "https_proxy": "http://www.proxys.com:8080/"});
   expect("PROXY www.proxys.com:8080",
          "https://www.google.com",
          {"http_proxy": "http://www.proxy.com:8080/",
@@ -64,12 +87,41 @@
   expect("PROXY www.proxy.com:8080",
          "http://www.google.com",
          {"http_proxy": "http://www.proxy.com:8080/",
-          "https_proxy": "http://www.proxy.com:8080/index.html"});
+          "https_proxy": "http://www.proxys.com:8080/index.html"});
   expect("PROXY www.proxys.com:8080",
          "https://www.google.com",
          {"http_proxy": "http://www.proxy.com:8080/",
           "https_proxy": "http://www.proxys.com:8080/index.html"});
 
+  expect("PROXY [::FFFF:1]:1080",
+         "http://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]"});
+  expect("PROXY [::FFFF:1]:1080",
+         "http://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]/"});
+  expect("PROXY [::FFFF:1]:8080",
+         "http://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]:8080/"});
+  expect("PROXY [::FFFF:1]:8080",
+         "http://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]:8080/index.html"});
+  expect("PROXY [::FFFF:1]:8080",
+         "http://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]:8080/",
+          "https_proxy": "http://[::FFFF:1]:8080/"});
+  expect("PROXY [::FFFF:2]:8080",
+         "https://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]:8080/",
+          "https_proxy": "http://[::FFFF:2]:8080/"});
+  expect("PROXY [::FFFF:1]:8080",
+         "http://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]:8080/",
+          "https_proxy": "http://[::FFFF:1]:8080/index.html"});
+  expect("PROXY [::FFFF:2]:8080",
+         "https://www.google.com",
+         {"http_proxy": "http://[::FFFF:1]:8080/",
+          "https_proxy": "http://[::FFFF:2]:8080/index.html"});
+
   expectDirect("http://www.google.com",
                {"http_proxy": "www.proxy.com:8080",
                 "no_proxy": "www.google.com"});
@@ -87,4 +139,20 @@
                 "no_proxy": ",,  , www.google.edu,,.com    "});
   expectDirect("http://www.google.com",
                {"https_proxy": "www.proxy.com:8080"});
+
+  expect("PROXY www.proxy.com:8080",
+         "http://[::FFFF:1]",
+         {"http_proxy": "www.proxy.com:8080",
+          "no_proxy": "["});
+  expect("PROXY www.proxy.com:8080",
+         "http://[::FFFF:1]",
+         {"http_proxy": "www.proxy.com:8080",
+          "no_proxy": "[]"});
+
+  expectDirect("http://[::FFFF:1]",
+               {"http_proxy": "www.proxy.com:8080",
+                "no_proxy": "[::FFFF:1]"});
+  expectDirect("http://[::FFFF:1]",
+               {"http_proxy": "www.proxy.com:8080",
+                "no_proxy": ",,  , www.google.edu,,[::FFFF:1]    "});
 }
diff --git a/tests/standalone/io/http_proxy_test.dart b/tests/standalone/io/http_proxy_test.dart
index d8f59ad..63a125f 100644
--- a/tests/standalone/io/http_proxy_test.dart
+++ b/tests/standalone/io/http_proxy_test.dart
@@ -77,6 +77,7 @@
 }
 
 class ProxyServer {
+  final bool ipV6;
   HttpServer server;
   HttpClient client;
   int requestCount = 0;
@@ -92,7 +93,7 @@
 
   var nonce = "12345678";  // No need for random nonce in test.
 
-  ProxyServer() : client = new HttpClient();
+  ProxyServer({this.ipV6: false}) : client = new HttpClient();
 
   void useBasicAuthentication(String username, String password) {
     this.username = username;
@@ -141,7 +142,8 @@
 
   Future<ProxyServer> start() {
     var x = new Completer();
-    HttpServer.bind("localhost", 0).then((s) {
+    var host = ipV6 ? "::1" : "localhost";
+    HttpServer.bind(host, 0).then((s) {
       server = s;
       x.complete(this);
       server.listen((HttpRequest request) {
@@ -269,8 +271,8 @@
   int get port => server.port;
 }
 
-Future<ProxyServer> setupProxyServer() {
-  ProxyServer proxyServer = new ProxyServer();
+Future<ProxyServer> setupProxyServer({ipV6: false}) {
+  ProxyServer proxyServer = new ProxyServer(ipV6: ipV6);
   return proxyServer.start();
 }
 
@@ -397,6 +399,55 @@
   });
 }
 
+int testProxyIPV6DoneCount = 0;
+void testProxyIPV6() {
+  setupProxyServer(ipV6: true).then((proxyServer) {
+  setupServer(1, directRequestPaths: ["/4"]).then((server) {
+  setupServer(1, directRequestPaths: ["/4"], secure: true).then((secureServer) {
+    HttpClient client = new HttpClient();
+
+    List<String> proxy = ["PROXY [::1]:${proxyServer.port}"];
+    client.findProxy = (Uri uri) {
+      // Pick the proxy configuration based on the request path.
+      int index = int.parse(uri.path.substring(1));
+      return proxy[index];
+    };
+
+    for (int i = 0; i < proxy.length; i++) {
+      test(bool secure) {
+        String url = secure
+            ? "https://localhost:${secureServer.port}/$i"
+            : "http://localhost:${server.port}/$i";
+
+        client.postUrl(Uri.parse(url))
+          .then((HttpClientRequest clientRequest) {
+            String content = "$i$i$i";
+            clientRequest.write(content);
+            return clientRequest.close();
+          })
+          .then((HttpClientResponse response) {
+            response.listen((_) {}, onDone: () {
+              testProxyIPV6DoneCount++;
+              if (testProxyIPV6DoneCount == proxy.length * 2) {
+                Expect.equals(proxy.length, server.requestCount);
+                Expect.equals(proxy.length, secureServer.requestCount);
+                proxyServer.shutdown();
+                server.shutdown();
+                secureServer.shutdown();
+                client.close();
+              }
+            });
+          });
+      }
+
+      test(false);
+      test(true);
+    }
+  });
+  });
+  });
+}
+
 int testProxyChainDoneCount = 0;
 void testProxyChain() {
   // Setup two proxy servers having the first using the second as its proxy.
@@ -756,6 +807,7 @@
   testInvalidProxy();
   testDirectProxy();
   testProxy();
+  testProxyIPV6();
   testProxyChain();
   testProxyFromEnviroment();
   // The two invocations of uses the same global variable for state -
diff --git a/tests/standalone/io/http_server_close_response_after_error_test.dart b/tests/standalone/io/http_server_close_response_after_error_test.dart
index 3f76282..c5cdcec 100644
--- a/tests/standalone/io/http_server_close_response_after_error_test.dart
+++ b/tests/standalone/io/http_server_close_response_after_error_test.dart
@@ -1,36 +1,36 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file

-// for details. All rights reserved. Use of this source code is governed by a

-// BSD-style license that can be found in the LICENSE file.

-//

-// VMOptions=

-// VMOptions=--short_socket_read

-// VMOptions=--short_socket_write

-// VMOptions=--short_socket_read --short_socket_write

-

-import 'dart:async';

-import 'dart:io';

-

-const CLIENT_SCRIPT = "http_server_close_response_after_error_client.dart";

-

-void main() {

-  HttpServer.bind("127.0.0.1", 0)

-      .then((server) {

-        server.listen(

-            (request) {

-              request.listen(

-                  null,

-                  onError: (e) {},

-                  onDone: () {

-                    request.response.close();

-                  });

-            });

-        Process.run(Platform.executable,

-                    [Platform.script.resolve(CLIENT_SCRIPT).toString(),

-                     server.port.toString()])

-            .then((result) {

-              if (result.exitCode != 0) throw "Bad exit code";

-              server.close();

-            });

-      });

-}

-

+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=
+// VMOptions=--short_socket_read
+// VMOptions=--short_socket_write
+// VMOptions=--short_socket_read --short_socket_write
+
+import 'dart:async';
+import 'dart:io';
+
+const CLIENT_SCRIPT = "http_server_close_response_after_error_client.dart";
+
+void main() {
+  HttpServer.bind("127.0.0.1", 0)
+      .then((server) {
+        server.listen(
+            (request) {
+              request.listen(
+                  null,
+                  onError: (e) {},
+                  onDone: () {
+                    request.response.close();
+                  });
+            });
+        Process.run(Platform.executable,
+                    [Platform.script.resolve(CLIENT_SCRIPT).toString(),
+                     server.port.toString()])
+            .then((result) {
+              if (result.exitCode != 0) throw "Bad exit code";
+              server.close();
+            });
+      });
+}
+
diff --git a/tests/standalone/io/http_server_response_test.dart b/tests/standalone/io/http_server_response_test.dart
index 60c350a..3c5767e 100644
--- a/tests/standalone/io/http_server_response_test.dart
+++ b/tests/standalone/io/http_server_response_test.dart
@@ -274,6 +274,20 @@
 }
 
 
+void testBadHeaders() {
+  testServerRequest((server, request) {
+    var value = "a";
+    for (int i = 0; i < 8 * 1024; i++) {
+      value += 'a';
+    }
+    request.response.headers.set('name', value);
+    request.response.close().catchError((error) {
+      server.close();
+    }, test: (e) => e is HttpException);
+  });
+}
+
+
 void main() {
   testResponseDone();
   testResponseAddStream();
@@ -282,4 +296,5 @@
   testBadResponseAdd();
   testBadResponseClose();
   testIgnoreRequestData();
+  testBadHeaders();
 }
diff --git a/tests/standalone/io/internet_address_test.dart b/tests/standalone/io/internet_address_test.dart
index fd4b358..d8a997f 100644
--- a/tests/standalone/io/internet_address_test.dart
+++ b/tests/standalone/io/internet_address_test.dart
@@ -10,13 +10,13 @@
   var loopback4 = InternetAddress.LOOPBACK_IP_V4;
   Expect.isNotNull(loopback4);
   Expect.equals(InternetAddressType.IP_V4, loopback4.type);
-  Expect.equals("localhost", loopback4.host);
+  Expect.equals("127.0.0.1", loopback4.host);
   Expect.equals("127.0.0.1", loopback4.address);
 
   var loopback6 = InternetAddress.LOOPBACK_IP_V6;
   Expect.isNotNull(loopback6);
   Expect.equals(InternetAddressType.IP_V6, loopback6.type);
-  Expect.equals("ip6-localhost", loopback6.host);
+  Expect.equals("::1", loopback6.host);
   Expect.equals("::1", loopback6.address);
 
   var any4 = InternetAddress.ANY_IP_V4;
@@ -32,6 +32,76 @@
   Expect.equals("::", any6.address);
 }
 
+void testConstructor() {
+  var loopback4 = new InternetAddress("127.0.0.1");
+  Expect.equals(InternetAddressType.IP_V4, loopback4.type);
+  Expect.equals("127.0.0.1", loopback4.host);
+  Expect.equals("127.0.0.1", loopback4.address);
+  Expect.isFalse(loopback4.isMulticast);
+
+  var loopback6 = new InternetAddress("::1");
+  Expect.equals(InternetAddressType.IP_V6, loopback6.type);
+  Expect.equals("::1", loopback6.host);
+  Expect.equals("::1", loopback6.address);
+  Expect.isFalse(loopback6.isMulticast);
+
+  var ip4 = new InternetAddress("10.20.30.40");
+  Expect.equals(InternetAddressType.IP_V4, ip4.type);
+  Expect.equals("10.20.30.40", ip4.host);
+  Expect.equals("10.20.30.40", ip4.address);
+  Expect.isFalse(ip4.isMulticast);
+
+  var ip6 = new InternetAddress("10:20::30:40");
+  Expect.equals(InternetAddressType.IP_V6, ip6.type);
+  Expect.equals("10:20::30:40", ip6.host);
+  Expect.equals("10:20::30:40", ip6.address);
+  Expect.isFalse(ip6.isMulticast);
+
+  var multicast4 = new InternetAddress("224.1.2.3");
+  Expect.equals(InternetAddressType.IP_V4, multicast4.type);
+  Expect.isTrue(multicast4.isMulticast);
+
+  var multicast6 = new InternetAddress("FF00::1:2:3");
+  Expect.equals(InternetAddressType.IP_V6, multicast6.type);
+  Expect.isTrue(multicast6.isMulticast);
+
+  Expect.throws(() => new InternetAddress("1.2.3"),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new InternetAddress("::FFFF::1"),
+                (e) => e is ArgumentError);
+}
+
+void testEquality() {
+  Expect.equals(new InternetAddress("127.0.0.1"),
+                new InternetAddress("127.0.0.1"));
+  Expect.equals(new InternetAddress("127.0.0.1"),
+                InternetAddress.LOOPBACK_IP_V4);
+  Expect.equals(new InternetAddress("::1"),
+                new InternetAddress("::1"));
+  Expect.equals(new InternetAddress("::1"),
+                InternetAddress.LOOPBACK_IP_V6);
+  Expect.equals(new InternetAddress("1:2:3:4:5:6:7:8"),
+                new InternetAddress("1:2:3:4:5:6:7:8"));
+  Expect.equals(new InternetAddress("1::2"),
+                new InternetAddress("1:0:0:0:0:0:0:2"));
+  Expect.equals(new InternetAddress("::FFFF:0:0:16.32.48.64"),
+                new InternetAddress("::FFFF:0:0:1020:3040"));
+
+  var set = new Set();
+  set.add(new InternetAddress("127.0.0.1"));
+  set.add(new InternetAddress("::1"));
+  set.add(new InternetAddress("1:2:3:4:5:6:7:8"));
+  Expect.isTrue(set.contains(new InternetAddress("127.0.0.1")));
+  Expect.isTrue(set.contains(InternetAddress.LOOPBACK_IP_V4));
+  Expect.isFalse(set.contains(new InternetAddress("127.0.0.2")));
+  Expect.isTrue(set.contains(new InternetAddress("::1")));
+  Expect.isTrue(set.contains(InternetAddress.LOOPBACK_IP_V6));
+  Expect.isFalse(set.contains(new InternetAddress("::2")));
+  Expect.isTrue(set.contains(new InternetAddress("1:2:3:4:5:6:7:8")));
+  Expect.isFalse(set.contains(new InternetAddress("1:2:3:4:5:6:7:9")));
+  Expect.isFalse(set.contains(new InternetAddress("0:2:3:4:5:6:7:8")));
+}
+
 void testLookup() {
   InternetAddress.lookup("127.0.0.1").then((addresses) {
     Expect.equals(1, addresses.length);
@@ -62,6 +132,8 @@
 
 void main() {
   testDefaultAddresses();
+  testConstructor();
+  testEquality();
   testLookup();
   testReverseLookup();
 }
diff --git a/tests/standalone/io/link_uri_test.dart b/tests/standalone/io/link_uri_test.dart
new file mode 100644
index 0000000..e9afb0a
--- /dev/null
+++ b/tests/standalone/io/link_uri_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void testFromUri() {
+  asyncStart();
+  Directory originalWorkingDirectory = Directory.current;
+  Directory.systemTemp.createTemp('dart_file').then((temp) {
+    File target = new File(temp.path + '/target');
+    target.createSync();
+
+    String linkname = temp.path + '/from_uri';
+    Uri linkUri = new Uri.file(linkname);
+    Link link = new Link.fromUri(linkUri);
+    Expect.isTrue(linkUri.isAbsolute);
+    Expect.isTrue(linkUri.path.startsWith('/'));
+    link.createSync(target.path);
+    Expect.isTrue(new Link.fromUri(linkUri).existsSync());
+    Expect.isTrue(new Link.fromUri(Uri.base.resolveUri(linkUri)).existsSync());
+    Directory.current = temp.path;
+    Expect.isTrue(new Link.fromUri(Uri.parse('from_uri')).existsSync());
+    Expect.isTrue(new Link.fromUri(Uri.base.resolve('from_uri')).existsSync());
+    Directory.current = originalWorkingDirectory;
+    link.deleteSync();
+    target.deleteSync();
+    temp.deleteSync();
+    asyncEnd();
+  });
+}
+
+void testFromUriUnsupported() {
+  Expect.throws(
+      () => new Link.fromUri(Uri.parse('http://localhost:8080/index.html')),
+      (e) => e is UnsupportedError);
+  Expect.throws(() => new Link.fromUri(Uri.parse('ftp://localhost/tmp/xxx')),
+                (e) => e is UnsupportedError);
+  Expect.throws(() => new Link.fromUri(Uri.parse('name#fragment')),
+                (e) => e is UnsupportedError);
+}
+
+void main() {
+  testFromUri();
+  testFromUriUnsupported();
+}
diff --git a/tests/standalone/io/secure_socket_bad_data_test.dart b/tests/standalone/io/secure_socket_bad_data_test.dart
index 27c6724..bff3f46 100644
--- a/tests/standalone/io/secure_socket_bad_data_test.dart
+++ b/tests/standalone/io/secure_socket_bad_data_test.dart
@@ -150,8 +150,6 @@
         },
         onError: (e) {
           Expect.isTrue(e is HandshakeException);
-          Expect.isTrue(e.toString().contains(
-              'received a record with an incorrect Message Authentication'));
         })
         .whenComplete(server.close);
     });
diff --git a/tests/standalone/io/test_extension_test.dart b/tests/standalone/io/test_extension_test.dart
index 8d35977..0f03233 100644
--- a/tests/standalone/io/test_extension_test.dart
+++ b/tests/standalone/io/test_extension_test.dart
@@ -56,6 +56,13 @@
     var script = join(testDirectory, 'test_extension_tester.dart');
     return Process.run(Platform.executable, [script]);
   })..then((ProcessResult result) {
+    if (result.exitCode != 0) {
+      print('Subprocess failed with exit code ${result.exitCode}');
+      print('stdout:');
+      print('${result.stdout}');
+      print('stderr:');
+      print('${result.stderr}');
+    }
     Expect.equals(0, result.exitCode);
     tempDirectory.deleteSync(recursive: true);
   })..catchError((_) {
diff --git a/tests/standalone/issue14236_source.dart b/tests/standalone/issue14236_source.dart
index 9b89cef..d0e9234 100644
--- a/tests/standalone/issue14236_source.dart
+++ b/tests/standalone/issue14236_source.dart
@@ -7,6 +7,12 @@
 // The original test/main has been commented out and we have a test/main which
 // throws an error to ensure that this file is not executed as part of the
 // test.
+// 
+// When issue14236_test.dart fails, you must regenerate it using the VM 
+// with your changes. Notes on regenerating:
+// 1) Swap the test and main functions below.
+// 2) $ dart --snapshot=issue14236_test.dart issue14236_source.dart
+// 3) Undo changes in 1.
 
 library test.issue14236;
 import "dart:isolate";
diff --git a/tests/standalone/vmservice/isolate_stacktrace_command_test.dart b/tests/standalone/vmservice/isolate_stacktrace_command_test.dart
index 4b4ce79..03caed1 100644
--- a/tests/standalone/vmservice/isolate_stacktrace_command_test.dart
+++ b/tests/standalone/vmservice/isolate_stacktrace_command_test.dart
@@ -13,7 +13,10 @@
 
   onRequestCompleted(Map reply) {
     Expect.equals('StackTrace', reply['type'], 'Not a StackTrace message.');
-    Expect.equals(4, reply['members'].length, 'Stacktrace is wrong length.');
+    Expect.isTrue(4 <= reply['members'].length, 'Stacktrace is wrong length.');
+    // The number of frames involved in isolate message dispatch is an
+    // implementation detail. Only check that we got all the frames for user
+    // code.
     Expect.equals('a', reply['members'][0]['name']);
     Expect.equals('b', reply['members'][1]['name']);
     Expect.equals('c', reply['members'][2]['name']);
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index 4c0a4aa9..aad4e49 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -32,7 +32,7 @@
 class double{}
 class String{}
 class Function{}
-class List {}
+class List<E> {}
 class Map {}
 class Closure {}
 class BoundClosure {}
@@ -57,7 +57,9 @@
   get length;
 }
 class JSMutableIndexable {}
-class JSArray implements JSIndexable {
+class JSArray<E> implements JSIndexable {
+  JSArray() {}
+  factory JSArray.typed(a) => a;
   var removeLast;
   var add;
 }
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index 9d288aa..2c5cb00 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -44,6 +44,8 @@
 }
 class JSMutableIndexable {}
 class JSArray {
+  JSArray() {}
+  factory JSArray.typed(a) => a;
   removeLast() => null;
   add(x) { }
 }
diff --git a/tools/VERSION b/tools/VERSION
index 52b6cb0..45524bd 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 1
 MINOR 0
-BUILD 0
-PATCH 9
+BUILD 1
+PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 88bd448..51b92df 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -77,6 +77,7 @@
     - /sdk/dartsdk-{linux,macos,windows}-{ia32,x64}-release.zip
     - /editor/darteditor-{linux,macos,windows}-{ia32,x64}.zip
     - /editor/darteditor-installer-macos-{ia32,x64}.dmg
+    - /editor/darteditor-installer-windows-{ia32,x64}.msi
     - /editor-eclipse-update
          /{index.html,features/,plugins/,artifacts.jar,content.jar}
   """
@@ -179,18 +180,19 @@
     assert len('%s' % revision) > 0
     return '%s/channels/%s/latest.txt' % (self.bucket, self.channel)
 
-def run(command, env=None, shell=False):
+def run(command, env=None, shell=False, throw_on_error=True):
   print "Running command: ", command
 
   p = subprocess.Popen(command, stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE, env=env, shell=shell)
   (stdout, stderr) = p.communicate()
-  if p.returncode != 0:
+  if throw_on_error and p.returncode != 0:
     print >> sys.stderr, "Failed to execute '%s'. Exit code: %s." % (
         command, p.returncode)
     print >> sys.stderr, "stdout: ", stdout
     print >> sys.stderr, "stderr: ", stderr
     raise Exception("Failed to execute %s." % command)
+  return (stdout, stderr, p.returncode)
 
 class GSUtil(object):
   GSUTIL_IS_SHELL_SCRIPT = False
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index b64ed3e..7f730cb 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -121,30 +121,6 @@
   flags = [x for x in flags if not '=' in x]
   return ('%s tests %s' % (name, ' '.join(flags))).strip()
 
-# TODO(ricow): remove this once we have browser controller drivers for all
-# supported platforms.
-def UseBrowserController(runtime, system):
-  supported_platforms = {
-    'linux': ['ff', 'chromeOnAndroid', 'chrome', 'dartium'],
-    'mac': ['safari', 'chrome', 'dartium'],
-    'windows': ['ie9', 'ie10', 'ff', 'chrome', 'dartium']
-  }
-  # Platforms that we run on the fyi waterfall only.
-  fyi_supported_platforms = {
-    'linux': [],
-    'mac': [],
-    'windows': []
-  }
-
-  if (runtime in supported_platforms[system]):
-    return True
-
-  if (os.environ.get('BUILDBOT_SCHEDULER') == "fyi-main" and
-      runtime in fyi_supported_platforms[system]):
-    return True
-
-  return False
-
 
 IsFirstTestStepCall = True
 def TestStep(name, mode, system, compiler, runtime, targets, flags, arch):
@@ -175,8 +151,6 @@
     else:
       cmd.extend(['--progress=buildbot', '-v'])
 
-    if UseBrowserController(runtime, system):
-      cmd.append('--use_browser_controller')
     if runtime == 'safari':
       cmd.append('--clear_safari_cache')
 
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index f9f18ee..2d852d8 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -35,12 +35,6 @@
 
 
 def PubSteps(build_info):
-  with bot.BuildStep('Build API Docs'):
-    args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
-            'api_docs']
-    print 'Generating API Docs: %s' % (' '.join(args))
-    bot.RunProcess(args)
-
   with bot.BuildStep('Build package-root'):
     args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
             'packages']
diff --git a/tools/bots/steps_clank.py b/tools/bots/steps_clank.py
new file mode 100755
index 0000000..1c8af34
--- /dev/null
+++ b/tools/bots/steps_clank.py
@@ -0,0 +1,12 @@
+#!/usr/bin/python
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+import sys
+
+def main():
+  sys.exit(0)
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/ddbg.dart b/tools/ddbg.dart
index 5c7aced..38433dd 100644
--- a/tools/ddbg.dart
+++ b/tools/ddbg.dart
@@ -248,6 +248,14 @@
     return "(list, id $id, len $len) $text";
   } else if (kind == "object") {
     return "(obj, id $id) $text";
+  } else if (kind == "function") {
+    var location = value['location'] != null
+        ? ", file '${value['location']['url']}'"
+          ", token pos ${value['location']['tokenOffset']}"
+        : "";
+    var name = value['name'];
+    var signature = value['signature'];
+    return "(closure ${name}${signature} $location)";
   } else {
     return "$text";
   }
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index b218268..447fa51 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -244,7 +244,7 @@
           "   * Gets the data for the specified type.",
           "   *",
           "   * The data is only available from within a drop operation (such as an",
-          "   * [Element.onDrop] event) and will return `null` before the event is",
+          "   * [Element.onDrop] event) and will return null before the event is",
           "   * triggered.",
           "   *",
           "   * Data transfer is prohibited across domains. If a drag originates",
@@ -1424,7 +1424,7 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Using the full-screen API]",
+          "   * * [Using the fullscreen API]",
           "   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)",
           "   * tutorial from WebPlatform.org.",
           "   * * [Fullscreen specification]",
@@ -1447,6 +1447,62 @@
         ]
       }
     },
+    "Event": {
+      "members": {
+        "AT_TARGET": [
+          "/**",
+          "   * This event is being handled by the event target.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Target phase] (http://www.w3.org/TR/DOM-Level-3-Events/#target-phase)",
+          "   * from W3C.",
+          "   */"
+        ],
+        "BUBBLING_PHASE": [
+          "/**",
+          "   * This event is bubbling up through the target's ancestors.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)",
+          "   * from W3C.",
+          "   */"
+        ],
+        "CAPTURING_PHASE": [
+          "/**",
+          "   * This event is propagating through the target's ancestors, starting from the",
+          "   * document.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)",
+          "   * from W3C.",
+          "   */"
+        ],
+        "clipboardData": [
+          "/**",
+          "   * Access to the system's clipboard data during copy, cut, and paste events.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [clipboardData specification]",
+          "   * (http://www.w3.org/TR/clipboard-apis/#attributes) from W3C.",
+          "   */"
+        ],
+        "path": [
+          "/**",
+          "   * This event's path, taking into account shadow DOM.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Shadow DOM extensions to Event]",
+          "   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from",
+          "   * W3C.",
+          "   */"
+        ]
+      }
+    },
     "EventSource": {
       "members": {
         "errorEvent": [
@@ -2515,7 +2571,7 @@
           "/**",
           "   * The document this node belongs to.",
           "   *",
-          "   * Returns `null` if this node does not belong to any document.",
+          "   * Returns null if this node does not belong to any document.",
           "   *",
           "   * ## Other resources",
           "   *",
@@ -2528,7 +2584,7 @@
           "/**",
           "   * The parent element of this node.",
           "   *",
-          "   * Returns `null` if this node either does not have a parent or its parent is",
+          "   * Returns null if this node either does not have a parent or its parent is",
           "   * not an element.",
           "   *",
           "   * ## Other resources",
@@ -3198,6 +3254,65 @@
         " */"
       ],
       "members": {
+        "alert": [
+          "/**",
+          "   * Displays a modal alert to the user.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [User prompts]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "applicationCache": [
+          "/**",
+          "   * The application cache for this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [A beginner's guide to using the application cache]",
+          "   * (http://www.html5rocks.com/en/tutorials/appcache/beginner) from HTML5Rocks.",
+          "   * * [Application cache API]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "confirm": [
+          "/**",
+          "   * Displays a modal OK/Cancel prompt to the user.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [User prompts]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "crypto": [
+          "/**",
+          "   * Entrypoint for the browser's cryptographic functions.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Web cryptography API](http://www.w3.org/TR/WebCryptoAPI/) from W3C.",
+          "   */"
+        ],
+        "CSS": [
+          "/**",
+          "   * Entrypoint for CSS-related functions.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The CSS interface](http://dev.w3.org/csswg/css-conditional/#the-css-interface) from W3C.",
+          "   */"
+        ],
+        "defaultStatus": [
+          "/// *Deprecated*."
+        ],
+        "defaultstatus": [
+          "/// *Deprecated*."
+        ],
         "devicemotionEvent": [
           "/**",
           "   * Static factory designed to expose `devicemotion` events to event",
@@ -3214,6 +3329,20 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "devicePixelRatio": [
+          "/**",
+          "   * The ratio between physical pixels and logical CSS pixels.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [devicePixelRatio]",
+          "   * (http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html) from",
+          "   * quirksmode.",
+          "   * * [More about devicePixelRatio]",
+          "   * (http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html) from",
+          "   * quirksmode.",
+          "   */"
+        ],
         "DOMContentLoadedEvent": [
           "/**",
           "   * Static factory designed to expose `contentloaded` events to event",
@@ -3222,6 +3351,32 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "find": [
+          "/**",
+          "   * Finds text in this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.find]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.find) from MDN.",
+          "   */"
+        ],
+        "getMatchedCSSRules": [
+          "/**",
+          "   * Returns all CSS rules that apply to the element's pseudo-element.",
+          "   */"
+        ],
+        "getSelection": [
+          "/**",
+          "   * Returns the currently selected text.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.getSelection]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.getSelection)",
+          "   * from MDN.",
+          "   */"
+        ],
         "hashchangeEvent": [
           "/**",
           "   * Static factory designed to expose `hashchange` events to event",
@@ -3230,6 +3385,89 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "history": [
+          "/**",
+          "   * The current session history for this window's newest document.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Loading web pages]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "innerHeight": [
+          "/**",
+          "   * The height of the viewport including scrollbars.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [innerHeight]",
+          "   * (http://docs.webplatform.org/wiki/css/cssom/properties/innerHeight) from",
+          "   * WebPlatform.org.",
+          "   */"
+        ],
+        "innerWidth": [
+          "/**",
+          "   * The width of the viewport including scrollbars.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [innerWidth]",
+          "   * (http://docs.webplatform.org/wiki/css/cssom/properties/innerWidth) from",
+          "   * WebPlatform.org.",
+          "   */"
+        ],
+        "localStorage": [
+          "/**",
+          "   * Storage for this window that persists across sessions.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [DOM storage guide]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage) from",
+          "   * MDN.",
+          "   * * [The past, present & future of local storage for web applications]",
+          "   * (http://diveintohtml5.info/storage.html) from Dive Into HTML5.",
+          "   * * [Local storage specification]",
+          "   * (http://www.w3.org/TR/webstorage/#the-localstorage-attribute) from W3C.",
+          "   */"
+        ],
+        "locationbar": [
+          "/**",
+          "   * This window's location bar, which displays the URL.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface elements]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "matchMedia": [
+          "/**",
+          "   * Returns a list of media queries for the given query string.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Testing media queries]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Testing_media_queries)",
+          "   * from MDN.",
+          "   * * [The MediaQueryList specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#the-mediaquerylist-interface) from W3C.",
+          "   */"
+        ],
+        "menubar": [
+          "/**",
+          "   * This window's menu bar, which displays menu commands.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface elements]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)",
+          "   * from WHATWG.",
+          "   */"
+        ],
         "messageEvent": [
           "/**",
           "   * Static factory designed to expose `message` events to event",
@@ -3238,6 +3476,42 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "moveBy": [
+          "/**",
+          "   * Moves this window.",
+          "   *",
+          "   * x and y can be negative.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.moveBy]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveBy) from MDN.",
+          "   * * [Window.moveBy]",
+          "   * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.",
+          "   */"
+        ],
+        "name": [
+          "/**",
+          "   * The name of this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window name]",
+          "   * (http://docs.webplatform.org/wiki/html/attributes/name_(window)) from",
+          "   * WebPlatform.org.",
+          "   */"
+        ],
+        "navigator": [
+          "/**",
+          "   * The user agent accessing this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The navigator object]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#the-navigator-object)",
+          "   * from WHATWG.",
+          "   */"
+        ],
         "offlineEvent": [
           "/**",
           "   * Static factory designed to expose `offline` events to event",
@@ -3246,6 +3520,17 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "offscreenBuffering": [
+          "/**",
+          "   * Whether objects are drawn offscreen before being displayed.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [offscreenBuffering]",
+          "   * (http://docs.webplatform.org/wiki/dom/properties/offscreenBuffering) from",
+          "   * WebPlatform.org.",
+          "   */"
+        ],
         "onabort": [
           "/// Stream of `abort` events handled by this [Window]."
         ],
@@ -3419,6 +3704,31 @@
         "onwebkitAnimationStart": [
           "/// Stream of `animationstart` events handled by this [Window]."
         ],
+        "openDatabase": [
+          "/// *Deprecated.*"
+        ],
+        "outerHeight": [
+          "/**",
+          "   * The height of this window including all user interface elements.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [outerHeight]",
+          "   * (http://docs.webplatform.org/wiki/css/cssom/properties/outerHeight) from",
+          "   * WebPlatform.org.",
+          "   */"
+        ],
+        "outerWidth": [
+          "/**",
+          "   * The width of the window including all user interface elements.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [outerWidth]",
+          "   * (http://docs.webplatform.org/wiki/css/cssom/properties/outerWidth) from",
+          "   * WebPlatform.org.",
+          "   */"
+        ],
         "pagehideEvent": [
           "/**",
           "   * Static factory designed to expose `pagehide` events to event",
@@ -3435,6 +3745,60 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "pageXOffset": [
+          "/**",
+          "   * The distance this window has been scrolled horizontally.",
+          "   *",
+          "   * This attribute is an alias for [scrollX].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   * * [scrollX and pageXOffset]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX) from MDN.",
+          "   */"
+        ],
+        "pageYOffset": [
+          "/**",
+          "   * The distance this window has been scrolled vertically.",
+          "   *",
+          "   * This attribute is an alias for [scrollY].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   * * [scrollY and pageYOffset]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY) from MDN.",
+          "   */"
+        ],
+        "performance": [
+          "/**",
+          "   * Timing and navigation data for this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Measuring page load speed with navigation timeing]",
+          "   * (http://www.html5rocks.com/en/tutorials/webperformance/basics/) from",
+          "   * HTML5Rocks.",
+          "   * * [Navigation timing specification]",
+          "   * (http://www.w3.org/TR/navigation-timing/) from W3C.",
+          "   */"
+        ],
+        "PERSISTENT": [
+          "/**",
+          "   * Indicates that file system data cannot be cleared unless given user",
+          "   * permission.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Exploring the FileSystem APIs]",
+          "   * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.",
+          "   * * [File API]",
+          "   * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.",
+          "   */"
+        ],
         "popstateEvent": [
           "/**",
           "   * Static factory designed to expose `popstate` events to event",
@@ -3443,6 +3807,26 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "print": [
+          "/**",
+          "   * Opens the print dialog for this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.print]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.print) from MDN.",
+          "   */"
+        ],
+        "resizeBy": [
+          "/**",
+          "   * Resizes this window by an offset.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window resizeBy] (http://docs.webplatform.org/wiki/dom/methods/resizeBy)",
+          "   * from WebPlatform.org.",
+          "   */"
+        ],
         "resizeEvent": [
           "/**",
           "   * Static factory designed to expose `resize` events to event",
@@ -3451,6 +3835,184 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "resizeTo": [
+          "/**",
+          "   * Resizes this window to a specific width and height.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window resizeTo] (http://docs.webplatform.org/wiki/dom/methods/resizeTo)",
+          "   * from WebPlatform.org.",
+          "   */"
+        ],
+        "screen": [
+          "/**",
+          "   * Information about the screen displaying this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   */"
+        ],
+        "screenLeft": [
+          "/**",
+          "   * The distance from the left side of the screen to the left side of this",
+          "   * window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   */"
+        ],
+        "screenTop": [
+          "/**",
+          "   * The distance from the top of the screen to the top of this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   */"
+        ],
+        "screenX": [
+          "/**",
+          "   * The distance from the left side of the screen to the mouse pointer.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   */"
+        ],
+        "screenY": [
+          "/**",
+          "   * The distance from the top of the screen to the mouse pointer.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification]",
+          "   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   */"
+        ],
+        "scroll": [
+          "/**",
+          "   * Scrolls the page horizontally and vertically to a specific point.",
+          "   *",
+          "   * This method is identical to [scrollTo].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)",
+          "   * from WebPlatform.org.",
+          "   */"
+        ],
+        "scrollbars": [
+          "/**",
+          "   * This window's scroll bars.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface elements]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "scrollBy": [
+          "/**",
+          "   * Scrolls the page horizontally and vertically by an offset.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)",
+          "   * from WebPlatform.org.",
+          "   */"
+        ],
+        "scrollTo": [
+          "/**",
+          "   * Scrolls the page horizontally and vertically to a specific point.",
+          "   *",
+          "   * This method is identical to [scroll].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)",
+          "   * from WebPlatform.org.",
+          "   */"
+        ],
+        "self": [
+          "/**",
+          "   * The current window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.self]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.self) from MDN.",
+          "   */"
+        ],
+        "sessionStorage": [
+          "/**",
+          "   * Storage for this window that is cleared when this session ends.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [DOM storage guide]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage) from",
+          "   * MDN.",
+          "   * * [The past, present & future of local storage for web applications]",
+          "   * (http://diveintohtml5.info/storage.html) from Dive Into HTML5.",
+          "   * * [Local storage specification]",
+          "   * (http://www.w3.org/TR/webstorage/#dom-sessionstorage) from W3C.",
+          "   */"
+        ],
+        "showModalDialog": [
+          "/**",
+          "   * Opens a new page as a modal dialog.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Dialogs implemented using separate documents]",
+          "   * (http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)",
+          "   * from W3C.",
+          "   */"
+        ],
+        "speechSynthesis": [
+          "/**",
+          "   * Access to speech synthesis in the browser.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Web speech specification]",
+          "   * (https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section)",
+          "   * from W3C.",
+          "   */"
+        ],
+        "status": [
+          "/// *Deprecated*."
+        ],
+        "statusbar": [
+          "/**",
+          "   * This window's status bar.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface elements]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "stop": [
+          "/**",
+          "   * Stops the window from loading.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Window object]",
+          "   * (http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)",
+          "   * from W3C.",
+          "   */"
+        ],
         "storageEvent": [
           "/**",
           "   * Static factory designed to expose `storage` events to event",
@@ -3459,6 +4021,40 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "styleMedia": [
+          "/**",
+          "   * Access to CSS media queries.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [StyleMedia class reference]",
+          "   * (https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html)",
+          "   * from Safari Developer Library.",
+          "   */"
+        ],
+        "TEMPORARY": [
+          "/**",
+          "   * Indicates that file system data can be cleared at any time.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Exploring the FileSystem APIs]",
+          "   * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.",
+          "   * * [File API]",
+          "   * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.",
+          "   */"
+        ],
+        "toolbar": [
+          "/**",
+          "   * This window's tool bar.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface elements]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#browser-interface-elements)",
+          "   * from WHATWG.",
+          "   */"
+        ],
         "unloadEvent": [
           "/**",
           "   * Static factory designed to expose `unload` events to event",
@@ -3490,6 +4086,27 @@
           "   *",
           "   * See [EventStreamProvider] for usage information.",
           "   */"
+        ],
+        "webkitResolveLocalFileSystemURL": [
+          "/**",
+          "   * Asynchronously retrieves a local filesystem entry.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Obtaining access to file system entry points]",
+          "   * (http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)",
+          "   * from W3C.",
+          "   */"
+        ],
+        "window": [
+          "/**",
+          "   * The current window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.window]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.window) from MDN.",
+          "   */"
         ]
       }
     },
@@ -3559,7 +4176,7 @@
         ],
         "getResponseHeader": [
           "/**",
-          "   * Return the response header named `header`, or `null` if not found.",
+          "   * Return the response header named `header`, or null if not found.",
           "   *",
           "   * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)",
           "   * for a list of common response headers.",
diff --git a/tools/dom/docs/lib/docs.dart b/tools/dom/docs/lib/docs.dart
index 0f59276..e7c4abf 100644
--- a/tools/dom/docs/lib/docs.dart
+++ b/tools/dom/docs/lib/docs.dart
@@ -50,7 +50,7 @@
  *       ...
  *     }
  *
- * Completes to `true` if any errors were encountered, `false` otherwise.
+ * Completes to true if any errors were encountered, false otherwise.
  */
 Future<bool> convert(String libUri, String jsonPath) {
   var paths = <String>[];
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 852706f..13f2307 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -12259,7 +12259,9 @@
         "comment": "http://www.w3.org/TR/WebCryptoAPI/",
         "support_level": "experimental"
       },
-      "defaultStatus": {},
+      "defaultStatus": {
+        "support_level": "nonstandard"
+      },
       "defaultstatus": {
         "support_level": "nonstandard"
       },
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 04923b2..f1d5e96 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -8,7 +8,7 @@
 import dartgenerator
 import database
 import fremontcutbuilder
-import logging.config
+import logging
 import monitored
 import multiemitter
 import optparse
@@ -139,6 +139,7 @@
         template_loader.Load('cpp_resolver.template'), dartium_output_dir)
     cpp_library_emitter.EmitClassIdTable(
         webkit_database, dartium_output_dir, type_registry, renamer)
+    emitters.Flush()
 
   if update_dom_metadata:
     metadata.Flush()
diff --git a/tools/dom/scripts/databasebuilder.py b/tools/dom/scripts/databasebuilder.py
index 4bb2d12..ab04d56 100755
--- a/tools/dom/scripts/databasebuilder.py
+++ b/tools/dom/scripts/databasebuilder.py
@@ -72,8 +72,8 @@
       defines=import_options.idl_defines)
     return IDLFile(idl_ast, file_name)
   except SyntaxError, e:
-    raise RuntimeError('Failed to load file %s: %s'
-                       % (file_name, e))
+    raise RuntimeError('Failed to load file %s: %s: Content: %s[end]'
+                       % (file_name, e, content))
 
 
 class DatabaseBuilder(object):
diff --git a/tools/dom/scripts/logging.conf b/tools/dom/scripts/logging.conf
index d19a395..db1658b 100644
--- a/tools/dom/scripts/logging.conf
+++ b/tools/dom/scripts/logging.conf
@@ -1,88 +1,68 @@
-[loggers]
-keys=root,pegparser,database,databasebuilder,dartgenerator,multiemitter,dartmetadata,snippet_manager,htmlrenamer,htmldartgenerator,fremontcutbuilder, systemhtml
+# Change programmatically for other use cases.
+
+[DEFAULT]
+handlers=consoleHandler
+level=INFO
+propagate=0
+
+# Handle everything on the console.
 
 [handlers]
 keys=consoleHandler
 
-[formatters]
-keys=simpleFormatter
-
-[logger_root]
-level=INFO
-handlers=consoleHandler
-
-[logger_pegparser]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=pegparser
-
-[logger_database]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=database
-
-[logger_databasebuilder]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=databasebuilder
-
-[logger_fremontcutbuilder]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=fremontcutbuilder
-
-[logger_snippet_manager]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=snippet_manager
-
-[logger_multiemitter]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=multiemitter
-
-[logger_dartgenerator]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=dartgenerator
-
 [handler_consoleHandler]
 class=StreamHandler
-level=INFO
 formatter=simpleFormatter
 args=(sys.stdout,)
 
-[logger_htmlrenamer]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=htmlrenamer
+# Only 1 basic formatter.
 
-[logger_htmldartgenerator]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=htmldartgenerator
-
-[logger_dartmetadata]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=dartmetadata
-
-[logger_systemhtml]
-level=INFO
-propagate=0
-handlers=consoleHandler
-qualname=systemhtml
+[formatters]
+keys=simpleFormatter
 
 [formatter_simpleFormatter]
 format=%(name)s - %(levelname)s - %(message)s
 datefmt=
+
+# Loggers for every module.
+
+[loggers]
+keys=root,dartdomgenerator,dartgenerator,dartmetadata,database,databasebuilder,fremontcutbuilder,htmldartgenerator,htmlrenamer,multiemitter,pegparser,snippet_manager,systemhtml
+
+[logger_root]
+
+[logger_dartdomgenerator]
+qualname=dartdomgenerator
+
+[logger_dartgenerator]
+qualname=dartgenerator
+
+[logger_dartmetadata]
+qualname=dartmetadata
+
+[logger_database]
+qualname=database
+
+[logger_databasebuilder]
+qualname=databasebuilder
+
+[logger_fremontcutbuilder]
+qualname=fremontcutbuilder
+
+[logger_htmldartgenerator]
+qualname=htmldartgenerator
+
+[logger_htmlrenamer]
+qualname=htmlrenamer
+
+[logger_multiemitter]
+qualname=multiemitter
+
+[logger_pegparser]
+qualname=pegparser
+
+[logger_snippet_manager]
+qualname=snippet_manager
+
+[logger_systemhtml]
+qualname=systemhtml
diff --git a/tools/dom/scripts/multiemitter.py b/tools/dom/scripts/multiemitter.py
index 2e9922c..f0628410 100644
--- a/tools/dom/scripts/multiemitter.py
+++ b/tools/dom/scripts/multiemitter.py
@@ -77,21 +77,22 @@
       _logger.info('Mkdir - %s' % dir)
       os.makedirs(dir)
 
-  # Remove file if pre-existing.
+  # If file exists and is unchanged, return.
+  new_contents = ''.join(lines)
   if os.path.exists(path):
-    _logger.info('Removing - %s' % path)
-    os.remove(path)
-    if os.path.exists(path):
-      _logger.info('Warning: File still exists- %s' % path)
+    with open(path) as fd:
+      contents = fd.read()
+    if new_contents == contents:
+      _logger.info('Unchanged file %s' % path)
+      return
 
   # Write the file.
   num_attempts = 4
   for i in range(num_attempts):
     try:
       _logger.info('Writing (attempt %d) - %s' % (i + 1, path))
-      f = open(path, 'w')
-      f.writelines(lines)
-      f.close()
+      with open(path, 'w') as fd:
+        fd.write(new_contents)
       return
     except IOError as error:
       last_attempt = (i == (num_attempts - 1))
@@ -114,4 +115,3 @@
             _logger.info("Couldn't find %s. Not printing open handles."
                          % handle_file)
         raise error
-
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 651900a..fdc48bd 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -1231,7 +1231,6 @@
     e.Emit('\n');
     e.Emit('} // namespace WebCore\n');
     e.Emit('#endif // DartWebkitClassIds_h\n');
-    self._emitters.Flush()
 
     path = os.path.join(output_dir, 'DartWebkitClassIds.cpp')
     e = self._emitters.FileEmitter(path)
@@ -1281,7 +1280,6 @@
     e.Emit("};\n");
     e.Emit('\n');
     e.Emit('} // namespace WebCore\n');
-    self._emitters.Flush()
 
 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument):
   return (
diff --git a/tools/dom/src/CrossFrameTypes.dart b/tools/dom/src/CrossFrameTypes.dart
index 679092d..cda5957 100644
--- a/tools/dom/src/CrossFrameTypes.dart
+++ b/tools/dom/src/CrossFrameTypes.dart
@@ -33,6 +33,16 @@
    *     print(currentLocation.href); // 'http://www.example.com:80/'
    */
   LocationBase get location;
+
+  /**
+   * The current session history for this window.
+   *
+   * ## Other resources
+   *
+   * * [Session history and navigation specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html)
+   * from WHATWG.
+   */
   HistoryBase get history;
 
   /**
@@ -118,6 +128,19 @@
    * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
    */
   void close();
+
+  /**
+   * Sends a cross-origin message.
+   *
+   * ## Other resources
+   *
+   * * [window.postMessage]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) from
+   * MDN.
+   * * [Cross-document messaging]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html)
+   * from WHATWG.
+   */
   void postMessage(var message, String targetOrigin, [List messagePorts]);
 }
 
diff --git a/tools/dom/src/CssClassSet.dart b/tools/dom/src/CssClassSet.dart
index 5d9a910..c948819 100644
--- a/tools/dom/src/CssClassSet.dart
+++ b/tools/dom/src/CssClassSet.dart
@@ -36,10 +36,10 @@
    * This is the Dart equivalent of jQuery's
    * [addClass](http://api.jquery.com/addClass/).
    *
-   * If this corresponds to one element. Returns `true` if [value] was added to
-   * the set, otherwise `false`.
+   * If this corresponds to one element. Returns true if [value] was added to
+   * the set, otherwise false.
    *
-   * If this corresponds to many elements, `null` is always returned.
+   * If this corresponds to many elements, null is always returned.
    */
   bool add(String value);
 
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index 43d542f..5cf230b 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -70,24 +70,6 @@
     return result;
   }
 
-  static List parseStackTrace(StackTrace stackTrace) {
-    final regExp = new RegExp(r'#\d\s+(.*) \((.*):(\d+):(\d+)\)');
-    List result = [];
-    for (var match in regExp.allMatches(stackTrace.toString())) {
-      result.add([match.group(1), match.group(2), int.parse(match.group(3)), int.parse(match.group(4))]);
-    }
-    return result;
-  }
-
-  static List captureParsedStackTrace() {
-    try {
-      // Throwing an exception is the only way to generate a stack trace.
-      throw new Exception();
-    } catch (e, stackTrace) {
-      return parseStackTrace(stackTrace);
-    }
-  }
-
   static void populateMap(Map result, List list) {
     for (int i = 0; i < list.length; i += 2) {
       result[list[i]] = list[i + 1];
@@ -302,7 +284,7 @@
     addForClass(ClassMirror mirror, bool isStatic) {
       if (mirror == null)
         return;
-      addAll(mirror.members, isStatic);
+      addAll(mirror.declarations, isStatic);
       if (mirror.superclass != null)
         addForClass(mirror.superclass, isStatic);
       for (var interface in mirror.superinterfaces) {
@@ -423,7 +405,9 @@
     }
     var className = MirrorSystem.getName(cls.simpleName);
     var createdConstructor = cls.constructors[new Symbol('$className.created')];
-    if (createdConstructor == null) {
+    if (createdConstructor == null ||
+        createdConstructor is! MethodMirror ||
+        !createdConstructor.isConstructor) {
       throw new UnsupportedError(
           'Class is missing constructor $className.created');
     }
diff --git a/tools/dom/templates/html/impl/impl_ClientRect.darttemplate b/tools/dom/templates/html/impl/impl_ClientRect.darttemplate
index d607a5a..0c31179 100644
--- a/tools/dom/templates/html/impl/impl_ClientRect.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ClientRect.darttemplate
@@ -27,7 +27,7 @@
    * The intersection of two axis-aligned rectangles, if any, is always another
    * axis-aligned rectangle.
    *
-   * Returns the intersection of this and `other`, or `null` if they don't
+   * Returns the intersection of this and `other`, or null if they don't
    * intersect.
    */
   Rectangle intersection(Rectangle other) {
diff --git a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
index 474aca9..9e965e9 100644
--- a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate
@@ -14,6 +14,16 @@
   CanvasRenderingContext2D get context2D => getContext('2d');
 $endif
 
+  /**
+   * Returns a new Web GL context for this canvas.
+   *
+   * ## Other resources
+   *
+   * * [WebGL fundamentals]
+   * (http://www.html5rocks.com/en/tutorials/webgl/webgl_fundamentals/) from
+   * HTML5Rocks.
+   * * [WebGL homepage] (http://get.webgl.org/).
+   */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @Experimental()
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 53adce9..973c9d4 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -105,6 +105,19 @@
     _title = value;
   }
 
+  /**
+   * Returns page to standard layout.
+   *
+   * Has no effect if the page is not in fullscreen mode.
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitExitFullscreen')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -121,12 +134,43 @@
     _webkitExitPointerLock();
   }
 
+  /**
+   * Returns the element, if any, that is currently displayed in fullscreen.
+   *
+   * Returns null if there is currently no fullscreen element. You can use
+   * this to determine if the page is in fullscreen mode.
+   *
+   *     myVideo = new VideoElement();
+   *     if (document.fullscreenElement == null) {
+   *       myVideo.requestFullscreen();
+   *       print(document.fullscreenElement == myVideo); // true
+   *     }
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitFullscreenElement')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   Element get fullscreenElement => _webkitFullscreenElement;
 
+  /**
+   * Returns true if this document can display elements in fullscreen mode.
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen API]
+   * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+   * WebPlatform.org.
+   * * [Fullscreen specification]
+   * (http://www.w3.org/TR/fullscreen/) from W3C.
+   */
   @DomName('Document.webkitFullscreenEnabled')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index 499694f..d7dadf4 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -35,6 +35,15 @@
   }
 
 $if DART2JS
+  /**
+   * The newest document in this window.
+   *
+   * ## Other resources
+   *
+   * * [Loading web pages]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html)
+   * from WHATWG.
+   */
   Document get document => JS('Document', '#.document', this);
 
   WindowBase _open2(url, name) => JS('Window', '#.open(#,#)', this, url, name);
@@ -42,6 +51,16 @@
   WindowBase _open3(url, name, options) =>
       JS('Window', '#.open(#,#,#)', this, url, name, options);
 
+  /**
+   * Opens a new window.
+   *
+   * ## Other resources
+   *
+   * * [Window.open]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.open) from MDN.
+   * * [Window open]
+   * (http://docs.webplatform.org/wiki/dom/methods/open) from WebPlatform.org.
+   */
   WindowBase open(String url, String name, [String options]) {
     if (options == null) {
       return _DOMWindowCrossFrame._createSafe(_open2(url, name));
@@ -53,6 +72,12 @@
   // API level getter and setter for Location.
   // TODO: The cross domain safe wrapper can be inserted here or folded into
   // _LocationWrapper.
+  /**
+   * The current location of this window.
+   *
+   *     Location currentLocation = window.location;
+   *     print(currentLocation.href); // 'http://www.example.com:80/'
+   */
   Location get location {
     // Firefox work-around for Location.  The Firefox location object cannot be
     // made to behave like a Dart object so must be wrapped.
@@ -121,6 +146,14 @@
     return _requestAnimationFrame(_wrapZone(callback));
   }
 
+  /**
+   * Cancels an animation frame request.
+   *
+   * ## Other resources
+   *
+   * * [Window.cancelAnimationFrame]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.cancelAnimationFrame) from MDN.
+   */
   void cancelAnimationFrame(int id) {
     _ensureRequestAnimationFrame();
     _cancelAnimationFrame(id);
@@ -161,7 +194,7 @@
   /**
    * Gets an instance of the Indexed DB factory to being using Indexed DB.
    *
-   * Use [IdbFactory.supported] to check if Indexed DB is supported on the
+   * Use [indexed_db.IdbFactory.supported] to check if Indexed DB is supported on the
    * current platform.
    */
   @SupportedBrowser(SupportedBrowser.CHROME, '23.0')
@@ -169,10 +202,11 @@
   @SupportedBrowser(SupportedBrowser.IE, '10.0')
   @Experimental()
   IdbFactory get indexedDB =>
-      JS('IdbFactory|Null',  // If not supported, returns `null`.
+      JS('IdbFactory|Null',  // If not supported, returns null.
          '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
          this, this, this);
 
+  /// The debugging console for this window.
   @DomName('Window.console')
   Console get console => Console._safeConsole;
 
@@ -211,6 +245,15 @@
     return _requestFileSystem(persistent? 1 : 0, size);
   }
 
+  /**
+   * Converts a point from node coordinates to this window's coordinates.
+   *
+   * ## Other resources
+   *
+   * * [webkitConvertPointFromPageToNode]
+   * (https://developer.apple.com/library/safari/documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html#//apple_ref/javascript/instm/DOMWindow/webkitConvertPointFromNodeToPage)
+   * from Safari Development Library.
+   */
   @DomName('Window.convertPointFromNodeToPage')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -221,6 +264,15 @@
     return new Point(result.x, result.y);
   }
 
+  /**
+   * Converts a point from this window's coordinates to node coordinates.
+   *
+   * ## Other resources
+   *
+   * * [webkitConvertPointFromPageToNode]
+   * (https://developer.apple.com/library/safari/documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html#//apple_ref/javascript/instm/DOMWindow/webkitConvertPointFromPageToNode)
+   * from Safari Development Library.
+   */
   @DomName('Window.convertPointFromPageToNode')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -252,13 +304,46 @@
   @DomName('Window.onbeforeunload')
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
+  /**
+   * Moves this window to a specific position.
+   *
+   * x and y can be negative.
+   *
+   * ## Other resources
+   *
+   * * [Window.moveTo]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveTo) from MDN.
+   * * [Window.moveTo]
+   * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveto) from W3C.
+   */
   void moveTo(Point p) {
     _moveTo(p.x, p.y);
   }
 
 $if DART2JS
+  /**
+   * The distance this window has been scrolled horizontally.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollX]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX) from MDN.
+   */
   int get scrollX => JS('bool', '("scrollX" in #)', this) ? JS('int',
       '#.scrollX', this) : document.documentElement.scrollLeft;
+
+  /**
+   * The distance this window has been scrolled vertically.
+   *
+   * ## Other resources
+   *
+   * * [The Screen interface specification]
+   * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+   * * [scrollY]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY) from MDN.
+   */
   int get scrollY => JS('bool', '("scrollY" in #)', this) ? JS('int',
       '#.scrollY', this) : document.documentElement.scrollTop;
 $endif
diff --git a/tools/gyp/configurations_android.gypi b/tools/gyp/configurations_android.gypi
index f7d9da9..cefd3ab 100644
--- a/tools/gyp/configurations_android.gypi
+++ b/tools/gyp/configurations_android.gypi
@@ -56,7 +56,7 @@
         'cflags': [
           '-fdata-sections',
           '-ffunction-sections',
-          '-fomit-frame-pointer',
+          '-fno-omit-frame-pointer',
           '-O3',
         ],
       },
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 014eaca..73d7350 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -24,8 +24,8 @@
           #'-ansi',
           '-fno-rtti',
           '-fno-exceptions',
-          '-fvisibility=hidden',
-          '-fvisibility-inlines-hidden',
+          # '-fvisibility=hidden',
+          # '-fvisibility-inlines-hidden',
         ],
       },
 
@@ -91,12 +91,17 @@
       'Dart_Debug': {
         'cflags': [
           '-O<(dart_debug_optimization_level)',
+          # The sampling profiler uses the frame pointer to walk the stack.
           '-fno-omit-frame-pointer',
         ],
       },
 
       'Dart_Release': {
-        'cflags': [ '-O3', ],
+        'cflags': [
+          '-O3',
+          # The sampling profiler uses the frame pointer to walk the stack.
+          '-fno-omit-frame-pointer',
+        ],
       },
     },
   },
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index dd1d115..9e2828f 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -26,6 +26,7 @@
             'AdditionalDependencies': [
               'advapi32.lib',
               'shell32.lib',
+              'dbghelp.lib',
             ],
           },
         },
@@ -57,6 +58,7 @@
             'AdditionalDependencies': [
               'advapi32.lib',
               'shell32.lib',
+              'dbghelp.lib',
             ],
           },
         },
diff --git a/tools/publish_barback.py b/tools/publish_barback.py
new file mode 100755
index 0000000..58ca64a
--- /dev/null
+++ b/tools/publish_barback.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+#
+# Script to push the barback package to pub. Barback is treated specially
+# because it is tightly coupled to the SDK. Pub includes its own copy of
+# barback but also includes code that is run against the user's copy of barback.
+# To ensure that those are in sync, each version of the SDK has a single
+# version of barback that it works with.
+#
+# We enforce this by placing a narrow SDK constraint in each version of barback.
+# This ensures the only barback that will be selected is the one that works
+# with the user's SDK. Once barback is more stable, we can loosen this.
+#
+# Usage: publish_barback.py
+#
+# "pub" must be in PATH.
+
+import os
+import os.path
+import re
+import shutil
+import sys
+import subprocess
+import tempfile
+
+def ReadVersion(file, field):
+  for line in open(file).read().split('\n'):
+    [k, v] = re.split('\s+', line)
+    if field == k:
+      return int(v)
+
+def Main(argv):
+  HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+  BARBACK = os.path.join(HOME, 'pkg', 'barback')
+
+  versionFile = os.path.join(HOME, 'tools', 'VERSION')
+  major = ReadVersion(versionFile, 'MAJOR')
+  minor = ReadVersion(versionFile, 'MINOR')
+  build = ReadVersion(versionFile, 'BUILD')
+  patch = ReadVersion(versionFile, 'PATCH')
+
+  # The bleeding_edge branch has a fixed version number of 0.1.x.y. Don't allow
+  # users to publish packages from there.
+  if major == 0 and minor <= 1:
+    print 'Error: Do not run this script from a bleeding_edge checkout.'
+    return -1
+
+  # Convert the version to semver syntax.
+  # TODO(rnystrom): Change this when the SDK's version numbering scheme is
+  # decided.
+  if patch != 0:
+    version = '%d.%d.%d+%d' % (major, minor, build, patch)
+  else:
+    version = '%d.%d.%d' % (major, minor, build)
+
+  # Copy the package to a temp directory so we can fill in the versions in its
+  # pubspec.
+  tmpDir = tempfile.mkdtemp()
+  shutil.copytree(os.path.join(HOME, BARBACK), os.path.join(tmpDir, 'barback'))
+
+  pubspecPath = os.path.join(tmpDir, 'barback', 'pubspec.yaml')
+  with open(pubspecPath) as pubspecFile:
+    pubspec = pubspecFile.read()
+
+  # Fill in the SDK version constraint. It pins barback to the current version
+  # of the SDK with a small amount of wiggle room for hotfixes.
+  if major < 1:
+    # No breaking changes until after 1.0.
+    # TODO(rnystrom): Remove this once 1.0 has shipped.
+    constraint = '>=%d.%d.%d <1.1.0' % (major, minor, build)
+  else:
+    constraint = '>=%d.%d.%d <%d.%d.0' % (major, minor, build, major, minor + 1)
+
+  # Fill in the SDK version constraint.
+  pubspec = pubspec.replace('$SDK_CONSTRAINT$', constraint)
+
+  with open(pubspecPath, 'w') as pubspecFile:
+    pubspecFile.write(pubspec)
+
+  print ('Publishing barback %s with SDK constraint "%s".' %
+      (version, constraint))
+  subprocess.call(['pub', 'lish'], cwd=os.path.join(tmpDir, 'barback'))
+  shutil.rmtree(tmpDir)
+
+if __name__ == '__main__':
+  sys.exit(Main(sys.argv))
diff --git a/tools/signing_script.py b/tools/signing_script.py
index 9ea7630..8147aeb 100755
--- a/tools/signing_script.py
+++ b/tools/signing_script.py
@@ -1,10 +1,9 @@
 #!/usr/bin/env python
-# 
+#
 # Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-import hashlib
 import imp
 import optparse
 import os
@@ -119,6 +118,12 @@
                                     config['bits'])
   run([GSUTIL, 'cp', bucket, destination])
 
+def download_msi_installer_from_new_location(channel, config, destination):
+  namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
+  bucket = namer.editor_installer_filepath(
+      config['revision'], config['system'], config['bits'], 'msi')
+  run([GSUTIL, 'cp', bucket, destination])
+
 def upload_to_new_location(channel, config, source_zip):
   namer = bot_utils.GCSNamer(channel,
                              bot_utils.ReleaseType.SIGNED)
@@ -135,6 +140,12 @@
   run([GSUTIL, 'setacl', 'public-read', bucket])
   run([GSUTIL, 'setacl', 'public-read', bucket + '.md5sum'])
 
+def upload_msi_installer_to_new_location(channel, config, signed_msi):
+  namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.SIGNED)
+  bucket = namer.editor_installer_filepath(
+      config['revision'], config['system'], config['bits'], 'msi')
+  run([GSUTIL, 'cp', '-a', 'public-read', signed_msi, bucket])
+
 def main():
   if sys.platform != 'linux2':
     print "This script was only tested on linux. Please run it on linux!"
@@ -180,24 +191,19 @@
     'macos' : {
       'editor' : os.path.join('dart', 'DartEditor.app'),
       'chrome' : os.path.join('dart', 'chromium', 'Chromium.app'),
-      'content_shell' : os.path.join('dart', 'chromium',
-                                     'Content Shell.app'),
 
       'editor_scratch' : 'DartEditor%(bits)s.app',
       'chrome_scratch' : 'Chromium%(bits)s.app',
-      'content_shell_scratch' : 'ContentShell%(bits)s.app',
 
       'zip' : True,
     },
     'win32' : {
       'editor' : os.path.join('dart', 'DartEditor.exe'),
       'chrome' : os.path.join('dart', 'chromium', 'chrome.exe'),
-      'content_shell' : os.path.join('dart', 'chromium',
-                                     'content_shell.exe'),
 
+      'msi_scratch' : 'darteditor-installer-windows-%(bits)s.msi',
       'editor_scratch' : 'DartEditor%(bits)s.exe',
       'chrome_scratch' : 'chromium%(bits)s.exe',
-      'content_shell_scratch' : 'content_shell%(bits)s.exe',
 
       'zip' : False,
     },
@@ -224,7 +230,7 @@
 
         run(['unzip', destination, '-d', destination_dir])
 
-        for name in ['editor', 'chrome', 'content_shell']:
+        for name in ['editor', 'chrome']:
           from_path = os.path.join(destination_dir, locations[system][name])
           to_path = os.path.join(
               presign_dir, locations[system]['%s_scratch' % name] % config)
@@ -235,10 +241,17 @@
           else:
             # We copy an .exe file
             copy_file(from_path, to_path)
+
+        # Download .*msi installer from GCS to presign directory
+        if system == 'win32':
+          presign_msi = os.path.join(
+              presign_dir, locations[system]['msi_scratch'] % config)
+          download_msi_installer_from_new_location(
+              options.channel, config, presign_msi)
       elif options.deploy:
         copy_tree(destination_dir, deploy_dir)
-  
-        for name in ['editor', 'chrome', 'content_shell']:
+
+        for name in ['editor', 'chrome']:
           from_path = os.path.join(
               postsign_dir, locations[system]['%s_scratch' % name] % config)
           to_path = os.path.join(deploy_dir, locations[system][name])
@@ -257,6 +270,13 @@
         # Upload *.zip/*.zip.md5sum and set 'public-read' ACL
         upload_to_new_location(options.channel, config, deploy_zip_file)
 
+        # Upload *.msi installer and set 'public-read ACL
+        if system == 'win32':
+          postsign_msi = os.path.join(
+              postsign_dir, locations[system]['msi_scratch'] % config)
+          upload_msi_installer_to_new_location(
+              options.channel, config, postsign_msi)
+
 if __name__ == '__main__':
   main()
 
diff --git a/tools/test.dart b/tools/test.dart
index 0556662..4d71459 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -165,13 +165,11 @@
       // issues with starting up a new browser just after killing the hanging
       // browser.
       maxBrowserProcesses = 1;
-    } else if (conf['runtime'].startsWith('safari') &&
-               conf['use_browser_controller']) {
+    } else if (conf['runtime'].startsWith('safari')) {
       // Safari does not allow us to run from a fresh profile, so we can only
       // use one browser.
       maxBrowserProcesses = 1;
     } else if (conf['runtime'] == 'chrome' &&
-               conf['use_browser_controller'] &&
                Platform.operatingSystem == 'macos') {
       // Chrome on mac results in random timeouts.
       maxBrowserProcesses = math.max(1, maxBrowserProcesses ~/ 2);
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index d661e84..8cdc3cd 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -31,6 +31,10 @@
 
   /** The version of the browser - normally set when starting a browser */
   String version = "";
+
+  // The path to the browser executable.
+  String _binary;
+
   /**
    * The underlying process - don't mess directly with this if you don't
    * know what you are doing (this is an interactive process that needs
@@ -55,21 +59,24 @@
   Browser();
 
   factory Browser.byName(String name,
-                         [Map globalConfiguration = const {},
-                          bool checkedMode = false]) {
-    if (name == 'ff' || name == 'firefox') {
-      return new Firefox();
+                         String executablePath,
+                         [bool checkedMode = false]) {
+    var browser;
+    if (name == 'firefox') {
+      browser = new Firefox();
     } else if (name == 'chrome') {
-      return new Chrome();
+      browser = new Chrome();
     } else if (name == 'dartium') {
-      return new Dartium(globalConfiguration, checkedMode);
+      browser = new Dartium(checkedMode);
     } else if (name == 'safari') {
-      return new Safari();
+      browser = new Safari();
     } else if (name.startsWith('ie')) {
-      return new IE();
+      browser = new IE();
     } else {
       throw "Non supported browser";
     }
+    browser._binary = executablePath;
+    return browser;
   }
 
   static const List<String> SUPPORTED_BROWSERS =
@@ -194,12 +201,6 @@
 
 class Safari extends Browser {
   /**
-   * The binary used to run safari - changing this can be nececcary for
-   * testing or using non standard safari installation.
-   */
-  static const String binary = "/Applications/Safari.app/Contents/MacOS/Safari";
-
-  /**
    * We get the safari version by parsing a version file
    */
   static const String versionFile =
@@ -318,10 +319,10 @@
             _cleanup = () { userDir.deleteSync(recursive: true); };
             _createLaunchHTML(userDir.path, url);
             var args = ["${userDir.path}/launch.html"];
-            return startBrowser(binary, args);
+            return startBrowser(_binary, args);
           });
         }).catchError((error) {
-          _logEvent("Running $binary --version failed with $error");
+          _logEvent("Running $_binary --version failed with $error");
           return false;
         });
       });
@@ -338,23 +339,8 @@
 
 
 class Chrome extends Browser {
-  String _binary;
   String _version = "Version not found yet";
 
-  Chrome() {
-    _binary = _getBinary();
-  }
-
-  String _getBinary() {
-    if (Platform.isWindows) {
-      return "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";
-    } else if (Platform.isMacOS) {
-      return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
-    }
-    assert(Platform.isLinux);
-    return 'google-chrome';
-  }
-
   Map<String, String> _getEnvironment() => null;
 
   Future<bool> _getVersion() {
@@ -410,14 +396,9 @@
 }
 
 class Dartium extends Chrome {
-  final Map globalConfiguration;
   final bool checkedMode;
 
-  Dartium(this.globalConfiguration, this.checkedMode);
-
-  String _getBinary() {
-    return Locations.getDartiumLocation(globalConfiguration);
-  }
+  Dartium(this.checkedMode);
 
   Map<String, String> _getEnvironment() {
     var environment = new Map<String,String>.from(Platform.environment);
@@ -435,10 +416,6 @@
 }
 
 class IE extends Browser {
-
-  static const String binary =
-      "c:\\Program Files\\Internet Explorer\\iexplore.exe";
-
   Future<String> getVersion() {
     var args = ["query",
                 "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Internet Explorer",
@@ -463,7 +440,7 @@
     _logEvent("Starting ie browser on: $url");
     return getVersion().then((version) {
       _logEvent("Got version: $version");
-      return startBrowser(binary, [url]);
+      return startBrowser(_binary, [url]);
     });
   }
   String toString() => "IE";
@@ -494,10 +471,11 @@
 
 
 class AndroidBrowser extends Browser {
+  final bool checkedMode;
   AdbDevice _adbDevice;
   AndroidBrowserConfig _config;
 
-  AndroidBrowser(this._adbDevice, this._config);
+  AndroidBrowser(this._adbDevice, this._config, this.checkedMode);
 
   Future<bool> start(String url) {
     var intent = new Intent(
@@ -511,6 +489,12 @@
     }).then((_) {
       return _adbDevice.setProp("DART_FORWARDING_PRINT", "1");
     }).then((_) {
+      if (checkedMode) {
+        return _adbDevice.setProp("DART_FLAGS", "--checked");
+      } else {
+        return _adbDevice.setProp("DART_FLAGS", "");
+      }
+    }).then((_) {
       return _adbDevice.startActivity(intent).then((_) => true);
     });
   }
@@ -603,8 +587,6 @@
   static const String disableScriptTimeLimit =
       'user_pref("dom.max_script_run_time", 0);';
 
-  static String _binary = _getBinary();
-
   Future _createPreferenceFile(var path) {
     var file = new File("${path.toString()}/user.js");
     var randomFile = file.openSync(mode: FileMode.WRITE);
@@ -614,17 +596,6 @@
     randomFile.close();
   }
 
-  // This is extracted to a function since we may need to support several
-  // locations.
-  static String _getWindowsBinary() {
-    return "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe";
-  }
-
-  static String _getBinary() {
-    if (Platform.isWindows) return _getWindowsBinary();
-    if (Platform.isLinux) return 'firefox';
-  }
-
   Future<bool> start(String url) {
     _logEvent("Starting firefox browser on: $url");
     // Get the version and log that.
@@ -659,11 +630,9 @@
  * Describes the current state of a browser used for testing.
  */
 class BrowserTestingStatus {
-// TODO(ricow): Add prefetching to the browsers. We spend a lot of time waiting
-// for the next test. Handling timeouts is the hard part of this!
-
   Browser browser;
   BrowserTest currentTest;
+
   // This is currently not used for anything except for error reporting.
   // Given the usefulness of this in debugging issues this should not be
   // removed even when we have really stable system.
@@ -681,6 +650,7 @@
   Function doneCallback;
   String url;
   int timeout;
+  String lastKnownMessage = '';
   Stopwatch stopwatch;
 
   // This might be null
@@ -702,20 +672,22 @@
 
 /* Describes the output of running the test in a browser */
 class BrowserTestOutput {
-  final bool didTimeout;
   final Duration delayUntilTestStarted;
   final Duration duration;
+
+  final String lastKnownMessage;
+
   final BrowserOutput browserOutput;
-  final String dom;
+  final bool didTimeout;
 
   BrowserTestOutput(
-      this.delayUntilTestStarted, this.duration, this.dom,
+      this.delayUntilTestStarted, this.duration, this.lastKnownMessage,
       this.browserOutput, {this.didTimeout: false});
 }
 
 /**
  * Encapsulates all the functionality for running tests in browsers.
- * The interface is rather simple. After starting the runner tests
+ * The interface is rather simple. After starting, the runner tests
  * are simply added to the queue and a the supplied callbacks are called
  * whenever a test completes.
  */
@@ -760,6 +732,7 @@
         globalConfiguration, localIp, useIframe);
     return testingServer.start().then((_) {
       testingServer.testDoneCallBack = handleResults;
+      testingServer.testStatusUpdateCallBack = handleStatusUpdate;
       testingServer.testStartedCallBack = handleStarted;
       testingServer.nextTestCallBack = getNextTest;
       return getBrowsers().then((browsers) {
@@ -788,9 +761,9 @@
     var androidBrowserCreationMapping = {
       'chromeOnAndroid' : (AdbDevice device) => new AndroidChrome(device),
       'ContentShellOnAndroid' : (AdbDevice device) =>
-          new AndroidBrowser(device, contentShellOnAndroidConfig),
+          new AndroidBrowser(device, contentShellOnAndroidConfig, checkedMode),
       'DartiumOnAndroid' : (AdbDevice device) =>
-          new AndroidBrowser(device, dartiumOnAndroidConfig),
+          new AndroidBrowser(device, dartiumOnAndroidConfig, checkedMode),
     };
     if (androidBrowserCreationMapping.containsKey(browserName)) {
       AdbHelper.listDevices().then((deviceIds) {
@@ -874,6 +847,18 @@
     }
   }
 
+  void handleStatusUpdate(String browserId, String output, int testId) {
+    var status = browserStatus[browserId];
+
+    if (status == null || status.timeout) {
+      // We don't do anything, this browser is currently being killed and
+      // replaced. The browser here can be null if we decided to kill the
+      // browser.
+    } else if (status.currentTest != null && status.currentTest.id != testId) {
+      status.currentTest.lastKnownMessage = output;
+    }
+  }
+
   void handleStarted(String browserId, String output, int testId) {
     var status = browserStatus[browserId];
 
@@ -895,13 +880,18 @@
 
     status.currentTest.stopwatch.stop();
     status.browser.close().then((_) {
+      var lastKnownMessage =
+          'Dom could not be fetched, since the test timed out.';
+      if (status.currentTest.lastKnownMessage.length > 0) {
+        lastKnownMessage = status.currentTest.lastKnownMessage;
+      }
       // Wait until the browser is closed before reporting the test as timeout.
       // This will enable us to capture stdout/stderr from the browser
       // (which might provide us with information about what went wrong).
       var browserTestOutput = new BrowserTestOutput(
           status.currentTest.delayUntilTestStarted,
           status.currentTest.stopwatch.elapsed,
-          'Dom could not be fetched, since the test timed out.',
+          lastKnownMessage,
           status.browser.testBrowserOutput,
           didTimeout: true);
       status.currentTest.doneCallback(browserTestOutput);
@@ -915,10 +905,12 @@
         browser = new AndroidChrome(adbDeviceMapping[id]);
       } else if (browserName == 'ContentShellOnAndroid') {
         browser = new AndroidBrowser(adbDeviceMapping[id],
-                                     contentShellOnAndroidConfig);
+                                     contentShellOnAndroidConfig,
+                                     checkedMode);
       } else if (browserName == 'DartiumOnAndroid') {
         browser = new AndroidBrowser(adbDeviceMapping[id],
-                                     dartiumOnAndroidConfig);
+                                     dartiumOnAndroidConfig,
+                                     checkedMode);
       } else {
         browserStatus.remove(id);
         browser = getInstance();
@@ -960,6 +952,7 @@
     BrowserTest test = testQueue.removeLast();
     if (status.currentTest == null) {
       status.currentTest = test;
+      status.currentTest.lastKnownMessage = '';
     } else {
       // TODO(ricow): Handle this better.
       print("This is bad, should never happen, getNextTest all full");
@@ -1027,8 +1020,9 @@
   }
 
   Browser getInstance() {
-    var browser =
-        new Browser.byName(browserName, globalConfiguration, checkedMode);
+    if (browserName == 'ff') browserName = 'firefox';
+    var path = Locations.getBrowserLocation(browserName, globalConfiguration);
+    var browser = new Browser.byName(browserName, path, checkedMode);
     browser.logger = logger;
     return browser;
   }
@@ -1053,6 +1047,7 @@
   static const String driverPath = "/driver";
   static const String nextTestPath = "/next_test";
   static const String reportPath = "/report";
+  static const String statusUpdatePath = "/status_update";
   static const String startedPath = "/started";
   static const String waitSignal = "WAIT";
   static const String terminateSignal = "TERMINATE";
@@ -1064,6 +1059,7 @@
   bool useIframe = false;
 
   Function testDoneCallBack;
+  Function testStatusUpdateCallBack;
   Function testStartedCallBack;
   Function nextTestCallBack;
 
@@ -1078,11 +1074,19 @@
         // we don't want the browser to cache the result of getNextTest.
         request.response.headers.set("Cache-Control",
                                      "no-cache, no-store, must-revalidate");
-        if (request.uri.path.startsWith(reportPath)) {
-          var browserId = request.uri.path.substring(reportPath.length + 1);
+        bool isReport = request.uri.path.startsWith(reportPath);
+        bool isStatusUpdate = request.uri.path.startsWith(statusUpdatePath);
+        if (isReport || isStatusUpdate) {
+          var browserId;
+          if (isStatusUpdate) {
+            browserId = request.uri.path.substring(statusUpdatePath.length + 1);
+          } else {
+            browserId = request.uri.path.substring(reportPath.length + 1);
+          }
           var testId =
               int.parse(request.uri.queryParameters["id"].split("=")[1]);
-          handleReport(request, browserId, testId);
+          handleReport(
+              request, browserId, testId, isStatusUpdate: isStatusUpdate);
           // handleReport will asynchroniously fetch the data and will handle
           // the closing of the streams.
           return;
@@ -1148,14 +1152,19 @@
     });
   }
 
-  void handleReport(HttpRequest request, String browserId, var testId) {
+  void handleReport(HttpRequest request, String browserId, var testId,
+                    {bool isStatusUpdate}) {
     StringBuffer buffer = new StringBuffer();
     request.transform(UTF8.decoder).listen((data) {
       buffer.write(data);
     }, onDone: () {
       String back = buffer.toString();
       request.response.close();
-      testDoneCallBack(browserId, back, testId);
+      if (isStatusUpdate) {
+        testStatusUpdateCallBack(browserId, back, testId);
+      } else {
+        testDoneCallBack(browserId, back, testId);
+      }
       // TODO(ricow): We should do something smart if we get an error here.
     }, onError: (error) { DebugLogger.error("$error"); });
   }
@@ -1207,7 +1216,6 @@
 <head>
   <title>Driving page</title>
   <script type='text/javascript'>
-
     function startTesting() {
       var number_of_tests = 0;
       var current_id;
@@ -1303,39 +1311,69 @@
             'POST', '$errorReportingUrl?test=1', handleReady, msg, true); 
       }
 
-      function reportMessage(msg) {
-        if (msg == 'STARTING') {
+      function reportMessage(msg, isFirstMessage, isStatusUpdate) {
+        if (isFirstMessage) {
           test_completed = false;
           current_id = next_id;
           contactBrowserController(
             'POST', '$startedPath/${browserId}?id=' + current_id,
             function () {}, msg, true);
-          return;
-        }
+        } else if (isStatusUpdate) {
+            contactBrowserController(
+              'POST', '$statusUpdatePath/${browserId}?id=' + current_id,
+              function() {}, msg, true);
+        } else {
+          var is_double_report = test_completed;
+          test_completed = true;
 
-        var is_double_report = test_completed;
-        test_completed = true;
-
-        function handleReady() {
-          if (this.readyState == this.DONE) {
-            if (this.status == 200) {
-              if (!is_double_report) {
-                getNextTask();
+          function handleReady() {
+            if (this.readyState == this.DONE) {
+              if (this.status == 200) {
+                if (!is_double_report) {
+                  getNextTask();
+                }
+              } else {
+                reportError('Error sending result to server');
               }
-            } else {
-              reportError('Error sending result to server');
             }
           }
-        }
-        contactBrowserController(
+          contactBrowserController(
             'POST', '$reportPath/${browserId}?id=' + current_id, handleReady,
             msg, true);
+        }
+      }
+
+      function parseResult(result) {
+        var parsedData = null;
+        try {
+          parsedData = JSON.parse(result);
+        } catch(error) { }
+        return parsedData;
       }
 
       function messageHandler(e) {
         var msg = e.data;
         if (typeof msg != 'string') return;
-        reportMessage(msg);
+        
+        var parsedData = parseResult(msg);
+        if (parsedData) {
+          // Only if the JSON was valid, we'll post it back.
+          var message = parsedData['message'];
+          var isFirstMessage = parsedData['is_first_message'];
+          var isStatusUpdate = parsedData['is_status_update'];
+          var isDone = parsedData['is_done'];
+          if (!isFirstMessage && !isStatusUpdate) {
+            if (!isDone) {
+              alert("Bug in test_controller.js: " +
+                    "isFirstMessage/isStatusUpdate/isDone were all false");
+            }
+          }
+          if (message) {
+            reportMessage(message, isFirstMessage, isStatusUpdate);
+          }
+        } else {
+          reportMessage(msg, msg == 'STARTING', false);
+        }
       }
 
       window.addEventListener('message', messageHandler, false);
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 5d49a0a..fa3c48b 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -6,8 +6,13 @@
 
 String getHtmlContents(String title,
                        String scriptType,
-                       Path sourceScript) =>
-"""
+                       Path sourceScript,
+                       {bool use_unittest_controller: false}) {
+  var testControllerJs = '/root_dart/tools/testing/dart/test_controller.js';
+  if (use_unittest_controller) {
+    testControllerJs = '/root_dart/pkg/unittest/lib/test_controller.js';
+  }
+  return """
 <!DOCTYPE html>
 <html>
 <head>
@@ -24,9 +29,10 @@
 <body>
   <h1> Running $title </h1>
   <script type="text/javascript"
-          src="/root_dart/pkg/unittest/lib/test_controller.js">
+          src="$testControllerJs">
   </script>
-  <script type="$scriptType" src="$sourceScript" onerror="externalError(null)"
+  <script type="$scriptType" src="$sourceScript"
+          onerror="scriptTagOnErrorCallback(null)"
           defer>
   </script>
   <script type="text/javascript"
@@ -34,8 +40,8 @@
   <script type="text/javascript"
           src="/root_dart/pkg/browser/lib/interop.js"></script>
 </body>
-</html>
-""";
+</html>""";
+}
 
 String dartTestWrapper(String libraryPathComponent) {
   return """
@@ -47,4 +53,4 @@
   print("dart-main-done");
 }
 """;
-}
\ No newline at end of file
+}
diff --git a/tools/testing/dart/co19_test.dart b/tools/testing/dart/co19_test.dart
index dd92951..dc28b47 100644
--- a/tools/testing/dart/co19_test.dart
+++ b/tools/testing/dart/co19_test.dart
@@ -36,6 +36,7 @@
     const <String>['-mrelease', '-rnone', '-cdartanalyzer'],
     const <String>['-mrelease', '-rnone', '-cdart2analyzer'],
     const <String>['-mrelease', '-rvm', '-cdart2dart', '--use-sdk'],
+    const <String>['-mrelease', '-rvm', '-cdart2dart', '--use-sdk', '--minified'],
     const <String>['-mrelease', '-rd8', '-cdart2js', '--use-sdk'],
     const <String>['-mrelease', '-rd8,jsshell', '-cdart2js', '--use-sdk',
                    '--minified'],
diff --git a/tools/testing/dart/launch_browser.dart b/tools/testing/dart/launch_browser.dart
index 3637906..0b752d3 100644
--- a/tools/testing/dart/launch_browser.dart
+++ b/tools/testing/dart/launch_browser.dart
@@ -12,6 +12,7 @@
 
 import "dart:io";
 import "browser_controller.dart";
+import "utils.dart";
 
 void printHelp() {
   print("Usage pattern:");
@@ -26,14 +27,15 @@
     printHelp();
     return;
   }
+  var name = args[0];
 
-  if (!Browser.supportedBrowser(args[0])) {
+  if (!Browser.supportedBrowser(name)) {
     print("Specified browser not supported");
     printHelp();
     return;
   }
 
-  var browser = new Browser.byName(args[0]);
+  var executable = Locations.getBrowserLocation(name, {});
+  var browser = new Browser.byName(name, executable);
   browser.start(args[1]);
-
 }
diff --git a/tools/testing/dart/status_expression.dart b/tools/testing/dart/status_expression.dart
index 9579249..96396ea 100644
--- a/tools/testing/dart/status_expression.dart
+++ b/tools/testing/dart/status_expression.dart
@@ -30,6 +30,13 @@
  *  to A if B is true, and to the empty set if B is false.
  */
 
+class ExprEvaluationException {
+  String error;
+
+  ExprEvaluationException(this.error);
+
+  toString() => error;
+}
 
 class Token {
   static const String LEFT_PAREN = "(";
@@ -97,7 +104,15 @@
 
   TermVariable(this.name);
 
-  String termValue(environment) => environment[name].toString();
+  String termValue(environment) {
+    var value = environment[name];
+    if (value == null) {
+      throw new ExprEvaluationException(
+          "Could not find '$name' in environment "
+          "while evaluating status file expression.");
+    }
+    return value.toString();
+  }
 }
 
 
diff --git a/tools/testing/dart/test_controller.js b/tools/testing/dart/test_controller.js
new file mode 100644
index 0000000..1b03546
--- /dev/null
+++ b/tools/testing/dart/test_controller.js
@@ -0,0 +1,293 @@
+// 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.
+
+/*
+ * The communication protocol between test_controller.js and the driving
+ * page are JSON encoded messages of the following form:
+ *   message = {
+ *      is_first_message: true/false,
+ *      is_status_update: true/false,
+ *      is_done: true/false,
+ *      message: message_content,
+ *   }
+ *
+ * The first message should have [is_first_message] set, the last message
+ * should have [is_done] set. Status updates should have [is_status_update] set.
+ *
+ * The [message_content] can be be any content. In our case it will a list of
+ * events encoded in JSON. See the next comment further down about what an event
+ * is.
+ */
+
+/*
+ * We will collect testing driver specific events here instead of printing
+ * them to the DOM.
+ * Every entry will look like this:
+ *   {
+ *     'type' : 'sync_exception' / 'window_onerror' / 'script_onerror' / 'print'
+ *              'window_compilationerror' / 'message_received' / 'dom' / 'debug'
+ *     'value' : 'some content',
+ *     'timestamp' : TimestampInMs,
+ *   }
+ */
+var recordedEventList = [];
+var timestampOfFirstEvent = null;
+
+var STATUS_UPDATE_INTERVALL = 5000; // Every 10 seconds.
+
+function getCurrentTimestamp() {
+  if (timestampOfFirstEvent == null) {
+    timestampOfFirstEvent = new Date().getTime();
+  }
+  return (new Date().getTime() - timestampOfFirstEvent) / 1000.0;
+}
+
+function stringifyEvent(event) {
+  return JSON.stringify(event, null, 2);
+}
+
+function recordEvent(type, value) {
+  var event = {
+    type: type,
+    value: value,
+    timestamp: getCurrentTimestamp()
+  };
+  recordedEventList.push(event);
+  printToConsole(stringifyEvent(event));
+}
+
+function clearConsole() {
+  // Clear the console before every test run - this is Firebug specific code.
+  if (typeof console == 'object' && typeof console.clear == 'function') {
+    console.clear();
+  }
+}
+
+function printToDOM(message) {
+  var pre = document.createElement('pre');
+  pre.appendChild(document.createTextNode(String(message)));
+  document.body.appendChild(pre);
+  document.body.appendChild(document.createTextNode('\n'));
+}
+
+function printToConsole(message) {
+  var consoleAvailable = typeof console === 'object';
+
+  if (!consoleAvailable) {
+    printToDOM(message);
+  } else {
+    console.log(message);
+  }
+}
+
+clearConsole();
+
+// Some tests may expect and have no way to suppress global errors.
+var testExpectsGlobalError = false;
+var testSuppressedGlobalErrors = [];
+
+// Set window onerror to make sure that we catch test harness errors across all
+// browsers.
+window.onerror = function (message, url, lineNumber) {
+  if (url) {
+    message = ('window.onerror called: \n\n' +
+        url + ':' + lineNumber + ':\n' + message + '\n\n');
+  }
+  if (testExpectsGlobalError) {
+    testSuppressedGlobalErrors.push({
+      message: message
+    });
+    return;
+  }
+  recordEvent('window_onerror', message);
+  notifyDone('FAIL');
+};
+
+// testRunner is provided by content shell.
+// It is not available in browser tests.
+var testRunner = window.testRunner || window.layoutTestController;
+var isContentShell = testRunner;
+
+var waitForDone = false;
+
+// Returns the driving window object if available
+function getDriverWindow() {
+  if (window != window.parent) {
+    // We're running in an iframe.
+    return window.parent;
+  } else if (window.opener) {
+    // We were opened by another window.
+    return window.opener;
+  }
+  return null;
+}
+
+function usingBrowserController() {
+  return getDriverWindow() != null;
+}
+
+function buildDomEvent() {
+  return {
+      type: 'dom',
+      value: '' + window.document.documentElement.innerHTML,
+      timestamp: getCurrentTimestamp()
+  };
+}
+
+function notifyUpdate(testOutcome, isFirstMessage, isStatusUpdate, isDone) {
+  // If we are not using the browser controller (e.g. in the none-drt
+  // configuration), we need to print 'testOutcome' as it is.
+  if (isDone && !usingBrowserController()) {
+    if (isContentShell) {
+      // We need this, since test.dart is looking for 'FAIL\n', 'PASS\n' in the
+      // DOM output of content shell.
+      printToDOM(testOutcome);
+    } else {
+      printToConsole('Test outcome: ' + testOutcome);
+    }
+  } else if (usingBrowserController()) {
+    // To support in browser launching of tests we post back start and result
+    // messages to the window.opener.
+    var driver = getDriverWindow();
+
+    // Post the DOM and all events that happened.
+    var events = recordedEventList.slice(0);
+    events.push(buildDomEvent());
+
+    var message = JSON.stringify(events);
+    driver.postMessage(
+        JSON.stringify({
+          message: message,
+          is_first_message: isFirstMessage,
+          is_status_update: isStatusUpdate,
+          is_done: isDone
+        }), '*');
+  }
+  if (isDone) {
+    if (testRunner) testRunner.notifyDone();
+  }
+}
+
+function notifyDone(testOutcome) {
+  notifyUpdate(testOutcome, false, false, true);
+}
+
+// Repeatedly send back the current status of this test.
+function sendStatusUpdate(isFirstMessage) {
+  notifyUpdate('', isFirstMessage, true, false);
+  setTimeout(function() {sendStatusUpdate(false)}, STATUS_UPDATE_INTERVALL);
+}
+
+// We call notifyStart here to notify the encapsulating browser.
+recordEvent('debug', 'test_controller.js started');
+sendStatusUpdate(true);
+
+function processMessage(msg) {
+  // Filter out ShadowDOM polyfill messages which are random floats.
+  if (msg != parseFloat(msg)) {
+    recordEvent('message_received', '' + msg);
+  }
+  if (typeof msg != 'string') return;
+  if (msg == 'unittest-suite-wait-for-done') {
+    waitForDone = true;
+    if (testRunner) {
+      testRunner.startedDartTest = true;
+    }
+  } else if (msg == 'dart-calling-main') {
+    if (testRunner) {
+      testRunner.startedDartTest = true;
+    }
+  } else if (msg == 'dart-main-done') {
+    if (!waitForDone) {
+      notifyDone('PASS');
+    }
+  } else if (msg == 'unittest-suite-success' ||
+             msg == 'unittest-suite-done') {
+    notifyDone('PASS');
+  } else if (msg == 'unittest-suite-fail') {
+    notifyDone('FAIL');
+  }
+}
+
+function onReceive(e) {
+  processMessage(e.data);
+}
+
+if (testRunner) {
+  testRunner.dumpAsText();
+  testRunner.waitUntilDone();
+}
+window.addEventListener('message', onReceive, false);
+
+function onLoad(e) {
+  // needed for dartium compilation errors.
+  if (window.compilationError) {
+    recordEvent('window_compilationerror',
+        'DOMContentLoaded event: window.compilationError = ' +
+        calledwindow.compilationError);
+    notifyDone('FAIL');
+  }
+}
+
+window.addEventListener('DOMContentLoaded', onLoad, false);
+
+// Note: before renaming this function, note that it is also included in an
+// inlined error handler in the HTML files that wrap DRT tests.
+// See: tools/testing/dart/browser_test.dart
+function scriptTagOnErrorCallback(e) {
+  var message = e && e.message;
+  recordEvent('script_onerror', 'script.onError called: ' + message);
+  notifyDone('FAIL');
+}
+
+// dart2js will generate code to call this function to handle the Dart
+// [print] method.
+//
+// dartium will invoke this method for [print] calls if the environment variable
+// "DART_FORWARDING_PRINT" was set when launching dartium.
+//
+// Our tests will be wrapped, so we can detect when [main] is called and when
+// it has ended.
+// The wrapping happens either via "dartMainRunner" (for dart2js) or wrapped
+// tests for dartium.
+//
+// The following messages are handled specially:
+//   dart-calling-main:  signals that the dart [main] function will be invoked
+//   dart-main-done:  signals that the dart [main] function has finished
+//   unittest-suite-wait-for-done:  signals the start of an asynchronous test
+//   unittest-suite-success:  signals the end of an asynchrounous test
+//   unittest-suite-fail:  signals that the asynchronous test failed
+//   unittest-suite-done:  signals the end of an asynchronous test, the outcome
+//                         is unknown
+//
+// These messages are used to communicate with the test and will be posted so
+// [processMessage] above can see it.
+function dartPrint(message) {
+  recordEvent('print', message);
+  if ((message === 'unittest-suite-wait-for-done') ||
+      (message === 'unittest-suite-success') ||
+      (message === 'unittest-suite-fail') ||
+      (message === 'unittest-suite-done') ||
+      (message === 'dart-calling-main') ||
+      (message === 'dart-main-done')) {
+    // We have to do this asynchronously, in case error messages are
+    // already in the message queue.
+    window.postMessage(message, '*');
+    return;
+  }
+}
+
+// dart2js will generate code to call this function instead of calling
+// Dart [main] directly. The argument is a closure that invokes main.
+function dartMainRunner(main) {
+  dartPrint('dart-calling-main');
+  try {
+    main();
+  } catch (e) {
+    recordEvent('sync_exception', 'Exception: ' + e + '\nStack: ' + e.stack);
+    notifyDone('FAIL');
+    return;
+  }
+  dartPrint('dart-main-done');
+}
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index b1528ec..feda5b9 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -243,6 +243,24 @@
               [],
               ''),
           new _TestOptionSpecification(
+              'firefox',
+              'Path to firefox browser executable',
+              ['--firefox'],
+              [],
+              ''),
+          new _TestOptionSpecification(
+              'chrome',
+              'Path to chrome browser executable',
+              ['--chrome'],
+              [],
+              ''),
+          new _TestOptionSpecification(
+              'safari',
+              'Path to safari browser executable',
+              ['--safari'],
+              [],
+              ''),
+          new _TestOptionSpecification(
               'use_sdk',
               '''Use compiler or runtime from the SDK.
 
@@ -284,14 +302,6 @@
               'bool'
               ),
           new _TestOptionSpecification(
-              'use_browser_controller',
-              'Use the new selenium replacement browser-controller.',
-              ['--use_browser_controller'],
-              [],
-              false,
-              'bool'
-              ),
-          new _TestOptionSpecification(
               'clear_safari_cache',
               'Clear the safari cache (i.e., delete it).',
               ['--clear_safari_cache'],
@@ -484,8 +494,8 @@
   // options.
   Set<String>  _blacklistedOptions = new Set<String>.from([
     'progress', 'failure-summary', 'step_name', 'report', 'tasks', 'verbose',
-    'time', 'dart', 'drt', 'dartium', 'build_directory', 'append_logs',
-    'local_ip', 'shard', 'shards',
+    'time', 'dart', 'drt', 'dartium', 'firefox', 'chrome', 'safari',
+    'build_directory', 'append_logs', 'local_ip', 'shard', 'shards',
   ]);
 
   List<String> _constructReproducingCommandArguments(Map config) {
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 9f62c9c..e5205b1 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -13,7 +13,7 @@
 
 import "dart:async";
 import "dart:collection" show Queue;
-import "dart:convert" show LineSplitter, UTF8;
+import "dart:convert" show LineSplitter, UTF8, JSON;
 // We need to use the 'io' prefix here, otherwise io.exitCode will shadow
 // CommandOutput.exitCode in subclasses of CommandOutput.
 import "dart:io" as io;
@@ -309,60 +309,26 @@
   }
 }
 
-class SeleniumTestCommand extends Command {
-  final String browser;
-  final String url;
-
-  SeleniumTestCommand._(String _browser,
-                        this.url,
-                        String executable,
-                        List<String> arguments,
-                        String configurationDir)
-      : super._(_browser, executable, arguments, configurationDir),
-        browser = _browser;
-
-  void _buildHashCode(HashCodeBuilder builder) {
-    super._buildHashCode(builder);
-    builder.add(browser);
-    builder.add(url);
-  }
-
-  bool _equal(Command other) {
-    return
-        other is SeleniumTestCommand &&
-        super._equal(other) &&
-        browser == other.browser &&
-        url == other.url;
-  }
-}
-
 class AnalysisCommand extends Command {
   final String flavor;
 
-  // If [fileFilter] is given, only errors/warnings reported by the analyzer
-  // for which [fileFilter] returns [:true:] are considered.
-  final Function fileFilter;
-
   AnalysisCommand._(this.flavor,
                     String displayName,
                     String executable,
                     List<String> arguments,
-                    String configurationDir,
-                    this.fileFilter)
+                    String configurationDir)
       : super._(displayName, executable, arguments, configurationDir);
 
   void _buildHashCode(HashCodeBuilder builder) {
     super._buildHashCode(builder);
     builder.add(flavor);
-    builder.add(fileFilter);
   }
 
   bool _equal(Command other) {
     return
         other is AnalysisCommand &&
         super._equal(other) &&
-        flavor == other.flavor &&
-        fileFilter == other.fileFilter;
+        flavor == other.flavor;
   }
 }
 
@@ -415,16 +381,6 @@
     return _getUniqueCommand(command);
   }
 
-  SeleniumTestCommand getSeleniumTestCommand(String browser,
-                                             String url,
-                                             String executable,
-                                             List<String> arguments,
-                                             String configurationDir) {
-    var command = new SeleniumTestCommand._(
-        browser, url, executable, arguments, configurationDir);
-    return _getUniqueCommand(command);
-  }
-
   CompilationCommand getCompilationCommand(String displayName,
                                            outputFile,
                                            neverSkipCompilation,
@@ -441,10 +397,9 @@
 
   AnalysisCommand getAnalysisCommand(
       String displayName, executable, arguments, String configurationDir,
-      {String flavor: 'dartanalyzer', Function fileFilter: null}) {
+      {String flavor: 'dartanalyzer'}) {
     var command = new AnalysisCommand._(
-        flavor, displayName, executable, arguments, configurationDir,
-        fileFilter);
+        flavor, displayName, executable, arguments, configurationDir);
     return _getUniqueCommand(command);
   }
 
@@ -563,8 +518,6 @@
 
   List<String> get batchTestArguments => commands.last.arguments;
 
-  bool get usesWebDriver => TestUtils.usesWebDriver(configuration['runtime']);
-
   bool get isFlaky {
       if (expectedOutcomes.contains(Expectation.SKIP) ||
           expectedOutcomes.contains(Expectation.SKIP_BY_DESIGN)) {
@@ -700,12 +653,7 @@
     if (io.Platform.operatingSystem == 'windows') {
       // The VM uses std::abort to terminate on asserts.
       // std::abort terminates with exit code 3 on Windows.
-      if (exitCode == 3) {
-        return !timedOut;
-      }
-      // TODO(ricow): Remove this dirty hack ones we have a selenium
-      // replacement.
-      if (exitCode == CRASHING_BROWSER_EXITCODE) {
+      if (exitCode == 3 || exitCode == CRASHING_BROWSER_EXITCODE) {
         return !timedOut;
       }
       // If a program receives an uncaught system exception, the program
@@ -878,8 +826,11 @@
       }
       assert(containsPass);
       if (exitCode != 0) {
-        DebugLogger.warning("All tests passed, but exitCode != 0. "
-                            "($command)");
+        var message = "All tests passed, but exitCode != 0. "
+                      "Actual exitcode: $exitCode. "
+                      "($command)";
+        DebugLogger.warning(message);
+        diagnostics.add(message);
       }
       return (exitCode != 0 && !hasCrashed);
     }
@@ -919,6 +870,220 @@
   }
 }
 
+class BrowserTestJsonResult {
+  static const ALLOWED_TYPES =
+      const ['sync_exception', 'window_onerror', 'script_onerror',
+             'window_compilationerror', 'print', 'message_received', 'dom',
+             'debug'];
+
+  final Expectation outcome;
+  final String htmlDom;
+  final List events;
+
+  BrowserTestJsonResult(this.outcome, this.htmlDom, this.events);
+
+  static BrowserTestJsonResult parseFromString(String content) {
+    void validate(String assertion, bool value) {
+      if (!value) {
+        throw "InvalidFormat sent from browser driving page: $assertion:\n\n"
+               "$content";
+      }
+    }
+
+    var events;
+    try {
+      events = JSON.decode(content);
+      if (events != null) {
+        validate("Message must be a List", events is List);
+
+        Map<String, List<String>> messagesByType = {};
+        ALLOWED_TYPES.forEach((type) => messagesByType[type] = <String>[]);
+
+        for (var entry in events) {
+          validate("An entry must be a Map", entry is Map);
+
+          var type = entry['type'];
+          var value = entry['value'];
+          var timestamp = entry['timestamp'];
+
+          validate("'type' of an entry must be a String",
+                   type is String);
+          validate("'type' has to be in $ALLOWED_TYPES.",
+                   ALLOWED_TYPES.contains(type));
+          validate("'timestamp' of an entry must be a number",
+                   timestamp is num);
+
+          messagesByType[type].add(value);
+        }
+        validate("The message must have exactly one 'dom' entry.",
+            messagesByType['dom'].length == 1);
+
+        var dom = messagesByType['dom'][0];
+        if (dom.endsWith('\n')) {
+          dom = '$dom\n';
+        }
+
+        return new BrowserTestJsonResult(
+            _getOutcome(messagesByType), dom, events);
+      }
+    } catch(error) {
+      // If something goes wrong, we know the content was not in the correct
+      // JSON format. So we can't parse it.
+      // The caller is responsible for falling back to the old way of
+      // determining if a test failed.
+    }
+
+    return null;
+  }
+
+  static Expectation _getOutcome(Map<String, List<String>> messagesByType) {
+    occured(type) => messagesByType[type].length > 0;
+    searchForMsg(types, message) {
+      return types.any((type) => messagesByType[type].contains(message));
+    }
+
+    // FIXME(kustermann,ricow): I think this functionality doesn't work in
+    // test_controller.js: So far I haven't seen anything being reported on
+    // "window.compilationerror"
+    if (occured('window_compilationerror')) {
+      return Expectation.COMPILETIME_ERROR;
+    }
+
+    if (occured('sync_exception') ||
+        occured('window_onerror') ||
+        occured('script_onerror')) {
+      return Expectation.RUNTIME_ERROR;
+    }
+
+    if (messagesByType['dom'][0].contains('FAIL')) {
+      return Expectation.RUNTIME_ERROR;
+    }
+
+    // We search for these messages in 'print' and 'message_received' because
+    // the unittest implementation posts these messages using
+    // "window.postMessage()" instead of the normal "print()" them.
+
+    var isAsyncTest = searchForMsg(['print', 'message_received'],
+                                   'unittest-suite-wait-for-done');
+    var isAsyncSuccess =
+        searchForMsg(['print', 'message_received'], 'unittest-suite-success') ||
+        searchForMsg(['print', 'message_received'], 'unittest-suite-done');
+
+    if (isAsyncTest) {
+      if (isAsyncSuccess) {
+        return Expectation.PASS;
+      }
+      return Expectation.RUNTIME_ERROR;
+    }
+
+    var mainStarted =
+        searchForMsg(['print', 'message_received'], 'dart-calling-main');
+    var mainDone =
+        searchForMsg(['print', 'message_received'], 'dart-main-done');
+
+    if (mainStarted && mainDone) {
+      return Expectation.PASS;
+    }
+    return Expectation.FAIL;
+  }
+}
+
+class BrowserControllerTestOutcome extends CommandOutputImpl
+                                   with UnittestSuiteMessagesMixin {
+  BrowserTestOutput _result;
+  Expectation _rawOutcome;
+
+  factory BrowserControllerTestOutcome(Command command,
+                                       BrowserTestOutput result) {
+    void validate(String assertion, bool value) {
+      if (!value) {
+        throw "InvalidFormat sent from browser driving page: $assertion:\n\n"
+              "${result.lastKnownMessage}";
+      }
+    }
+
+    String indent(String string, int numSpaces) {
+      var spaces = new List.filled(numSpaces, ' ').join('');
+      return string.replaceAll('\r\n', '\n')
+          .split('\n')
+          .map((line) => "$spaces$line")
+          .join('\n');
+    }
+
+    String stdout = "";
+    String stderr = "";
+    Expectation outcome;
+
+    var parsedResult =
+        BrowserTestJsonResult.parseFromString(result.lastKnownMessage);
+    if (parsedResult != null) {
+      outcome = parsedResult.outcome;
+    } else {
+      // Old way of determining whether a test failed or passed.
+      if (result.lastKnownMessage.contains("FAIL")) {
+        outcome = Expectation.RUNTIME_ERROR;
+      } else if (result.lastKnownMessage.contains("PASS")) {
+        outcome = Expectation.PASS;
+      } else {
+        outcome = Expectation.RUNTIME_ERROR;
+      }
+    }
+
+    if (result.didTimeout) {
+      if (result.delayUntilTestStarted != null) {
+        stderr = "This test timed out. The delay until the test actually "
+                 "started was: ${result.delayUntilTestStarted}.";
+      } else {
+        // TODO(ricow/kustermann) as soon as we record the state periodically,
+        // we will have more information and can remove this warning.
+        stderr = "This test has not notified test.py that it started running. "
+                 "This could be a bug in test.py! "
+                 "Please contact ricow/kustermann";
+      }
+    }
+
+    if (parsedResult != null) {
+      stdout = "events:\n${indent(prettifyJson(parsedResult.events), 2)}\n\n";
+    } else {
+      stdout = "message:\n${indent(result.lastKnownMessage, 2)}\n\n";
+    }
+
+    stderr =
+        '$stderr\n\n'
+        'BrowserOutput while running the test (* EXPERIMENTAL *):\n'
+        'BrowserOutput.stdout:\n'
+        '${indent(result.browserOutput.stdout.toString(), 2)}\n'
+        'BrowserOutput.stderr:\n'
+        '${indent(result.browserOutput.stderr.toString(), 2)}\n'
+        '\n';
+    return new BrowserControllerTestOutcome._internal(
+      command, result, outcome, encodeUtf8(stdout), encodeUtf8(stderr));
+  }
+
+  BrowserControllerTestOutcome._internal(
+      Command command, BrowserTestOutput result, this._rawOutcome,
+      List<int> stdout, List<int> stderr)
+      : super(command, 0, result.didTimeout, stdout, stderr, result.duration,
+              false) {
+    _result = result;
+  }
+
+  Expectation result(TestCase testCase) {
+    // Handle timeouts first
+    if (_result.didTimeout)  return Expectation.TIMEOUT;
+
+    // Multitests are handled specially
+    if (testCase.info != null) {
+      if (testCase.info.hasRuntimeError) {
+        if (_rawOutcome == Expectation.RUNTIME_ERROR) return Expectation.PASS;
+        return Expectation.MISSING_RUNTIME_ERROR;
+      }
+    }
+
+    return _negateOutcomeIfNegativeTest(_rawOutcome, testCase.isNegative);
+  }
+}
+
 
 class AnalysisCommandOutputImpl extends CommandOutputImpl {
   // An error line has 8 fields that look like:
@@ -987,11 +1152,6 @@
 
   void parseAnalyzerOutput(List<String> outErrors, List<String> outWarnings) {
     AnalysisCommand analysisCommand = command;
-    Function fileFilter = analysisCommand.fileFilter;
-    if (fileFilter == null) {
-      // If no filter function was given, we don't filter the output at all.
-      fileFilter = (arg) => true;
-    }
 
     // Parse a line delimited by the | character using \ as an escape charager
     // like:  FOO|BAR|FOO\|BAR|FOO\\BAZ as 4 fields: FOO BAR FOO|BAR FOO\BAZ
@@ -1022,12 +1182,10 @@
       List<String> fields = splitMachineError(line);
       // We only consider errors/warnings for files of interest.
       if (fields.length > FILENAME) {
-        if (fileFilter(fields[FILENAME])) {
-          if (fields[ERROR_LEVEL] == 'ERROR') {
-            outErrors.add(fields[FORMATTED_ERROR]);
-          } else if (fields[ERROR_LEVEL] == 'WARNING') {
-            outWarnings.add(fields[FORMATTED_ERROR]);
-          }
+        if (fields[ERROR_LEVEL] == 'ERROR') {
+          outErrors.add(fields[FORMATTED_ERROR]);
+        } else if (fields[ERROR_LEVEL] == 'WARNING') {
+          outWarnings.add(fields[FORMATTED_ERROR]);
         }
         // OK to Skip error output that doesn't match the machine format
       }
@@ -1106,7 +1264,7 @@
 
     // Multitests are handled specially
     if (testCase.info != null) {
-      if (testCase.info.hasCompileError) {
+    if (testCase.info.hasCompileError) {
         // Nonzero exit code of the compiler means compilation failed
         // TODO(kustermann): Do we have a special exit code in that case???
         if (exitCode != 0) {
@@ -1167,10 +1325,6 @@
     return new HTMLBrowserCommandOutputImpl(
         command, exitCode, timedOut, stdout, stderr,
         time, compilationSkipped);
-  } else if (command is SeleniumTestCommand) {
-    return new BrowserCommandOutputImpl(
-        command, exitCode, timedOut, stdout, stderr,
-        time, compilationSkipped);
   } else if (command is AnalysisCommand) {
     return new AnalysisCommandOutputImpl(
         command, exitCode, timedOut, stdout, stderr,
@@ -1192,18 +1346,6 @@
 }
 
 
-/** Modifies the --timeout=XX parameter passed to run_selenium.py */
-List<String> _modifySeleniumTimeout(List<String> arguments, int timeout) {
-  return arguments.map((argument) {
-    if (argument.startsWith('--timeout=')) {
-      return "--timeout=$timeout";
-    } else {
-      return argument;
-    }
-  }).toList();
-}
-
-
 /**
  * A RunningProcess actually runs a test, getting the command lines from
  * its [TestCase], starting the test process (and first, a compilation
@@ -1241,11 +1383,9 @@
         _commandComplete(0);
       } else {
         var processEnvironment = _createProcessEnvironment();
-        var commandArguments = _modifySeleniumTimeout(command.arguments,
-                                                      timeout);
         Future processFuture =
             io.Process.start(command.executable,
-                             commandArguments,
+                             command.arguments,
                              environment: processEnvironment);
         processFuture.then((io.Process process) {
           // Close stdin so that tests that try to block on input will fail.
@@ -1318,24 +1458,17 @@
   static bool isWindows = io.Platform.operatingSystem == 'windows';
 
   final batchRunnerTypes = {
-      'selenium' : {
-          'run_executable' : 'python',
-          'run_arguments' : ['tools/testing/run_selenium.py', '--batch'],
-          'terminate_command' : ['--terminate'],
-      },
       'dartanalyzer' : {
         'run_executable' :
            isWindows ?
              'sdk\\bin\\dartanalyzer_developer.bat'
               : 'sdk/bin/dartanalyzer_developer',
         'run_arguments' : ['--batch'],
-        'terminate_command' : null,
       },
       'dart2analyzer' : {
         // This is a unix shell script, no windows equivalent available
         'run_executable' : 'editor/tools/analyzer',
         'run_arguments' : ['--batch'],
-        'terminate_command' : null,
     },
   };
 
@@ -1403,18 +1536,7 @@
       if (killTimer != null) killTimer.cancel();
       terminateCompleter.complete(true);
     };
-    var shutdownCommand = batchRunnerTypes[_runnerType]['terminate_command'];
-    if (shutdownCommand != null && !shutdownCommand.isEmpty) {
-      // Use a graceful shutdown so our Selenium script can close
-      // the open browser processes. On Windows, signals do not exist
-      // and a kill is a hard kill.
-      _process.stdin.writeln(shutdownCommand.join(' '));
-
-      // In case the run_selenium process didn't close, kill it after 30s
-      killTimer = new Timer(new Duration(seconds: 30), _process.kill);
-    } else {
-      _process.kill();
-    }
+    _process.kill();
 
     return terminateCompleter.future;
   }
@@ -1438,7 +1560,6 @@
   }
 
   String _createArgumentsLine(List<String> arguments, int timeout) {
-    arguments = _modifySeleniumTimeout(arguments, timeout);
     return arguments.join(' ') + '\n';
   }
 
@@ -1767,9 +1888,7 @@
 
     if (_numProcesses < _maxProcesses && !_runQueue.isEmpty) {
       Command command = _runQueue.removeFirst();
-      var isBrowserCommand =
-          command is SeleniumTestCommand ||
-          command is BrowserTestCommand;
+      var isBrowserCommand = command is BrowserTestCommand;
 
       if (isBrowserCommand && _numBrowserProcesses == _maxBrowserProcesses) {
         // If there is no free browser runner, put it back into the queue.
@@ -1855,7 +1974,7 @@
   final int maxProcesses;
   final int maxBrowserProcesses;
 
-  // For dartc/selenium batch processing we keep a list of batch processes.
+  // For dartanalyzer batch processing we keep a list of batch processes.
   final _batchProcesses = new Map<String, List<BatchRunnerProcess>>();
   // We keep a BrowserTestRunner for every "browserName-checked" configuration.
   final _browserTestRunners = new Map<String, BrowserTestRunner>();
@@ -1908,11 +2027,6 @@
 
     if (command is BrowserTestCommand) {
       return _startBrowserControllerTest(command, timeout);
-    } else if (command is SeleniumTestCommand && batchMode) {
-      var arguments = ['--force-refresh', '--browser=${command.browser}',
-                       '--timeout=${timeout}', '--out', '${command.url}'];
-      return _getBatchRunner(command.browser)
-          .runCommand('selenium', command, timeout, arguments);
     } else if (command is AnalysisCommand && batchMode) {
       return _getBatchRunner(command.flavor)
           .runCommand(command.flavor, command, timeout, command.arguments);
@@ -1943,31 +2057,8 @@
     var completer = new Completer<CommandOutput>();
 
     var callback = (BrowserTestOutput output) {
-      bool timedOut = output.didTimeout;
-      String stderr = "";
-      if (timedOut) {
-        if (output.delayUntilTestStarted != null) {
-          stderr = "This test timed out. The delay until the test actually "
-                   "started was: ${output.delayUntilTestStarted}.";
-        } else {
-          stderr = "This test has not notified test.py that it started running."
-                   " This could be a bug in test.py! "
-                   "Please contact ricow/kustermann";
-        }
-      }
-      stderr =
-          '$stderr\n\n'
-          'BrowserOutput while running the test (* EXPERIMENTAL *):\n'
-          'BrowserOutput.stdout:\n${output.browserOutput.stdout.toString()}\n'
-          'BrowserOutput.stderr:\n${output.browserOutput.stderr.toString()}\n';
-      var commandOutput = createCommandOutput(browserCommand,
-                          0,
-                          timedOut,
-                          encodeUtf8(output.dom),
-                          encodeUtf8(stderr),
-                          output.duration,
-                          false);
-      completer.complete(commandOutput);
+      completer.complete(
+          new BrowserControllerTestOutcome(browserCommand, output));
     };
     BrowserTest browserTest = new BrowserTest(browserCommand.url,
                                               callback,
@@ -2078,11 +2169,6 @@
       }
     }
 
-    // Selenium tests can be flaky. Try re-running.
-    if (command is SeleniumTestCommand) {
-      return true;
-    }
-
     // We currently rerun dartium tests, see issue 14074
     if (command is BrowserTestCommand && command.displayName == 'dartium') {
       return true;
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 19d5bbb..1d4c4dc 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1093,34 +1093,7 @@
 
         List<String> args = <String>[];
 
-        if (configuration['use_browser_controller']) {
-          // This command is not actually run, it is used for reproducing
-          // the failure.
-          args = ['tools/testing/dart/launch_browser.dart',
-                  runtime,
-                  fullHtmlPath];
-          commandSet.add(CommandBuilder.instance.getBrowserTestCommand(
-              runtime, fullHtmlPath, TestUtils.dartTestExecutable.toString(),
-              args, configurationDir, checkedMode: configuration['checked']));
-        } else if (TestUtils.usesWebDriver(runtime)) {
-          args = [
-              dartDir.append('tools/testing/run_selenium.py').toNativePath(),
-              '--browser=$runtime',
-              // NOTE: This value will be overridden by the test runner
-              '--timeout=${configuration['timeout']}',
-              '--out=$fullHtmlPath'];
-          if (runtime == 'dartium') {
-            var dartiumLocation = Locations.getDartiumLocation(configuration);
-            args.add('--executable=$dartiumLocation');
-          }
-          if (subtestIndex != 0) {
-            args.add('--force-refresh');
-          }
-          commandSet.add(CommandBuilder.instance.getSeleniumTestCommand(
-                  runtime, fullHtmlPath, 'python', args, configurationDir));
-        } else {
-          assert(runtime == "drt");
-
+        if (runtime == "drt") {
           var dartFlags = [];
           var contentShellOptions = [];
 
@@ -1139,6 +1112,15 @@
           commandSet.add(CommandBuilder.instance.getContentShellCommand(
               contentShellFilename, fullHtmlPath, contentShellOptions,
               dartFlags, configurationDir));
+        } else {
+          // This command is not actually run, it is used for reproducing
+          // the failure.
+          args = ['tools/testing/dart/launch_browser.dart',
+                  runtime,
+                  fullHtmlPath];
+          commandSet.add(CommandBuilder.instance.getBrowserTestCommand(
+              runtime, fullHtmlPath, TestUtils.dartTestExecutable.toString(),
+              args, configurationDir, checkedMode: configuration['checked']));
         }
 
         // Create BrowserTestCase and queue it.
@@ -1648,14 +1630,9 @@
 
   AnalysisCommand makeAnalysisCommand(TestInformation info,
                                       List<String> arguments) {
-    bool fileFilter(String filepath) {
-      return filepath == "${info.originTestPath}";
-    }
-
     return CommandBuilder.instance.getAnalysisCommand(
         configuration['compiler'], dartShellFileName, arguments,
-        configurationDir, flavor: configuration['compiler'],
-        fileFilter: fileFilter);
+        configurationDir, flavor: configuration['compiler']);
   }
 
   bool get listRecursively => true;
@@ -1917,8 +1894,9 @@
     return args;
   }
 
-  static bool usesWebDriver(String runtime) {
+  static bool isBrowserRuntime(String runtime) {
     const BROWSERS = const [
+      'drt',
       'dartium',
       'ie9',
       'ie10',
@@ -1933,9 +1911,6 @@
     return BROWSERS.contains(runtime);
   }
 
-  static bool isBrowserRuntime(String runtime) =>
-      runtime == 'drt' || TestUtils.usesWebDriver(runtime);
-
   static bool isJsCommandLineRuntime(String runtime) =>
       const ['d8', 'jsshell'].contains(runtime);
 
@@ -2015,6 +1990,8 @@
   static int compileErrorSkip = 0;
 
   static void add(Set<Expectation> expectations) {
+    bool containsFail = expectations.any(
+        (expectation) => expectation.canBeOutcomeOf(Expectation.FAIL));
     ++total;
     if (expectations.contains(Expectation.SKIP)) {
       ++skipped;
@@ -2022,8 +1999,9 @@
       ++skipped;
       ++skippedByDesign;
     } else {
+      // Counts the number of flaky tests.
       if (expectations.contains(Expectation.PASS) &&
-          expectations.contains(Expectation.FAIL) &&
+          containsFail &&
           !expectations.contains(Expectation.CRASH) &&
           !expectations.contains(Expectation.OK)) {
         ++noCrash;
@@ -2035,7 +2013,7 @@
           expectations.length == 2) {
         ++failOk;
       }
-      if (expectations.contains(Expectation.FAIL) && expectations.length == 1) {
+      if (containsFail && expectations.length == 1) {
         ++fail;
       }
       if (expectations.contains(Expectation.CRASH) &&
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index 65949b7..fb71f3f 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -65,6 +65,53 @@
   static String get _datetime => "${new DateTime.now()}";
 }
 
+String prettifyJson(Object json, {int startIndentation: 0, int shiftWidth: 6}) {
+  int currentIndentation = startIndentation;
+  var buffer = new StringBuffer();
+
+  String indentationString() {
+    return new List.filled(currentIndentation, ' ').join('');
+  }
+
+  addString(String s, {bool indentation: true, bool newLine: true}) {
+    if (indentation) {
+      buffer.write(indentationString());
+    }
+    buffer.write(s.replaceAll("\n", "\n${indentationString()}"));
+    if (newLine) buffer.write("\n");
+  }
+
+  prettifyJsonInternal(
+      Object obj, {bool indentation: true, bool newLine: true}) {
+    if (obj is List) {
+      addString("[", indentation: indentation);
+      currentIndentation += shiftWidth;
+      for (var item in obj) {
+
+        prettifyJsonInternal(item, indentation: indentation, newLine: false);
+        addString(",", indentation: false);
+      }
+      currentIndentation -= shiftWidth;
+      addString("]", indentation: indentation);
+    } else if (obj is Map) {
+      addString("{", indentation: indentation);
+      currentIndentation += shiftWidth;
+      for (var key in obj.keys) {
+        addString("$key: ", indentation: indentation, newLine: false);
+        currentIndentation += shiftWidth;
+        prettifyJsonInternal(obj[key], indentation: false);
+        currentIndentation -= shiftWidth;
+      }
+      currentIndentation -= shiftWidth;
+      addString("}", indentation: indentation, newLine: newLine);
+    } else {
+      addString("$obj", indentation: indentation, newLine: newLine);
+    }
+  }
+  prettifyJsonInternal(json);
+  return buffer.toString();
+}
+
 
 /**
  * [areByteArraysEqual] compares a range of bytes from [buffer1] with a
@@ -126,16 +173,47 @@
 }
 
 class Locations {
-  static String getDartiumLocation(Map globalConfiguration) {
-    var dartium = globalConfiguration['dartium'];
-    if (dartium != null && dartium != '') {
-      return dartium;
+  static String getBrowserLocation(String browserName,
+                                   Map globalConfiguration) {
+    var location = globalConfiguration[browserName];
+    if (location != null && location != '') {
+      return location;
     }
-    if (Platform.operatingSystem == 'macos') {
-      return new Path('client/tests/dartium/Chromium.app/Contents/'
-          'MacOS/Chromium').toNativePath();
+    final browserLocations = const {
+        'firefox': const {
+          'windows': 'C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe',
+          'linux': 'firefox',
+          'macos': '/Applications/Firefox.app/Contents/MacOS/firefox'
+        },
+        'chrome': const {
+          'windows':
+            'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
+          'macos':
+            '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
+          'linux': 'google-chrome'
+        },
+        'dartium': const {
+          'windows': 'client\\tests\\dartium\\chrome.exe',
+          'macos': 'client/tests/dartium/Chromium.app/Contents/MacOS/Chromium',
+          'linux': 'client/tests/dartium/chrome'
+        },
+        'safari': const {
+          'macos': '/Applications/Safari.app/Contents/MacOS/Safari'
+        },
+        'ie9': const {
+          'windows': 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
+        },
+        'ie10': const {
+          'windows': 'C:\\Program Files\\Internet Explorer\\iexplore.exe'
+        }};
+
+    assert(browserLocations[browserName] != null);
+    location = browserLocations[browserName][Platform.operatingSystem];
+    if (location != null) {
+      return location;
+    } else {
+      throw '$browserName not supported on ${Platform.operatingSystem}';
     }
-    return new Path('client/tests/dartium/chrome').toNativePath();
   }
 }
 
diff --git a/utils/apidoc/docgen.gyp b/utils/apidoc/docgen.gyp
new file mode 100644
index 0000000..27cc69d
--- /dev/null
+++ b/utils/apidoc/docgen.gyp
@@ -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.
+
+{
+  'variables' : {
+    'script_suffix%': '',
+  },
+  'conditions' : [
+    ['OS=="win"', {
+      'variables' : {
+        'script_suffix': '.bat',
+      },
+    }],
+  ],
+  'targets': [
+    {
+      'target_name': 'docgen',
+      'type': 'none',
+      'dependencies': [
+        '../../utils/compiler/compiler.gyp:dart2js',
+        '../../runtime/dart-runtime.gyp:dart',
+        '../../pkg/pkg.gyp:pkg_packages',
+        'apidoc.gyp:api_docs',
+      ],
+      'includes': [
+        '../../sdk/lib/core/corelib_sources.gypi',
+      ],
+      'actions': [
+        {
+          'action_name': 'run_docgen',
+          # The 'inputs' list records the files whose timestamps are
+          # compared to the files listed in 'outputs'.  If a file
+          # 'outputs' doesn't exist or if a file in 'inputs' is newer
+          # than a file in 'outputs', this action is executed.  Notice
+          # that the dependencies listed above has nothing to do with
+          # when this action is executed.  You must list a file in
+          # 'inputs' to make sure that it exists before the action is
+          # executed, or to make sure this action is re-run.
+          #
+          # We want to build the platform documentation whenever
+          # dartdoc, apidoc, or its dependency changes.  This prevents
+          # people from accidentally breaking apidoc when making
+          # changes to the platform libraries and or when modifying
+          # dart2js or the VM.
+          #
+          # In addition, we want to make sure that the platform
+          # documentation is regenerated when the platform sources
+          # changes.
+          #
+          # So we want this action to be re-run when a dart file
+          # changes in this directory, or in the SDK library (we may
+          # no longer need to list the files in ../../runtime/lib and
+          # ../../runtime/bin, as most of them has moved to
+          # ../../sdk/lib).
+          #
+          'inputs': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
+            '<!@(["python", "../../tools/list_files.py", "\\.(css|ico|js|json|png|sh|txt|yaml|py)$", ".", "../../sdk/lib/_internal/dartdoc"])',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", ".", "../../sdk/lib", "../../runtime/lib", "../../runtime/bin"])',
+            '../../sdk/bin/dart',
+            '../../sdk/bin/dart.bat',
+            '../../sdk/bin/dart2js',
+            '../../sdk/bin/dart2js.bat',
+            '../../tools/only_in_release_mode.py',
+            # We sit inside the api_docs directory, so make sure it has run
+            # before we do. Otherwise it might run later and delete us.
+            '<(PRODUCT_DIR)/api_docs/index.html',
+          ],
+          'outputs': [
+            '<(PRODUCT_DIR)/api_docs/docgen/index.json',
+          ],
+          'action': [
+            'python',
+            '../../tools/only_in_release_mode.py',
+            '<@(_outputs)',
+            '--',
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '--old_gen_heap_size=1024',
+            '--package-root=<(PRODUCT_DIR)/packages/',
+            '../../pkg/docgen/bin/docgen.dart',
+            '--out=<(PRODUCT_DIR)/api_docs/docgen',
+            '--json',
+            '--include-sdk',
+            '--package-root=<(PRODUCT_DIR)/packages',
+            '--exclude-lib=async_helper',
+            '--exclude-lib=expect',
+            '--exclude-lib=docgen',
+            '../../pkg',          
+          ],
+          'message': 'Running docgen: <(_action)',
+        },
+      ],
+    }
+  ],
+}
diff --git a/utils/testrunner/http_server.dart b/utils/testrunner/http_server.dart
deleted file mode 100644
index 1f74290..0000000
--- a/utils/testrunner/http_server.dart
+++ /dev/null
@@ -1,108 +0,0 @@
-// 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_server;
-import 'dart:io';
-import 'package:args/args.dart';
-
-/** An options parser for the server. */
-ArgParser getOptionParser() {
-  var parser = new ArgParser();
-  parser.addOption('port', abbr: 'p',
-      help: 'Set the server listening port.',
-      defaultsTo: '80');
-
-  parser.addOption('root', abbr: 'r',
-      help: 'Set the directory for static files.');
-  return parser;
-}
-
-/** A simple HTTP server. Currently handles serving static files. */
-class HttpTestServer {
-  HttpServer server;
-  List<Function> matchers = [];
-  List<Function> handlers = [];
-
-  /** If set, serve up static files from this directory. */
-  String staticFileDirectory;
-
-  /* A common subset of all possible MIME types. */
-  static const MIME_TYPES = const {
-      'json' : 'applicaton/json',
-      'js'   : 'application/javascript',
-      'cgm'  : 'image/cgm',
-      'g3fax': 'image/g3fax',
-      'gif'  : 'image/gif',
-      'jpeg' : 'image/jpeg',
-      'jpg'  : 'image/jpeg',
-      'png'  : 'image/png',
-      'tif'  : 'image/tiff',
-      'tiff' : 'image/tiff',
-      'ac3'  : 'audio/ac3',
-      'mp3'  : 'audio/mpeg',
-      'ogg'  : 'audio/ogg',
-      'css'  : 'text/css',
-      'csv'  : 'text/csv',
-      'htm'  : 'text/html',
-      'html' : 'text/html',
-      'txt'  : 'text/plain',
-      'rtf'  : 'text/rtf',
-      'mp4'  : 'video/mp4',
-      'qt'   : 'video/quicktime',
-      'vc1'  : 'video/vc1'
-  };
-
-  HttpTestServer(int port, this.staticFileDirectory) {
-    HttpServer.bind("127.0.0.1", port).then((s) {
-      server = s;
-      print('Server listening on port $port');
-      server.listen((HttpRequest request) {
-        for (var i = 0; i < matchers.length; i++) {
-          if (matchers[i](request)) {
-            handlers[i](request);
-            return;
-          }
-        }
-        HttpResponse response = request.response;
-        try {
-          if (staticFileDirectory != null) {
-            String fname = request.uri.path;
-            String path = '$staticFileDirectory$fname';
-            File f = new File(path);
-            if (f.existsSync()) {
-              var p = path.substring(path.lastIndexOf('.') + 1).toLowerCase();
-              if (MIME_TYPES.containsKey(p)) {
-                var ct = MIME_TYPES[p];
-                var idx = ct.indexOf('/');
-                response.headers.contentType =
-                    new ContentType(ct.substring(0, idx),
-                        ct.substring(idx + 1));
-              }
-              response.addStream(f.openRead()).then((_) => response.close());
-            } else {
-              response.statusCode = HttpStatus.NOT_FOUND;
-              response.reasonPhrase = '$path does not exist';
-              response.close();
-            }
-          }
-        } catch(e,s) {
-          response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
-          response.reasonPhrase = "$e";
-          response.write(s);
-          response.close();
-        }
-      });
-    });
-  }
-
-  void addHandler(Function matcher, Function handler) {
-    matchers.add(matcher);
-    handlers.add(handler);
-  }
-
-  void close() {
-    server.close();
-  }
-}
-
diff --git a/utils/testrunner/http_server_runner.dart b/utils/testrunner/http_server_runner.dart
deleted file mode 100644
index bfc6db1..0000000
--- a/utils/testrunner/http_server_runner.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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_server_runner;
-import 'dart:io';
-import 'http_server.dart';
-
-main(List<String> arguments) {
-  var optionsParser = getOptionParser();
-  try {
-    var argResults = optionsParser.parse(arguments);
-    var server = new HttpTestServer(
-        int.parse(argResults['port']),
-        argResults['root']);
-  } catch (e) {
-    print(e);
-    print('Usage: http_server_runner.dart <options>');
-    print(optionsParser.getUsage());
-  }
-}
diff --git a/utils/testrunner/layout_test_controller.dart b/utils/testrunner/layout_test_controller.dart
deleted file mode 100644
index 31a35cf..0000000
--- a/utils/testrunner/layout_test_controller.dart
+++ /dev/null
@@ -1,368 +0,0 @@
-// 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.
-
-// The following set of variables should be set by the caller that
-// #sources this file.
-/** Whether to include elapsed time. */
-
-part of test_controller;
-
-bool includeTime;
-
-/** Path to DRT executable. */
-String drt;
-
-/** Whether to regenerate layout test files. */
-bool regenerate;
-
-/** Whether to output test summary. */
-bool summarize;
-
-/** Whether  to print results immediately as they come in. */
-bool immediate;
-
-/** Format strings to use for test result messages. */
-String passFormat, failFormat, errorFormat, listFormat;
-
-/** Location of the running test file. */
-String sourceDir;
-
-/** Path of the running test file. */
-String testfile;
-
-/** URL of the child test file. */
-String baseUrl;
-
-/** The print function to use. */
-Function tprint;
-
-/** A callback function to notify the caller we are done. */
-Function notifyDone;
-
-// Variable below here are local to this file.
-var passCount = 0, failCount = 0, errorCount = 0;
-DateTime start;
-
-class Macros {
-  static const String testTime = '<TIME>';
-  static const String testfile = '<FILENAME>';
-  static const String testGroup = '<GROUPNAME>';
-  static const String testDescription = '<TESTNAME>';
-  static const String testMessage = '<MESSAGE>';
-  static const String testStacktrace = '<STACK>';
-}
-
-String formatMessage(filename, groupname,
-    [testname = '', testTime = '', result = '',
-      message = '', stack = '']) {
-  var format = errorFormat;
-  if (result == 'pass') format = passFormat;
-  else if (result == 'fail') format = failFormat;
-  return format.
-      replaceAll(Macros.testTime, testTime).
-      replaceAll(Macros.testfile, filename).
-      replaceAll(Macros.testGroup, groupname).
-      replaceAll(Macros.testDescription, testname).
-      replaceAll(Macros.testMessage, message).
-      replaceAll(Macros.testStacktrace, stack);
-}
-
-void outputResult(start, label, result, [message = '']) {
-  var idx = label.lastIndexOf('###');
-  var group = '', test = '';
-  if (idx >= 0) {
-    group = '${label.substring(0, idx).replaceAll("###", " ")} ';
-    test = '${label.substring(idx+3)} ';
-  } else {
-    test = '$label ';
-  }
-  var elapsed = '';
-  if (includeTime) {
-    var end = new DateTime.now();
-    double duration = (end.difference(start)).inMilliseconds.toDouble();
-    duration /= 1000;
-    elapsed = '${duration.toStringAsFixed(3)}s ';
-  }
-  tprint(formatMessage('$testfile ', group, test, elapsed, result, message));
-}
-
-pass(start, label) {
-  ++passCount;
-  outputResult(start, label, 'pass');
-}
-
-fail(start, label, message) {
-  ++failCount;
-  outputResult(start, label, 'fail', message);
-}
-
-error(start, label, message) {
-  ++errorCount;
-  outputResult(start, label, 'error', message);
-}
-
-void printSummary(String testFile, int passed, int failed, int errors,
-    [String uncaughtError = '']) {
-  tprint('');
-  if (passed == 0 && failed == 0 && errors == 0) {
-    tprint('$testFile: No tests found.');
-  } else if (failed == 0 && errors == 0 && uncaughtError == null) {
-    tprint('$testFile: All $passed tests passed.');
-  } else {
-    if (uncaughtError != null) {
-      tprint('$testFile: Top-level uncaught error: $uncaughtError');
-    }
-    tprint('$testFile: $passed PASSED, $failed FAILED, $errors ERRORS');
-  }
-}
-
-complete() {
-  if (summarize) {
-    printSummary(testfile, passCount, failCount, errorCount);
-  }
-  notifyDone(failCount > 0 ? -1 : 0);
-}
-
-/*
- * Run an external process [cmd] with command line arguments [args].
- * [timeout] can be used to forcefully terminate the process after
- * some number of seconds. This is used by runCommand and startProcess.
- * If [procId] is non-zero (i.e. called from startProcess) then a reference
- * to the [Process] will be put in a map with key [procId]; in this case
- * the process can be terminated later by calling [stopProcess] and
- * passing in the [procId].
- * [outputMonitor] is an optional function that will be called back with each
- * line of output from the process.
- * Returns a [Future] for when the process terminates.
- */
-Future _processHelper(String command, List<String> args,
-    List stdout, List stderr,
-    int timeout, int procId, Function outputMonitor, bool raw) {
-  var timer = null;
-  return Process.start(command, args).then((process) {
-
-    timer = new Timer(new Duration(seconds: timeout), () {
-      timer = null;
-      process.kill();
-    });
-
-    if (raw) {
-      process.stdout.listen((c) { stdout.addAll(c); });
-    } else {
-      _pipeStream(process.stdout, stdout, outputMonitor);
-    }
-    _pipeStream(process.stderr, stderr, outputMonitor);
-    return process.exitCode;
-  }).then((exitCode) {
-    if (timer != null) {
-      timer.cancel();
-    }
-    return exitCode;
-  })
-  .catchError((e) {
-    stderr.add("#Error starting process $command: ${e.error}");
-  });
-}
-
-void _pipeStream(Stream stream, List<String> destination,
-                 Function outputMonitor) {
-  stream
-      .transform(UTF8.decoder)
-      .transform(new LineTransformer())
-      .listen((String line) {
-        if (outputMonitor != null) {
-          outputMonitor(line);
-        }
-        destination.add(line);
-      });
-}
-
-/**
- * Run an external process [cmd] with command line arguments [args].
- * [timeout] can be used to forcefully terminate the process after
- * some number of seconds.
- * Returns a [Future] for when the process terminates.
- */
-Future runCommand(String command, List<String> args,
-                  List stdout, List stderr,
-                  {int timeout: 300, Function outputMonitor,
-                   bool raw: false}) {
-  return _processHelper(command, args, stdout, stderr, 
-      timeout, 0, outputMonitor, raw);
-}
-
-String parseLabel(String line) {
-  if (line.startsWith('CONSOLE MESSAGE')) {
-    var idx = line.indexOf('#TEST ');
-    if (idx > 0) {
-      return line.substring(idx + 6);
-    }
-  }
-  return null;
-}
-
-runTextLayoutTest(testNum) {
-  var url = '$baseUrl?test=$testNum';
-  var stdout = new List();
-  var stderr = new List();
-  start = new DateTime.now();
-  runCommand(drt, [url], stdout, stderr).then((e) {
-    if (stdout.length > 0 && stdout[stdout.length-1].startsWith('#EOF')) {
-      stdout.removeLast();
-    }
-    var done = false;
-    var i = 0;
-    var label = null;
-    var contentMarker = 'layer at ';
-    while (i < stdout.length) {
-      if (label == null && (label = parseLabel(stdout[i])) != null) {
-        if (label == 'NONEXISTENT') {
-          complete();
-          return;
-        }
-      } else if (stdout[i].startsWith(contentMarker)) {
-        if (label == null) {
-          complete();
-          return;
-        }
-        var expectedFileName =
-            '$sourceDir${Platform.pathSeparator}'
-            '${label.replaceAll("###", "_")
-                    .replaceAll(new RegExp("[^A-Za-z0-9]"),"_")}.txt';
-        var expected = new File(expectedFileName);
-        if (regenerate) {
-          var osink = expected.openWrite();
-          while (i < stdout.length) {
-            osink.write(stdout[i]);
-            osink.write('\n');
-            i++;
-          }
-          osink.close();
-          pass(start, label);
-        } else if (!expected.existsSync()) {
-          fail(start, label, 'No expectation file');
-        } else {
-          var lines = expected.readAsLinesSync();
-          var actualLength = stdout.length - i;
-          var compareCount = min(lines.length, actualLength);
-          var match = true;
-          for (var j = 0; j < compareCount; j++) {
-            if (lines[j] != stdout[i + j]) {
-              fail(start, label, 'Expectation differs at line ${j + 1}');
-              match = false;
-              break;
-            }
-          }
-          if (match) {
-            if (lines.length != actualLength) {
-              fail(start, label, 'Expectation file has wrong length');
-            } else {
-              pass(start, label);
-            }
-          }
-        }
-        done = true;
-        break;
-      }
-      i++;
-    }
-    if (label != null) {
-      if (!done) error(start, label, 'Failed to parse output');
-      runTextLayoutTest(testNum + 1);
-    }
-  });
-}
-
-runPixelLayoutTest(int testNum) {
-  var url = '$baseUrl?test=$testNum';
-  var stdout = new List();
-  var stderr = new List();
-  start = new DateTime.now();
-  runCommand(drt, ["$url'-p"], stdout, stderr, raw:true).then((exitCode) {
-    var contentMarker = 'Content-Length: ';
-    var eol = '\n'.codeUnitAt(0);
-    var pos = 0;
-    var label = null;
-    var done = false;
-
-    while(pos < stdout.length) {
-      StringBuffer sb = new StringBuffer();
-      while (pos < stdout.length && stdout[pos] != eol) {
-        sb.writeCharCode(stdout[pos++]);
-      }
-      if (++pos >= stdout.length && line == '') break;
-      var line = sb.toString();
-
-      if (label == null && (label = parseLabel(line)) != null) {
-        if (label == 'NONEXISTENT') {
-          complete();
-        }
-      } else if (line.startsWith(contentMarker)) {
-        if (label == null) {
-          complete();
-        }
-        var len = int.parse(line.substring(contentMarker.length));
-        var expectedFileName =
-            '$sourceDir${Platform.pathSeparator}'
-            '${label.replaceAll("###","_").
-                     replaceAll(new RegExp("[^A-Za-z0-9]"),"_")}.png';
-        var expected = new File(expectedFileName);
-        if (regenerate) {
-          var osink = expected.openWrite();
-          stdout.removeRange(0, pos);
-          stdout.length = len;
-          osink.add(stdout);
-          osink.close();
-          pass(start, label);
-        } else if (!expected.existsSync()) {
-          fail(start, label, 'No expectation file');
-        } else {
-          var bytes = expected.readAsBytesSync();
-          if (bytes.length != len) {
-            fail(start, label, 'Expectation file has wrong length');
-          } else {
-            var match = true;
-            for (var j = 0; j < len; j++) {
-              if (bytes[j] != stdout[pos + j]) {
-                fail(start, label, 'Expectation differs at byte ${j + 1}');
-                match = false;
-                break;
-              }
-            }
-            if (match) pass(start, label);
-          }
-        }
-        done = true;
-        break;
-      }
-    }
-    if (label != null) {
-      if (!done) error(start, label, 'Failed to parse output');
-      runPixelLayoutTest(testNum + 1);
-    }
-  });
-}
-
-void init() {
-  // Get the name of the directory that has the expectation files
-  // (by stripping .dart suffix from test file path).
-  // Create it if it does not exist.
-  sourceDir = testfile.substring(0, testfile.length - 5);
-  if (regenerate) {
-    var d = new Directory(sourceDir);
-    if (!d.existsSync()) {
-      d.createSync();
-    }
-  }
-}
-
-void runPixelLayoutTests() {
-  init();
-  runPixelLayoutTest(0);
-}
-
-void runTextLayoutTests() {
-  init();
-  runTextLayoutTest(0);
-}
diff --git a/utils/testrunner/layout_test_runner.dart b/utils/testrunner/layout_test_runner.dart
deleted file mode 100644
index e4b91ab..0000000
--- a/utils/testrunner/layout_test_runner.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// 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.
-
-part of layout_test;
-
-// The filters must be set by the caller that #sources this file.
-List includeFilters;
-List excludeFilters;
-
-/**
- * A special marker string used to separate group names and
- * identify non-debug output.
- */ 
-final marker = '###';
-
-class LayoutTestConfiguration extends unittest.Configuration {
-  get autoStart => false;
-  void onTestResult(unittest.TestCase testCase) {
-    window.postMessage('done', '*'); // Unblock DRT
-  }
-}
-
-filterTest(t) {
-  var name = t.description.replaceAll(marker, " ");
-  if (includeFilters.length > 0) {
-    for (var f in includeFilters) {
-      if (name.indexOf(f) >= 0) return true;
-    }
-    return false;
-  } else if (excludeFilters.length > 0) {
-    for (var f in excludeFilters) {
-      if (name.indexOf(f) >= 0) return false;
-    }
-    return true;
-  } else {
-    return true;
-  }
-}
-
-runTests(testMain) {
-  unittest.groupSep = marker;
-  unittest.unittestConfiguration = new LayoutTestConfiguration();
-
-  // Create the set of test cases.
-  unittest.group('', testMain);
-
-  // Do any user-specified test filtering.
-  unittest.filterTests(filterTest);
-
-  // Filter to the test number in the search query.
-  var testNum = int.parse(window.location.search.substring(6));
-  if (testNum < 0 || testNum >= unittest.testCases.length) {
-    print('#TEST NONEXISTENT');
-    window.postMessage('done', '*'); // Unblock DRT
-  } else {
-    var name = unittest.testCases[testNum].description;
-    print('#TEST $name');
-    unittest.filterTests(name);
-    // Run the test.
-    print('Tests - ${unittest.testCases.length}');
-    unittest.runTests();
-  }
-}
diff --git a/utils/testrunner/options.dart b/utils/testrunner/options.dart
deleted file mode 100644
index 94b12de..0000000
--- a/utils/testrunner/options.dart
+++ /dev/null
@@ -1,260 +0,0 @@
-// 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.
-
-part of testrunner;
-
-/** Create and return an options parser for the test runner. */
-ArgParser getOptionParser() {
-  var parser = new ArgParser();
-
-  parser.addOption('help', abbr: '?',
-      help: 'Show usage information.');
-
-  parser.addOption('runtime', abbr: 'r', defaultsTo: 'vm',
-      help: 'Where the tests should be run.',
-      allowed: ['vm', 'drt-dart', 'drt-js'],
-      allowedHelp: {
-        'vm': 'Run Dart code natively on the standalone dart vm.',
-        // TODO(antonm): fix option name.
-        'drt-dart': 'Run Dart code natively in the headless version of\n'
-          'Chrome, Content shell.',
-        // TODO(antonm): fix option name.
-        'drt-js': 'Run Dart compiled to JavaScript in the headless version\n'
-            'of Chrome, Content shell.'
-      });
-
-  parser.addFlag('checked', defaultsTo: false,
-      help: 'Run tests in checked mode.');
-
-  parser.addFlag('sort', defaultsTo: false,
-      help: 'Sort test files before running.');
-
-  parser.addFlag('layout-text', defaultsTo: false,
-      help: 'Run text layout tests.');
-
-  parser.addFlag('layout-pixel', defaultsTo: false,
-      help: 'Run pixel layout tests.');
-
-  parser.addOption('timeout', abbr: 't',
-      help: 'Timeout in seconds', defaultsTo: '60');
-
-  parser.addOption('tasks', abbr: 'j',
-      defaultsTo: Platform.numberOfProcessors.toString(),
-      help: 'The number of parallel tasks to run.');
-
-  parser.addOption('out', abbr: 'o', defaultsTo: 'stdout',
-      help: 'File to send test results. This should be a '
-        'file name or one of stdout, stderr, or none.');
-
-  parser.addOption('list-format',
-      defaultsTo:
-        '<FILENAME><GROUPNAME><TESTNAME>',
-      help: 'Format for test list result output.');
-
-  parser.addOption('pass-format',
-      defaultsTo: 'PASS <TIME><FILENAME><GROUPNAME><TESTNAME><MESSAGE>',
-      help: 'Format for passing test result output.');
-
-  parser.addOption('fail-format',
-      defaultsTo: 'FAIL <TIME><FILENAME><GROUPNAME><TESTNAME><MESSAGE>',
-      help: 'Format for failed test result output.');
-
-  parser.addOption('error-format',
-      defaultsTo: 'ERROR <TIME><FILENAME><GROUPNAME><TESTNAME><MESSAGE>',
-      help: 'Format for tests with errors result output.');
-
-  parser.addFlag('summary', defaultsTo: false,
-      help: 'Print a summary of tests passed/failed for each test file.');
-
-  parser.addOption('log', abbr: 'l', defaultsTo: 'none',
-      help: 'File to send test log/print output to. This should be a '
-        'file name or one of stdout, stderr, or none.');
-
-  // TODO(gram) - add loglevel once we have switched unittest to use the log
-  // library.
-
-  parser.addFlag('list-files', defaultsTo: false,
-      help: 'List test files only, do not run them.');
-
-  parser.addFlag('list-tests', defaultsTo: false,
-      help: 'List tests only, do not run them.');
-
-  parser.addFlag('list-groups', defaultsTo: false,
-      help: 'List test groups only, do not run tests.');
-
-  parser.addFlag('clean-files', defaultsTo: false,
-      help: 'Remove the generated files from the temporary directory.');
-
-  parser.addFlag('list-options', defaultsTo: false,
-      help: 'Print non-default option settings, usable as a test.config.');
-
-  parser.addFlag('list-all-options', defaultsTo: false,
-      help: 'Print all option settings, usable as a test.config.');
-
-  parser.addFlag('time',
-      help: 'Print timing information after running tests',
-      defaultsTo: false);
-
-  parser.addFlag('stop-on-failure', defaultsTo: false,
-      help: 'Stop execution after first file with failures.');
-
-  parser.addFlag('isolate', defaultsTo: false,
-      help: 'Runs each test in a separate isolate.');
-
-  parser.addOption('configfile', help: 'Path to an argument file to load.');
-
-  parser.addOption('dartsdk', help: 'Path to dart SDK.');
-
-  var tmp;
-  if (Platform.operatingSystem == 'windows') {
-    tmp = "c:\\tmp\\test";
-  } else {
-    tmp = "/tmp/test";
-  }
-  parser.addOption('tempdir', help: 'Directory to store temp files.',
-        defaultsTo: tmp);
-
-  parser.addOption('test-file-pattern',
-      help: 'A regular expression that test file names must match '
-        'to be considered', defaultsTo: '_test.dart\$');
-
-  parser.addOption('include',
-      help: 'Only run tests from the specified group(s).',
-      allowMultiple: true);
-
-  parser.addOption('exclude',
-      help: 'Exclude tests from the specified group(s).',
-      allowMultiple: true);
-
-  parser.addFlag('recurse', abbr: 'R',
-      help: 'Recurse through child directories looking for tests.',
-      defaultsTo: false);
-
-  parser.addFlag('immediate',
-      help: 'Print test results immediately, instead of at the end of a test '
-        'file. Note that in some async cases this may result in multiple '
-        'messages for a single test.',
-      defaultsTo: false);
-
-  parser.addFlag('regenerate',
-      help: 'Regenerate layout test expectation files.',
-      defaultsTo: false);
-
-  parser.addFlag('server', help: 'Run an HTTP server.', defaultsTo: false);
-
-  parser.addOption('port', help: 'Port to use for HTTP server');
-
-  parser.addOption('root',
-      help: 'Root directory for HTTP server for static files');
-
-  parser.addOption('pipeline',
-      help: 'Pipeline script to use to run each test file.',
-      defaultsTo: 'run_pipeline.dart');
-
-  return parser;
-}
-
-/** Print a value option, quoting it if it has embedded spaces. */
-_printValueOption(String name, value, IOSink dest) {
-  if (value.indexOf(' ') >= 0) {
-    dest.write("--$name='$value'\n");
-  } else {
-    dest.write("--$name=$value\n");
-  }
-}
-
-/** Print the current option values. */
-printOptions(ArgParser parser, ArgResults arguments,
-             bool includeDefaults, IOSink dest) {
-  if (dest == null) return;
-  for (var name in arguments.options) {
-    if (!name.startsWith('list-')) {
-      var value = arguments[name];
-      var defaultValue = parser.getDefault(name);
-      if (value is bool) {
-        if (includeDefaults || (value != defaultValue)) {
-          dest.write('--${value ? "" : "no-"}$name\n');
-        }
-      } else if (value is List) {
-        if (value.length > 0) {
-          for (var v in value) {
-            _printValueOption(name, v, dest);
-          }
-        }
-      } else if (value != null && (includeDefaults || value != defaultValue)) {
-        _printValueOption(name, value, dest);
-      }
-    }
-  }
-}
-
-/**
- * Get the test runner configuration. This loads options from multiple
- * sources, in increasing order of priority: a test.config file in the
- * current directory, a test config file specified with --configfile on
- * the command line, and other arguments specified on the command line.
- */
-ArgResults loadConfiguration(optionsParser, List<String> commandLineArgs) {
-  var options = new List();
-  // We first load options from a test.config file in the working directory.
-  options.addAll(getFileContents('test.config', false).
-      where((e) => e.trim().length > 0 && e[0] != '#'));
-  // Next we look to see if the command line included a -testconfig argument,
-  // and if so, load options from that file too; where these are not
-  // multi-valued they will take precedence over the ones in test.config.
-  var cfgarg = '--configfile';
-  var cfgarge = '--configfile=';
-  for (var i = 0; i < commandLineArgs.length; i++) {
-    if (commandLineArgs[i].startsWith(cfgarg)) {
-      if (commandLineArgs[i] == cfgarg) {
-        if (i == commandLineArgs.length - 1) {
-          throw new Exception('Missing argument to $cfgarg');
-        }
-        options.addAll(getFileContents(commandLineArgs[++i], true).
-            where((e) => e.trim().length > 0 && e[0] != '#'));
-      } else if (commandLineArgs[i].startsWith(cfgarge)) {
-        options.addAll(
-            getFileContents(commandLineArgs[i].substring(cfgarge.length), true).
-                where((e) => e.trim().length > 0 && e[0] != '#'));
-      } else {
-        throw new Exception('Missing argument to $cfgarg');
-      }
-    }
-  }
-  // Finally, we add options from the command line. These have the highest
-  // precedence of all.
-  options.addAll(commandLineArgs);
-  // Now try parse the whole collection of options, and if this fails,
-  // issue a usage message.
-  try {
-    return optionsParser.parse(options);
-  } catch (e) {
-    print(e);
-    print('Usage: testrunner <options> [<directory or file> ...]');
-    print(optionsParser.getUsage());
-    return null;
-  }
-}
-
-/** Perform some sanity checking of the configuration. */
-bool isSane(ArgResults config) {
-  if (config == null) {
-    return false;
-  }
-  if (config['runtime'] == null) {
-    print('Missing required option --runtime');
-    return false;
-  }
-  if (config['include'].length > 0 &&
-      config['exclude'].length > 0) {
-    print('--include and --exclude are mutually exclusive.');
-    return false;
-  }
-  if ((config['layout-text'] || config['layout-pixel']) &&
-      config['runtime'] == 'vm') {
-    print('Layout tests must use --runtime values of "drt-dart" or "drt-js"');
-    return false;
-  }
-  return true;
-}
diff --git a/utils/testrunner/pipeline_utils.dart b/utils/testrunner/pipeline_utils.dart
deleted file mode 100644
index 38ed392..0000000
--- a/utils/testrunner/pipeline_utils.dart
+++ /dev/null
@@ -1,212 +0,0 @@
-// 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.
-
-part of pipeline;
-
-List log;
-var replyPort;
-int _procId = 1;
-Map _procs = {};
-
-/**
- * Create a file path for a temporary file. The file will be in the
- * [tmpDir] directory, with name [basis], but with any extension
- * stripped and replaced by [suffix].
- */
-String createTempName(String tmpDir, String basis, [String suffix='']) {
-  var p = new Path(basis);
-  return '$tmpDir${Platform.pathSeparator}'
-      '${p.filenameWithoutExtension}${suffix}';
-}
-
-/**
- * Given a file path [file], make it absolute if it is relative,
- * and return the result as a [Path].
- */
-Path getAbsolutePath(String file) {
-  var p = new Path(file).canonicalize();
-  if (p.isAbsolute) {
-    return p;
-  } else {
-    var cwd = new Path(Directory.current.path);
-    return cwd.join(p);
-  }
-}
-
-/** Get the directory that contains a [file]. */
-String getDirectory(String file) =>
-    getAbsolutePath(file).directoryPath.toString();
-
-/** Create a file [fileName] and populate it with [contents]. */
-void writeFile(String fileName, String contents) {
-  var file = new File(fileName);
-  file.writeAsStringSync(contents);
-}
-
-/*
- * Run an external process [cmd] with command line arguments [args].
- * [timeout] can be used to forcefully terminate the process after
- * some number of seconds. This is used by runCommand and startProcess.
- * If [procId] is non-zero (i.e. called from startProcess) then a reference
- * to the [Process] will be put in a map with key [procId]; in this case
- * the process can be terminated later by calling [stopProcess] and
- * passing in the [procId].
- * [outputMonitor] is an optional function that will be called back with each
- * line of output from the process.
- * Returns a [Future] for when the process terminates.
- */
-Future _processHelper(String command, List<String> args,
-    List stdout, List stderr,
-    [int timeout = 30, int procId = 0, Function outputMonitor]) {
-  var timer = null;
-  if (Platform.operatingSystem == 'windows' && command.endsWith('.bat')) {
-    var oldArgs = args;
-    args = new List();
-    args.add('/c');
-    // TODO(gram): We may need some escaping here if any of the
-    // components contain spaces.
-    args.add("$command ${oldArgs.join(' ')}");
-    command='cmd.exe';
-  }
-  log.add('Running $command ${args.join(" ")}');
-  
-  return Process.start(command, args)
-      .then((process) {
-        _procs[procId.toString()] = process;
-
-        var stdoutFuture = _pipeStream(process.stdout, stdout, outputMonitor);
-        var stderrFuture = _pipeStream(process.stderr, stderr, outputMonitor);
-
-        timer = new Timer(new Duration(seconds: timeout), () {
-          timer = null;
-          process.kill();
-        });
-        return Future.wait([process.exitCode, stdoutFuture, stderrFuture])
-            .then((values) {
-              if (timer != null) {
-                timer.cancel();
-              }
-              return values[0];
-            });
-      })
-      .catchError((e) {
-        stderr.add("Error starting process:");
-        stderr.add("  Command: $command");
-        stderr.add("  Error: ${e.toString()}");
-        return new Future.value(-1);
-      });
-}
-
-Future _pipeStream(Stream stream, List<String> destination,
-                 Function outputMonitor) {
-  return stream
-    .transform(UTF8.decoder)
-    .transform(new LineTransformer())
-    .listen((String line) {
-      if (config["immediate"] && line.startsWith('###')) {
-        print(line.substring(3));
-      }
-      if (outputMonitor != null) {
-        outputMonitor(line);
-      }
-      destination.add(line);
-    })
-    .asFuture();
-}
-
-/**
- * Run an external process [cmd] with command line arguments [args].
- * [timeout] can be used to forcefully terminate the process after
- * some number of seconds.
- * Returns a [Future] for when the process terminates.
- */
-Future runCommand(String command, List<String> args,
-                  List stdout, List stderr,
-                  [int timeout = 30, Function outputMonitor]) {
-  return _processHelper(command, args, stdout, stderr, 
-      timeout, 0, outputMonitor);
-}
-
-/**
- * Start an external process [cmd] with command line arguments [args].
- * Returns an ID by which it can later be stopped.
- */
-int startProcess(String command, List<String> args, List stdout, List stderr,
-                 [Function outputMonitor]) {
-  int id = _procId++;
-  var f = _processHelper(command, args, stdout, stderr, 3000, id,
-      outputMonitor);
-  if (f != null) {
-    f.then((e) {
-      _procs.remove(id.toString());
-    });
-  }
-  return id;
-}
-
-/** Checks if a process is still running. */
-bool isProcessRunning(int id) {
-  return _procs.containsKey(id.toString());
-}
-
-/**
- * Stop a process previously started with [startProcess] or [runCommand],
- * given the id string.
- */
-void stopProcess(int id) {
-  var sid = id.toString();
-  if (_procs.containsKey(sid)) {
-    Process p = _procs.remove(sid);
-    p.kill();
-  }
-}
-
-/** Delete a file named [fname] if it exists. */
-bool cleanup(String fname) {
-  if (fname != null && config['clean-files']) {
-    var f = new File(fname);
-    try {
-      if (f.existsSync()) {
-        logMessage('Removing $fname');
-        f.deleteSync();
-      }
-    } catch (e) {
-      return false;
-    }
-  }
-  return true;
-}
-
-/** Delete a directory named [dname] if it exists. */
-bool cleanupDir(String dname) {
-  if (dname != null && config['clean-files']) {
-    var d = new Directory(dname);
-    try {
-      if (d.existsSync()) {
-        logMessage('Removing $dname');
-        d.deleteSync(recursive: true);
-      }
-    } catch (e) {
-      return false;
-    }
-  }
-  return true;
-}
-
-initPipeline(port) {
-  replyPort = port;
-  stdout = new List();
-  stderr = new List();
-  log = new List();
-}
-
-void completePipeline(List stdout, List stderr, [exitCode = 0]) {
-  replyPort.send([stdout, stderr, log, exitCode]);
-}
-
-/** Utility function to log diagnostic messages. */
-void logMessage(msg) => log.add(msg);
-
-/** Turn file paths into standard form with forward slashes. */
-String normalizePath(String p) => (new Path(p)).toString();
diff --git a/utils/testrunner/pubspec.yaml b/utils/testrunner/pubspec.yaml
deleted file mode 100644
index 4b47496..0000000
--- a/utils/testrunner/pubspec.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-name: testrunner
-dependencies:
-  args: any
diff --git a/utils/testrunner/run_pipeline.dart b/utils/testrunner/run_pipeline.dart
deleted file mode 100644
index 2e98bf5..0000000
--- a/utils/testrunner/run_pipeline.dart
+++ /dev/null
@@ -1,364 +0,0 @@
-// 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.
-
-/** The default pipeline code for running a test file. */
-library pipeline;
-import 'dart:async';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-part 'pipeline_utils.dart';
-
-/**
- * The configuration passed in to the pipeline runner; this essentially
- * contains all the command line arguments passded to testrunner plus some
- * synthesized ones.
- */
-Map config;
-
-/** Paths to the various generated temporary files. */
-String tempDartFile = null;
-String tempHtmlFile = null;
-String tempChildDartFile = null;
-String tempJsFile = null;
-String tempChildJsFile = null;
-
-/**
- * Path to the Dart script file referenced from the HTML wrapper (or
- * that is compiled to a Javascript file referenced from the HTML wrapper).
- */
-String sourceFile = null;
-
-/** Path to the script file referenced from the HTML wrapper (Dart or JS). */
-String scriptFile = null;
-
-/** MIME type of the script. */
-String scriptType;
-
-/** Process id for the HTTP server. */
-int serverId;
-
-/** Port used by HTTP server. */
-int serverPort;
-
-/** Root directory for static files used by HTTP server. */
-String serverRoot;
-
-/** Path of the HTTP server script. */
-String serverPath;
-
-/** Number of attempts we will make to start the HTTP server. */
-const int MAX_SERVER_TRIES = 10;
-
-/** Pipeline output. */
-List stdout;
-
-/** Pipeline errors. */
-List stderr;
-
-/** Directory where test wrappers are created. */
-String tmpDir;
-
-void main(List<String> args, SendPort replyTo) {
-  var port = new ReceivePort();
-  replyTo.send(port);
-  port.first.then((message) {
-    config = message[0];
-    var replyPort = message[1];
-    stdout = new List();
-    stderr = new List();
-    initPipeline(replyPort);
-    startHTTPServerStage();
-  });
-}
-
-/** Initial pipeline stage - starts the HTTP server, if appropriate. */
-startHTTPServerStage() {
-  if (config["server"]) {
-    serverPath = config["testfile"];
-    // Replace .dart with _server.dart to get test's server file, if any.
-    var truncLen = serverPath.length - '.dart'.length;
-    serverPath = '${serverPath.substring(0, truncLen)}_server.dart';
-    var serverFile = new File(serverPath);
-    if (!serverFile.existsSync()) {
-      // No custom server; run the default server.
-      serverPath = '${config["runnerDir"]}/http_server_runner.dart';
-    }
-    if (serverPath != null) {
-      serverRoot = config["root"];
-      if (serverRoot == null) {
-        // Set the root to be the directory containing the test file.
-        serverRoot =  getDirectory(config["testfile"]);
-      }
-
-      if (config["port"] == null) {
-        // In this case we have to choose a random port and we need
-        // to see if the server starts successfully on that port.
-        var r = new Random();
-        tryStartHTTPServer(r, MAX_SERVER_TRIES);
-      } else {
-        serverPort = int.parse(config["port"]);
-        // Start the HTTP server.
-        serverId = startProcess(config["dart"],
-            [ serverPath, '--port=$serverPort', '--root=$serverRoot'],
-            stdout, stderr);
-      }
-    }
-  }
-  wrapStage();
-}
-
-void tryStartHTTPServer(Random r, int remainingAttempts) {
-  // Pick a port from 1024 to 32767.
-  serverPort = 1024 + r.nextInt(32768 - 1024);
-  logMessage('Trying ${config["dart"]} $serverPath --port=$serverPort '
-      '--root=$serverRoot');
-  serverId = startProcess(config["dart"],
-      [ serverPath, '--port=$serverPort', '--root=$serverRoot'],
-      stdout, stderr,
-      (line) {
-        if (line.startsWith('Server listening')) {
-          wrapStage();
-        } else if (remainingAttempts == 0) {
-          print('Failed to start HTTP server after $MAX_SERVER_TRIES'
-              ' attempts; aborting.');
-      exit(1);
-    } else {
-      tryStartHTTPServer(r, remainingAttempts - 1);
-    }
-  });
-}
-
-/** Initial pipeline stage - generates Dart and HTML wrapper files. */
-wrapStage() {
-  tmpDir = config["targetDir"];
-  var testFile = config["testfile"];
-
-  // Generate names for the generated wrapper files.
-  tempDartFile = createTempName(tmpDir, testFile, '.dart');
-  if (config["runtime"] != 'vm') {
-    tempHtmlFile = createTempName(tmpDir, testFile, '.html');
-    if (config["layout"]) {
-      tempChildDartFile =
-          createTempName(tmpDir, testFile, '-child.dart');
-    }
-    if (config["runtime"] == 'drt-js') {
-      tempJsFile = createTempName(tmpDir, testFile, '.js');
-      if (config["layout"]) {
-        tempChildJsFile =
-            createTempName(tmpDir, testFile, '-child.js');
-      }
-    }
-  }
-
-  // Create the test controller Dart wrapper.
-  var directives, extras;
-
-  if (config["layout"]) {
-    directives = '''
-import 'dart:async';
-import 'dart:io';
-import 'dart:math';
-part '${normalizePath('${config["runnerDir"]}/layout_test_controller.dart')}';
-    ''';
-    extras = '''
-  baseUrl = 'file://${normalizePath('$tempHtmlFile')}';
-  tprint = (msg) => print('###\$msg');
-  notifyDone = (e) => exit(e);
-    ''';
-  } else if (config["runtime"] == "vm") {
-    directives = '''
-import 'dart:async';
-import 'dart:io';
-import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import '${normalizePath('${config["testfile"]}')}' as test;
-part '${normalizePath('${config["runnerDir"]}/standard_test_runner.dart')}';
-    ''';
-    extras = '''
-  includeFilters = ${config["include"]};
-  excludeFilters = ${config["exclude"]};
-  tprint = (msg) => print('###\$msg');
-  notifyDone = (e) { exit(e); };
-    ''';
-  } else {
-    directives = '''
-import 'dart:async';
-import 'dart:html';
-import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import '${normalizePath('${config["testfile"]}')}' as test;
-part '${normalizePath('${config["runnerDir"]}/standard_test_runner.dart')}';
-    ''';
-    extras = '''
-  includeFilters = ${config["include"]};
-  excludeFilters = ${config["exclude"]};
-  tprint = (msg) => query('#console').appendText('###\$msg\\n');
-  notifyDone = (e) => window.postMessage('done', '*');
-    ''';
-  }
-
-  var action = 'process(test.main, runTests)';
-  if (config["layout-text"]) {
-    action = 'runTextLayoutTests()';
-  } else if (config["layout-pixel"]) {
-    action = 'runPixelLayoutTests()';
-  } else if (config["list-tests"]) {
-    action = 'process(test.main, listTests)';
-  } else if (config["list-groups"]) {
-    action = 'process(test.main, listGroups)';
-  } else if (config["isolate"]) {
-    action = 'process(test.main, runIsolateTests)';
-  }
-
-  logMessage('Creating $tempDartFile');
-  writeFile(tempDartFile, '''
-library test_controller;
-$directives
-
-main() {
-  immediate = ${config["immediate"]};
-  includeTime = ${config["time"]};
-  passFormat = '${config["pass-format"]}';
-  failFormat = '${config["fail-format"]}';
-  errorFormat = '${config["error-format"]}';
-  listFormat = '${config["list-format"]}';
-  regenerate = ${config["regenerate"]};
-  summarize = ${config["summary"]};
-  testfile = '${testFile.replaceAll("\\","\\\\")}';
-  drt = '${config["drt"].replaceAll("\\","\\\\")}';
-$extras
-  $action;
-}
-  ''');
-
-  // Create the child wrapper for layout tests.
-  if (config["layout"]) {
-    logMessage('Creating $tempChildDartFile');
-    writeFile(tempChildDartFile, '''
-library layout_test;
-import 'dart:math';
-import 'dart:isolate';
-import 'dart:html';
-import 'package:unittest/unittest.dart' as unittest;
-import '${normalizePath('$testFile')}' as test;
-part '${normalizePath('${config["runnerDir"]}/layout_test_runner.dart')}';
-
-main() {
-  includeFilters = ${config["include"]};
-  excludeFilters = ${config["exclude"]};
-  runTests(test.main);
-}
-    ''');
-  }
-
-  // Create the HTML wrapper and compile to Javascript if necessary.
-  var isJavascript = config["runtime"] == 'drt-js';
-  if (config["runtime"] == 'drt-dart' || isJavascript) {
-    var bodyElements, runAsText;
-
-    if (config["layout"]) {
-      sourceFile = tempChildDartFile;
-      scriptFile = isJavascript ? tempChildJsFile : tempChildDartFile;
-      bodyElements = '';
-    } else {
-      sourceFile = tempDartFile;
-      scriptFile = isJavascript ? tempJsFile : tempDartFile;
-      bodyElements = '<div id="container"></div><pre id="console"></pre>';
-      runAsText = "testRunner.dumpAsText();";
-    }
-    scriptType = isJavascript ? 'text/javascript' : 'application/dart';
-
-    if (config["runtime"] == 'drt-dart' || isJavascript) {
-      logMessage('Creating $tempHtmlFile');
-      writeFile(tempHtmlFile, '''
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>$testFile</title>
-    <link rel="stylesheet" href="${config["runnerDir"]}/testrunner.css">
-    <script type='text/javascript'>
-      var testRunner = window.testRunner || window.layoutTestController;
-      if (testRunner) {
-        function handleMessage(m) {
-          if (m.data == 'done') {
-            testRunner.notifyDone();
-          }
-        }
-        testRunner.waitUntilDone();
-        $runAsText
-        window.addEventListener("message", handleMessage, false);
-      }
-    </script>
-  </head>
-<body>
-  $bodyElements
-  <script type='$scriptType' src='$scriptFile'></script>
-  </script>
-</body>
-</html>
-''');
-    }
-  }
-  compileStage(isJavascript);
-}
-
-/** Second stage of pipeline - compiles Dart to Javascript if needed. */
-compileStage(isJavascript) {
-  if (isJavascript) { // Compile the Dart file.
-    var cmd = config["dart2js"];
-    var input = sourceFile.replaceAll('/', Platform.pathSeparator);
-    var output = scriptFile.replaceAll('/', Platform.pathSeparator);
-    if (config["checked"]) {
-      runCommand(cmd, [ '-c', '-o$output', '$input' ], stdout, stderr)
-          .then(runTestStage);
-    } else {
-      runCommand(cmd, [ '-o$output', '$input' ], stdout, stderr)
-          .then(runTestStage);
-    }
-  } else {
-    runTestStage(0);
-  }
-}
-
-/** Third stage of pipeline - runs the tests. */
-runTestStage(_) {
-  var cmd, args;
-  if (config["runtime"] == 'vm' || config["layout"]) { // Run the tests.
-    if (config["checked"]) {
-      cmd = config["dart"];
-      args = [ '--enable_asserts', '--enable_type_checks', tempDartFile ];
-    } else {
-      cmd = config["dart"];
-      args = [ tempDartFile ];
-    }
-  } else {
-    cmd = config["drt"];
-    args = [ '--no-timeout', tempHtmlFile ];
-  }
-  runCommand(cmd, args, stdout, stderr, config["timeout"]).then(cleanupStage);
-}
-
-/**
- * Final stage of the pipeline - clean up generated files and notify
- * the originator that started the isolate.
- */
-cleanupStage(exitcode) {
-  if (config["server"]) { // Stop the HTTP server.
-    stopProcess(serverId);
-  }
-
-  if (config["clean-files"]) { // Remove the temporary files.
-    cleanup(tempDartFile);
-    cleanup(tempHtmlFile);
-    cleanup(tempJsFile);
-    cleanup(tempChildDartFile);
-    cleanup(tempChildJsFile);
-    cleanup(createTempName(tmpDir, "pubspec", "yaml"));
-    cleanup(createTempName(tmpDir, "pubspec", "lock"));
-    cleanupDir(createTempName(tmpDir, "packages"));
-  }
-  completePipeline(stdout, stderr, exitcode);
-}
diff --git a/utils/testrunner/standard_test_runner.dart b/utils/testrunner/standard_test_runner.dart
deleted file mode 100644
index cb39ff2..0000000
--- a/utils/testrunner/standard_test_runner.dart
+++ /dev/null
@@ -1,268 +0,0 @@
-// 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.
-
-part of test_controller;
-
-/** Path to DRT executable. */
-String drt;
-
-/** Whether to include elapsed time. */
-bool includeTime;
-
-/** Whether to regenerate layout test files. */
-bool regenerate;
-
-/** Whether to output test summary. */
-bool summarize;
-
-/** Whether  to print results immediately as they come in. */
-bool immediate;
-
-/** Format strings to use for test result messages. */
-String listFormat, passFormat, failFormat, errorFormat;
-
-/** Path of the running test file. */
-String testfile;
-
-/** The filters must be set by the caller. */
-List includeFilters;
-List excludeFilters;
-
-/** The print function to use. */
-Function tprint;
-
-/** A callback function to notify the caller we are done. */
-Function notifyDone;
-
-/** The action function to use. */
-Function action;
-
-/**
- * A special marker string used to separate group names and
- * identify non-debug output.
- */
-final marker = '###';
-
-class Macros {
-  static const String testTime = '<TIME>';
-  static const String testfile = '<FILENAME>';
-  static const String testGroup = '<GROUPNAME>';
-  static const String testDescription = '<TESTNAME>';
-  static const String testMessage = '<MESSAGE>';
-  static const String testStacktrace = '<STACK>';
-}
-
-class TestRunnerConfiguration extends SimpleConfiguration {
-  get name => 'Minimal test runner configuration';
-  get autoStart => false;
-
-  void onInit() {}
-
-  String formatMessage(filename, groupname,
-      [ testname = '', testTime = '', result = '',
-        message = '', stack = '' ]) {
-    var format = errorFormat;
-    if (result == 'pass') format = passFormat;
-    else if (result == 'fail') format = failFormat;
-    return format.
-        replaceAll(Macros.testTime, testTime).
-        replaceAll(Macros.testfile, filename).
-        replaceAll(Macros.testGroup, groupname).
-        replaceAll(Macros.testDescription, testname).
-        replaceAll(Macros.testMessage, message).
-        replaceAll(Macros.testStacktrace, stack);
-  }
-
-  String elapsed(TestCase t) {
-    if (includeTime) {
-      double duration = t.runningTime.inMilliseconds.toDouble();
-      duration /= 1000;
-      return '${duration.toStringAsFixed(3)}s ';
-    } else {
-      return '';
-    }
-  }
-
-  void dumpTestResult(source, TestCase t) {
-    var groupName = '', testName = '';
-    var idx = t.description.lastIndexOf(marker);
-    if (idx >= 0) {
-        groupName = t.description.substring(0, idx).replaceAll(marker, ' ');
-        testName = t.description.substring(idx+3);
-    } else {
-        testName = t.description;
-    }
-    var stack = (t.stackTrace == null) ? '' : '${t.stackTrace} ';
-    var message = (t.message.length > 0) ? '${t.message} ' : '';
-    var duration = elapsed(t);
-    tprint(formatMessage(source, '$groupName ', '$testName ',
-        duration, t.result, message, stack));
-  }
-
-  void onTestResult(TestCase testCase) {
-    if (immediate) {
-      dumpTestResult('$testfile ', testCase);
-    }
-  }
-
-  void printSummary(int passed, int failed, int errors,
-                    [String uncaughtError = '']) {
-    tprint('');
-    if (passed == 0 && failed == 0 && errors == 0) {
-      tprint('$testfile: No tests found.');
-    } else if (failed == 0 && errors == 0 && uncaughtError == null) {
-      tprint('$testfile: All $passed tests passed.');
-    } else {
-      if (uncaughtError != null) {
-        tprint('$testfile: Top-level uncaught error: $uncaughtError');
-      }
-      tprint('$testfile: $passed PASSED, $failed FAILED, $errors ERRORS');
-    }
-  }
-
-  void onSummary(int passed, int failed, int errors,
-      List<TestCase> results, String uncaughtError) {
-    if (!immediate) {
-      for (final testCase in results) {
-        dumpTestResult('$testfile ', testCase);
-      }
-    }
-    if (summarize) {
-      printSummary(passed, failed, errors, uncaughtError);
-    }
-  }
-
-  void onDone(bool success) {
-    if (notifyDone != null) {
-      notifyDone(success ? 0 : -1);
-    }
-  }
-}
-
-String formatListMessage(filename, groupname, [ testname = '']) {
-  return listFormat.
-      replaceAll(Macros.testfile, filename).
-      replaceAll(Macros.testGroup, groupname).
-      replaceAll(Macros.testDescription, testname);
-}
-
-listGroups() {
-  List tests = testCases;
-  Map groups = {};
-  for (var t in tests) {
-    var groupName, testName = '';
-    var idx = t.description.lastIndexOf(marker);
-    if (idx >= 0) {
-      groupName = t.description.substring(0, idx).replaceAll(marker, ' ');
-      if (!groups.containsKey(groupName)) {
-        groups[groupName] = '';
-      }
-    }
-  }
-  for (var g in groups.keys) {
-    var msg = formatListMessage('$testfile ', '$g ');
-    print('$marker$msg');
-  }
-  if (notifyDone != null) {
-    notifyDone(0);
-  }
-}
-
-listTests() {
-  List tests = testCases;
-  for (var t in tests) {
-    var groupName, testName = '';
-    var idx = t.description.lastIndexOf(marker);
-    if (idx >= 0) {
-      groupName = t.description.substring(0, idx).replaceAll(marker, ' ');
-      testName = t.description.substring(idx+3);
-    } else {
-      groupName = '';
-      testName = t.description;
-    }
-    var msg = formatListMessage('$testfile ', '$groupName ', '$testName ');
-    print('$marker$msg');
-  }
-  if (notifyDone != null) {
-    notifyDone(0);
-  }
-}
-
-// Support for running in isolates.
-
-class TestRunnerChildConfiguration extends SimpleConfiguration {
-  get name => 'Test runner child configuration';
-  get autoStart => false;
-
-  void onSummary(int passed, int failed, int errors,
-      List<TestCase> results, String uncaughtError) {
-    TestCase test = results[0];
-    parentPort.send([test.result, test.runningTime.inMilliseconds,
-                     test.message, test.stackTrace.toString()]);
-  }
-}
-
-var parentPort;
-runChildTest(message) {
-  var testName = message[0];
-  parentPort = message[1];
-  unittestConfiguration = new TestRunnerChildConfiguration();
-  groupSep = marker;
-  group('', test.main);
-  filterTests(testName);
-  runTests();
-}
-
-isolatedTestParentWrapper(testCase) => () {
-  ReceivePort response = new ReceivePort();
-  return Isolate.spawn(runChildTest, [testCase.description, response.sendPort])
-      .then((_) => response.first)
-      .then((results) {
-    var result = results[0];
-    var duration = new Duration(milliseconds: results[1]);
-    var message = results[2];
-    var stack = results[3];
-    if (result == 'fail') {
-      testCase.fail(message, stack);
-    } else if (result == 'error') {
-      testCase.error(message, stack);
-    }
-  });
-};
-
-runIsolateTests() {
-  // Replace each test with a wrapped version first.
-  for (var i = 0; i < testCases.length; i++) {
-    testCases[i].testFunction = isolatedTestParentWrapper(testCases[i]);
-  }
-  runTests();
-}
-
-// Main
-
-filterTest(t) {
-  var name = t.description.replaceAll(marker, " ");
-  if (includeFilters.length > 0) {
-    for (var f in includeFilters) {
-      if (name.indexOf(f) >= 0) return true;
-    }
-    return false;
-  } else if (excludeFilters.length > 0) {
-    for (var f in excludeFilters) {
-      if (name.indexOf(f) >= 0) return false;
-    }
-    return true;
-  } else {
-    return true;
-  }
-}
-
-process(testMain, action) {
-  groupSep = marker;
-  unittestConfiguration = new TestRunnerConfiguration();
-  group('', testMain);
-  // Do any user-specified test filtering.
-  filterTests(filterTest);
-  action();
-}
diff --git a/utils/testrunner/testrunner.dart b/utils/testrunner/testrunner.dart
deleted file mode 100755
index a700de4..0000000
--- a/utils/testrunner/testrunner.dart
+++ /dev/null
@@ -1,421 +0,0 @@
-//#!/usr/bin/env dart
-// 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.
-
-/**
- * testrunner is a program to run Dart unit tests. Unlike $DART/tools/test.dart,
- * this program is intended for 3rd parties to be able to run unit tests in
- * a batched fashion. As such, it adds some features and removes others. Some
- * of the removed features are:
- *
- *   - No support for test.status files. The assumption is that tests are
- *     expected to pass. Status file support will be added in the future.
- *   - A restricted set of runtimes. The assumption here is that the Dart
- *     libraries deal with platform dependencies, and so the primary
- *     SKUs that a user of this app would be concerned with would be
- *     Dart-native versus compiled, and client (browser) vs server. To
- *     support these, three runtimes are allowed: 'drt-dart' and 'drt-js' (for
- *     client native and client-compiled, respectively), and 'vm'
- *     (for server-side native).
- *   - No sharding of test processes.
- *
- * On the other hand, a number of features have been added:
- *
- *   - The ability to filter tests by group or name.
- *   - The ability to run tests in isolates.
- *   - The ability to customize the format of the test result messages.
- *   - The ability to list the tests available.
- *
- * By default, testrunner will run all tests in the current directory.
- * With a -R option, it will recurse into subdirectories.
- * Directories can also be specified on the command line; if
- * any are specified they will override the use of the current directory.
- * All files that match the `--test-file-pattern` will be included; by default
- * this is files with names that end in _test.dart.
- *
- * Options can be specified on the command line, via a configuration
- * file (`--config`) or via a test.config file in the test directory,
- * in decreasing order of priority.
- *
- * The three runtimes are:
- *
- *   vm - run native Dart in the VM; i.e. using $DARTSDK/dart-sdk/bin/dart.
- *   TODO(antonm): fix the option name.
- *   drt-dart - run native Dart in content shell, the headless version of
- *       Dartium, which is located in $DARTSDK/chromium/content_shell, if
- *       you installed the SDK that is bundled with the editor, or available
- *       from http://gsdview.appspot.com/dartium-archive/continuous/
- *       otherwise.
- *
- *   TODO(antonm): fix the option name.
- *   drt-js - run Dart compiled to Javascript in content shell.
- *
- * testrunner supports simple DOM render tests. These can use expected values
- * for the render output from content shell, either are textual DOM
- * descriptions (`--layout-tests`) or pixel renderings (`--pixel-tests`).
- * When running layout tests, testrunner will see if there is a file with
- * a .png or a .txt extension in a directory with the same name as the
- * test file (without extension) and with the test name as the file name.
- * For example, if there is a test file foo_test.dart with tests 'test1'
- * and 'test2', it will look for foo_test/test1.txt and foo_test/test2.txt
- * for text render layout files. If these exist it will do additional checks
- * of the rendered layout; if not, the test will fail.
- *
- * Layout file (re)generation can be done using `--regenerate`. This will
- * create or update the layout files (and implicitly pass the tests).
- *
- * The wrapping and execution of test files is handled by test_pipeline.dart,
- * which is run in an isolate. The `--pipeline` argument can be used to
- * specify a different script for running a test file pipeline, allowing
- * customization of the pipeline.
- *
- * Wrapper files are created for tests in the tmp directory, which can be
- * overridden with --tempdir. These files are not removed after the tests
- * are complete, primarily to reduce the amount of times pub must be 
- * executed. You can use --clean-files to force file cleanup. The temp 
- * directories will have pubspec.yaml files auto-generated unless the 
- * original test file directories have such files; in that case the existing
- * files will be copied. Whenever a new pubspec file is copied or 
- * created pub will be run (but not otherwise - so if you want to do 
- * the equivelent of pub update you should use --clean-files and the rerun
- * the tests).
- *
- * TODO(gram): if the user has a pubspec.yaml file,  we should inspect the
- * pubspec.lock file and give useful errors:
- *  - if the lock file doesn't exit, then run pub install
- *  - if it exists and it doesn't have the required packages (unittest or
- *    browser), ask the user to add them and run pub install again.
- */
-
-library testrunner;
-import 'dart:async';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-import 'package:args/args.dart';
-
-part 'options.dart';
-part 'utils.dart';
-
-/** The set of [PipelineRunner]s to execute. */
-List _tasks;
-
-/** The maximum number of pipelines that can run concurrently. */
-int _maxTasks;
-
-/** The number of pipelines currently running. */
-int _numTasks;
-
-/** The index of the next pipeline runner to execute. */
-int _nextTask;
-
-/** The sink to use for high-value messages, like test results. */
-IOSink _outSink;
-
-/** The sink to use for low-value messages, like verbose output. */
-IOSink _logSink;
-
-/**
- * The last temp test directory we accessed; we use this to know if we
- * need to check the pub configuration.
- */
-String _testDir;
-    
-/**
- * The user can specify output streams on the command line, using 'none',
- * 'stdout', 'stderr', or a file path; [getSink] will take such a name
- * and return an appropriate [IOSink].
- */
-IOSink getSink(String name) {
-  if (name == null || name == 'none') {
-    return null;
-  }
-  if (name == 'stdout') {
-    return stdout;
-  }
-  if (name == 'stderr') {
-    return stderr;
-  }
-  var f = new File(name);
-  return f.openWrite();
-}
-
-/**
- * Given a [List] of [testFiles], either print the list or create
- * and execute pipelines for the files.
- */
-void processTests(Map config, List testFiles) {
-  _outSink = getSink(config['out']);
-  _logSink = getSink(config['log']);
-  if (config['list-files']) {
-    if (_outSink != null) {
-      for (var i = 0; i < testFiles.length; i++) {
-        _outSink.write(testFiles[i]);
-        _outSink.write('\n');
-      }
-    }
-  } else {
-    _maxTasks = min(config['tasks'], testFiles.length);
-    _numTasks = 0;
-    _nextTask = 0;
-    spawnTasks(config, testFiles);
-  }
-}
-
-/**
- * Create or update a pubspec for the target test directory. We use the
- * source directory pubspec if available; otherwise we create a minimal one.
- * We return a Future if we are running pub install, or null otherwise.
- */
-Future doPubConfig(Path sourcePath, String sourceDir,
-                   Path targetPath, String targetDir,
-                   String pub, String runtime) {
-  // Make sure the target directory exists.
-  var d = new Directory(targetDir);
-  if (!d.existsSync()) {
-    d.createSync(recursive: true);
-  }
-
-  // If the source has no pubspec, but the dest does, leave 
-  // things as they are. If neither do, create one in dest.
-
-  var sourcePubSpecName = new Path(sourceDir).append("pubspec.yaml").
-      toNativePath();
-  var targetPubSpecName = new Path(targetDir).append("pubspec.yaml").
-      toNativePath();
-  var sourcePubSpec = new File(sourcePubSpecName);
-  var targetPubSpec = new File(targetPubSpecName);
-
-  if (!sourcePubSpec.existsSync()) {
-    if (targetPubSpec.existsSync()) {
-      return null;
-    } else {
-      // Create one.
-      if (runtime == 'vm') {
-        writeFile(targetPubSpecName,
-          "name: testrunner\ndependencies:\n  unittest: any\n");
-      } else {
-        writeFile(targetPubSpecName,
-          "name: testrunner\ndependencies:\n  unittest: any\n  browser: any\n");
-      }
-    }
-  } else {
-    if (targetPubSpec.existsSync()) {
-      // If there is a source one, and it is older than the target,
-      // leave the target as is.
-      if (sourcePubSpec.lastModifiedSync().millisecondsSinceEpoch <
-          targetPubSpec.lastModifiedSync().millisecondsSinceEpoch) {
-        return null;
-      }
-    }
-    // Source exists and is newer than target or there is no target;
-    // copy the source to the target. If there is a pubspec.lock file,
-    // copy that too.
-    var s = sourcePubSpec.readAsStringSync();
-    targetPubSpec.writeAsStringSync(s);
-    var sourcePubLock = new File(sourcePubSpecName.replaceAll(".yaml", ".lock"));
-    if (sourcePubLock.existsSync()) {
-      var targetPubLock =
-          new File(targetPubSpecName.replaceAll(".yaml", ".lock"));
-      s = sourcePubLock.readAsStringSync();
-      targetPubLock.writeAsStringSync(s);
-    }
-  }
-  // A new target pubspec was created so run pub install.
-  return _processHelper(pub, [ 'install' ], workingDir: targetDir);
-}
-
-/** Execute as many tasks as possible up to the maxTasks limit. */
-void spawnTasks(Map config, List testFiles) {
-  var verbose = config['verbose'];
-  // If we were running in the VM and the immediate flag was set, we have
-  // already printed the important messages (i.e. prefixed with ###),
-  // so we should skip them now.
-  var skipNonVerbose = config['immediate'] && config['runtime'] == 'vm';
-  while (_numTasks < _maxTasks && _nextTask < testFiles.length) {
-    ++_numTasks;
-    var testfile = testFiles[_nextTask++];
-    config['testfile'] = testfile;
-    ReceivePort port = new ReceivePort();
-    port.receive((msg, _) {
-      List stdout = msg[0];
-      List stderr = msg[1];
-      List log = msg[2];
-      int exitCode = msg[3];
-      writelog(stdout, _outSink, _logSink, verbose, skipNonVerbose);
-      writelog(stderr, _outSink, _logSink, true, skipNonVerbose);
-      writelog(log, _outSink, _logSink, verbose, skipNonVerbose);
-      port.close();
-      --_numTasks;
-      if (exitCode == 0 || !config['stop-on-failure']) {
-        spawnTasks(config, testFiles);
-      }
-      if (_numTasks == 0) {
-        // No outstanding tasks; we're all done.
-        // We could later print a summary report here.
-      }
-    });
-    // Get the names of the source and target test files and containing
-    // directories.
-    var testPath = new Path(testfile);
-    var sourcePath = testPath.directoryPath;
-    var sourceDir = sourcePath.toNativePath();
-
-    var targetPath = new Path(config["tempdir"]);
-    var normalizedTarget = testPath.directoryPath.toNativePath()
-        .replaceAll(Platform.pathSeparator, '_')
-        .replaceAll(':', '_');
-    targetPath = targetPath.append("${normalizedTarget}_${config['runtime']}");
-    var targetDir = targetPath.toNativePath();
-
-    config['targetDir'] = targetDir;
-    // If this is a new target dir, we need to redo the pub check.
-    var f = null;
-    if (targetDir != _testDir) {
-      f = doPubConfig(sourcePath, sourceDir, targetPath, targetDir,
-          config['pub'], config['runtime']);
-      _testDir = targetDir;
-    }
-    var response = new ReceivePort();
-    spawnUri(config['pipeline'], [], response)
-        .then((_) => f)
-        .then((_) => response.first)
-        .then((s) { s.send([config, port.sendPort]); });
-    if (f != null) break; // Don't do any more until pub is done.
-  }
-}
-
-/**
- * Our tests are configured so that critical messages have a '###' prefix.
- * [writelog] takes the output from a pipeline execution and writes it to
- * our output sinks. It will strip the '###' if necessary on critical
- * messages; other messages will only be written if verbose output was
- * specified.
- */
-void writelog(List messages, IOSink out, IOSink log,
-              bool includeVerbose, bool skipNonVerbose) {
-  for (var i = 0; i < messages.length; i++) {
-    var msg = messages[i];
-    if (msg.startsWith('###')) {
-      if (!skipNonVerbose && out != null) {
-        out.write(msg.substring(3));
-        out.write('\n');
-      }
-    } else if (msg.startsWith('CONSOLE MESSAGE:')) {
-      if (!skipNonVerbose && out != null) {
-        int idx = msg.indexOf('###');
-        if (idx > 0) {
-          out.write(msg.substring(idx + 3));
-          out.write('\n');
-        }
-      }
-    } else if (includeVerbose && log != null) {
-      log.write(msg);
-      log.write('\n');
-    }
-  }
-}
-
-normalizeFilter(List filter) {
-  // We want the filter to be a quoted string or list of quoted
-  // strings.
-  for (var i = 0; i < filter.length; i++) {
-    var f = filter[i];
-    if (f[0] != "'" && f[0] != '"') {
-      filter[i] = "'$f'"; // TODO(gram): Quote embedded quotes.
-    }
-  }
-  return filter;
-}
-
-void sanitizeConfig(Map config, ArgParser parser) {
-  config['layout'] = config['layout-text'] || config['layout-pixel'];
-  config['verbose'] = (config['log'] != 'none' && !config['list-groups']);
-  config['timeout'] = int.parse(config['timeout']);
-  config['tasks'] = int.parse(config['tasks']);
-
-  var dartsdk = config['dartsdk'];
-  var pathSep = Platform.pathSeparator;
-
-  if (dartsdk == null) {
-    var runner = Platform.executable;
-    var idx = runner.indexOf('dart-sdk');
-    if (idx < 0) {
-      print("Please use --dartsdk option or run using the dart executable "
-          "from the Dart SDK");
-      exit(0);
-    }
-    dartsdk = runner.substring(0, idx);
-  }
-  if (Platform.operatingSystem == 'macos') {
-    config['dart2js'] =
-        '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}dart2js';
-    config['dart'] = '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}dart';
-    config['pub'] = '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}pub';
-    config['drt'] =
-      '$dartsdk/chromium/Content Shell.app/Contents/MacOS/Content Shell';
-  } else if (Platform.operatingSystem == 'linux') {
-    config['dart2js'] =
-        '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}dart2js';
-    config['dart'] = '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}dart';
-    config['pub'] = '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}pub';
-    config['drt'] = '$dartsdk${pathSep}chromium${pathSep}content_shell';
-  } else {
-    config['dart2js'] =
-        '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}dart2js.bat';
-    config['dart'] = '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}dart.exe';
-    config['pub'] = '$dartsdk${pathSep}dart-sdk${pathSep}bin${pathSep}pub.bat';
-    config['drt'] = '$dartsdk${pathSep}chromium${pathSep}content_shell.exe';
-  }
-
-  for (var prog in [ 'drt', 'dart', 'pub', 'dart2js' ]) {
-    config[prog] = makePathAbsolute(config[prog]);
-  }
-  config['runnerDir'] = runnerDirectory;
-  config['include'] = normalizeFilter(config['include']);
-  config['exclude'] = normalizeFilter(config['exclude']);
-}
-
-main(List<String> arguments) {
-  var optionsParser = getOptionParser();
-  var options = loadConfiguration(optionsParser, arguments);
-  if (isSane(options)) {
-    if (options['list-options']) {
-      printOptions(optionsParser, options, false, stdout);
-    } else if (options['list-all-options']) {
-      printOptions(optionsParser, options, true, stdout);
-    } else {
-      var config = new Map();
-      for (var option in options.options) {
-        config[option] = options[option];
-      }
-      var rest = [];
-      // Process the remmaining command line args. If they look like
-      // options then split them up and add them to the map; they may be for
-      // custom pipelines.
-      for (var other in options.rest) {
-        var idx;
-        if (other.startsWith('--') && (idx = other.indexOf('=')) > 0) {
-          var optName = other.substring(2, idx);
-          var optValue = other.substring(idx+1);
-          config[optName] = optValue;
-        } else {
-          rest.add(other);
-        }
-      }
-
-      sanitizeConfig(config, optionsParser);
-
-      // Build the list of tests and then execute them.
-      List dirs = rest;
-      if (dirs.length == 0) {
-        dirs.add('.'); // Use current working directory as default.
-      }
-      var f = buildFileList(dirs,
-          new RegExp(config['test-file-pattern']), config['recurse']);
-      if (config['sort']) f.sort();
-      processTests(config, f);
-    }
-  }
-}
diff --git a/utils/testrunner/utils.dart b/utils/testrunner/utils.dart
deleted file mode 100644
index dc5025c..0000000
--- a/utils/testrunner/utils.dart
+++ /dev/null
@@ -1,118 +0,0 @@
-// 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.
-
-part of testrunner;
-
-/** Create a file [fileName] and populate it with [contents]. */
-void writeFile(String fileName, String contents) {
-  var file = new File(fileName);
-  file.writeAsStringSync(contents);
-}
-
-/**
- * Read the contents of a file [fileName] into a [List] of [String]s.
- * If the file does not exist and [errorIfNoFile] is true, throw an
- * exception, else return an empty list.
- */
-List<String> getFileContents(String filename, bool errorIfNoFile) {
-  File f = new File(filename);
-  if (!f.existsSync()) {
-    if (errorIfNoFile) {
-      throw new Exception('Config file $filename not found.');
-    } else {
-      return new List();
-    }
-  }
-  return f.readAsLinesSync();
-}
-
-/**
- * Given a file path [path], make it absolute if it is relative,
- * and return the result.
- */
-String makePathAbsolute(String path) {
-  var p = new Path(path).canonicalize();
-  if (p.isAbsolute) {
-    return p.toNativePath();
-  } else {
-    var cwd = new Path(Directory.current.path);
-    return cwd.join(p).toNativePath();
-  }
-}
-
-/**
- * Create the list of all the files in a set of directories
- * ([dirs]) whose names match [filePat]. If [recurse] is true
- * look at subdirectories too. An optional [excludePat] can be supplied
- * and files or directories that match that will be excluded.
- * [includeSymLinks] controls whether or not to include files that
- * have symlinks in the traversed tree.
- */
-List buildFileList(List dirs, RegExp filePat, bool recurse,
-                   [RegExp excludePat, bool includeSymLinks = false]) {
-  var files = new List();
-  for (var i = 0; i < dirs.length; i++) {
-    var path = dirs[i];
-    if (excludePat != null && excludePat.hasMatch(path)) {
-      continue;
-    }
-    // Is this a regular file?
-    File f = new File(path);
-    if (f.existsSync()) {
-      if (filePat.hasMatch(path)) {
-        files.add(path);
-      }
-    } else { // Try treat it as a directory.
-      path = makePathAbsolute(path);
-      Directory d = new Directory(path);
-      if (d.existsSync()) {
-        var contents = d.listSync(recursive: recurse,
-            followLinks: includeSymLinks);
-        for (var entity in contents) {
-          if (entity is File) {
-            var file = entity.path;
-            if (filePat.hasMatch(file)) {
-              if (excludePat == null || !excludePat.hasMatch(file)) {
-                files.add(file);
-              }
-            }
-          }
-        }
-      } else { // Does not exist.
-        print('$path does not exist.');
-      }
-    }
-  }
-  return files;
-}
-
-/**
- * Get the directory that testrunner lives in; we need it to import
- * support files into the generated scripts.
- */
-
-String get runnerDirectory {
-  var libDirectory = makePathAbsolute(new Platform.script);
-  return libDirectory.substring(0,
-      libDirectory.lastIndexOf(Platform.pathSeparator));
-}
-
-/*
- * Run an external process [cmd] with command line arguments [args].
- * Returns a [Future] for when the process terminates.
- */
-Future _processHelper(String command, List<String> args,
-    {String workingDir}) {
-  var options = null;
-  if (workingDir != null) {
-    options = new ProcessOptions();
-    options.workingDirectory = workingDir;
-  }
-  return Process.run(command, args, options)
-      .then((result) => result.exitCode)
-      .catchError((e) {
-        print("$command ${args.join(' ')}: ${e.toString()}");
-      });
-}
-
diff --git a/utils/tests/string_encoding/benchmark_runner.dart b/utils/tests/string_encoding/benchmark_runner.dart
deleted file mode 100644
index 0f54956..0000000
--- a/utils/tests/string_encoding/benchmark_runner.dart
+++ /dev/null
@@ -1,460 +0,0 @@
-// 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.
-
-part of BenchmarkTests;
-
-/**
- * The results of a single block of tests (count times run, overall time).
- */
-class BlockSample {
-  BlockSample(this.count, this.durationNanos);
-  int count;
-  int durationNanos;
-
-  static int _totalCount(List<BlockSample> samples) =>
-      _sum(samples, int (BlockSample s) => s.count);
-
-  static int _totalTime(List<BlockSample> samples) =>
-      _sum(samples, int (BlockSample s) => s.durationNanos);
-
-  static BlockSample _select(List<BlockSample> samples,
-      BlockSample selector(BlockSample a, BlockSample b)) {
-    BlockSample r = null;
-    for (BlockSample s in samples) {
-      r = (r == null) ? s : selector(r, s);
-    }
-    return r;
-  }
-
-  static int _sum(List<BlockSample> samples, int extract(BlockSample s)) {
-    int total = 0;
-    for (BlockSample s in samples) {
-      total += extract(s);
-    }
-    return total;
-  }
-}
-
-/**
- * Uses sample data to build a performance model for a test. Construct
- * the model from a set of sample results, and it generates a simple
- * predivtive model for execution of future requests. It uses
- * a simple least-squares linear solution to build the model.
- */
-class PerformanceModel {
-  PerformanceModel.calculate(List<BlockSample> source) {
-    if (0 == source.length) {
-      throw "Missing data exception";
-    } else if (1 == source.length) {
-      overheadNanos = 0;
-      perRequestNanos = source[0].durationNanos / source[0].count;
-    } else {
-      double n = source.length.toDouble();
-      double sumY = BlockSample._totalTime(source).toDouble();
-      double sumXSquared = BlockSample._sum(source,
-          int _(BlockSample s) => s.count * s.count).toDouble();
-      double sumX = BlockSample._totalCount(source).toDouble();
-      double sumXY = BlockSample._sum(source,
-          int _(BlockSample s) => s.durationNanos * s.count).toDouble();
-
-      overheadNanos =
-          ((((sumY * sumXSquared) - (sumX * sumXY)) /
-          ((n * sumXSquared) - (sumX * sumX))) / source.length).toInt();
-
-      perRequestNanos =
-          (((n * sumXY) - (sumX * sumY)) /
-          ((n * sumXSquared) - (sumX * sumX))).toInt();
-    }
-  }
-
-  bool isValid() => overheadNanos >= 0 && perRequestNanos >= 0;
-
-  int overheadNanos;
-  int perRequestNanos;
-  int repsFor(int targetDurationNanos, [int blocksize = -1]) {
-    if (blocksize <= 0) {
-      return ((targetDurationNanos - overheadNanos) / perRequestNanos).toInt();
-    } else {
-      int blockTime = overheadNanos + (blocksize * perRequestNanos);
-      int fullBlocks = targetDurationNanos ~/ blockTime;
-      int extraReps =
-          ((targetDurationNanos - (fullBlocks * blockTime)) - overheadNanos)
-          ~/ perRequestNanos;
-      return ((fullBlocks * blocksize) + extraReps).toInt();
-    }
-  }
-}
-
-/**
- * Report overall test performance
- */
-class TestReport {
-  TestReport(this.id, this.desc, this.warmup, this.results) {
-    spaceChar = " ".codeUnits[0];
-  }
-
-  int spaceChar;
-
-  int resultsCount() => BlockSample._totalCount(results);
-
-  int resultsNanos() => BlockSample._totalTime(results);
-
-  int resultsBestNanos() {
-    BlockSample best = bestBlock(results);
-    return best.durationNanos ~/ best.count;
-  }
-
-  int resultsMeanNanos() =>
-      BlockSample._totalTime(results) ~/ BlockSample._totalCount(results);
-
-  int resultsWorstNanos() {
-    BlockSample worst = worstBlock(results);
-    return worst.durationNanos / worst.count;
-  }
-
-  int warmupBestNanos() {
-    BlockSample best = bestBlock(warmup);
-    return best.durationNanos / best.count;
-  }
-
-  int warmupMeanNanos() => _totalTime(warmup) / _totalCount(warmup);
-
-  int warmupWorstNanos() {
-    BlockSample worst = worstBlock(warmup);
-    return worst.durationNanos / worst.count;
-  }
-
-  BlockSample bestBlock(List<BlockSample> samples) {
-    return BlockSample._select(samples,
-          BlockSample selector(BlockSample a, BlockSample b) {
-            return a.durationNanos <= b.durationNanos ? a : b;
-    });
-  }
-
-  BlockSample worstBlock(List<BlockSample> samples) {
-    return BlockSample._select(samples,
-          BlockSample selector(BlockSample a, BlockSample b) {
-      return a.durationNanos >= b.durationNanos ? a : b;
-    });
-  }
-
-  void printReport() {
-    String text = _leftAlign("${id}", 30);
-    String totalCount = _rightAlign(resultsCount().toString(), 10);
-    String totalDurationMs =
-        _rightAlign(_stringifyDoubleAsInt(resultsNanos() / 1E6), 6);
-    String meanDuration =
-       _rightAlign(_stringifyDoubleAsInt(resultsMeanNanos().toDouble()), 8);
-
-    print("${text} total time:${totalDurationMs} ms" +
-        "    iterations:${totalCount}    mean:${meanDuration} ns");
-  }
-
-  void printReportWithThroughput(int sizeBytes) {
-    String text = _leftAlign("${id}", 30);
-    String totalCount = _rightAlign(resultsCount().toString(), 10);
-    String totalDurationMs =
-        _rightAlign(_stringifyDoubleAsInt(resultsNanos() / 1E6), 6);
-    String meanDuration =
-        _rightAlign(_stringifyDoubleAsInt(resultsMeanNanos()), 8);
-
-    int totalBytes = sizeBytes * resultsCount();
-    String mbPerSec = (((1E9 * sizeBytes * resultsCount()) /
-       (1024 * 1024 * resultsNanos()))).toString();
-    print("${text} total time:${totalDurationMs} ms" +
-        "    iterations:${totalCount}" +
-        "    mean:${meanDuration} ns;   ${mbPerSec} MB/sec");
-  }
-
-  String _leftAlign(String s, int width) {
-    List<int> outCodes = new List<int>.filled(width, spaceChar);
-    outCodes.setRange(0, Math.min(width, s.length), s.codeUnits);
-    return new String.fromCharCodes(outCodes);
-  }
-
-  String _rightAlign(String s, int width) {
-    List<int> outCodes = new List<int>.filled(width, spaceChar);
-    int fromIndex = Math.max(0, width - s.length);
-    int length = Math.min(width, s.length);
-    outCodes.setRange(fromIndex, fromIndex + length, s.codeUnits);
-    return new String.fromCharCodes(outCodes);
-  }
-
-  static String _stringifyDoubleAsInt(double val) {
-    if (val.isInfinite || val.isNaN) {
-      return "NaN";
-    } else {
-      return val.toInt().toString();
-    }
-  }
-
-  String id;
-  String desc;
-  List<BlockSample> warmup;
-  List<BlockSample> results;
-}
-
-class Runner {
-  static List<String> arguments;  // Set by main.
-
-  static bool runTest(String testId) {
-    return arguments.length == 0 ||
-        arguments.any((String id) => id == testId);
-  }
-}
-
-/**
- * Run traditional blocking-style tests. Tests may be run a specified number
- * of times, or they can be run based on performance to estimate a particular
- * duration.
- */
-class BenchmarkRunner extends Runner {
-  static void runCount(String id, String desc, CountTestConfig config,
-      Function test) {
-    if (runTest(id)) {
-      List<BlockSample> warmupSamples = _runTests(test, config._warmup, 1);
-      List<BlockSample> resultSamples = _runTests(test, config._reps, 1);
-      config.reportHandler(
-          new TestReport(id, desc, warmupSamples, resultSamples));
-    }
-  }
-
-  static void runTimed(String id, String desc, TimedTestConfig config,
-      Function test) {
-    if (runTest(id)) {
-      List<BlockSample> warmupSamples = _runTests(test, config._warmup, 1);
-      PerformanceModel model = _calibrate(config._minSampleTimeMs, 16, test);
-      int reps = model.repsFor(1E6 * config._targetTimeMs, config._blocksize);
-      int blocksize = config._blocksize < 0 ? reps : config._blocksize;
-      List<BlockSample> resultSamples = _runTests(test, reps, blocksize);
-      config.reportHandler(
-          new TestReport(id, desc, warmupSamples, resultSamples));
-    }
-  }
-
-  static PerformanceModel _calibrate(int minSampleTimeMs, int maxAttempts,
-      Function test) {
-    PerformanceModel model;
-    int i = 0;
-    do {
-      model = _buildPerformanceModel(minSampleTimeMs, test);
-      i++;
-    } while (i < maxAttempts && !model.isValid());
-    return model;
-  }
-
-  static PerformanceModel _buildPerformanceModel(
-      int minSampleTimeMs, Function test) {
-    int iterations = 1;
-    List<BlockSample> calibrationResults = [];
-    BlockSample calibration = _execBlock(test, iterations);
-    calibrationResults.add(calibration);
-    while (calibration.durationNanos < (1E6 * minSampleTimeMs)) {
-      iterations *= 2;
-      calibration = _execBlock(test, iterations);
-      calibrationResults.add(calibration);
-    }
-    return new PerformanceModel.calculate(calibrationResults);
-  }
-
-  static List<BlockSample> _runTests(Function test, int count, int blocksize) {
-    List<BlockSample> samples = [];
-    for (int rem = count; rem > 0; rem -= blocksize) {
-      BlockSample bs = _execBlock(test, Math.min(blocksize, rem));
-      samples.add(bs);
-    }
-    return samples;
-  }
-
-  static BlockSample _execBlock(Function test, int count) {
-    Stopwatch s = new Stopwatch();
-    s.start();
-    for (int i = 0; i < count; i++) {
-      test();
-    }
-    s.stop();
-    return new BlockSample(count, s.elapsedMicroseconds * 1000);
-  }
-}
-
-/**
- * Define CPSTest type.
- */
-typedef void CPSTest(Function continuation);
-
-typedef void ReportHandler(TestReport r);
-
-/**
- * Run non-blocking-style using Continuation Passing Style callbacks. Tests may
- * be run a specified number of times, or they can be run based on performance
- * to estimate a particular duration.
- */
-class CPSBenchmarkRunner extends Runner {
-
-  CPSBenchmarkRunner(): _cpsTests = [];
-
-  void addTest(CPSTest test) {
-    _cpsTests.add(test);
-  }
-
-  void runTests([int index = 0, Function continuation = null]) {
-    if (index < _cpsTests.length) {
-      _cpsTests[index](_(){
-        _addToEventQueue(_() => runTests(index + 1, continuation));
-      });
-    } else {
-      if (null != continuation) {
-        _addToEventQueue(_() => continuation());
-      }
-    }
-  }
-
-  List<CPSTest> _cpsTests;
-
-  static void runCount(String id, String desc, CountTestConfig config,
-      CPSTest test, void continuation()) {
-    if (runTest(id)) {
-      _runTests(test, config._warmup, 1, (List<BlockSample> warmupSamples){
-        int blocksize =
-            config._blocksize <= 0 ? config._reps : config._blocksize;
-        _runTests(test, config._reps, blocksize,
-          _(List<BlockSample> resultSamples) {
-            config.reportHandler(
-                new TestReport(id, desc, warmupSamples, resultSamples));
-            continuation();
-          });
-      });
-    } else {
-      continuation();
-    }
-  }
-
-  static void runTimed(String id, String desc, TimedTestConfig config,
-      CPSTest test, void continuation()) {
-    if (runTest(id)) {
-      _runTests(test, config._warmup, 1, (List<BlockSample> warmupSamples){
-        _calibrate(config._minSampleTimeMs, 5, test, (PerformanceModel model){
-          int reps =
-              model.repsFor(1E6 * config._targetTimeMs, config._blocksize);
-          int blocksize =
-              config._blocksize <= 0 ? reps : config._blocksize;
-          _runTests(test, reps, blocksize, (List<BlockSample> results) {
-              config.reportHandler(
-                  new TestReport(id, desc, warmupSamples, results));
-              continuation();
-            });
-        });
-      });
-    } else {
-      continuation();
-    }
-  }
-
-  static void nextTest(Function testLoop, int iteration) {
-    _addToEventQueue(() => testLoop(iteration + 1));
-  }
-
-  static void _calibrate(int minSampleTimeMs, int maxAttempts,
-      CPSTest test, void continuation(PerformanceModel model)) {
-    _buildPerformanceModel(minSampleTimeMs, test, (PerformanceModel model){
-      if (maxAttempts > 1 && !model.isValid()) {
-        _calibrate(minSampleTimeMs, maxAttempts - 1, test, continuation);
-      } else {
-        continuation(model);
-      }
-    });
-  }
-
-  static void _buildPerformanceModel(
-      int minSampleTimeMs, CPSTest test, void continuation(PerformanceModel m),
-          [int iterations = 1, List<BlockSample> calibrationResults = null]) {
-    List<BlockSample> _calibrationResults =
-        null == calibrationResults ? [] : calibrationResults;
-    _runTests(test, iterations, 1000, (List<BlockSample> calibration) {
-      _calibrationResults.addAll(calibration);
-      if (BlockSample._totalTime(calibration) < (1E6 * minSampleTimeMs)) {
-        _buildPerformanceModel(minSampleTimeMs, test, continuation,
-            iterations: iterations * 2,
-            calibrationResults: _calibrationResults);
-      } else {
-        PerformanceModel model =
-            new PerformanceModel.calculate(_calibrationResults);
-        continuation(model);
-      }
-    });
-  }
-
-  static void _runTests(CPSTest test, int reps, int blocksize,
-        void continuation(List<BlockSample> samples),
-        [List<BlockSample> samples = null]) {
-    List<BlockSample> localSamples = (null == samples) ? [] : samples;
-    if (reps > 0) {
-      int blockCount = Math.min(blocksize, reps);
-      _execBlock(test, blockCount, (BlockSample sample){
-        localSamples.add(sample);
-        _addToEventQueue(() =>
-            _runTests(test, reps - blockCount, blocksize,
-                continuation, localSamples));
-      });
-    } else {
-      continuation(localSamples);
-    }
-  }
-
-  static void _execBlock(CPSTest test, int count,
-      void continuation(BlockSample sample)) {
-    Stopwatch s = new Stopwatch();
-    s.start();
-    _innerLoop(test, count, () {
-      s.stop();
-      continuation(new BlockSample(count, s.elapsedInUs() * 1000));
-    });
-  }
-
-  static void _innerLoop(CPSTest test, int remainingCount,
-      Function continuation) {
-    if (remainingCount > 1) {
-      test(() => _innerLoop(test, remainingCount - 1, continuation));
-    } else {
-      continuation();
-    }
-  }
-
-  static void _addToEventQueue(Function action) {
-    Timer.run(action);
-  }
-}
-
-class CountTestConfig {
-  CountTestConfig(int this._warmup, int this._reps,
-      [int blocksize = -1, ReportHandler reportHandler = null]) {
-        this._blocksize = blocksize;
-        this._reportHandler = (null == reportHandler) ?
-            _(TestReport r) => r.printReport() : reportHandler;
-      }
-
-  Function _reportHandler;
-  Function get reportHandler => _reportHandler;
-  int _warmup;
-  int _reps;
-  int _blocksize;
-}
-
-class TimedTestConfig {
-  TimedTestConfig(int this._warmup, int this._targetTimeMs,
-      [int minSampleTimeMs = 100, int blocksize = -1,
-      ReportHandler reportHandler = null]) :
-      this._minSampleTimeMs = minSampleTimeMs,
-      this._blocksize = blocksize {
-    this._reportHandler = (null == reportHandler) ?
-        _(TestReport r) => r.printReport() : reportHandler;
-  }
-
-  Function _reportHandler;
-  Function get reportHandler => _reportHandler;
-  int _warmup;
-  int _targetTimeMs;
-  int _minSampleTimeMs;
-  int _blocksize;
-}
diff --git a/utils/tests/string_encoding/dunit.dart b/utils/tests/string_encoding/dunit.dart
deleted file mode 100644
index e2302e3..0000000
--- a/utils/tests/string_encoding/dunit.dart
+++ /dev/null
@@ -1,119 +0,0 @@
-#!/usr/bin/env dart
-// 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 dunit;
-
-typedef void Test();
-typedef TestResult SynchTest();
-typedef Future<TestResult> AsynchTest();
-
-class TestSuite {
-  TestSuite() : _tests = <SynchTest>[];
-
-  void registerTestClass(TestClass tests) {
-    tests.registerTests(this);
-  }
-
-  void _registerTest(SynchTest test) {
-    _tests.add(test);
-  }
-
-  void run() {
-    reportResults(runTests());
-  }
-
-  List<TestResult> runTests() {
-    List<TestResult> results = <TestResult>[];
-    for(Function test in _tests) {
-      results.add(test());
-    }
-    return results;
-  }
-
-  void reportResults(List<TestResult> results) {
-    if(results.every((TestResult r) => r is PassedTest)) {
-      print("OK -- ALL TESTS PASS (${results.length} run)");
-    } else {
-      for(TestResult r in
-          results.where((TestResult r) => !(r is PassedTest))) {
-        print(r);
-      }
-      int passedTests =
-          results.where((TestResult r) => r is PassedTest).length;
-      int failures =
-          results.where((TestResult r) => r is FailedTest).length;
-      int errors =
-          results.where((TestResult r) => r is TestError).length;
-      print("FAIL -- TESTS RUN: ${results.length}");
-      print("        PASSED: ${passedTests}");
-      print("        FAILED: ${failures}");
-      print("        ERRORS: ${errors}");
-    }
-  }
-
-  List<SynchTest> _tests;
-}
-
-abstract class TestResult {
-  String get testDescription;
-}
-
-class PassedTest implements TestResult {
-  const PassedTest(String this._testDescription);
-  String get testDescription => _testDescription;
-  final String _testDescription;
-  String toString() => _testDescription;
-}
-
-class _ExceptionResult {
-  const _ExceptionResult(String this._testDescription, var this._exception);
-
-  String get testDescription => _testDescription;
-  final String _testDescription;
-
-  Object get exception => _exception;
-  final _exception;
-}
-
-class FailedTest extends _ExceptionResult implements TestResult {
-  FailedTest(String testDescription, var exception) :
-      super(testDescription, exception);
-
-  String toString() => ">>> Test failure in ${_testDescription} " +
-      "with:\n${exception}\n";
-}
-
-class TestError extends _ExceptionResult implements TestResult {
-  TestError(String testDescription, var exception, var this.stacktrace) :
-      super(testDescription, exception);
-
-  String toString() => ">>> Test error caught in " +
-      "${_testDescription} with:\n${exception}\n$stacktrace\n";
-
-  var stacktrace;
-}
-
-class TestClass {
-  void register(String description, Function test, TestSuite suite) {
-    suite._registerTest(() {
-      setUp();
-      try {
-        test();
-        tearDown();
-        return new PassedTest(description);
-      } on ExpectException catch (x) {
-        tearDown();
-        return new FailedTest(description, x);
-      } catch (x, stacktrace) {
-        tearDown();
-        return new TestError(description, x, stacktrace);
-      }
-    });
-  }
-
-  void registerTests(TestSuite suite);
-  void setUp() {}
-  void tearDown() {}
-}
diff --git a/utils/tests/string_encoding/run_test.dart b/utils/tests/string_encoding/run_test.dart
deleted file mode 100755
index 72ee000..0000000
--- a/utils/tests/string_encoding/run_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env dart
-// 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 string_encoding_run_tests;
-import 'dunit.dart';
-import 'unicode_test.dart' as u;
-import 'unicode_core_test.dart' as uc;
-import 'utf16_test.dart' as utf16;
-import 'utf32_test.dart' as utf32;
-import 'utf8_test.dart' as utf8;
-
-void main() {
-  TestSuite suite = new TestSuite();
-  registerTests(suite);
-  suite.run();
-}
-
-void registerTests(TestSuite suite) {
-  suite.registerTestClass(new u.UnicodeTests());
-  suite.registerTestClass(new uc.UnicodeCoreTests());
-  suite.registerTestClass(new utf16.Utf16Tests());
-  suite.registerTestClass(new utf32.Utf32Tests());
-  suite.registerTestClass(new utf8.Utf8Tests());
-}
diff --git a/utils/tests/string_encoding/unicode_core_test.dart b/utils/tests/string_encoding/unicode_core_test.dart
deleted file mode 100755
index 21e7ef3..0000000
--- a/utils/tests/string_encoding/unicode_core_test.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env dart
-// 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 unicode_core_tests;
-import 'dunit.dart';
-import '../../string_encoding/unicode_core.dart';
-
-void main() {
-  TestSuite suite = new TestSuite();
-  suite.registerTestClass(new UnicodeCoreTests());
-  suite.run();
-}
-
-class UnicodeCoreTests extends TestClass {
-  void registerTests(TestSuite suite) {
-    register("testPlatform", testPlatform, suite);
-    register("testCodepointsToUtf16CodeUnits",
-        testCodepointsToUtf16CodeUnits, suite);
-    register("testUtf16bytesToCodepoints", testUtf16bytesToCodepoints, suite);
-  }
-
-  void testPlatform() {
-    Expect.isFalse(is16BitCodeUnit());
-  }
-
-  void testCodepointsToUtf16CodeUnits() {
-    // boundary conditions
-    Expect.listEquals([], codepointsToUtf16CodeUnits([]), "no input");
-    Expect.listEquals([0x0], codepointsToUtf16CodeUnits([0x0]), "0");
-    Expect.listEquals([0xd800, 0xdc00],
-        codepointsToUtf16CodeUnits([0x10000]), "10000");
-
-    Expect.listEquals([0xffff],
-        codepointsToUtf16CodeUnits([0xffff]), "ffff");
-    Expect.listEquals([0xdbff, 0xdfff],
-        codepointsToUtf16CodeUnits([0x10ffff]), "10ffff");
-
-    Expect.listEquals([0xd7ff],
-        codepointsToUtf16CodeUnits([0xd7ff]), "d7ff");
-    Expect.listEquals([0xe000],
-        codepointsToUtf16CodeUnits([0xe000]), "e000");
-
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        codepointsToUtf16CodeUnits([0xd800]), "d800");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        codepointsToUtf16CodeUnits([0xdfff]), "dfff");
-  }
-
-  void testUtf16bytesToCodepoints() {
-    // boundary conditions: First possible values
-    Expect.listEquals([], utf16CodeUnitsToCodepoints([]), "no input");
-    Expect.listEquals([0x0], utf16CodeUnitsToCodepoints([0x0]), "0");
-    Expect.listEquals([0x10000],
-        utf16CodeUnitsToCodepoints([0xd800, 0xdc00]), "10000");
-
-    // boundary conditions: Last possible sequence of a certain length
-    Expect.listEquals([0xffff],
-        utf16CodeUnitsToCodepoints([0xffff]), "ffff");
-    Expect.listEquals([0x10ffff],
-        utf16CodeUnitsToCodepoints([0xdbff, 0xdfff]), "10ffff");
-
-    // other boundary conditions
-    Expect.listEquals([0xd7ff],
-        utf16CodeUnitsToCodepoints([0xd7ff]), "d7ff");
-    Expect.listEquals([0xe000],
-        utf16CodeUnitsToCodepoints([0xe000]), "e000");
-
-    // unexpected continuation bytes
-    Expect.listEquals([0xfffd],
-        utf16CodeUnitsToCodepoints([0xdc00]),
-        "dc00 first unexpected continuation byte");
-    Expect.listEquals([0xfffd],
-        utf16CodeUnitsToCodepoints([0xdfff]),
-        "dfff last unexpected continuation byte");
-    Expect.listEquals([0xfffd],
-        utf16CodeUnitsToCodepoints([0xdc00]),
-        "1 unexpected continuation bytes");
-    Expect.listEquals([0xfffd, 0xfffd],
-        utf16CodeUnitsToCodepoints([0xdc00, 0xdc00]),
-        "2 unexpected continuation bytes");
-    Expect.listEquals([0xfffd, 0xfffd ,0xfffd],
-        utf16CodeUnitsToCodepoints([0xdc00, 0xdc00, 0xdc00]),
-        "3 unexpected continuation bytes");
-
-    // incomplete sequences
-    Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xd800]),
-        "d800 last byte missing");
-    Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xdbff]),
-        "dbff last byte missing");
-
-    // concatenation of incomplete sequences
-    Expect.listEquals([0xfffd, 0xfffd],
-        utf16CodeUnitsToCodepoints([0xd800, 0xdbff]),
-        "d800 dbff last byte missing");
-
-    // impossible bytes
-    Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0x110000]),
-        "110000 out of bounds");
-
-    // overlong sequences not possible in utf16 (nothing < x10000)
-    // illegal code positions d800-dfff not encodable (< x10000)
-  }
-}
diff --git a/utils/tests/string_encoding/unicode_test.dart b/utils/tests/string_encoding/unicode_test.dart
deleted file mode 100755
index 6f4af57..0000000
--- a/utils/tests/string_encoding/unicode_test.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env dart
-// 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 unicode_tests;
-import 'dunit.dart';
-
-void main() {
-  TestSuite suite = new TestSuite();
-  suite.registerTestClass(new UnicodeTests());
-  suite.run();
-}
-
-class UnicodeTests extends TestClass {
-  static const String testPhrase =
-      "The quick brown fox jumps over the lazy dog.";
-
-  static const List<int> testCodepoints = const<int> [
-      84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110,
-      32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114,
-      32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103, 46];
-
-  void registerTests(TestSuite suite) {
-    register("testCodepointsToString", testCodepointsToString, suite);
-    register("testStringCharCodes", testStringCharCodes, suite);
-    register("testEmptyStringFromCharCodes", testEmptyStringFromCharCodes, suite);
-    register("testEmptyStringCharCodes", testEmptyStringCharCodes, suite);
-  }
-
-  void testStringCharCodes() {
-    Expect.listEquals(testCodepoints, testPhrase.codeUnits);
-  }
-
-  void testCodepointsToString() {
-    Expect.stringEquals(testPhrase, new String.fromCharCodes(testCodepoints));
-  }
-
-  void testEmptyStringFromCharCodes() {
-    Expect.stringEquals("", new String.fromCharCodes(<int>[]));
-  }
-
-  void testEmptyStringCharCodes() {
-    Expect.listEquals([], "".codeUnits);
-  }
-}
diff --git a/utils/tests/string_encoding/utf16_test.dart b/utils/tests/string_encoding/utf16_test.dart
deleted file mode 100755
index 7e58a6c..0000000
--- a/utils/tests/string_encoding/utf16_test.dart
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/bin/env dart
-// 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 utf16_tests;
-import 'dunit.dart';
-import '../../string_encoding/unicode_core.dart';
-import '../../string_encoding/utf16.dart';
-
-void main() {
-  TestSuite suite = new TestSuite();
-  suite.registerTestClass(new Utf16Tests());
-  suite.run();
-}
-
-class Utf16Tests extends TestClass {
-  static const String testKoreanCharSubset = """
-가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
-개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
-갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
-  static const String testHanWater = "水";
-
-  static const List<int> testKoreanCharSubsetUtf16beBom = const<int>[
-      0xfe, 0xff, 0xac, 0x00, 0xac, 0x01, 0xac, 0x02,
-      0xac, 0x03, 0xac, 0x04, 0xac, 0x05, 0xac, 0x06,
-      0xac, 0x07, 0xac, 0x08, 0xac, 0x09, 0xac, 0x0a,
-      0xac, 0x0b, 0xac, 0x0c, 0xac, 0x0d, 0xac, 0x0e,
-      0xac, 0x0f, 0xac, 0x10, 0xac, 0x11, 0xac, 0x12,
-      0xac, 0x13, 0xac, 0x14, 0xac, 0x15, 0xac, 0x16,
-      0xac, 0x17, 0xac, 0x18, 0xac, 0x19, 0xac, 0x1a,
-      0xac, 0x1b, 0x00, 0x0a, 0xac, 0x1c, 0xac, 0x1d,
-      0xac, 0x1e, 0xac, 0x1f, 0xac, 0x20, 0xac, 0x21,
-      0xac, 0x22, 0xac, 0x23, 0xac, 0x24, 0xac, 0x25,
-      0xac, 0x26, 0xac, 0x27, 0xac, 0x28, 0xac, 0x29,
-      0xac, 0x2a, 0xac, 0x2b, 0xac, 0x2c, 0xac, 0x2d,
-      0xac, 0x2e, 0xac, 0x2f, 0xac, 0x30, 0xac, 0x31,
-      0xac, 0x32, 0xac, 0x33, 0xac, 0x34, 0xac, 0x35,
-      0xac, 0x36, 0xac, 0x37, 0x00, 0x0a, 0xac, 0x38,
-      0xac, 0x39, 0xac, 0x3a, 0xac, 0x3b, 0xac, 0x3c,
-      0xac, 0x3d, 0xac, 0x3e, 0xac, 0x3f, 0xac, 0x40,
-      0xac, 0x41, 0xac, 0x42, 0xac, 0x43, 0xac, 0x44,
-      0xac, 0x45, 0xac, 0x46, 0xac, 0x47, 0xac, 0x48,
-      0xac, 0x49, 0xac, 0x4a, 0xac, 0x4b, 0xac, 0x4c,
-      0xac, 0x4d, 0xac, 0x4e, 0xac, 0x4f, 0xac, 0x50,
-      0xac, 0x51, 0xac, 0x52, 0xac, 0x53];
-
-  static const List<int> testKoreanCharSubsetUtf16le = const<int>    [
-      0x00, 0xac, 0x01, 0xac, 0x02, 0xac, 0x03, 0xac,
-      0x04, 0xac, 0x05, 0xac, 0x06, 0xac, 0x07, 0xac,
-      0x08, 0xac, 0x09, 0xac, 0x0a, 0xac, 0x0b, 0xac,
-      0x0c, 0xac, 0x0d, 0xac, 0x0e, 0xac, 0x0f, 0xac,
-      0x10, 0xac, 0x11, 0xac, 0x12, 0xac, 0x13, 0xac,
-      0x14, 0xac, 0x15, 0xac, 0x16, 0xac, 0x17, 0xac,
-      0x18, 0xac, 0x19, 0xac, 0x1a, 0xac, 0x1b, 0xac,
-      0x0a, 0x00, 0x1c, 0xac, 0x1d, 0xac, 0x1e, 0xac,
-      0x1f, 0xac, 0x20, 0xac, 0x21, 0xac, 0x22, 0xac,
-      0x23, 0xac, 0x24, 0xac, 0x25, 0xac, 0x26, 0xac,
-      0x27, 0xac, 0x28, 0xac, 0x29, 0xac, 0x2a, 0xac,
-      0x2b, 0xac, 0x2c, 0xac, 0x2d, 0xac, 0x2e, 0xac,
-      0x2f, 0xac, 0x30, 0xac, 0x31, 0xac, 0x32, 0xac,
-      0x33, 0xac, 0x34, 0xac, 0x35, 0xac, 0x36, 0xac,
-      0x37, 0xac, 0x0a, 0x00, 0x38, 0xac, 0x39, 0xac,
-      0x3a, 0xac, 0x3b, 0xac, 0x3c, 0xac, 0x3d, 0xac,
-      0x3e, 0xac, 0x3f, 0xac, 0x40, 0xac, 0x41, 0xac,
-      0x42, 0xac, 0x43, 0xac, 0x44, 0xac, 0x45, 0xac,
-      0x46, 0xac, 0x47, 0xac, 0x48, 0xac, 0x49, 0xac,
-      0x4a, 0xac, 0x4b, 0xac, 0x4c, 0xac, 0x4d, 0xac,
-      0x4e, 0xac, 0x4f, 0xac, 0x50, 0xac, 0x51, 0xac,
-      0x52, 0xac, 0x53, 0xac];
-
-  void registerTests(TestSuite suite) {
-    register("Utf16Tests.testEncodeToUtf16", testEncodeToUtf16, suite);
-    register("Utf16Tests.testUtf16BytesToString", testUtf16BytesToString, suite);
-    register("Utf16Tests.testIterableMethods", testIterableMethods, suite);
-  }
-
-  void testEncodeToUtf16() {
-    Expect.listEquals([], encodeUtf16be("")); // TODO(dcarlson) should we skip bom if empty?
-    Expect.listEquals(testKoreanCharSubsetUtf16beBom,
-        encodeUtf16(testKoreanCharSubset),
-        "encode UTF-16(BE by default) Korean");
-
-    Expect.listEquals(testKoreanCharSubsetUtf16le,
-        encodeUtf16le(testKoreanCharSubset),
-        "encode UTF-16LE Korean");
-  }
-
-  void testUtf16BytesToString() {
-    Expect.stringEquals("", decodeUtf16([]));
-    Expect.stringEquals(testHanWater, decodeUtf16([0x6C, 0x34]),
-        "Water variation 1");
-    Expect.stringEquals(testHanWater, decodeUtf16([0xFE, 0xFF, 0x6C, 0x34]),
-        "Water variation 2");
-    Expect.stringEquals(testHanWater, decodeUtf16([0xFF, 0xFE, 0x34, 0x6C]),
-        "Water variation 3");
-
-    Expect.stringEquals(testHanWater, decodeUtf16be([0x6C, 0x34]),
-        "Water variation 4");
-    Expect.stringEquals(testHanWater,
-        decodeUtf16be([0xFE, 0xFF, 0x6C, 0x34]),
-        "Water variation 5");
-
-    Expect.stringEquals(testHanWater, decodeUtf16le([0x34, 0x6C]),
-        "Water variation 6");
-    Expect.stringEquals(testHanWater,
-        decodeUtf16le([0xFF, 0xFE, 0x34, 0x6C]),
-        "Water variation 7");
-
-    Expect.stringEquals(testKoreanCharSubset,
-        decodeUtf16(testKoreanCharSubsetUtf16beBom), "UTF-16BE Korean");
-  }
-
-  void testIterableMethods() {
-    // empty input
-    Expect.isFalse(decodeUtf16AsIterable([]).iterator.moveNext());
-
-    IterableUtf16Decoder koreanDecoder =
-      decodeUtf16AsIterable(testKoreanCharSubsetUtf16beBom);
-    // get the first character
-    Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
-    // get the whole translation using the Iterable interface
-    Expect.stringEquals(testKoreanCharSubset,
-        new String.fromCharCodes(new List<int>.from(koreanDecoder)));
-
-    // specify types
-    Expect.equals(44032, (new List<int>
-        .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom)))[0]);
-    Expect.equals(44032, (new List<int>
-        .from(decodeUtf16leAsIterable(testKoreanCharSubsetUtf16le)))[0]);
-    Expect.equals(UNICODE_BOM, (new List<int>
-        .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom,
-              stripBom: false)))[0]);
-  }
-}
diff --git a/utils/tests/string_encoding/utf32_test.dart b/utils/tests/string_encoding/utf32_test.dart
deleted file mode 100755
index ed6ace8..0000000
--- a/utils/tests/string_encoding/utf32_test.dart
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/usr/bin/env dart
-// 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 utf32_tests;
-import 'dunit.dart';
-import '../../string_encoding/unicode_core.dart';
-import '../../string_encoding/utf32.dart';
-
-void main() {
-  TestSuite suite = new TestSuite();
-  suite.registerTestClass(new Utf32Tests());
-  suite.run();
-}
-
-class Utf32Tests extends TestClass {
-  static const String testKoreanCharSubset = """
-가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
-개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
-갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
-  static const String testHanTwice = "二";
-
-  static const List<int> testKoreanCharSubsetUtf32beBom = const<int>[
-      0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xac, 0x00,
-      0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xac, 0x02,
-      0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x04,
-      0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xac, 0x06,
-      0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xac, 0x08,
-      0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xac, 0x0a,
-      0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xac, 0x0c,
-      0x00, 0x00, 0xac, 0x0d, 0x00, 0x00, 0xac, 0x0e,
-      0x00, 0x00, 0xac, 0x0f, 0x00, 0x00, 0xac, 0x10,
-      0x00, 0x00, 0xac, 0x11, 0x00, 0x00, 0xac, 0x12,
-      0x00, 0x00, 0xac, 0x13, 0x00, 0x00, 0xac, 0x14,
-      0x00, 0x00, 0xac, 0x15, 0x00, 0x00, 0xac, 0x16,
-      0x00, 0x00, 0xac, 0x17, 0x00, 0x00, 0xac, 0x18,
-      0x00, 0x00, 0xac, 0x19, 0x00, 0x00, 0xac, 0x1a,
-      0x00, 0x00, 0xac, 0x1b, 0x00, 0x00, 0x00, 0x0a,
-      0x00, 0x00, 0xac, 0x1c, 0x00, 0x00, 0xac, 0x1d,
-      0x00, 0x00, 0xac, 0x1e, 0x00, 0x00, 0xac, 0x1f,
-      0x00, 0x00, 0xac, 0x20, 0x00, 0x00, 0xac, 0x21,
-      0x00, 0x00, 0xac, 0x22, 0x00, 0x00, 0xac, 0x23,
-      0x00, 0x00, 0xac, 0x24, 0x00, 0x00, 0xac, 0x25,
-      0x00, 0x00, 0xac, 0x26, 0x00, 0x00, 0xac, 0x27,
-      0x00, 0x00, 0xac, 0x28, 0x00, 0x00, 0xac, 0x29,
-      0x00, 0x00, 0xac, 0x2a, 0x00, 0x00, 0xac, 0x2b,
-      0x00, 0x00, 0xac, 0x2c, 0x00, 0x00, 0xac, 0x2d,
-      0x00, 0x00, 0xac, 0x2e, 0x00, 0x00, 0xac, 0x2f,
-      0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x31,
-      0x00, 0x00, 0xac, 0x32, 0x00, 0x00, 0xac, 0x33,
-      0x00, 0x00, 0xac, 0x34, 0x00, 0x00, 0xac, 0x35,
-      0x00, 0x00, 0xac, 0x36, 0x00, 0x00, 0xac, 0x37,
-      0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xac, 0x38,
-      0x00, 0x00, 0xac, 0x39, 0x00, 0x00, 0xac, 0x3a,
-      0x00, 0x00, 0xac, 0x3b, 0x00, 0x00, 0xac, 0x3c,
-      0x00, 0x00, 0xac, 0x3d, 0x00, 0x00, 0xac, 0x3e,
-      0x00, 0x00, 0xac, 0x3f, 0x00, 0x00, 0xac, 0x40,
-      0x00, 0x00, 0xac, 0x41, 0x00, 0x00, 0xac, 0x42,
-      0x00, 0x00, 0xac, 0x43, 0x00, 0x00, 0xac, 0x44,
-      0x00, 0x00, 0xac, 0x45, 0x00, 0x00, 0xac, 0x46,
-      0x00, 0x00, 0xac, 0x47, 0x00, 0x00, 0xac, 0x48,
-      0x00, 0x00, 0xac, 0x49, 0x00, 0x00, 0xac, 0x4a,
-      0x00, 0x00, 0xac, 0x4b, 0x00, 0x00, 0xac, 0x4c,
-      0x00, 0x00, 0xac, 0x4d, 0x00, 0x00, 0xac, 0x4e,
-      0x00, 0x00, 0xac, 0x4f, 0x00, 0x00, 0xac, 0x50,
-      0x00, 0x00, 0xac, 0x51, 0x00, 0x00, 0xac, 0x52,
-      0x00, 0x00, 0xac, 0x53];
-
-  static const List<int> testKoreanCharSubsetUtf32le = const<int>[
-      0x00, 0xac, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00,
-      0x02, 0xac, 0x00, 0x00, 0x03, 0xac, 0x00, 0x00,
-      0x04, 0xac, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00,
-      0x06, 0xac, 0x00, 0x00, 0x07, 0xac, 0x00, 0x00,
-      0x08, 0xac, 0x00, 0x00, 0x09, 0xac, 0x00, 0x00,
-      0x0a, 0xac, 0x00, 0x00, 0x0b, 0xac, 0x00, 0x00,
-      0x0c, 0xac, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x00,
-      0x0e, 0xac, 0x00, 0x00, 0x0f, 0xac, 0x00, 0x00,
-      0x10, 0xac, 0x00, 0x00, 0x11, 0xac, 0x00, 0x00,
-      0x12, 0xac, 0x00, 0x00, 0x13, 0xac, 0x00, 0x00,
-      0x14, 0xac, 0x00, 0x00, 0x15, 0xac, 0x00, 0x00,
-      0x16, 0xac, 0x00, 0x00, 0x17, 0xac, 0x00, 0x00,
-      0x18, 0xac, 0x00, 0x00, 0x19, 0xac, 0x00, 0x00,
-      0x1a, 0xac, 0x00, 0x00, 0x1b, 0xac, 0x00, 0x00,
-      0x0a, 0x00, 0x00, 0x00, 0x1c, 0xac, 0x00, 0x00,
-      0x1d, 0xac, 0x00, 0x00, 0x1e, 0xac, 0x00, 0x00,
-      0x1f, 0xac, 0x00, 0x00, 0x20, 0xac, 0x00, 0x00,
-      0x21, 0xac, 0x00, 0x00, 0x22, 0xac, 0x00, 0x00,
-      0x23, 0xac, 0x00, 0x00, 0x24, 0xac, 0x00, 0x00,
-      0x25, 0xac, 0x00, 0x00, 0x26, 0xac, 0x00, 0x00,
-      0x27, 0xac, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00,
-      0x29, 0xac, 0x00, 0x00, 0x2a, 0xac, 0x00, 0x00,
-      0x2b, 0xac, 0x00, 0x00, 0x2c, 0xac, 0x00, 0x00,
-      0x2d, 0xac, 0x00, 0x00, 0x2e, 0xac, 0x00, 0x00,
-      0x2f, 0xac, 0x00, 0x00, 0x30, 0xac, 0x00, 0x00,
-      0x31, 0xac, 0x00, 0x00, 0x32, 0xac, 0x00, 0x00,
-      0x33, 0xac, 0x00, 0x00, 0x34, 0xac, 0x00, 0x00,
-      0x35, 0xac, 0x00, 0x00, 0x36, 0xac, 0x00, 0x00,
-      0x37, 0xac, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
-      0x38, 0xac, 0x00, 0x00, 0x39, 0xac, 0x00, 0x00,
-      0x3a, 0xac, 0x00, 0x00, 0x3b, 0xac, 0x00, 0x00,
-      0x3c, 0xac, 0x00, 0x00, 0x3d, 0xac, 0x00, 0x00,
-      0x3e, 0xac, 0x00, 0x00, 0x3f, 0xac, 0x00, 0x00,
-      0x40, 0xac, 0x00, 0x00, 0x41, 0xac, 0x00, 0x00,
-      0x42, 0xac, 0x00, 0x00, 0x43, 0xac, 0x00, 0x00,
-      0x44, 0xac, 0x00, 0x00, 0x45, 0xac, 0x00, 0x00,
-      0x46, 0xac, 0x00, 0x00, 0x47, 0xac, 0x00, 0x00,
-      0x48, 0xac, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00,
-      0x4a, 0xac, 0x00, 0x00, 0x4b, 0xac, 0x00, 0x00,
-      0x4c, 0xac, 0x00, 0x00, 0x4d, 0xac, 0x00, 0x00,
-      0x4e, 0xac, 0x00, 0x00, 0x4f, 0xac, 0x00, 0x00,
-      0x50, 0xac, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
-      0x52, 0xac, 0x00, 0x00, 0x53, 0xac, 0x00, 0x00];
-
-  void registerTests(TestSuite suite) {
-    register("Utf32Tests.testUtf32BytesToString", testUtf32BytesToString,
-        suite);
-    register("Utf32Tests.testEncodeToUtf32", testEncodeToUtf32, suite);
-    register("Utf32Tests.testIterableMethods", testIterableMethods, suite);
-  }
-
-  void testEncodeToUtf32() {
-    Expect.listEquals([], encodeUtf32le(""), "no input"); // TODO(dcarlson) skip bom on empty?
-    Expect.listEquals(testKoreanCharSubsetUtf32beBom,
-        encodeUtf32(testKoreanCharSubset),
-        "encode UTF-32(BE by default) Korean");
-    Expect.listEquals(testKoreanCharSubsetUtf32le,
-        encodeUtf32le(testKoreanCharSubset),
-        "encode UTF-32(LE by default) Korean");
-  }
-
-  void testUtf32BytesToString() {
-    Expect.stringEquals("", decodeUtf32([]), "no input");
-    Expect.stringEquals("\ufffd", decodeUtf32([0]), "single byte");
-    Expect.stringEquals("\ufffd", decodeUtf32([0, 0, 0x4e]),
-        "short a byte");
-    Expect.stringEquals("\u4e8c\ufffd", decodeUtf32([0, 0, 0x4e, 0x8c, 0]),
-        "extra byte");
-
-    Expect.stringEquals(testHanTwice, decodeUtf32([0, 0, 0x4e, 0x8c]),
-        "twice variation 1");
-    Expect.stringEquals(testHanTwice,
-        decodeUtf32([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
-        "twice variation 2");
-    Expect.stringEquals(testHanTwice,
-        decodeUtf32([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
-        "twice variation 3");
-
-    Expect.stringEquals(testHanTwice, decodeUtf32be([0, 0, 0x4e, 0x8c]),
-        "twice variation 4");
-    Expect.stringEquals(testHanTwice,
-        decodeUtf32be([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
-        "twice variation 5");
-
-    Expect.stringEquals(testHanTwice, decodeUtf32le([0x8c, 0x4e, 0, 0]),
-        "twice variation 6");
-    Expect.stringEquals(testHanTwice,
-        decodeUtf32le([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
-        "twice variation 7");
-
-    Expect.stringEquals(testKoreanCharSubset,
-        decodeUtf32(testKoreanCharSubsetUtf32beBom),
-        "UTF-32BE Korean");
-  }
-
-  void testIterableMethods() {
-    // empty input
-    Expect.isFalse(decodeUtf32AsIterable([]).iterator.moveNext());
-
-    IterableUtf32Decoder koreanDecoder =
-      decodeUtf32AsIterable(testKoreanCharSubsetUtf32beBom);
-    // get the first character
-    Expect.equals(testKoreanCharSubset.codeUnits[0],
-        koreanDecoder.iterator.first);
-    // get the whole translation using the Iterable interface
-    Expect.stringEquals(testKoreanCharSubset,
-        new String.fromCharCodes(new List<int>.from(koreanDecoder)));
-
-    // specify types
-    Expect.equals(44032, (new List<int>
-        .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom)))[0]);
-    Expect.equals(44032, (new List<int>
-        .from(decodeUtf32leAsIterable(testKoreanCharSubsetUtf32le)))[0]);
-    Expect.equals(UNICODE_BOM, (new List<int>
-        .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom,
-            stripBom: false)))[0]);
-  }
-}
diff --git a/utils/tests/string_encoding/utf8_benchmarks.dart b/utils/tests/string_encoding/utf8_benchmarks.dart
deleted file mode 100755
index 8d8f230..0000000
--- a/utils/tests/string_encoding/utf8_benchmarks.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env dart
-// 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 BenchmarkTests;
-import 'dart:io';
-import 'dart:math' as Math;
-import '../../../lib/convert/convert.dart' as SE;
-part 'benchmark_runner.dart';
-
-void main(List<String> arguments) {
-  Runner.arguments = arguments;
-
-  final List<int> testEnglishUtf8 = const<int> [
-      0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
-      0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
-      0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
-      0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
-      0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20,
-      0x64, 0x6f, 0x67, 0x2e];
-
-  final List<int> testDanishUtf8 = const<int>[
-      0x51, 0x75, 0x69, 0x7a, 0x64, 0x65, 0x6c, 0x74,
-      0x61, 0x67, 0x65, 0x72, 0x6e, 0x65, 0x20, 0x73,
-      0x70, 0x69, 0x73, 0x74, 0x65, 0x20, 0x6a, 0x6f,
-      0x72, 0x64, 0x62, 0xc3, 0xa6, 0x72, 0x20, 0x6d,
-      0x65, 0x64, 0x20, 0x66, 0x6c, 0xc3, 0xb8, 0x64,
-      0x65, 0x20, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x63,
-      0x69, 0x72, 0x6b, 0x75, 0x73, 0x6b, 0x6c, 0x6f,
-      0x76, 0x6e, 0x65, 0x6e, 0x20, 0x57, 0x6f, 0x6c,
-      0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x69,
-      0x6c, 0x6c, 0x65, 0x64, 0x65, 0x20, 0x70, 0xc3,
-      0xa5, 0x20, 0x78, 0x79, 0x6c, 0x6f, 0x66, 0x6f,
-      0x6e, 0x2e];
-
-  final List<int> testHebrewUtf8 = const<int>[
-      0xd7, 0x93, 0xd7, 0x92, 0x20, 0xd7, 0xa1, 0xd7,
-      0xa7, 0xd7, 0xa8, 0xd7, 0x9f, 0x20, 0xd7, 0xa9,
-      0xd7, 0x98, 0x20, 0xd7, 0x91, 0xd7, 0x99, 0xd7,
-      0x9d, 0x20, 0xd7, 0x9e, 0xd7, 0x90, 0xd7, 0x95,
-      0xd7, 0x9b, 0xd7, 0x96, 0xd7, 0x91, 0x20, 0xd7,
-      0x95, 0xd7, 0x9c, 0xd7, 0xa4, 0xd7, 0xaa, 0xd7,
-      0xa2, 0x20, 0xd7, 0x9e, 0xd7, 0xa6, 0xd7, 0x90,
-      0x20, 0xd7, 0x9c, 0xd7, 0x95, 0x20, 0xd7, 0x97,
-      0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x94, 0x20, 0xd7,
-      0x90, 0xd7, 0x99, 0xd7, 0x9a, 0x20, 0xd7, 0x94,
-      0xd7, 0xa7, 0xd7, 0x9c, 0xd7, 0x99, 0xd7, 0x98,
-      0xd7, 0x94];
-
-  final List<int> testRussianUtf8 = const<int>[
-      0xd0, 0xa1, 0xd1, 0x8a, 0xd0, 0xb5, 0xd1, 0x88,
-      0xd1, 0x8c, 0x20, 0xd0, 0xb6, 0xd0, 0xb5, 0x20,
-      0xd0, 0xb5, 0xd1, 0x89, 0xd1, 0x91, 0x20, 0xd1,
-      0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0x20,
-      0xd0, 0xbc, 0xd1, 0x8f, 0xd0, 0xb3, 0xd0, 0xba,
-      0xd0, 0xb8, 0xd1, 0x85, 0x20, 0xd1, 0x84, 0xd1,
-      0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, 0x86, 0xd1,
-      0x83, 0xd0, 0xb7, 0xd1, 0x81, 0xd0, 0xba, 0xd0,
-      0xb8, 0xd1, 0x85, 0x20, 0xd0, 0xb1, 0xd1, 0x83,
-      0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xba, 0x20, 0xd0,
-      0xb4, 0xd0, 0xb0, 0x20, 0xd0, 0xb2, 0xd1, 0x8b,
-      0xd0, 0xbf, 0xd0, 0xb5, 0xd0, 0xb9, 0x20, 0xd1,
-      0x87, 0xd0, 0xb0, 0xd1, 0x8e];
-
-  final List<int> testGreekUtf8 = const<int>[
-      0xce, 0x93, 0xce, 0xb1, 0xce, 0xb6, 0xce, 0xad,
-      0xce, 0xb5, 0xcf, 0x82, 0x20, 0xce, 0xba, 0xce,
-      0xb1, 0xe1, 0xbd, 0xb6, 0x20, 0xce, 0xbc, 0xcf,
-      0x85, 0xcf, 0x81, 0xcf, 0x84, 0xce, 0xb9, 0xe1,
-      0xbd, 0xb2, 0xcf, 0x82, 0x20, 0xce, 0xb4, 0xe1,
-      0xbd, 0xb2, 0xce, 0xbd, 0x20, 0xce, 0xb8, 0xe1,
-      0xbd, 0xb0, 0x20, 0xce, 0xb2, 0xcf, 0x81, 0xe1,
-      0xbf, 0xb6, 0x20, 0xcf, 0x80, 0xce, 0xb9, 0xe1,
-      0xbd, 0xb0, 0x20, 0xcf, 0x83, 0xcf, 0x84, 0xe1,
-      0xbd, 0xb8, 0x20, 0xcf, 0x87, 0xcf, 0x81, 0xcf,
-      0x85, 0xcf, 0x83, 0xce, 0xb1, 0xcf, 0x86, 0xe1,
-      0xbd, 0xb6, 0x20, 0xce, 0xbe, 0xce, 0xad, 0xcf,
-      0x86, 0xcf, 0x89, 0xcf, 0x84, 0xce, 0xbf];
-
-  final List<int> testKatakanaUtf8 = const<int>[
-      0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xad, 0xe3, 0x83,
-      0x8f, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x9b, 0xe3,
-      0x83, 0x98, 0xe3, 0x83, 0x88, 0x20, 0xe3, 0x83,
-      0x81, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0x8c, 0xe3,
-      0x83, 0xab, 0xe3, 0x83, 0xb2, 0x20, 0xe3, 0x83,
-      0xaf, 0xe3, 0x82, 0xab, 0xe3, 0x83, 0xa8, 0xe3,
-      0x82, 0xbf, 0xe3, 0x83, 0xac, 0xe3, 0x82, 0xbd,
-      0x20, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x8d, 0xe3,
-      0x83, 0x8a, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0,
-      0x0a, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
-      0x83, 0x8e, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xaf,
-      0xe3, 0x83, 0xa4, 0xe3, 0x83, 0x9e, 0x20, 0xe3,
-      0x82, 0xb1, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xb3,
-      0xe3, 0x82, 0xa8, 0xe3, 0x83, 0x86, 0x20, 0xe3,
-      0x82, 0xa2, 0xe3, 0x82, 0xb5, 0xe3, 0x82, 0xad,
-      0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xa1, 0xe3, 0x83,
-      0x9f, 0xe3, 0x82, 0xb7, 0x20, 0xe3, 0x83, 0xb1,
-      0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa2, 0xe3, 0x82,
-      0xbb, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0xb3];
-
-  TimedTestConfig testConfig_1sec =
-      new TimedTestConfig(100, 1 * 1000, blocksize: 1000);
-
-  BenchmarkRunner.runTimed("SE_EN1","string_encoding/decodeUtf8-English1",
-      testConfig_1sec, () => SE.UTF8.decode(testEnglishUtf8));
-
-  BenchmarkRunner.runTimed("SE_DA1","string_encoding/decodeUtf8-Danish1",
-      testConfig_1sec, () => SE.UTF8.decode(testDanishUtf8));
-
-  BenchmarkRunner.runTimed("SE_HE1","string_encoding/decodeUtf8-Hebrew1",
-      testConfig_1sec, () => SE.UTF8.decode(testHebrewUtf8));
-
-  BenchmarkRunner.runTimed("SE_RU1","string_encoding/decodeUtf8-Russian1",
-      testConfig_1sec, () => SE.UTF8.decode(testRussianUtf8));
-
-  BenchmarkRunner.runTimed("SE_EL1","string_encoding/decodeUtf8-Greek",
-      testConfig_1sec, () => SE.UTF8.decode(testGreekUtf8));
-
-  BenchmarkRunner.runTimed("SE_JA1","string_encoding/decodeUtf8-Katakana",
-      testConfig_1sec, () => SE.UTF8.decode(testKatakanaUtf8));
-}
diff --git a/utils/tests/string_encoding/utf8_test.dart b/utils/tests/string_encoding/utf8_test.dart
deleted file mode 100755
index 4070426..0000000
--- a/utils/tests/string_encoding/utf8_test.dart
+++ /dev/null
@@ -1,478 +0,0 @@
-#!/usr/bin/env dart
-// 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 utf8_tests;
-import 'dunit.dart';
-import '../../../lib/convert/convert.dart';
-
-void main() {
-  TestSuite suite = new TestSuite();
-  suite.registerTestClass(new Utf8Tests());
-  suite.run();
-}
-
-class Utf8Tests extends TestClass {
-  static const String testEnglishPhrase =
-      "The quick brown fox jumps over the lazy dog.";
-
-  static const List<int> testEnglishUtf8 = const<int> [
-      0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
-      0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
-      0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
-      0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
-      0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20,
-      0x64, 0x6f, 0x67, 0x2e];
-
-  static const String testDanishPhrase = "Quizdeltagerne spiste jordbær med " +
-      "fløde mens cirkusklovnen Wolther spillede på xylofon.";
-
-  static const List<int> testDanishUtf8 = const<int>[
-      0x51, 0x75, 0x69, 0x7a, 0x64, 0x65, 0x6c, 0x74,
-      0x61, 0x67, 0x65, 0x72, 0x6e, 0x65, 0x20, 0x73,
-      0x70, 0x69, 0x73, 0x74, 0x65, 0x20, 0x6a, 0x6f,
-      0x72, 0x64, 0x62, 0xc3, 0xa6, 0x72, 0x20, 0x6d,
-      0x65, 0x64, 0x20, 0x66, 0x6c, 0xc3, 0xb8, 0x64,
-      0x65, 0x20, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x63,
-      0x69, 0x72, 0x6b, 0x75, 0x73, 0x6b, 0x6c, 0x6f,
-      0x76, 0x6e, 0x65, 0x6e, 0x20, 0x57, 0x6f, 0x6c,
-      0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x69,
-      0x6c, 0x6c, 0x65, 0x64, 0x65, 0x20, 0x70, 0xc3,
-      0xa5, 0x20, 0x78, 0x79, 0x6c, 0x6f, 0x66, 0x6f,
-      0x6e, 0x2e];
-
-  // unusual formatting due to strange editor interaction w/ text direction.
-  static const String
-      testHebrewPhrase = "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה";
-
-  static const List<int> testHebrewUtf8 = const<int>[
-      0xd7, 0x93, 0xd7, 0x92, 0x20, 0xd7, 0xa1, 0xd7,
-      0xa7, 0xd7, 0xa8, 0xd7, 0x9f, 0x20, 0xd7, 0xa9,
-      0xd7, 0x98, 0x20, 0xd7, 0x91, 0xd7, 0x99, 0xd7,
-      0x9d, 0x20, 0xd7, 0x9e, 0xd7, 0x90, 0xd7, 0x95,
-      0xd7, 0x9b, 0xd7, 0x96, 0xd7, 0x91, 0x20, 0xd7,
-      0x95, 0xd7, 0x9c, 0xd7, 0xa4, 0xd7, 0xaa, 0xd7,
-      0xa2, 0x20, 0xd7, 0x9e, 0xd7, 0xa6, 0xd7, 0x90,
-      0x20, 0xd7, 0x9c, 0xd7, 0x95, 0x20, 0xd7, 0x97,
-      0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x94, 0x20, 0xd7,
-      0x90, 0xd7, 0x99, 0xd7, 0x9a, 0x20, 0xd7, 0x94,
-      0xd7, 0xa7, 0xd7, 0x9c, 0xd7, 0x99, 0xd7, 0x98,
-      0xd7, 0x94];
-
-  static const String testRussianPhrase = "Съешь же ещё этих мягких " +
-      "французских булок да выпей чаю";
-
-  static const List<int> testRussianUtf8 = const<int>[
-      0xd0, 0xa1, 0xd1, 0x8a, 0xd0, 0xb5, 0xd1, 0x88,
-      0xd1, 0x8c, 0x20, 0xd0, 0xb6, 0xd0, 0xb5, 0x20,
-      0xd0, 0xb5, 0xd1, 0x89, 0xd1, 0x91, 0x20, 0xd1,
-      0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0x20,
-      0xd0, 0xbc, 0xd1, 0x8f, 0xd0, 0xb3, 0xd0, 0xba,
-      0xd0, 0xb8, 0xd1, 0x85, 0x20, 0xd1, 0x84, 0xd1,
-      0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, 0x86, 0xd1,
-      0x83, 0xd0, 0xb7, 0xd1, 0x81, 0xd0, 0xba, 0xd0,
-      0xb8, 0xd1, 0x85, 0x20, 0xd0, 0xb1, 0xd1, 0x83,
-      0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xba, 0x20, 0xd0,
-      0xb4, 0xd0, 0xb0, 0x20, 0xd0, 0xb2, 0xd1, 0x8b,
-      0xd0, 0xbf, 0xd0, 0xb5, 0xd0, 0xb9, 0x20, 0xd1,
-      0x87, 0xd0, 0xb0, 0xd1, 0x8e];
-
-  static const String testGreekPhrase = "Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ " +
-      "στὸ χρυσαφὶ ξέφωτο";
-
-  static const List<int> testGreekUtf8 = const<int>[
-      0xce, 0x93, 0xce, 0xb1, 0xce, 0xb6, 0xce, 0xad,
-      0xce, 0xb5, 0xcf, 0x82, 0x20, 0xce, 0xba, 0xce,
-      0xb1, 0xe1, 0xbd, 0xb6, 0x20, 0xce, 0xbc, 0xcf,
-      0x85, 0xcf, 0x81, 0xcf, 0x84, 0xce, 0xb9, 0xe1,
-      0xbd, 0xb2, 0xcf, 0x82, 0x20, 0xce, 0xb4, 0xe1,
-      0xbd, 0xb2, 0xce, 0xbd, 0x20, 0xce, 0xb8, 0xe1,
-      0xbd, 0xb0, 0x20, 0xce, 0xb2, 0xcf, 0x81, 0xe1,
-      0xbf, 0xb6, 0x20, 0xcf, 0x80, 0xce, 0xb9, 0xe1,
-      0xbd, 0xb0, 0x20, 0xcf, 0x83, 0xcf, 0x84, 0xe1,
-      0xbd, 0xb8, 0x20, 0xcf, 0x87, 0xcf, 0x81, 0xcf,
-      0x85, 0xcf, 0x83, 0xce, 0xb1, 0xcf, 0x86, 0xe1,
-      0xbd, 0xb6, 0x20, 0xce, 0xbe, 0xce, 0xad, 0xcf,
-      0x86, 0xcf, 0x89, 0xcf, 0x84, 0xce, 0xbf];
-
-  static const String testKatakanaPhrase = """
-イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム
-ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン""";
-
-  static const List<int> testKatakanaUtf8 = const<int>[
-      0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xad, 0xe3, 0x83,
-      0x8f, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x9b, 0xe3,
-      0x83, 0x98, 0xe3, 0x83, 0x88, 0x20, 0xe3, 0x83,
-      0x81, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0x8c, 0xe3,
-      0x83, 0xab, 0xe3, 0x83, 0xb2, 0x20, 0xe3, 0x83,
-      0xaf, 0xe3, 0x82, 0xab, 0xe3, 0x83, 0xa8, 0xe3,
-      0x82, 0xbf, 0xe3, 0x83, 0xac, 0xe3, 0x82, 0xbd,
-      0x20, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x8d, 0xe3,
-      0x83, 0x8a, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0,
-      0x0a, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
-      0x83, 0x8e, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xaf,
-      0xe3, 0x83, 0xa4, 0xe3, 0x83, 0x9e, 0x20, 0xe3,
-      0x82, 0xb1, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xb3,
-      0xe3, 0x82, 0xa8, 0xe3, 0x83, 0x86, 0x20, 0xe3,
-      0x82, 0xa2, 0xe3, 0x82, 0xb5, 0xe3, 0x82, 0xad,
-      0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xa1, 0xe3, 0x83,
-      0x9f, 0xe3, 0x82, 0xb7, 0x20, 0xe3, 0x83, 0xb1,
-      0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa2, 0xe3, 0x82,
-      0xbb, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0xb3];
-
-  void registerTests(TestSuite suite) {
-    register("Utf8Tests.testUtf8bytesToCodepoints", testUtf8bytesToCodepoints,
-        suite);
-    register("Utf8Tests.testUtf8BytesToString", testUtf8BytesToString, suite);
-    register("Utf8Tests.testEncodeToUtf8", testEncodeToUtf8, suite);
-    register("Utf8Tests.testIterableMethods", testIterableMethods, suite);
-  }
-
-  void testEncodeToUtf8() {
-    Expect.listEquals(testEnglishUtf8, encodeUtf8(testEnglishPhrase),
-        "english to utf8");
-
-    Expect.listEquals(testDanishUtf8, encodeUtf8(testDanishPhrase),
-        "encode danish to utf8");
-
-    Expect.listEquals(testHebrewUtf8, encodeUtf8(testHebrewPhrase),
-        "Hebrew to utf8");
-
-    Expect.listEquals(testRussianUtf8, encodeUtf8(testRussianPhrase),
-        "Russian to utf8");
-
-    Expect.listEquals(testGreekUtf8, encodeUtf8(testGreekPhrase),
-        "Greek to utf8");
-
-    Expect.listEquals(testKatakanaUtf8, encodeUtf8(testKatakanaPhrase),
-        "Katakana to utf8");
-  }
-
-  List encodeUtf8(String text) => UTF8.encode(text);
-  String decodeUtf8(List bytes) => UTF8.decode(bytes);
-  List utf8ToCodePoints(List bytes) => UTF8.decode(bytes).runes.toList();
-
-  void testUtf8bytesToCodepoints() {
-    Expect.listEquals([954, 972, 963, 956, 949],
-        utf8ToCodepoints([0xce, 0xba, 0xcf, 0x8c, 0xcf,
-        0x83, 0xce, 0xbc, 0xce, 0xb5]), "κόσμε");
-
-    // boundary conditions: First possible sequence of a certain length
-    Expect.listEquals([], utf8ToCodepoints([]), "no input");
-    Expect.listEquals([0x0], utf8ToCodepoints([0x0]), "0");
-    Expect.listEquals([0x80], utf8ToCodepoints([0xc2, 0x80]), "80");
-    Expect.listEquals([0x800],
-        utf8ToCodepoints([0xe0, 0xa0, 0x80]), "800");
-    Expect.listEquals([0x10000],
-        utf8ToCodepoints([0xf0, 0x90, 0x80, 0x80]), "10000");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80, 0x80]), "200000");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfc, 0x84, 0x80, 0x80, 0x80, 0x80]),
-        "4000000");
-
-    // boundary conditions: Last possible sequence of a certain length
-    Expect.listEquals([0x7f], utf8ToCodepoints([0x7f]), "7f");
-    Expect.listEquals([0x7ff], utf8ToCodepoints([0xdf, 0xbf]), "7ff");
-    Expect.listEquals([0xffff],
-        utf8ToCodepoints([0xef, 0xbf, 0xbf]), "ffff");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf7, 0xbf, 0xbf, 0xbf]), "1fffff");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf, 0xbf]), "3ffffff");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf]),
-        "4000000");
-
-    // other boundary conditions
-    Expect.listEquals([0xd7ff],
-        utf8ToCodepoints([0xed, 0x9f, 0xbf]), "d7ff");
-    Expect.listEquals([0xe000],
-        utf8ToCodepoints([0xee, 0x80, 0x80]), "e000");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xef, 0xbf, 0xbd]), "fffd");
-    Expect.listEquals([0x10ffff],
-        utf8ToCodepoints([0xf4, 0x8f, 0xbf, 0xbf]), "10ffff");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf4, 0x90, 0x80, 0x80]), "110000");
-
-    // unexpected continuation bytes
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0x80]), "80 => replacement character");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xbf]), "bf => replacement character");
-
-    List<int> allContinuationBytes = <int>[];
-    List<int> matchingReplacementChars = <int>[];
-    for (int i = 0x80; i < 0xc0; i++) {
-      allContinuationBytes.add(i);
-      matchingReplacementChars.add(UNICODE_REPLACEMENT_CHARACTER_CODEPOINT);
-    }
-    Expect.listEquals(matchingReplacementChars,
-        utf8ToCodepoints(allContinuationBytes),
-        "80 - bf => replacement character x 64");
-
-    List<int> allFirstTwoByteSeq = <int>[];
-    matchingReplacementChars = <int>[];
-    for (int i = 0xc0; i < 0xe0; i++) {
-      allFirstTwoByteSeq.addAll([i, 0x20]);
-      matchingReplacementChars.addAll(
-          [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
-    }
-    Expect.listEquals(matchingReplacementChars,
-        utf8ToCodepoints(allFirstTwoByteSeq),
-        "c0 - df + space => replacement character + space x 32");
-
-    List<int> allFirstThreeByteSeq = <int>[];
-    matchingReplacementChars = <int>[];
-    for (int i = 0xe0; i < 0xf0; i++) {
-      allFirstThreeByteSeq.addAll([i, 0x20]);
-      matchingReplacementChars.addAll(
-          [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
-    }
-    Expect.listEquals(matchingReplacementChars,
-        utf8ToCodepoints(allFirstThreeByteSeq),
-        "e0 - ef + space => replacement character x 16");
-
-    List<int> allFirstFourByteSeq = <int>[];
-    matchingReplacementChars = <int>[];
-    for (int i = 0xf0; i < 0xf8; i++) {
-      allFirstFourByteSeq.addAll([i, 0x20]);
-      matchingReplacementChars.addAll(
-          [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
-    }
-    Expect.listEquals(matchingReplacementChars,
-        utf8ToCodepoints(allFirstFourByteSeq),
-        "f0 - f7 + space => replacement character x 8");
-
-    List<int> allFirstFiveByteSeq = <int>[];
-    matchingReplacementChars = <int>[];
-    for (int i = 0xf8; i < 0xfc; i++) {
-      allFirstFiveByteSeq.addAll([i, 0x20]);
-      matchingReplacementChars.addAll(
-          [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
-    }
-    Expect.listEquals(matchingReplacementChars,
-        utf8ToCodepoints(allFirstFiveByteSeq),
-        "f8 - fb + space => replacement character x 4");
-
-    List<int> allFirstSixByteSeq = <int>[];
-    matchingReplacementChars = <int>[];
-    for (int i = 0xfc; i < 0xfe; i++) {
-      allFirstSixByteSeq.addAll([i, 0x20]);
-      matchingReplacementChars.addAll(
-          [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
-    }
-    Expect.listEquals(matchingReplacementChars,
-        utf8ToCodepoints(allFirstSixByteSeq),
-        "fc - fd + space => replacement character x 2");
-
-    // Sequences with last continuation byte missing
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xc2]),
-        "2-byte sequence with last byte missing");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xe0, 0x80]),
-        "3-byte sequence with last byte missing");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf0, 0x80, 0x80]),
-        "4-byte sequence with last byte missing");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80]),
-        "5-byte sequence with last byte missing");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80]),
-        "6-byte sequence with last byte missing");
-
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xdf]),
-        "2-byte sequence with last byte missing (hi)");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xef, 0xbf]),
-        "3-byte sequence with last byte missing (hi)");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf7, 0xbf, 0xbf]),
-        "4-byte sequence with last byte missing (hi)");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf]),
-        "5-byte sequence with last byte missing (hi)");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf]),
-        "6-byte sequence with last byte missing (hi)");
-
-    // Concatenation of incomplete sequences
-    Expect.listEquals(
-        [ UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-          UNICODE_REPLACEMENT_CHARACTER_CODEPOINT ],
-        utf8ToCodepoints(
-            [ 0xc2,
-              0xe0, 0x80,
-              0xf0, 0x80, 0x80,
-              0xf8, 0x88, 0x80, 0x80,
-              0xfc, 0x80, 0x80, 0x80, 0x80,
-              0xdf,
-              0xef, 0xbf,
-              0xf7, 0xbf, 0xbf,
-              0xfb, 0xbf, 0xbf, 0xbf,
-              0xfd, 0xbf, 0xbf, 0xbf, 0xbf ]),
-            "Concatenation of incomplete sequences");
-
-    // Impossible bytes
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfe]), "fe");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xff]), "ff");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfe, 0xfe, 0xff, 0xff]), "fe fe ff ff");
-
-    // Overlong sequences
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xc0, 0xaf]), "c0 af");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xe0, 0x80, 0xaf]), "e0 80 af");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf0, 0x80, 0x80, 0xaf]), "f0 80 80 af");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0xaf]), "f8 80 80 80 af");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0xaf]),
-        "fc 80 80 80 80 af");
-
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xc1, 0xbf]), "c1 bf");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xe0, 0x9f, 0xbf]), "e0 9f bf");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf0, 0x8f, 0xbf, 0xbf]), "f0 8f bf bf");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf8, 0x87, 0xbf, 0xbf, 0xbf]), "f8 87 bf bf bf");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfc, 0x83, 0xbf, 0xbf, 0xbf, 0xbf]),
-        "fc 83 bf bf bf bf");
-
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xc0, 0x80]), "c0 80");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xe0, 0x80, 0x80]), "e0 80 80");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf0, 0x80, 0x80, 0x80]), "f0 80 80 80");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0x80]), "f8 80 80 80 80");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0x80]),
-        "fc 80 80 80 80 80");
-
-    // Illegal code positions
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xa0, 0x80]), "U+D800");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xad, 0xbf]), "U+DB7F");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xae, 0x80]), "U+DB80");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xaf, 0xbf]), "U+DBFF");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xb0, 0x80]), "U+DC00");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xbe, 0x80]), "U+DF80");
-    Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xbf, 0xbf]), "U+DFFF");
-
-    // Paired UTF-16 surrogates
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80]),
-        "U+D800 U+DC00");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xbf, 0xbf]),
-        "U+D800 U+DFFF");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xb0, 0x80]),
-        "U+DB7F U+DC00");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xbf, 0xbf]),
-        "U+DB7F U+DFFF");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xb0, 0x80]),
-        "U+DB80 U+DC00");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xbf, 0xbf]),
-        "U+DB80 U+DFFF");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xb0, 0x80]),
-        "U+DBFF U+DC00");
-    Expect.listEquals([
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-        utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf]),
-        "U+DBFF U+DFFF");
-
-    // Other illegal code positions (???)
-    Expect.listEquals([0xfffe], utf8ToCodepoints([0xef, 0xbf, 0xbe]),
-        "U+FFFE");
-    Expect.listEquals([0xffff], utf8ToCodepoints([0xef, 0xbf, 0xbf]),
-        "U+FFFF");
-  }
-
-  void testUtf8BytesToString() {
-    Expect.stringEquals(testEnglishPhrase,
-        decodeUtf8(testEnglishUtf8), "English");
-
-    Expect.stringEquals(testDanishPhrase,
-        decodeUtf8(testDanishUtf8), "Danish");
-
-    Expect.stringEquals(testHebrewPhrase,
-        decodeUtf8(testHebrewUtf8), "Hebrew");
-
-    Expect.stringEquals(testRussianPhrase,
-        decodeUtf8(testRussianUtf8), "Russian");
-
-    Expect.stringEquals(testGreekPhrase,
-        decodeUtf8(testGreekUtf8), "Greek");
-
-    Expect.stringEquals(testKatakanaPhrase,
-        decodeUtf8(testKatakanaUtf8), "Katakana");
-  }
-
-  void testIterableMethods() {
-    IterableUtf8Decoder englishDecoder = decodeUtf8AsIterable(testEnglishUtf8);
-    // get the first character
-    Expect.equals(testEnglishUtf8[0], englishDecoder.first);
-    // get the whole translation using the Iterable interface
-    Expect.stringEquals(testEnglishPhrase,
-        new String.fromCharCodes(new List<int>.from(englishDecoder)));
-
-    IterableUtf8Decoder kataDecoder = decodeUtf8AsIterable(testKatakanaUtf8);
-    // get the first character
-    Expect.equals(testKatakanaPhrase.codeUnits[0], kataDecoder.first);
-    // get the whole translation using the Iterable interface
-    Expect.stringEquals(testKatakanaPhrase,
-        new String.fromCharCodes(new List<int>.from(kataDecoder)));
-  }
-}