Version 0.8.10.1

svn merge -c 29751 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29755 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29759 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29761 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29764 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29765 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29766 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29767 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29768 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29774 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29775 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29776 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 29777 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

Review URL: https://codereview.chromium.org//56933002

git-svn-id: http://dart.googlecode.com/svn/trunk@29786 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 51c3ad8..9237bdc 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -5,7 +5,7 @@
 \usepackage{hyperref}
 \newcommand{\code}[1]{{\sf #1}}
 \title{Dart Programming Language  Specification \\
-{\large Draft Version 0.71}}
+{\large Draft Version 0.8}}
 \author{The Dart Team}
 \begin{document}
 \maketitle
@@ -514,8 +514,18 @@
 
 \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.
 
 
@@ -2080,7 +2090,7 @@
 
 It is a compile-time error if the interface of a class $C$ is a superinterface of itself.
 
-Let $C$ be a concrete class that does not declare its own \code{noSuchMethod()} method.
+Let $C$ be a concrete class that does not declare its own \code{noSuchMethod()} method and is not annotated with a metadata declaration of the form \cd{@proxy}, where \cd{proxy} is declared in \cd{dart:core}.
 It is a static warning if the implicit interface of  $C$ includes an instance member $m$ of type $F$ and $C$ does not declare or inherit a corresponding instance member $m$ of type $F'$ such that $F' <: F$. 
 
 \commentary{A class does not inherit members from its superinterfaces. However, its implicit interface does.
@@ -2090,6 +2100,8 @@
 \rationale {
 We choose to issue these warnings only for concrete classes; an abstract class might legitimately be designed with the expectation that concrete subclasses will implement part of  the interface.
 We also disable these warnings if a \code{noSuchMethod()} declaration is present. In such cases, the supported interface is going to be implemented via \code{noSuchMethod()} and no actual declarations of the implemented interface's members are needed. This allows proxy classes for specific types to be implemented without provoking type warnings.
+
+In addition, it may be useful to suppress these warnings if \code{noSuchMethod} is inherited, However, this may suppress meaningful warnings and so we choose not to do so by default. Instead, a special annotation is defined in \cd{dart:core} for this purpose.
 }
 
 It is a static warning if the implicit interface of  a class $C$ includes an instance member $m$ of type $F$ and $C$ declares or inherits a corresponding instance member $m$ of type $F'$ if  $F'$ is not a subtype of $F$. 
@@ -2254,14 +2266,6 @@
 
 $q'_i(a_{i1}, \ldots , a_{ik_i}):\SUPER(a_{i1}, \ldots , a_{ik_i});$.
 
-% The types must be given in the copied constructor. It was tempting to elide them; after all, checked mode will catch things in the
-% super call - but this may be a problem for tools. 
-% We  interpret this instead as S includes the generic parameters, so the signature has already substituted them.
-% Default values may not be replicable for optional params due to scoping/privacy.
-% How to describe and implement
-
-%The class $C$ has an implicitly declared nullary generative constructor with no initializer list and no body. 
-
 If the mixin application declares support for interfaces, the resulting class implements those interfaces.
 
 It is a compile-time error if $S$ is a malformed type. It is a compile-time error if $M$ (respectively, any of $M_1, \ldots, M_k$) is a malformed type. It is a compile time error if a well formed mixin cannot be derived from $M$ (respectively, from each of $M_1, \ldots, M_k$). 
@@ -2271,7 +2275,6 @@
 \commentary{
 If, for example, $M$ declares an instance member $im$ whose type is at odds with the type of a member of the same name in $S$, this will result in a static warning just as if we had defined $K$ by means of an ordinary class declaration extending $S$, with a body that included $im$.
 
-%Another implication of this definition is that one cannot apply a mixin to a superclass that does not provide a nullary constructor.
 }
 
 The effect of a class definition of the form \code{\CLASS{} $C$ = $M$; } or the form 
@@ -2409,7 +2412,6 @@
 Metadata consists of a series of annotations, each of which begin with the character @, followed by  a constant expression that starts with an identifier. It is a compile time error if the expression is not one of the following:
 \begin{itemize}
 \item A reference to a compile-time constant variable.
-\item The name of a class.
 \item A call to a constant constructor.
 \end{itemize}
 
@@ -2523,9 +2525,13 @@
 \rationale{It would be tempting to allow string interpolation where the interpolated value is any compile-time constant.  However, this would require running the \code{toString()} method for constant objects, which could contain arbitrary code.}
 \item A literal symbol (\ref{symbols}).
 \item \NULL{} (\ref{null}).
-\item A qualified reference to a static constant variable (\ref{variables}). \commentary {For example, If class C declares a constant static variable v, C.v is a constant. The same is true if C is accessed via a prefix p; p.C.v is a constant.
+\item A qualified reference to a static constant variable (\ref{variables}). 
+\commentary {For example, If class C declares a constant static variable v, C.v is a constant. The same is true if C is accessed via a prefix p; p.C.v is a constant.
 }
-\item An identifier expression that denotes a constant variable, class or a type alias.
+\item An identifier expression that denotes a constant variable. %CHANGE in googledoc
+\item A simple or qualified identifier denoting a class or a type alias. 
+\commentary {For example, if C is a class or typedef C is a constant, and if C is imported with a prefix p,  p.C is a constant.
+}
 \item A constant constructor invocation (\ref{const}).  
 \item A constant list literal (\ref{lists}).
 \item A constant map literal (\ref{maps}).
@@ -2957,8 +2963,7 @@
 \begin{itemize}
 \item
 First, the expressions $e_1 \ldots e_n$ are evaluated in order they appear in the program, yielding objects $o_1 \ldots o_n$.
-\item
-A fresh instance  (\ref{generativeConstructors}) $a$, of size $n$,  whose class implements the built-in class $List<E>$ is allocated. 
+\item A fresh instance  (\ref{generativeConstructors}) $a$, of size $n$,  whose class implements the built-in class $List<E>$ is allocated. 
 \item
 
 The operator \code{[]=} is invoked on $a$ with  first  argument $i$ and second argument
@@ -3023,8 +3028,7 @@
 \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
@@ -3210,9 +3214,6 @@
 
 Otherwise, if $q$ is a generative constructor (\ref{generativeConstructors}), then:
 
-%Let $T_i$ be the type parameters of $R$ (if any) and let $B_i$ be the bound of $T_i, 1 \le i \le l$.
-%In checked mode, it is a dynamic type error if  $V_i$ is not a subtype of  $[V_1,  \ldots, V_l/T_1,  \ldots, T_l]B_i,  i \in 1.. l$.
-
 \commentary{Note that it this point we are assured that the number of actual type arguments match the number of formal type parameters.}
 
 A fresh instance (\ref{generativeConstructors}), $i$,  of class $R$ is allocated. For each instance variable $f$ of $i$,  if the variable declaration of $f$ has an initializer expression $e_f$, then $e_f$ is evaluated to an object $o_f$ and $f$ is bound to $o_f$. Otherwise $f$ is bound to \NULL{}.
@@ -3225,9 +3226,6 @@
 
 Otherwise, $q$ is a factory constructor (\ref{factories}). Then:
 
-%Let $T_i$ be the type parameters of $R$ (if any) and let $B_i$ be the bound of $T_i, 1 \le i \le l$.
-%In checked mode, it is a dynamic type error if  $V_i$ is not a subtype of  $[V_1,  \ldots, V_l/T_1,  \ldots, T_l]B_i, i \in 1.. l$.
-
 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$.
@@ -3452,22 +3450,10 @@
 {\bf namedArgument:}
       label expression % could be top level expression?
     .
-
-%spreadArgument:
-%     '...' expression
- %   .
  \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:
 
-%Furthermore, if $p_k$ is a rest parameter, then one of the following cases holds:
-%\begin{enumerate}
-%\item $m = k-1$. Then $p_k$ is bound to a freshly allocated empty list. \Q{cant we share it? identity?}
-%\item $m = k$, and $a_k$ is a spread argument ...$e_k$. Then $p_k$ is bound to the value of $e_k$.  In checked mode, it is a dynamic type error if  the type of $p_k$ is not a supertype of the value of $e_k$.
-%\item $m \ge k$.  A freshly allocated list $r$ of the type of $p_k$ with size $m - k + 1$ is allocated. and initialized such that $r_j = a_{k+j}, 0 \le j \le m - k$. Then $p_k$ is bound to $r$.
-%\end{enumerate}
-
-%Otherwise, i
 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}$.
 
 \commentary{Simply stated, an argument list consisting of $m$ positional arguments and $l$ named arguments is evaluated from left to right.
@@ -4391,7 +4377,7 @@
  
  Evaluation of the is-expression \code{$e$ \IS{} $T$} proceeds as follows:
 
-The expression $e$ is evaluated to a value $v$. Then, if the interface of the class of $v$ is a subtype of $T$, the is-expression evaluates to true. Otherwise it evaluates to false.
+The expression $e$ is evaluated to a value $v$. Then, if $T$ is malformed, a dynamic error occurs. Otherwise, if the interface of the class of $v$ is a subtype of $T$, the is-expression evaluates to true. Otherwise it evaluates to false.
 
 \commentary{It follows that \code{$e$ \IS{} Object} is always true. This makes sense in a language where everything is an object. 
 
@@ -4402,17 +4388,6 @@
 
 % Add flow dependent types
 
-\commentary{
-If $T$ is malformed the test always succeeds. This is a consequence of the rule that malformed types are treated as \DYNAMIC{}
-}
-%does not denote a type available in the current lexical scope. It is a %compile-time error % CHANGED
-%run-time error
-%if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters.
-
-%Note, that, in checked mode, it is a dynamic type error if a malformed type is used in a type test as specified in \ref{dynamicTypeSystem}.
-
-%It is a static warning if $T$ is malformed or malbounded.
-%does not denote a type available in the current lexical scope. 
 
 Let $v$  be a local variable or a formal parameter. An is-expression of the form \code{$v$ \IS{} $T$} shows that $v$  has type $T$ iff $T$ is more specific than the type $S$ of the expression $v$ and  both $T \ne \DYNAMIC{}$ and $S \ne \DYNAMIC{}$.
 
@@ -4427,8 +4402,6 @@
 }
 
 The static type of an is-expression is \code{bool}. 
-%It is a static warning if if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters. 
-
 
 
 \subsection{ Type Cast}
@@ -4449,23 +4422,10 @@
  
  Evaluation of the cast expression \code{$e$ \AS{} $T$} proceeds as follows:
 
-The expression $e$ is evaluated to a value $v$. Then, if the interface of the class of $v$ is a subtype of $T$, the cast expression evaluates to $v$. Otherwise, if $v$ is \NULL{}, the cast expression evaluates to $v$. 
+The expression $e$ is evaluated to a value $v$. Then, if $T$ is malformed, a dynamic error occurs. Otherwise, if the interface of the class of $v$ is a subtype of $T$, the cast expression evaluates to $v$. Otherwise, if $v$ is \NULL{}, the cast expression evaluates to $v$. 
 In all other cases,  a \code{CastError} is thrown.
-
-\commentary{
-If $T$ is malformed the cast always succeeds. This is a consequence of the rule that malformed types are treated as \DYNAMIC{}
-}
-
-%does not denote a type available in the current lexical scope. It is a %compile-time error ; CHANGED 
-%run-time error
-%if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters.
-
-%Note, that, in checked mode, it is a dynamic type error if a malformed type is used in a type cast as specified in \ref{dynamicTypeSystem}.
-
-%It is a static warning if $T$ is malformed or malbounded.
-%does not denote a type available in the current lexical scope. 
+ 
 The static type of a cast expression  \code{$e$ \AS{} $T$}  is $T$. 
-%It is a static warning if if $T$ is a parameterized type of the form $G<T_1, \ldots, T_n>$ and $G$ is not a generic type with $n$ type parameters. 
 
 
 \section{Statements}
@@ -4836,8 +4796,6 @@
 The \SWITCH{}  statement should only be used in very limited situations (e.g., interpreters or scanners).  
 }
 
-%A switch statement {\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$ \}} is equivalent to 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{}: \}}
-
 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:
 
 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$. 
@@ -4944,7 +4902,7 @@
 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$. 
+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}).
@@ -5482,15 +5440,19 @@
 \subsection{Scripts}
 \label{scripts}
 
-A {\em script} is a library with 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 scope in $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. 
 }
 
+\commentary {
+A Dart program will typically be executed by executing a script.
+}
+
 \subsection{URIs}
 \label{uris}
 
@@ -5581,12 +5543,13 @@
 %  \end{itemize}
 \end{itemize}
 
- 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.
- 
+ 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 unless explicitly specified otherwise.
+  
  \rationale{
 This ensures that the developer is spared a series of cascading warnings as the malformed type interacts with other types.
 }
 
+
 \subsubsection{Type Promotion}
 \label{typePromotion}
 
@@ -5605,7 +5568,7 @@
 %It is a run-time type error to access an undeclared type outside .
 
 %It is a dynamic type error if a malformed type is used in a subtype test.  
-In checked mode, it is a dynamic type error if  a malbounded (\ref{parameterizedTypes}) 
+In checked mode, it is a dynamic type error if a malformed or malbounded (\ref{parameterizedTypes}) 
 type is used in a subtype test.  
 
 %In production mode, an undeclared type is treated as an instance of type \DYNAMIC{}. 
@@ -5637,19 +5600,9 @@
 \end{dartCode}
 
 \commentary{
-Since $i$ is not a type, a static warning will be issue at the declaration of $j$. However, the program can be executed without incident.  The undeclared type $i$ is treated as \DYNAMIC{}, so even in checked mode, the implicit subtype test at the assignment  succeeds.
+Since $i$ is not a type, a static warning will be issue at the declaration of $j$. However, the program can be executed without incident in production mode because he undeclared type $i$ is treated as \DYNAMIC{}. However, in checked mode, the implicit subtype test at the assignment will trigger an error at runtime.
 }
 
-\rationale{
-We have chosen to treat malformed types  as type \DYNAMIC{}. Earlier versions of this specification did so in some cases but not in others. We found the rules to be too complex, and have opted to harmonize the specification. Given that a static warning is issued, there is no need for the runtime to deal with extra complexity by treating malformed types specially.
-
-
-%as is done in production mode. After all, a static warning has already been given. That is a legitimate design option, and it is ultimately a judgement call as to whether checked mode should be more or less aggressive in dealing with such a situation.
-
-%Likewise, we could opt to ignore malformed types entirely in checked mode.
-
-%For now, we have opted to treat a malformed type as an error type that has no subtypes or supertypes, and which causes a runtime error when tested against any other type.
-}
 
 \commentary{
 Here is an example involving malbounded types:
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 1c1f428..3a430d9 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -14626,6 +14626,526 @@
   }
 }
 /**
+ * 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.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the two AST nodes are equal
+   */
+  static bool equals3(CompilationUnit first, CompilationUnit second) {
+    ASTComparator comparator = new ASTComparator();
+    return comparator.isEqual(first, second);
+  }
+
+  /**
+   * The AST node with which the node being visited is to be compared. This is only valid at the
+   * 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);
+  }
+
+  /**
+   * Return `true` if the given AST nodes have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same structure
+   */
+  bool isEqual(ASTNode first, ASTNode second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    } else if (first.runtimeType != second.runtimeType) {
+      return false;
+    }
+    _other = second;
+    return first.accept(this);
+  }
+
+  /**
+   * Return `true` if the given lists of AST nodes have the same size and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same size and corresponding elements are
+   *         equal
+   */
+  bool isEqual5(NodeList first, NodeList second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    int size = first.length;
+    if (second.length != size) {
+      return false;
+    }
+    for (int i = 0; i < size; i++) {
+      if (!isEqual(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the given tokens have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given tokens have the same structure
+   */
+  bool isEqual6(Token first, Token second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    return first.offset == second.offset && first.length == second.length && first.lexeme == second.lexeme;
+  }
+
+  /**
+   * Return `true` if the given arrays of tokens have the same length and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given arrays of tokens have the same length and corresponding
+   *         elements are equal
+   */
+  bool isEqual7(List<Token> first, List<Token> second) {
+    int length = first.length;
+    if (second.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (isEqual6(first[i], second[i])) {
+        return false;
+      }
+    }
+    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
  * with a new ASTNode, mapping the old token stream to a new token stream, and preserving resolution
@@ -14684,7 +15204,9 @@
   AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression copy = new AssignmentExpression.full(clone4(node.leftHandSide), map(node.operator), clone4(node.rightHandSide));
     copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
     return copy;
   }
   BinaryExpression visitBinaryExpression(BinaryExpression node) {
@@ -14900,7 +15422,9 @@
   }
   PostfixExpression visitPostfixExpression(PostfixExpression node) {
     PostfixExpression copy = new PostfixExpression.full(clone4(node.operand), map(node.operator));
+    copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
     copy.staticType = node.staticType;
     return copy;
   }
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index a43b3cb..4aa51c0 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -4312,7 +4312,12 @@
   /**
    * Is `true` if this variable is potentially mutated somewhere in its scope.
    */
-  bool _isPotentiallyMutated2 = false;
+  bool _isPotentiallyMutatedInScope2 = false;
+
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in closure.
+   */
+  bool _isPotentiallyMutatedInClosure2 = false;
 
   /**
    * The offset to the beginning of the visible range for this element.
@@ -4344,13 +4349,21 @@
     }
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
-  bool get isPotentiallyMutated => _isPotentiallyMutated2;
+  bool get isPotentiallyMutatedInClosure => _isPotentiallyMutatedInClosure2;
+  bool get isPotentiallyMutatedInScope => _isPotentiallyMutatedInScope2;
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    _isPotentiallyMutatedInClosure2 = true;
+  }
 
   /**
    * Specifies that this variable is potentially mutated somewhere in its scope.
    */
-  void markPotentiallyMutated() {
-    _isPotentiallyMutated2 = true;
+  void markPotentiallyMutatedInScope() {
+    _isPotentiallyMutatedInScope2 = true;
   }
 
   /**
@@ -4613,7 +4626,12 @@
   /**
    * Is `true` if this variable is potentially mutated somewhere in its scope.
    */
-  bool _isPotentiallyMutated3 = false;
+  bool _isPotentiallyMutatedInScope3 = false;
+
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in closure.
+   */
+  bool _isPotentiallyMutatedInClosure3 = false;
 
   /**
    * An array containing all of the parameters defined by this parameter element. There will only be
@@ -4685,13 +4703,21 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
   bool get isInitializingFormal => false;
-  bool get isPotentiallyMutated => _isPotentiallyMutated3;
+  bool get isPotentiallyMutatedInClosure => _isPotentiallyMutatedInClosure3;
+  bool get isPotentiallyMutatedInScope => _isPotentiallyMutatedInScope3;
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    _isPotentiallyMutatedInClosure3 = true;
+  }
 
   /**
    * Specifies that this variable is potentially mutated somewhere in its scope.
    */
-  void markPotentiallyMutated() {
-    _isPotentiallyMutated3 = true;
+  void markPotentiallyMutatedInScope() {
+    _isPotentiallyMutatedInScope3 = true;
   }
 
   /**
@@ -5191,12 +5217,20 @@
   bool get isFinal => hasModifier(Modifier.FINAL);
 
   /**
+   * Return `true` if this variable is potentially mutated somewhere in closure. This
+   * information is only available for local variables (including parameters).
+   *
+   * @return `true` if this variable is potentially mutated somewhere in closure
+   */
+  bool get isPotentiallyMutatedInClosure => false;
+
+  /**
    * Return `true` if this variable is potentially mutated somewhere in its scope. This
    * information is only available for local variables (including parameters).
    *
    * @return `true` if this variable is potentially mutated somewhere in its scope
    */
-  bool get isPotentiallyMutated => false;
+  bool get isPotentiallyMutatedInScope => false;
 
   /**
    * Set whether this variable is const to correspond to the given value.
@@ -5835,7 +5869,7 @@
   BottomTypeImpl() : super(null, "<bottom>");
   bool operator ==(Object object) => identical(object, this);
   bool get isBottom => true;
-  bool isMoreSpecificThan(Type2 type) => 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;
@@ -5860,11 +5894,11 @@
   }
   bool operator ==(Object object) => object is DynamicTypeImpl;
   bool get isDynamic => true;
-  bool isMoreSpecificThan(Type2 type) {
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (identical(this, type)) {
       return true;
     }
-    return false;
+    return withDynamic;
   }
   bool isSubtypeOf(Type2 type) => true;
   bool isSupertypeOf(Type2 type) => true;
@@ -6086,7 +6120,7 @@
     return element.hashCode;
   }
   bool isAssignableTo(Type2 type) => this.isSubtypeOf(type);
-  bool isMoreSpecificThan(Type2 type) {
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (type == null) {
       return false;
     } else if (identical(this, type) || type.isDynamic || type.isDartCoreFunction || type.isObject) {
@@ -6110,7 +6144,7 @@
         return false;
       } else if (t.normalParameterTypes.length > 0) {
         for (int i = 0; i < tTypes.length; i++) {
-          if (!tTypes[i].isMoreSpecificThan(sTypes[i])) {
+          if (!tTypes[i].isMoreSpecificThan3(sTypes[i], withDynamic)) {
             return false;
           }
         }
@@ -6127,7 +6161,7 @@
         if (typeT == null) {
           return false;
         }
-        if (!typeT.isMoreSpecificThan(entryS.getValue())) {
+        if (!typeT.isMoreSpecificThan3(entryS.getValue(), withDynamic)) {
           return false;
         }
       }
@@ -6141,7 +6175,7 @@
       }
       if (tOpTypes.length == 0 && sOpTypes.length == 0) {
         for (int i = 0; i < sTypes.length; i++) {
-          if (!tTypes[i].isMoreSpecificThan(sTypes[i])) {
+          if (!tTypes[i].isMoreSpecificThan3(sTypes[i], withDynamic)) {
             return false;
           }
         }
@@ -6161,7 +6195,7 @@
           sAllTypes[i] = sOpTypes[j];
         }
         for (int i = 0; i < sAllTypes.length; i++) {
-          if (!tAllTypes[i].isMoreSpecificThan(sAllTypes[i])) {
+          if (!tAllTypes[i].isMoreSpecificThan3(sAllTypes[i], withDynamic)) {
             return false;
           }
         }
@@ -6169,7 +6203,7 @@
     }
     Type2 tRetType = t.returnType;
     Type2 sRetType = s.returnType;
-    return sRetType.isVoid || tRetType.isMoreSpecificThan(sRetType);
+    return sRetType.isVoid || tRetType.isMoreSpecificThan3(sRetType, withDynamic);
   }
   bool isSubtypeOf(Type2 type) {
     if (type == null) {
@@ -6698,35 +6732,40 @@
     return element.name == "Function" && element.library.isDartCore;
   }
   bool isDirectSupertypeOf(InterfaceType type) {
-    ClassElement i = element;
-    ClassElement j = type.element;
-    InterfaceType supertype = j.supertype;
+    InterfaceType i = this;
+    InterfaceType j = type;
+    ClassElement jElement = j.element;
+    InterfaceType supertype = jElement.supertype;
     if (supertype == null) {
       return false;
     }
-    ClassElement supertypeElement = supertype.element;
-    if (supertypeElement == i) {
+    List<Type2> jArgs = j.typeArguments;
+    List<Type2> jVars = jElement.type.typeArguments;
+    supertype = supertype.substitute2(jArgs, jVars);
+    if (supertype == i) {
       return true;
     }
-    for (InterfaceType interfaceType in j.interfaces) {
-      if (interfaceType.element == i) {
+    for (InterfaceType interfaceType in jElement.interfaces) {
+      interfaceType = interfaceType.substitute2(jArgs, jVars);
+      if (interfaceType == i) {
         return true;
       }
     }
-    for (InterfaceType mixinType in j.mixins) {
-      if (mixinType.element == i) {
+    for (InterfaceType mixinType in jElement.mixins) {
+      mixinType = mixinType.substitute2(jArgs, jVars);
+      if (mixinType == i) {
         return true;
       }
     }
     return false;
   }
-  bool isMoreSpecificThan(Type2 type) {
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic) {
     if (identical(type, DynamicTypeImpl.instance)) {
       return true;
     } else if (type is! InterfaceType) {
       return false;
     }
-    return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>());
+    return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>(), withDynamic);
   }
   bool get isObject => element.supertype == null;
   bool isSubtypeOf(Type2 type) {
@@ -6901,7 +6940,7 @@
       builder.append(">");
     }
   }
-  bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses) {
+  bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses, bool withDynamic) {
     if (this == s) {
       return true;
     }
@@ -6917,7 +6956,7 @@
         return false;
       }
       for (int i = 0; i < tArguments.length; i++) {
-        if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
+        if (!tArguments[i].isMoreSpecificThan3(sArguments[i], withDynamic)) {
           return false;
         }
       }
@@ -6929,16 +6968,16 @@
     }
     javaSetAdd(visitedClasses, element);
     InterfaceType supertype = superclass;
-    if (supertype != null && ((supertype as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+    if (supertype != null && ((supertype as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
       return true;
     }
     for (InterfaceType interfaceType in interfaces) {
-      if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+      if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
         return true;
       }
     }
     for (InterfaceType mixinType in mixins) {
-      if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+      if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses, withDynamic)) {
         return true;
       }
     }
@@ -6952,7 +6991,6 @@
       return false;
     }
     javaSetAdd(visitedClasses, elementT);
-    typeT = substitute2(_typeArguments, elementT.type.typeArguments);
     if (typeT == typeS) {
       return true;
     } else if (elementT == typeS.element) {
@@ -7052,7 +7090,8 @@
   bool get isBottom => false;
   bool get isDartCoreFunction => false;
   bool get isDynamic => false;
-  bool isMoreSpecificThan(Type2 type) => 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;
@@ -7118,7 +7157,7 @@
   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 isMoreSpecificThan(Type2 s) {
+  bool isMoreSpecificThan3(Type2 s, bool withDynamic) {
     if (this == s) {
       return true;
     }
@@ -7128,9 +7167,9 @@
     if (s.isDynamic) {
       return true;
     }
-    return isMoreSpecificThan3(s, new Set<Type2>());
+    return isMoreSpecificThan4(s, new Set<Type2>(), withDynamic);
   }
-  bool isSubtypeOf(Type2 s) => isMoreSpecificThan(s);
+  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++) {
@@ -7140,7 +7179,7 @@
     }
     return this;
   }
-  bool isMoreSpecificThan3(Type2 s, Set<Type2> visitedTypes) {
+  bool isMoreSpecificThan4(Type2 s, Set<Type2> visitedTypes, bool withDynamic) {
     Type2 bound = element.bound;
     if (s == bound) {
       return true;
@@ -7157,9 +7196,9 @@
         return false;
       }
       javaSetAdd(visitedTypes, bound);
-      return boundTypeParameter.isMoreSpecificThan3(s, visitedTypes);
+      return boundTypeParameter.isMoreSpecificThan4(s, visitedTypes, withDynamic);
     }
-    return bound.isMoreSpecificThan(s);
+    return bound.isMoreSpecificThan3(s, withDynamic);
   }
 }
 /**
@@ -7732,6 +7771,15 @@
   bool isMoreSpecificThan(Type2 type);
 
   /**
+   * Return `true` if this type is more specific than the given type.
+   *
+   * @param type the type being compared with this type
+   * @param withDynamic `true` if "dynamic" should be considered as a subtype of any type
+   * @return `true` if this type is more specific than the given type
+   */
+  bool isMoreSpecificThan3(Type2 type, bool withDynamic);
+
+  /**
    * Return `true` if this type represents the type 'Object'.
    *
    * @return `true` if this type represents the type 'Object'
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 04d6d01..904598b 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -4054,7 +4054,7 @@
   AnalysisTask get nextTaskAnalysisTask {
     {
       bool hintsEnabled = _options.hint;
-      if (_incrementalAnalysisCache != null) {
+      if (_incrementalAnalysisCache != null && _incrementalAnalysisCache.hasWork()) {
         AnalysisTask task = new IncrementalAnalysisTask(this, _incrementalAnalysisCache);
         _incrementalAnalysisCache = null;
       }
@@ -4596,6 +4596,7 @@
       if (unit != null) {
         ChangeNoticeImpl notice = getNotice(task.source);
         notice.compilationUnit = unit;
+        _incrementalAnalysisCache = IncrementalAnalysisCache.cacheResult(task.cache, unit);
       }
     }
     return null;
@@ -4646,6 +4647,7 @@
           dartCopy.setValue(DartEntry.INCLUDED_PARTS, task.includedSources);
           ChangeNoticeImpl notice = getNotice(source);
           notice.setErrors(dartEntry.allErrors, lineInfo);
+          _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_incrementalAnalysisCache, source, task.compilationUnit);
         } else {
           dartCopy.recordParseError();
         }
@@ -5588,6 +5590,21 @@
 class IncrementalAnalysisCache {
 
   /**
+   * Determine if the incremental analysis result can be cached for the next incremental analysis.
+   *
+   * @param cache the prior incremental analysis cache
+   * @param unit the incrementally updated compilation unit
+   * @return the cache used for incremental analysis or `null` if incremental analysis results
+   *         cannot be cached for the next incremental analysis
+   */
+  static IncrementalAnalysisCache cacheResult(IncrementalAnalysisCache cache, CompilationUnit unit) {
+    if (cache != null && unit != null) {
+      return new IncrementalAnalysisCache(cache.librarySource, cache.source, unit, cache.newContents, cache.newContents, 0, 0, 0);
+    }
+    return null;
+  }
+
+  /**
    * Determine if the cache should be cleared.
    *
    * @param cache the prior cache or `null` if none
@@ -5617,20 +5634,19 @@
    *         be performed
    */
   static IncrementalAnalysisCache update(IncrementalAnalysisCache cache, Source source, String oldContents, String newContents, int offset, int oldLength, int newLength, SourceEntry sourceEntry) {
-    if (cache == null || cache.source != source) {
-      if (sourceEntry is! DartEntryImpl) {
-        return null;
-      }
+    Source librarySource = null;
+    CompilationUnit unit = null;
+    if (sourceEntry is DartEntryImpl) {
       DartEntryImpl dartEntry = sourceEntry as DartEntryImpl;
       List<Source> librarySources = dartEntry.librariesContaining;
-      if (librarySources.length != 1) {
-        return null;
+      if (librarySources.length == 1) {
+        librarySource = librarySources[0];
+        if (librarySource != null) {
+          unit = dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+        }
       }
-      Source librarySource = librarySources[0];
-      if (librarySource == null) {
-        return null;
-      }
-      CompilationUnit unit = dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
+    }
+    if (cache == null || cache.source != source || unit != null) {
       if (unit == null) {
         return null;
       }
@@ -5642,11 +5658,36 @@
       }
       return new IncrementalAnalysisCache(librarySource, source, unit, oldContents, newContents, offset, oldLength, newLength);
     }
-    if (cache.offset > offset || offset > cache.offset + cache.newLength) {
-      return null;
+    if (cache.oldLength == 0 && cache.newLength == 0) {
+      cache.offset = offset;
+      cache.oldLength = oldLength;
+      cache.newLength = newLength;
+    } else {
+      if (cache.offset > offset || offset > cache.offset + cache.newLength) {
+        return null;
+      }
+      cache.newLength += newLength - oldLength;
     }
     cache.newContents = newContents;
-    cache.newLength += newLength - oldLength;
+    return cache;
+  }
+
+  /**
+   * Verify that the incrementally parsed and resolved unit in the incremental cache is structurally
+   * equivalent to the fully parsed unit.
+   *
+   * @param cache the prior cache or `null` if none
+   * @param source the source of the compilation unit that was parsed (not `null`)
+   * @param unit the compilation unit that was just parsed
+   * @return the cache used for incremental analysis or `null` if incremental analysis results
+   *         cannot be cached for the next incremental analysis
+   */
+  static IncrementalAnalysisCache verifyStructure(IncrementalAnalysisCache cache, Source source, CompilationUnit unit) {
+    if (cache != null && unit != null && cache.source == source) {
+      if (!ASTComparator.equals3(cache.resolvedUnit, unit)) {
+        return null;
+      }
+    }
     return cache;
   }
   Source librarySource;
@@ -5667,6 +5708,13 @@
     this.oldLength = oldLength;
     this.newLength = newLength;
   }
+
+  /**
+   * Determine if the cache contains source changes that need to be analyzed
+   *
+   * @return `true` if the cache contains changes to be analyzed, else `false`
+   */
+  bool hasWork() => oldLength > 0 && newLength > 0;
 }
 /**
  * Instances of the class `InstrumentedAnalysisContextImpl` implement an
@@ -6841,7 +6889,7 @@
   /**
    * The information used to perform incremental analysis.
    */
-  IncrementalAnalysisCache _cache;
+  IncrementalAnalysisCache cache;
 
   /**
    * The compilation unit that was produced by incrementally updating the existing unit.
@@ -6855,7 +6903,7 @@
    * @param cache the incremental analysis cache used to perform the analysis
    */
   IncrementalAnalysisTask(InternalAnalysisContext context, IncrementalAnalysisCache cache) : super(context) {
-    this._cache = cache;
+    this.cache = cache;
   }
   accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
 
@@ -6864,13 +6912,13 @@
    *
    * @return the source
    */
-  Source get source => _cache != null ? _cache.source : null;
-  String get taskDescription => "incremental analysis ${(_cache != null ? _cache.source : "null")}";
+  Source get source => cache != null ? cache.source : null;
+  String get taskDescription => "incremental analysis ${(cache != null ? cache.source : "null")}";
   void internalPerform() {
-    if (_cache == null) {
+    if (cache == null) {
       return;
     }
-    compilationUnit = _cache.resolvedUnit;
+    compilationUnit = cache.resolvedUnit;
   }
 }
 /**
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index c1c580a..81d6249 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -1749,28 +1749,22 @@
   static final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 121, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
-   * 13.3 Local Variable Declaration: It is a compile-time error if <i>e</i> refers to the name
-   * <i>v</i> or the name <i>v=</i>.
-   */
-  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode.con1('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 122, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
-
-  /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = new CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 123, "Local variables cannot be referenced before they are declared");
+  static final CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = new CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 122, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 124, "rethrow must be inside of a catch clause");
+  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 123, "rethrow must be inside of a catch clause");
 
   /**
    * 13.11 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 125, "Constructors cannot return a value");
+  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 124, "Constructors cannot return a value");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1780,19 +1774,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 126, "Invalid context for 'super' invocation");
+  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 125, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 127, "The redirecting constructor cannot have a 'super' initializer");
+  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 126, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 128, "");
+  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 127, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1811,19 +1805,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 129, "'%s' does not extend '%s'");
+  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 128, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 130, "Type alias cannot reference itself directly or recursively via another typedef");
+  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 129, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode.con1('UNDEFINED_CLASS', 131, "Undefined class '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode.con1('UNDEFINED_CLASS', 130, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1831,7 +1825,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 132, "The class '%s' does not have a generative constructor '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 131, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1839,7 +1833,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 133, "The class '%s' does not have a default generative constructor");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 132, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.3 Unqualified Invocation: If there exists a lexically visible declaration named
@@ -1849,7 +1843,7 @@
    *
    * @param methodName the name of the method that is undefined
    */
-  static final CompileTimeErrorCode UNDEFINED_FUNCTION = new CompileTimeErrorCode.con1('UNDEFINED_FUNCTION', 134, "The function '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_FUNCTION = new CompileTimeErrorCode.con1('UNDEFINED_FUNCTION', 133, "The function '%s' is not defined");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1861,7 +1855,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 135, "The named parameter '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 134, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1876,7 +1870,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 136, "Target of URI does not exist: '%s'");
+  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 135, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1888,7 +1882,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 137, "URIs cannot use string interpolation");
+  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 136, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1901,7 +1895,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 138, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 137, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1909,13 +1903,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 139, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 138, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 140, "Setters should declare exactly one required parameter");
+  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,
@@ -2039,7 +2033,6 @@
       REDIRECT_TO_MISSING_CONSTRUCTOR,
       REDIRECT_TO_NON_CLASS,
       REDIRECT_TO_NON_CONST_CONSTRUCTOR,
-      REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER,
       REFERENCED_BEFORE_DECLARATION,
       RETHROW_OUTSIDE_CATCH,
       RETURN_IN_GENERATIVE_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 55b7cd6..46fdaae 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -40,6 +40,13 @@
   if (oTypeName == "${tTypeName}Impl") {
     return true;
   }
+  if (tTypeName == "FormalParameter") {
+    return
+        oTypeName == "DefaultFormalParameter" ||
+        oTypeName == "FieldNormalParameter" ||
+        oTypeName == "FunctionTypedFormalParameter" ||
+        oTypeName == "SimpleFormalParameter";
+  }
   if (tTypeName == "MethodElement") {
     if (oTypeName == "MethodMember") {
       return true;
@@ -272,7 +279,7 @@
 }
 
 class RuntimeException extends JavaException {
-  RuntimeException([String message = "", Exception cause = null]) :
+  RuntimeException({String message: "", Exception cause: null}) :
     super(message, cause);
 }
 
@@ -436,6 +443,10 @@
   return a || b;
 }
 
+bool javaBooleanAnd(bool a, bool b) {
+  return a && b;
+}
+
 class JavaStringBuilder {
   StringBuffer sb = new StringBuffer();
   String toString() => sb.toString();
diff --git a/pkg/analyzer/lib/src/generated/java_junit.dart b/pkg/analyzer/lib/src/generated/java_junit.dart
index 2c13338..81b4be0 100644
--- a/pkg/analyzer/lib/src/generated/java_junit.dart
+++ b/pkg/analyzer/lib/src/generated/java_junit.dart
@@ -43,6 +43,9 @@
   static void assertSameMsg(String msg, expected, actual) {
     expect(actual, sameMsg(msg, expected));
   }
+  static void assertNotSame(expected, actual) {
+    expect(actual, notSame(expected));
+  }
 }
 
 runJUnitTest(testInstance, Function testFunction) {
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index bfd461d..10a1a2c 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -10,6 +10,7 @@
 import 'ast.dart';
 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.
@@ -143,6 +144,1035 @@
   }
 }
 /**
+ * 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
+ * in this class assume that the parser is positioned to parse the replacement for the node. All of
+ * the methods will throw an [IncrementalParseException] if the node could not be parsed for
+ * some reason.
+ */
+class IncrementalParseDispatcher implements ASTVisitor<ASTNode> {
+
+  /**
+   * The parser used to parse the replacement for the node.
+   */
+  Parser _parser;
+
+  /**
+   * The node that is to be replaced.
+   */
+  ASTNode _oldNode;
+
+  /**
+   * Initialize a newly created dispatcher to parse a single node that will replace the given node.
+   *
+   * @param parser the parser used to parse the replacement for the node
+   * @param oldNode the node that is to be replaced
+   */
+  IncrementalParseDispatcher(Parser parser, ASTNode oldNode) {
+    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();
+    } else if (identical(_oldNode, node.constructorName)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.arguments)) {
+      return _parser.parseArgumentList();
+    }
+    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();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    }
+    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();
+    } else if (identical(_oldNode, node.rightHandSide)) {
+      if (isCascadeAllowed(node)) {
+        return _parser.parseExpression2();
+      }
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitBinaryExpression(BinaryExpression node) {
+    if (identical(_oldNode, node.leftOperand)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.rightOperand)) {
+      throw new InsufficientContextException();
+    }
+    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();
+    } else if (node.cascadeSections.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitCatchClause(CatchClause node) {
+    if (identical(_oldNode, node.exceptionType)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.exceptionParameter)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.stackTraceParameter)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseBlock();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitClassDeclaration(ClassDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.extendsClause)) {
+      return _parser.parseExtendsClause();
+    } else if (identical(_oldNode, node.withClause)) {
+      return _parser.parseWithClause();
+    } else if (identical(_oldNode, node.implementsClause)) {
+      return _parser.parseImplementsClause();
+    } else if (node.members.contains(_oldNode)) {
+      return _parser.parseClassMember(node.name.name);
+    }
+    return notAChild(node);
+  }
+  ASTNode visitClassTypeAlias(ClassTypeAlias node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.superclass)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.withClause)) {
+      return _parser.parseWithClause();
+    } else if (identical(_oldNode, node.implementsClause)) {
+      return _parser.parseImplementsClause();
+    }
+    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();
+    } else if (identical(_oldNode, node.thenExpression)) {
+      return _parser.parseExpressionWithoutCascade();
+    } else if (identical(_oldNode, node.elseExpression)) {
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    } else if (identical(_oldNode, node.redirectedConstructor)) {
+      throw new InsufficientContextException();
+    } else if (node.initializers.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(_oldNode, node.fieldName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.expression)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitConstructorName(ConstructorName node) {
+    if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    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();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (identical(_oldNode, node.parameter)) {
+      return _parser.parseNormalFormalParameter();
+    } else if (identical(_oldNode, node.defaultValue)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitDoStatement(DoStatement node) {
+    if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    } else if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    }
+    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();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    } else if (node.combinators.contains(_oldNode)) {
+      throw new IncrementalParseException();
+    }
+    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();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.fields)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFieldFormalParameter(FieldFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitForEachStatement(ForEachStatement node) {
+    if (identical(_oldNode, node.loopVariable)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFormalParameterList(FormalParameterList node) {
+    throw new InsufficientContextException();
+  }
+  ASTNode visitForStatement(ForStatement node) {
+    if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.initialization)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    } else if (node.updaters.contains(_oldNode)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionDeclaration(FunctionDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.functionExpression)) {
+      throw new InsufficientContextException();
+    }
+    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();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    if (identical(_oldNode, node.function)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    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();
+    } else if (identical(_oldNode, node.thenStatement)) {
+      return _parser.parseStatement2();
+    } else if (identical(_oldNode, node.elseStatement)) {
+      return _parser.parseStatement2();
+    }
+    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();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    } else if (identical(_oldNode, node.prefix)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (node.combinators.contains(_oldNode)) {
+      throw new IncrementalParseException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitIndexExpression(IndexExpression node) {
+    if (identical(_oldNode, node.target)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.index)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseConstructorName();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitIntegerLiteral(IntegerLiteral node) => notAChild(node);
+  ASTNode visitInterpolationExpression(InterpolationExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      if (node.leftBracket == null) {
+        throw new InsufficientContextException();
+      }
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitInterpolationString(InterpolationString node) {
+    throw new InsufficientContextException();
+  }
+  ASTNode visitIsExpression(IsExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseBitwiseOrExpression();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    }
+    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();
+    } else if (identical(_oldNode, node.statement)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitLibraryDirective(LibraryDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseLibraryIdentifier();
+    }
+    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();
+    } else if (node.elements.contains(_oldNode)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMapLiteral(MapLiteral node) {
+    if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    } else if (node.entries.contains(_oldNode)) {
+      return _parser.parseMapLiteralEntry();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMapLiteralEntry(MapLiteralEntry node) {
+    if (identical(_oldNode, node.key)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.value)) {
+      return _parser.parseExpression2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMethodDeclaration(MethodDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.name)) {
+      if (node.operatorKeyword != null) {
+        throw new InsufficientContextException();
+      }
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitMethodInvocation(MethodInvocation node) {
+    if (identical(_oldNode, node.target)) {
+      throw new IncrementalParseException();
+    } else if (identical(_oldNode, node.methodName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitNamedExpression(NamedExpression node) {
+    if (identical(_oldNode, node.name)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    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();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitPartOfDirective(PartOfDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.libraryName)) {
+      return _parser.parseLibraryIdentifier();
+    }
+    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();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    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();
+    } else if (identical(_oldNode, node.propertyName)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    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();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      throw new InsufficientContextException();
+    }
+    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();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSuperExpression(SuperExpression node) => notAChild(node);
+  ASTNode visitSwitchCase(SwitchCase node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    } else if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSwitchDefault(SwitchDefault node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitSwitchStatement(SwitchStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    } else if (node.members.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    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)) {
+        return _parser.parseExpression2();
+      }
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTryStatement(TryStatement node) {
+    if (identical(_oldNode, node.body)) {
+      return _parser.parseBlock();
+    } else if (node.catchClauses.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.finallyBlock)) {
+      throw new InsufficientContextException();
+    }
+    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();
+    } else if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitTypeParameter(TypeParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.bound)) {
+      return _parser.parseTypeName();
+    }
+    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();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.initializer)) {
+      throw new InsufficientContextException();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitVariableDeclarationList(VariableDeclarationList node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (node.variables.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    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();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return notAChild(node);
+  }
+  ASTNode visitWithClause(WithClause node) {
+    if (node.mixinTypes.contains(node)) {
+      return _parser.parseTypeName();
+    }
+    return notAChild(node);
+  }
+
+  /**
+   * Return `true` if the given assignment expression can have a cascade expression on the
+   * right-hand side.
+   *
+   * @param node the assignment expression being tested
+   * @return `true` if the right-hand side can be a cascade expression
+   */
+  bool isCascadeAllowed(AssignmentExpression node) {
+    throw new InsufficientContextException();
+  }
+
+  /**
+   * Return `true` if the given throw expression can have a cascade expression.
+   *
+   * @param node the throw expression being tested
+   * @return `true` if the expression can be a cascade expression
+   */
+  bool isCascadeAllowed2(ThrowExpression node) {
+    throw new InsufficientContextException();
+  }
+
+  /**
+   * Throw an exception indicating that the visited node was not the parent of the node to be
+   * replaced.
+   *
+   * @param visitedNode the visited node that should have been the parent of the node to be replaced
+   */
+  ASTNode notAChild(ASTNode visitedNode) {
+    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.
+   */
+  IncrementalParseException() : super();
+
+  /**
+   * Initialize a newly created exception to have the given message and to be its own cause.
+   *
+   * @param message the message describing the reason for the exception
+   */
+  IncrementalParseException.con1(String message) : super(message: message);
+
+  /**
+   * Initialize a newly created exception to have no message and to have the given cause.
+   *
+   * @param cause the exception that caused this exception
+   */
+  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.
+   */
+  Source _source;
+
+  /**
+   * A map from old tokens to new tokens used during the cloning process.
+   */
+  TokenMap _tokenMap;
+
+  /**
+   * The error listener that will be informed of any errors that are found during the parse.
+   */
+  AnalysisErrorListener _errorListener;
+
+  /**
+   * Initialize a newly created incremental parser to parse a portion of the content of the given
+   * source.
+   *
+   * @param source the source being parsed
+   * @param tokenMap a map from old tokens to new tokens used during the cloning process
+   * @param errorListener the error listener that will be informed of any errors that are found
+   *          during the parse
+   */
+  IncrementalParser(Source source, TokenMap tokenMap, AnalysisErrorListener errorListener) {
+    this._source = source;
+    this._tokenMap = tokenMap;
+    this._errorListener = errorListener;
+  }
+
+  /**
+   * Given a range of tokens that were re-scanned, re-parse the minimimum number of tokens to
+   * produce a consistent AST structure. The range is represented by the first and last tokens in
+   * the range. The tokens are assumed to be contained in the same token stream.
+   *
+   * @param firstToken the first token in the range of tokens that were re-scanned or `null`
+   *          if no new tokens were inserted
+   * @param lastToken the last token in the range of tokens that were re-scanned or `null` if
+   *          no new tokens were inserted
+   * @param originalStart the offset in the original source of the first character that was modified
+   * @param originalEnd the offset in the original source of the last character that was modified
+   */
+  ASTNode reparse(ASTNode originalStructure, Token firstToken, Token lastToken, int originalStart, int originalEnd) {
+    ASTNode oldNode = null;
+    ASTNode newNode = null;
+    if (firstToken != null) {
+      if (originalEnd < originalStart) {
+        oldNode = new NodeLocator.con1(originalStart).searchWithin(originalStructure);
+      } else {
+        oldNode = new NodeLocator.con2(originalStart, originalEnd).searchWithin(originalStructure);
+      }
+      int originalOffset = oldNode.offset;
+      Token parseToken = findTokenAt(firstToken, originalOffset);
+      if (parseToken == null) {
+        return null;
+      }
+      Parser parser = new Parser(_source, _errorListener);
+      parser.currentToken = parseToken;
+      while (newNode == null) {
+        ASTNode parent = oldNode.parent;
+        if (parent == null) {
+          parseToken = findFirstToken(parseToken);
+          parser.currentToken = parseToken;
+          return parser.parseCompilationUnit2() as ASTNode;
+        }
+        try {
+          IncrementalParseDispatcher dispatcher = new IncrementalParseDispatcher(parser, oldNode);
+          newNode = parent.accept(dispatcher);
+        } on InsufficientContextException catch (exception) {
+          oldNode = parent;
+          originalOffset = oldNode.offset;
+          parseToken = findTokenAt(parseToken, originalOffset);
+          parser.currentToken = parseToken;
+        } on JavaException catch (exception) {
+          return null;
+        }
+      }
+      if (newNode.offset != originalOffset) {
+        return null;
+      }
+      if (identical(oldNode, originalStructure)) {
+        return newNode as ASTNode;
+      }
+      ResolutionCopier.copyResolutionData(oldNode, newNode);
+    }
+    IncrementalASTCloner cloner = new IncrementalASTCloner(oldNode, newNode, _tokenMap);
+    return originalStructure.accept(cloner) as ASTNode;
+  }
+
+  /**
+   * Return the first (non-EOF) token in the token stream containing the given token.
+   *
+   * @param firstToken the token from which the search is to begin
+   * @return the first token in the token stream containing the given token
+   */
+  Token findFirstToken(Token firstToken) {
+    while (firstToken.type != TokenType.EOF) {
+      firstToken = firstToken.previous;
+    }
+    return firstToken.next;
+  }
+
+  /**
+   * Find the token at or before the given token with the given offset, or `null` if there is
+   * no such token.
+   *
+   * @param firstToken the token from which the search is to begin
+   * @param offset the offset of the token to be returned
+   * @return the token with the given offset
+   */
+  Token findTokenAt(Token firstToken, int offset) {
+    while (firstToken.offset > offset && firstToken.type != TokenType.EOF) {
+      firstToken = firstToken.previous;
+    }
+    if (firstToken.offset == offset) {
+      return firstToken;
+    }
+    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.
+   */
+  InsufficientContextException() : super();
+
+  /**
+   * Initialize a newly created exception to have the given message and to be its own cause.
+   *
+   * @param message the message describing the reason for the exception
+   */
+  InsufficientContextException.con1(String message) : super.con1(message);
+
+  /**
+   * Initialize a newly created exception to have no message and to have the given cause.
+   *
+   * @param cause the exception that caused this exception
+   */
+  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
@@ -176,8 +1206,8 @@
   static String _HIDE = "hide";
   static String _OF = "of";
   static String _ON = "on";
-  static String _SHOW = "show";
   static String _NATIVE = "native";
+  static String _SHOW = "show";
 
   /**
    * Initialize a newly created parser.
@@ -259,6 +1289,1008 @@
       instrumentation.log();
     }
   }
+
+  /**
+   * Parse an annotation.
+   *
+   * <pre>
+   * annotation ::=
+   *     '@' qualified ('.' identifier)? arguments?
+   * </pre>
+   *
+   * @return the annotation that was parsed
+   */
+  Annotation parseAnnotation() {
+    Token atSign = expect2(TokenType.AT);
+    Identifier name = parsePrefixedIdentifier();
+    Token period = null;
+    SimpleIdentifier constructorName = null;
+    if (matches5(TokenType.PERIOD)) {
+      period = andAdvance;
+      constructorName = parseSimpleIdentifier();
+    }
+    ArgumentList arguments = null;
+    if (matches5(TokenType.OPEN_PAREN)) {
+      arguments = parseArgumentList();
+    }
+    return new Annotation.full(atSign, name, period, constructorName, arguments);
+  }
+
+  /**
+   * Parse an argument.
+   *
+   * <pre>
+   * argument ::=
+   *     namedArgument
+   *   | expression
+   *
+   * namedArgument ::=
+   *     label expression
+   * </pre>
+   *
+   * @return the argument that was parsed
+   */
+  Expression parseArgument() {
+    if (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
+      return new NamedExpression.full(parseLabel(), parseExpression2());
+    } else {
+      return parseExpression2();
+    }
+  }
+
+  /**
+   * Parse a list of arguments.
+   *
+   * <pre>
+   * arguments ::=
+   *     '(' argumentList? ')'
+   *
+   * argumentList ::=
+   *     namedArgument (',' namedArgument)*
+   *   | expressionList (',' namedArgument)*
+   * </pre>
+   *
+   * @return the argument list that was parsed
+   */
+  ArgumentList parseArgumentList() {
+    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
+    List<Expression> arguments = new List<Expression>();
+    if (matches5(TokenType.CLOSE_PAREN)) {
+      return new ArgumentList.full(leftParenthesis, arguments, andAdvance);
+    }
+    Expression argument = parseArgument();
+    arguments.add(argument);
+    bool foundNamedArgument = argument is NamedExpression;
+    bool generatedError = false;
+    while (optional(TokenType.COMMA)) {
+      argument = parseArgument();
+      arguments.add(argument);
+      if (foundNamedArgument) {
+        if (!generatedError && argument is! NamedExpression) {
+          reportError8(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
+          generatedError = true;
+        }
+      } else if (argument is NamedExpression) {
+        foundNamedArgument = true;
+      }
+    }
+    Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
+    return new ArgumentList.full(leftParenthesis, arguments, rightParenthesis);
+  }
+
+  /**
+   * Parse a bitwise or expression.
+   *
+   * <pre>
+   * bitwiseOrExpression ::=
+   *     bitwiseXorExpression ('|' bitwiseXorExpression)*
+   *   | 'super' ('|' bitwiseXorExpression)+
+   * </pre>
+   *
+   * @return the bitwise or expression that was parsed
+   */
+  Expression parseBitwiseOrExpression() {
+    Expression expression;
+    if (matches(Keyword.SUPER) && matches4(peek(), TokenType.BAR)) {
+      expression = new SuperExpression.full(andAdvance);
+    } else {
+      expression = parseBitwiseXorExpression();
+    }
+    while (matches5(TokenType.BAR)) {
+      Token operator = andAdvance;
+      expression = new BinaryExpression.full(expression, operator, parseBitwiseXorExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a block.
+   *
+   * <pre>
+   * block ::=
+   *     '{' statements '}'
+   * </pre>
+   *
+   * @return the block that was parsed
+   */
+  Block parseBlock() {
+    Token leftBracket = expect2(TokenType.OPEN_CURLY_BRACKET);
+    List<Statement> statements = new List<Statement>();
+    Token statementStart = _currentToken;
+    while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET)) {
+      Statement statement = parseStatement2();
+      if (statement != null) {
+        statements.add(statement);
+      }
+      if (identical(_currentToken, statementStart)) {
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        advance();
+      }
+      statementStart = _currentToken;
+    }
+    Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
+    return new Block.full(leftBracket, statements, rightBracket);
+  }
+
+  /**
+   * Parse a class member.
+   *
+   * <pre>
+   * classMemberDefinition ::=
+   *     declaration ';'
+   *   | methodSignature functionBody
+   * </pre>
+   *
+   * @param className the name of the class containing the member being parsed
+   * @return the class member that was parsed, or `null` if what was found was not a valid
+   *         class member
+   */
+  ClassMember parseClassMember(String className) {
+    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+    Modifiers modifiers = parseModifiers();
+    if (matches(Keyword.VOID)) {
+      TypeName returnType = parseReturnType();
+      if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
+        validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
+        validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
+        validateModifiersForOperator(modifiers);
+        return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
+      } else if (matchesIdentifier() && matchesAny(peek(), [
+          TokenType.OPEN_PAREN,
+          TokenType.OPEN_CURLY_BRACKET,
+          TokenType.FUNCTION])) {
+        validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return parseMethodDeclaration(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else {
+        if (matchesIdentifier()) {
+          if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+            reportError(ParserErrorCode.VOID_VARIABLE, returnType, []);
+            return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), returnType);
+          }
+        }
+        if (isOperator(_currentToken)) {
+          validateModifiersForOperator(modifiers);
+          return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
+        }
+        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        return null;
+      }
+    } else if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
+    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
+    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
+      validateModifiersForOperator(modifiers);
+      return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (!matchesIdentifier()) {
+      if (isOperator(_currentToken)) {
+        validateModifiersForOperator(modifiers);
+        return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
+      }
+      reportError9(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());
+    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName = parseSimpleIdentifier();
+      FormalParameterList parameters = parseFormalParameterList();
+      if (matches5(TokenType.COLON) || modifiers.factoryKeyword != null || methodName.name == className) {
+        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
+      }
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      validateFormalParameterList(parameters);
+      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, []);
+      }
+      return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
+    }
+    TypeName type = parseTypeName();
+    if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
+    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
+    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
+      validateModifiersForOperator(modifiers);
+      return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
+    } else if (!matchesIdentifier()) {
+      if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
+        return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
+      }
+      if (isOperator(_currentToken)) {
+        validateModifiersForOperator(modifiers);
+        return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
+      }
+      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      return null;
+    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName = parseSimpleIdentifier();
+      FormalParameterList parameters = parseFormalParameterList();
+      if (methodName.name == className) {
+        reportError(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type, []);
+        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
+      }
+      validateModifiersForGetterOrSetterOrMethod(modifiers);
+      validateFormalParameterList(parameters);
+      return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
+    }
+    return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
+  }
+
+  /**
+   * Parse a compilation unit.
+   *
+   * Specified:
+   *
+   * <pre>
+   * compilationUnit ::=
+   *     scriptTag? directive* topLevelDeclaration*
+   * </pre>
+   * Actual:
+   *
+   * <pre>
+   * compilationUnit ::=
+   *     scriptTag? topLevelElement*
+   *
+   * topLevelElement ::=
+   *     directive
+   *   | topLevelDeclaration
+   * </pre>
+   *
+   * @return the compilation unit that was parsed
+   */
+  CompilationUnit parseCompilationUnit2() {
+    Token firstToken = _currentToken;
+    ScriptTag scriptTag = null;
+    if (matches5(TokenType.SCRIPT_TAG)) {
+      scriptTag = new ScriptTag.full(andAdvance);
+    }
+    bool libraryDirectiveFound = false;
+    bool partOfDirectiveFound = false;
+    bool partDirectiveFound = false;
+    bool directiveFoundAfterDeclaration = false;
+    List<Directive> directives = new List<Directive>();
+    List<CompilationUnitMember> declarations = new List<CompilationUnitMember>();
+    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)) {
+        Directive directive = parseDirective(commentAndMetadata);
+        if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
+          reportError8(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
+          directiveFoundAfterDeclaration = true;
+        }
+        if (directive is LibraryDirective) {
+          if (libraryDirectiveFound) {
+            reportError8(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
+          } else {
+            if (directives.length > 0) {
+              reportError8(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
+            }
+            libraryDirectiveFound = true;
+          }
+        } else if (directive is PartDirective) {
+          partDirectiveFound = true;
+        } else if (partDirectiveFound) {
+          if (directive is ExportDirective) {
+            reportError9(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, []);
+          }
+        }
+        if (directive is PartOfDirective) {
+          if (partOfDirectiveFound) {
+            reportError8(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
+          } else {
+            for (Directive precedingDirective in directives) {
+              reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, precedingDirective.keyword, []);
+            }
+            partOfDirectiveFound = true;
+          }
+        } else {
+          if (partOfDirectiveFound) {
+            reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
+          }
+        }
+        directives.add(directive);
+      } else if (matches5(TokenType.SEMICOLON)) {
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        advance();
+      } else {
+        CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
+        if (member != null) {
+          declarations.add(member);
+        }
+      }
+      if (identical(_currentToken, memberStart)) {
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        advance();
+        while (!matches5(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
+          advance();
+        }
+      }
+      memberStart = _currentToken;
+    }
+    return new CompilationUnit.full(firstToken, scriptTag, directives, declarations, _currentToken);
+  }
+
+  /**
+   * Parse a conditional expression.
+   *
+   * <pre>
+   * conditionalExpression ::=
+   *     logicalOrExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
+   * </pre>
+   *
+   * @return the conditional expression that was parsed
+   */
+  Expression parseConditionalExpression() {
+    Expression condition = parseLogicalOrExpression();
+    if (!matches5(TokenType.QUESTION)) {
+      return condition;
+    }
+    Token question = andAdvance;
+    Expression thenExpression = parseExpressionWithoutCascade();
+    Token colon = expect2(TokenType.COLON);
+    Expression elseExpression = parseExpressionWithoutCascade();
+    return new ConditionalExpression.full(condition, question, thenExpression, colon, elseExpression);
+  }
+
+  /**
+   * Parse the name of a constructor.
+   *
+   * <pre>
+   * constructorName:
+   *     type ('.' identifier)?
+   * </pre>
+   *
+   * @return the constructor name that was parsed
+   */
+  ConstructorName parseConstructorName() {
+    TypeName type = parseTypeName();
+    Token period = null;
+    SimpleIdentifier name = null;
+    if (matches5(TokenType.PERIOD)) {
+      period = andAdvance;
+      name = parseSimpleIdentifier();
+    }
+    return new ConstructorName.full(type, period, name);
+  }
+
+  /**
+   * Parse an expression that does not contain any cascades.
+   *
+   * <pre>
+   * expression ::=
+   *     assignableExpression assignmentOperator expression
+   *   | conditionalExpression cascadeSection*
+   *   | throwExpression
+   * </pre>
+   *
+   * @return the expression that was parsed
+   */
+  Expression parseExpression2() {
+    if (matches(Keyword.THROW)) {
+      return parseThrowExpression();
+    } else if (matches(Keyword.RETHROW)) {
+      return parseRethrowExpression();
+    }
+    Expression expression = parseConditionalExpression();
+    TokenType tokenType = _currentToken.type;
+    if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+      List<Expression> cascadeSections = new List<Expression>();
+      while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+        Expression section = parseCascadeSection();
+        if (section != null) {
+          cascadeSections.add(section);
+        }
+        tokenType = _currentToken.type;
+      }
+      return new CascadeExpression.full(expression, cascadeSections);
+    } else if (tokenType.isAssignmentOperator) {
+      Token operator = andAdvance;
+      ensureAssignable(expression);
+      return new AssignmentExpression.full(expression, operator, parseExpression2());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse an expression that does not contain any cascades.
+   *
+   * <pre>
+   * expressionWithoutCascade ::=
+   *     assignableExpression assignmentOperator expressionWithoutCascade
+   *   | conditionalExpression
+   *   | throwExpressionWithoutCascade
+   * </pre>
+   *
+   * @return the expression that was parsed
+   */
+  Expression parseExpressionWithoutCascade() {
+    if (matches(Keyword.THROW)) {
+      return parseThrowExpressionWithoutCascade();
+    } else if (matches(Keyword.RETHROW)) {
+      return parseRethrowExpression();
+    }
+    Expression expression = parseConditionalExpression();
+    if (_currentToken.type.isAssignmentOperator) {
+      Token operator = andAdvance;
+      ensureAssignable(expression);
+      expression = new AssignmentExpression.full(expression, operator, parseExpressionWithoutCascade());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a class extends clause.
+   *
+   * <pre>
+   * classExtendsClause ::=
+   *     'extends' type
+   * </pre>
+   *
+   * @return the class extends clause that was parsed
+   */
+  ExtendsClause parseExtendsClause() {
+    Token keyword = expect(Keyword.EXTENDS);
+    TypeName superclass = parseTypeName();
+    return new ExtendsClause.full(keyword, superclass);
+  }
+
+  /**
+   * Parse a list of formal parameters.
+   *
+   * <pre>
+   * formalParameterList ::=
+   *     '(' ')'
+   *   | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+   *   | '(' optionalFormalParameters ')'
+   *
+   * normalFormalParameters ::=
+   *     normalFormalParameter (',' normalFormalParameter)*
+   *
+   * optionalFormalParameters ::=
+   *     optionalPositionalFormalParameters
+   *   | namedFormalParameters
+   *
+   * optionalPositionalFormalParameters ::=
+   *     '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
+   *
+   * namedFormalParameters ::=
+   *     '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
+   * </pre>
+   *
+   * @return the formal parameters that were parsed
+   */
+  FormalParameterList parseFormalParameterList() {
+    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
+    if (matches5(TokenType.CLOSE_PAREN)) {
+      return new FormalParameterList.full(leftParenthesis, null, null, null, andAdvance);
+    }
+    List<FormalParameter> parameters = new List<FormalParameter>();
+    List<FormalParameter> normalParameters = new List<FormalParameter>();
+    List<FormalParameter> positionalParameters = new List<FormalParameter>();
+    List<FormalParameter> namedParameters = new List<FormalParameter>();
+    List<FormalParameter> currentParameters = normalParameters;
+    Token leftSquareBracket = null;
+    Token rightSquareBracket = null;
+    Token leftCurlyBracket = null;
+    Token rightCurlyBracket = null;
+    ParameterKind kind = ParameterKind.REQUIRED;
+    bool firstParameter = true;
+    bool reportedMuliplePositionalGroups = false;
+    bool reportedMulipleNamedGroups = false;
+    bool reportedMixedGroups = false;
+    bool wasOptionalParameter = false;
+    Token initialToken = null;
+    do {
+      if (firstParameter) {
+        firstParameter = false;
+      } else if (!optional(TokenType.COMMA)) {
+        if (getEndToken(leftParenthesis) != null) {
+          reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+        } else {
+          reportError9(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
+          break;
+        }
+      }
+      initialToken = _currentToken;
+      if (matches5(TokenType.OPEN_SQUARE_BRACKET)) {
+        wasOptionalParameter = true;
+        if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
+          reportError8(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
+          reportedMuliplePositionalGroups = true;
+        }
+        if (leftCurlyBracket != null && !reportedMixedGroups) {
+          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportedMixedGroups = true;
+        }
+        leftSquareBracket = andAdvance;
+        currentParameters = positionalParameters;
+        kind = ParameterKind.POSITIONAL;
+      } else if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
+        wasOptionalParameter = true;
+        if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
+          reportError8(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
+          reportedMulipleNamedGroups = true;
+        }
+        if (leftSquareBracket != null && !reportedMixedGroups) {
+          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportedMixedGroups = true;
+        }
+        leftCurlyBracket = andAdvance;
+        currentParameters = namedParameters;
+        kind = ParameterKind.NAMED;
+      }
+      FormalParameter parameter = parseFormalParameter(kind);
+      parameters.add(parameter);
+      currentParameters.add(parameter);
+      if (identical(kind, ParameterKind.REQUIRED) && wasOptionalParameter) {
+        reportError(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter, []);
+      }
+      if (matches5(TokenType.CLOSE_SQUARE_BRACKET)) {
+        rightSquareBracket = andAdvance;
+        currentParameters = normalParameters;
+        if (leftSquareBracket == null) {
+          if (leftCurlyBracket != null) {
+            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            rightCurlyBracket = rightSquareBracket;
+            rightSquareBracket = null;
+          } else {
+            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
+        rightCurlyBracket = andAdvance;
+        currentParameters = normalParameters;
+        if (leftCurlyBracket == null) {
+          if (leftSquareBracket != null) {
+            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            rightSquareBracket = rightCurlyBracket;
+            rightCurlyBracket = null;
+          } else {
+            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      }
+    } 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, ["]"]);
+    }
+    if (leftCurlyBracket != null && rightCurlyBracket == null) {
+      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+    }
+    if (leftSquareBracket == null) {
+      leftSquareBracket = leftCurlyBracket;
+    }
+    if (rightSquareBracket == null) {
+      rightSquareBracket = rightCurlyBracket;
+    }
+    return new FormalParameterList.full(leftParenthesis, parameters, leftSquareBracket, rightSquareBracket, rightParenthesis);
+  }
+
+  /**
+   * Parse a function expression.
+   *
+   * <pre>
+   * functionExpression ::=
+   *     formalParameterList functionExpressionBody
+   * </pre>
+   *
+   * @return the function expression that was parsed
+   */
+  FunctionExpression parseFunctionExpression() {
+    FormalParameterList parameters = parseFormalParameterList();
+    validateFormalParameterList(parameters);
+    FunctionBody body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
+    return new FunctionExpression.full(parameters, body);
+  }
+
+  /**
+   * Parse an implements clause.
+   *
+   * <pre>
+   * implementsClause ::=
+   *     'implements' type (',' type)*
+   * </pre>
+   *
+   * @return the implements clause that was parsed
+   */
+  ImplementsClause parseImplementsClause() {
+    Token keyword = expect(Keyword.IMPLEMENTS);
+    List<TypeName> interfaces = new List<TypeName>();
+    interfaces.add(parseTypeName());
+    while (optional(TokenType.COMMA)) {
+      interfaces.add(parseTypeName());
+    }
+    return new ImplementsClause.full(keyword, interfaces);
+  }
+
+  /**
+   * Parse a label.
+   *
+   * <pre>
+   * label ::=
+   *     identifier ':'
+   * </pre>
+   *
+   * @return the label that was parsed
+   */
+  Label parseLabel() {
+    SimpleIdentifier label = parseSimpleIdentifier();
+    Token colon = expect2(TokenType.COLON);
+    return new Label.full(label, colon);
+  }
+
+  /**
+   * Parse a library identifier.
+   *
+   * <pre>
+   * libraryIdentifier ::=
+   *     identifier ('.' identifier)*
+   * </pre>
+   *
+   * @return the library identifier that was parsed
+   */
+  LibraryIdentifier parseLibraryIdentifier() {
+    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
+    components.add(parseSimpleIdentifier());
+    while (matches5(TokenType.PERIOD)) {
+      advance();
+      components.add(parseSimpleIdentifier());
+    }
+    return new LibraryIdentifier.full(components);
+  }
+
+  /**
+   * Parse a logical or expression.
+   *
+   * <pre>
+   * logicalOrExpression ::=
+   *     logicalAndExpression ('||' logicalAndExpression)*
+   * </pre>
+   *
+   * @return the logical or expression that was parsed
+   */
+  Expression parseLogicalOrExpression() {
+    Expression expression = parseLogicalAndExpression();
+    while (matches5(TokenType.BAR_BAR)) {
+      Token operator = andAdvance;
+      expression = new BinaryExpression.full(expression, operator, parseLogicalAndExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a map literal entry.
+   *
+   * <pre>
+   * mapLiteralEntry ::=
+   *     expression ':' expression
+   * </pre>
+   *
+   * @return the map literal entry that was parsed
+   */
+  MapLiteralEntry parseMapLiteralEntry() {
+    Expression key = parseExpression2();
+    Token separator = expect2(TokenType.COLON);
+    Expression value = parseExpression2();
+    return new MapLiteralEntry.full(key, separator, value);
+  }
+
+  /**
+   * Parse a normal formal parameter.
+   *
+   * <pre>
+   * normalFormalParameter ::=
+   *     functionSignature
+   *   | fieldFormalParameter
+   *   | simpleFormalParameter
+   *
+   * functionSignature:
+   *     metadata returnType? identifier formalParameterList
+   *
+   * fieldFormalParameter ::=
+   *     metadata finalConstVarOrType? 'this' '.' identifier
+   *
+   * simpleFormalParameter ::=
+   *     declaredIdentifier
+   *   | metadata identifier
+   * </pre>
+   *
+   * @return the normal formal parameter that was parsed
+   */
+  NormalFormalParameter parseNormalFormalParameter() {
+    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+    FinalConstVarOrType holder = parseFinalConstVarOrType(true);
+    Token thisKeyword = null;
+    Token period = null;
+    if (matches(Keyword.THIS)) {
+      thisKeyword = andAdvance;
+      period = expect2(TokenType.PERIOD);
+    }
+    SimpleIdentifier identifier = parseSimpleIdentifier();
+    if (matches5(TokenType.OPEN_PAREN)) {
+      FormalParameterList parameters = parseFormalParameterList();
+      if (thisKeyword == null) {
+        if (holder.keyword != null) {
+          reportError9(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
+        }
+        return new FunctionTypedFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.type, identifier, parameters);
+      } else {
+        return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, parameters);
+      }
+    }
+    TypeName type = holder.type;
+    if (type != null) {
+      if (matches3(type.name.beginToken, Keyword.VOID)) {
+        reportError9(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
+      } else if (holder.keyword != null && matches3(holder.keyword, Keyword.VAR)) {
+        reportError9(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
+      }
+    }
+    if (thisKeyword != null) {
+      return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, null);
+    }
+    return new SimpleFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
+  }
+
+  /**
+   * Parse a prefixed identifier.
+   *
+   * <pre>
+   * prefixedIdentifier ::=
+   *     identifier ('.' identifier)?
+   * </pre>
+   *
+   * @return the prefixed identifier that was parsed
+   */
+  Identifier parsePrefixedIdentifier() {
+    SimpleIdentifier qualifier = parseSimpleIdentifier();
+    if (!matches5(TokenType.PERIOD)) {
+      return qualifier;
+    }
+    Token period = andAdvance;
+    SimpleIdentifier qualified = parseSimpleIdentifier();
+    return new PrefixedIdentifier.full(qualifier, period, qualified);
+  }
+
+  /**
+   * Parse a return type.
+   *
+   * <pre>
+   * returnType ::=
+   *     'void'
+   *   | type
+   * </pre>
+   *
+   * @return the return type that was parsed
+   */
+  TypeName parseReturnType() {
+    if (matches(Keyword.VOID)) {
+      return new TypeName.full(new SimpleIdentifier.full(andAdvance), null);
+    } else {
+      return parseTypeName();
+    }
+  }
+
+  /**
+   * Parse a simple identifier.
+   *
+   * <pre>
+   * identifier ::=
+   *     IDENTIFIER
+   * </pre>
+   *
+   * @return the simple identifier that was parsed
+   */
+  SimpleIdentifier parseSimpleIdentifier() {
+    if (matchesIdentifier()) {
+      return new SimpleIdentifier.full(andAdvance);
+    }
+    reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
+    return createSyntheticIdentifier();
+  }
+
+  /**
+   * Parse a statement.
+   *
+   * <pre>
+   * statement ::=
+   *     label* nonLabeledStatement
+   * </pre>
+   *
+   * @return the statement that was parsed
+   */
+  Statement parseStatement2() {
+    List<Label> labels = new List<Label>();
+    while (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
+      labels.add(parseLabel());
+    }
+    Statement statement = parseNonLabeledStatement();
+    if (labels.isEmpty) {
+      return statement;
+    }
+    return new LabeledStatement.full(labels, statement);
+  }
+
+  /**
+   * Parse a string literal.
+   *
+   * <pre>
+   * stringLiteral ::=
+   *     MULTI_LINE_STRING+
+   *   | SINGLE_LINE_STRING+
+   * </pre>
+   *
+   * @return the string literal that was parsed
+   */
+  StringLiteral parseStringLiteral() {
+    List<StringLiteral> strings = new List<StringLiteral>();
+    while (matches5(TokenType.STRING)) {
+      Token string = andAdvance;
+      if (matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
+        strings.add(parseStringInterpolation(string));
+      } else {
+        strings.add(new SimpleStringLiteral.full(string, computeStringValue(string.lexeme, true, true)));
+      }
+    }
+    if (strings.length < 1) {
+      reportError8(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
+      return createSyntheticStringLiteral();
+    } else if (strings.length == 1) {
+      return strings[0];
+    } else {
+      return new AdjacentStrings.full(strings);
+    }
+  }
+
+  /**
+   * Parse a list of type arguments.
+   *
+   * <pre>
+   * typeArguments ::=
+   *     '<' typeList '>'
+   *
+   * typeList ::=
+   *     type (',' type)*
+   * </pre>
+   *
+   * @return the type argument list that was parsed
+   */
+  TypeArgumentList parseTypeArgumentList() {
+    Token leftBracket = expect2(TokenType.LT);
+    List<TypeName> arguments = new List<TypeName>();
+    arguments.add(parseTypeName());
+    while (optional(TokenType.COMMA)) {
+      arguments.add(parseTypeName());
+    }
+    Token rightBracket = expect2(TokenType.GT);
+    return new TypeArgumentList.full(leftBracket, arguments, rightBracket);
+  }
+
+  /**
+   * Parse a type name.
+   *
+   * <pre>
+   * type ::=
+   *     qualified typeArguments?
+   * </pre>
+   *
+   * @return the type name that was parsed
+   */
+  TypeName parseTypeName() {
+    Identifier typeName;
+    if (matches(Keyword.VAR)) {
+      reportError8(ParserErrorCode.VAR_AS_TYPE_NAME, []);
+      typeName = new SimpleIdentifier.full(andAdvance);
+    } else if (matchesIdentifier()) {
+      typeName = parsePrefixedIdentifier();
+    } else {
+      typeName = createSyntheticIdentifier();
+      reportError8(ParserErrorCode.EXPECTED_TYPE_NAME, []);
+    }
+    TypeArgumentList typeArguments = null;
+    if (matches5(TokenType.LT)) {
+      typeArguments = parseTypeArgumentList();
+    }
+    return new TypeName.full(typeName, typeArguments);
+  }
+
+  /**
+   * Parse a type parameter.
+   *
+   * <pre>
+   * typeParameter ::=
+   *     metadata name ('extends' bound)?
+   * </pre>
+   *
+   * @return the type parameter that was parsed
+   */
+  TypeParameter parseTypeParameter() {
+    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+    SimpleIdentifier name = parseSimpleIdentifier();
+    if (matches(Keyword.EXTENDS)) {
+      Token keyword = andAdvance;
+      TypeName bound = parseTypeName();
+      return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, keyword, bound);
+    }
+    return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, null, null);
+  }
+
+  /**
+   * Parse a list of type parameters.
+   *
+   * <pre>
+   * typeParameterList ::=
+   *     '<' typeParameter (',' typeParameter)* '>'
+   * </pre>
+   *
+   * @return the list of type parameters that were parsed
+   */
+  TypeParameterList parseTypeParameterList() {
+    Token leftBracket = expect2(TokenType.LT);
+    List<TypeParameter> typeParameters = new List<TypeParameter>();
+    typeParameters.add(parseTypeParameter());
+    while (optional(TokenType.COMMA)) {
+      typeParameters.add(parseTypeParameter());
+    }
+    Token rightBracket = expect2(TokenType.GT);
+    return new TypeParameterList.full(leftBracket, typeParameters, rightBracket);
+  }
+
+  /**
+   * Parse a with clause.
+   *
+   * <pre>
+   * withClause ::=
+   *     'with' typeName (',' typeName)*
+   * </pre>
+   *
+   * @return the with clause that was parsed
+   */
+  WithClause parseWithClause() {
+    Token with2 = expect(Keyword.WITH);
+    List<TypeName> types = new List<TypeName>();
+    types.add(parseTypeName());
+    while (optional(TokenType.COMMA)) {
+      types.add(parseTypeName());
+    }
+    return new WithClause.full(with2, types);
+  }
   void set currentToken(Token currentToken) {
     this._currentToken = currentToken;
   }
@@ -952,56 +2984,6 @@
   }
 
   /**
-   * Parse an annotation.
-   *
-   * <pre>
-   * annotation ::=
-   *     '@' qualified ('.' identifier)? arguments?
-   * </pre>
-   *
-   * @return the annotation that was parsed
-   */
-  Annotation parseAnnotation() {
-    Token atSign = expect2(TokenType.AT);
-    Identifier name = parsePrefixedIdentifier();
-    Token period = null;
-    SimpleIdentifier constructorName = null;
-    if (matches5(TokenType.PERIOD)) {
-      period = andAdvance;
-      constructorName = parseSimpleIdentifier();
-    }
-    ArgumentList arguments = null;
-    if (matches5(TokenType.OPEN_PAREN)) {
-      arguments = parseArgumentList();
-    }
-    return new Annotation.full(atSign, name, period, constructorName, arguments);
-  }
-
-  /**
-   * Parse an argument.
-   *
-   * <pre>
-   * argument ::=
-   *     namedArgument
-   *   | expression
-   *
-   * namedArgument ::=
-   *     label expression
-   * </pre>
-   *
-   * @return the argument that was parsed
-   */
-  Expression parseArgument() {
-    if (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
-      SimpleIdentifier label = new SimpleIdentifier.full(andAdvance);
-      Label name = new Label.full(label, andAdvance);
-      return new NamedExpression.full(name, parseExpression2());
-    } else {
-      return parseExpression2();
-    }
-  }
-
-  /**
    * Parse an argument definition test.
    *
    * <pre>
@@ -1019,46 +3001,6 @@
   }
 
   /**
-   * Parse a list of arguments.
-   *
-   * <pre>
-   * arguments ::=
-   *     '(' argumentList? ')'
-   *
-   * argumentList ::=
-   *     namedArgument (',' namedArgument)*
-   *   | expressionList (',' namedArgument)*
-   * </pre>
-   *
-   * @return the argument list that was parsed
-   */
-  ArgumentList parseArgumentList() {
-    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
-    List<Expression> arguments = new List<Expression>();
-    if (matches5(TokenType.CLOSE_PAREN)) {
-      return new ArgumentList.full(leftParenthesis, arguments, andAdvance);
-    }
-    Expression argument = parseArgument();
-    arguments.add(argument);
-    bool foundNamedArgument = argument is NamedExpression;
-    bool generatedError = false;
-    while (optional(TokenType.COMMA)) {
-      argument = parseArgument();
-      arguments.add(argument);
-      if (foundNamedArgument) {
-        if (!generatedError && argument is! NamedExpression) {
-          reportError8(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
-          generatedError = true;
-        }
-      } else if (argument is NamedExpression) {
-        foundNamedArgument = true;
-      }
-    }
-    Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
-    return new ArgumentList.full(leftParenthesis, arguments, rightParenthesis);
-  }
-
-  /**
    * Parse an assert statement.
    *
    * <pre>
@@ -1193,31 +3135,6 @@
   }
 
   /**
-   * Parse a bitwise or expression.
-   *
-   * <pre>
-   * bitwiseOrExpression ::=
-   *     bitwiseXorExpression ('|' bitwiseXorExpression)*
-   *   | 'super' ('|' bitwiseXorExpression)+
-   * </pre>
-   *
-   * @return the bitwise or expression that was parsed
-   */
-  Expression parseBitwiseOrExpression() {
-    Expression expression;
-    if (matches(Keyword.SUPER) && matches4(peek(), TokenType.BAR)) {
-      expression = new SuperExpression.full(andAdvance);
-    } else {
-      expression = parseBitwiseXorExpression();
-    }
-    while (matches5(TokenType.BAR)) {
-      Token operator = andAdvance;
-      expression = new BinaryExpression.full(expression, operator, parseBitwiseXorExpression());
-    }
-    return expression;
-  }
-
-  /**
    * Parse a bitwise exclusive-or expression.
    *
    * <pre>
@@ -1243,35 +3160,6 @@
   }
 
   /**
-   * Parse a block.
-   *
-   * <pre>
-   * block ::=
-   *     '{' statements '}'
-   * </pre>
-   *
-   * @return the block that was parsed
-   */
-  Block parseBlock() {
-    Token leftBracket = expect2(TokenType.OPEN_CURLY_BRACKET);
-    List<Statement> statements = new List<Statement>();
-    Token statementStart = _currentToken;
-    while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-      Statement statement = parseStatement2();
-      if (statement != null) {
-        statements.add(statement);
-      }
-      if (identical(_currentToken, statementStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
-      }
-      statementStart = _currentToken;
-    }
-    Token rightBracket = expect2(TokenType.CLOSE_CURLY_BRACKET);
-    return new Block.full(leftBracket, statements, rightBracket);
-  }
-
-  /**
    * Parse a break statement.
    *
    * <pre>
@@ -1351,7 +3239,12 @@
         expression = selector;
         progress = true;
         while (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
-          expression = new FunctionExpressionInvocation.full(expression, parseArgumentList());
+          if (expression is PropertyAccess) {
+            PropertyAccess propertyAccess = expression as PropertyAccess;
+            expression = new MethodInvocation.full(propertyAccess.target, propertyAccess.operator, propertyAccess.propertyName, parseArgumentList());
+          } else {
+            expression = new FunctionExpressionInvocation.full(expression, parseArgumentList());
+          }
         }
       }
     }
@@ -1459,120 +3352,6 @@
   }
 
   /**
-   * Parse a class member.
-   *
-   * <pre>
-   * classMemberDefinition ::=
-   *     declaration ';'
-   *   | methodSignature functionBody
-   * </pre>
-   *
-   * @param className the name of the class containing the member being parsed
-   * @return the class member that was parsed, or `null` if what was found was not a valid
-   *         class member
-   */
-  ClassMember parseClassMember(String className) {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    Modifiers modifiers = parseModifiers();
-    if (matches(Keyword.VOID)) {
-      TypeName returnType = parseReturnType();
-      if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
-      } else if (matchesIdentifier() && matchesAny(peek(), [
-          TokenType.OPEN_PAREN,
-          TokenType.OPEN_CURLY_BRACKET,
-          TokenType.FUNCTION])) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseMethodDeclaration(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else {
-        if (matchesIdentifier()) {
-          if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
-            reportError(ParserErrorCode.VOID_VARIABLE, returnType, []);
-            return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), returnType);
-          }
-        }
-        if (isOperator(_currentToken)) {
-          validateModifiersForOperator(modifiers);
-          return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
-        }
-        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
-        return null;
-      }
-    } else if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
-    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
-    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      validateModifiersForOperator(modifiers);
-      return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
-    } else if (!matchesIdentifier()) {
-      if (isOperator(_currentToken)) {
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
-      }
-      reportError9(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());
-    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
-      SimpleIdentifier methodName = parseSimpleIdentifier();
-      FormalParameterList parameters = parseFormalParameterList();
-      if (matches5(TokenType.COLON) || modifiers.factoryKeyword != null || methodName.name == className) {
-        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
-      }
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      validateFormalParameterList(parameters);
-      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, []);
-      }
-      return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
-    }
-    TypeName type = parseTypeName();
-    if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
-    } else if (matches(Keyword.SET) && matchesIdentifier2(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
-    } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      validateModifiersForOperator(modifiers);
-      return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
-    } else if (!matchesIdentifier()) {
-      if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-        return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
-      }
-      if (isOperator(_currentToken)) {
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
-      }
-      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
-      return null;
-    } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
-      SimpleIdentifier methodName = parseSimpleIdentifier();
-      FormalParameterList parameters = parseFormalParameterList();
-      if (methodName.name == className) {
-        reportError(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type, []);
-        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
-      }
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      validateFormalParameterList(parameters);
-      return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
-    }
-    return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
-  }
-
-  /**
    * Parse a list of class members.
    *
    * <pre>
@@ -1814,103 +3593,6 @@
   }
 
   /**
-   * Parse a compilation unit.
-   *
-   * Specified:
-   *
-   * <pre>
-   * compilationUnit ::=
-   *     scriptTag? directive* topLevelDeclaration*
-   * </pre>
-   * Actual:
-   *
-   * <pre>
-   * compilationUnit ::=
-   *     scriptTag? topLevelElement*
-   *
-   * topLevelElement ::=
-   *     directive
-   *   | topLevelDeclaration
-   * </pre>
-   *
-   * @return the compilation unit that was parsed
-   */
-  CompilationUnit parseCompilationUnit2() {
-    Token firstToken = _currentToken;
-    ScriptTag scriptTag = null;
-    if (matches5(TokenType.SCRIPT_TAG)) {
-      scriptTag = new ScriptTag.full(andAdvance);
-    }
-    bool libraryDirectiveFound = false;
-    bool partOfDirectiveFound = false;
-    bool partDirectiveFound = false;
-    bool directiveFoundAfterDeclaration = false;
-    List<Directive> directives = new List<Directive>();
-    List<CompilationUnitMember> declarations = new List<CompilationUnitMember>();
-    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)) {
-        Directive directive = parseDirective(commentAndMetadata);
-        if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
-          reportError8(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
-          directiveFoundAfterDeclaration = true;
-        }
-        if (directive is LibraryDirective) {
-          if (libraryDirectiveFound) {
-            reportError8(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
-          } else {
-            if (directives.length > 0) {
-              reportError8(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
-            }
-            libraryDirectiveFound = true;
-          }
-        } else if (directive is PartDirective) {
-          partDirectiveFound = true;
-        } else if (partDirectiveFound) {
-          if (directive is ExportDirective) {
-            reportError9(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, []);
-          }
-        }
-        if (directive is PartOfDirective) {
-          if (partOfDirectiveFound) {
-            reportError8(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
-          } else {
-            for (Directive precedingDirective in directives) {
-              reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, precedingDirective.keyword, []);
-            }
-            partOfDirectiveFound = true;
-          }
-        } else {
-          if (partOfDirectiveFound) {
-            reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
-          }
-        }
-        directives.add(directive);
-      } else if (matches5(TokenType.SEMICOLON)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
-      } else {
-        CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
-        if (member != null) {
-          declarations.add(member);
-        }
-      }
-      if (identical(_currentToken, memberStart)) {
-        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
-        while (!matches5(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
-          advance();
-        }
-      }
-      memberStart = _currentToken;
-    }
-    return new CompilationUnit.full(firstToken, scriptTag, directives, declarations, _currentToken);
-  }
-
-  /**
    * Parse a compilation unit member.
    *
    * <pre>
@@ -2012,28 +3694,6 @@
   }
 
   /**
-   * Parse a conditional expression.
-   *
-   * <pre>
-   * conditionalExpression ::=
-   *     logicalOrExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
-   * </pre>
-   *
-   * @return the conditional expression that was parsed
-   */
-  Expression parseConditionalExpression() {
-    Expression condition = parseLogicalOrExpression();
-    if (!matches5(TokenType.QUESTION)) {
-      return condition;
-    }
-    Token question = andAdvance;
-    Expression thenExpression = parseExpressionWithoutCascade();
-    Token colon = expect2(TokenType.COLON);
-    Expression elseExpression = parseExpressionWithoutCascade();
-    return new ConditionalExpression.full(condition, question, thenExpression, colon, elseExpression);
-  }
-
-  /**
    * Parse a const expression.
    *
    * <pre>
@@ -2145,27 +3805,6 @@
   }
 
   /**
-   * Parse the name of a constructor.
-   *
-   * <pre>
-   * constructorName:
-   *     type ('.' identifier)?
-   * </pre>
-   *
-   * @return the constructor name that was parsed
-   */
-  ConstructorName parseConstructorName() {
-    TypeName type = parseTypeName();
-    Token period = null;
-    SimpleIdentifier name = null;
-    if (matches5(TokenType.PERIOD)) {
-      period = andAdvance;
-      name = parseSimpleIdentifier();
-    }
-    return new ConstructorName.full(type, period, name);
-  }
-
-  /**
    * Parse a continue statement.
    *
    * <pre>
@@ -2346,44 +3985,6 @@
   }
 
   /**
-   * Parse an expression that does not contain any cascades.
-   *
-   * <pre>
-   * expression ::=
-   *     assignableExpression assignmentOperator expression
-   *   | conditionalExpression cascadeSection*
-   *   | throwExpression
-   * </pre>
-   *
-   * @return the expression that was parsed
-   */
-  Expression parseExpression2() {
-    if (matches(Keyword.THROW)) {
-      return parseThrowExpression();
-    } else if (matches(Keyword.RETHROW)) {
-      return parseRethrowExpression();
-    }
-    Expression expression = parseConditionalExpression();
-    TokenType tokenType = _currentToken.type;
-    if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
-      List<Expression> cascadeSections = new List<Expression>();
-      while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
-        Expression section = parseCascadeSection();
-        if (section != null) {
-          cascadeSections.add(section);
-        }
-        tokenType = _currentToken.type;
-      }
-      return new CascadeExpression.full(expression, cascadeSections);
-    } else if (tokenType.isAssignmentOperator) {
-      Token operator = andAdvance;
-      ensureAssignable(expression);
-      return new AssignmentExpression.full(expression, operator, parseExpression2());
-    }
-    return expression;
-  }
-
-  /**
    * Parse a list of expressions.
    *
    * <pre>
@@ -2403,49 +4004,6 @@
   }
 
   /**
-   * Parse an expression that does not contain any cascades.
-   *
-   * <pre>
-   * expressionWithoutCascade ::=
-   *     assignableExpression assignmentOperator expressionWithoutCascade
-   *   | conditionalExpression
-   *   | throwExpressionWithoutCascade
-   * </pre>
-   *
-   * @return the expression that was parsed
-   */
-  Expression parseExpressionWithoutCascade() {
-    if (matches(Keyword.THROW)) {
-      return parseThrowExpressionWithoutCascade();
-    } else if (matches(Keyword.RETHROW)) {
-      return parseRethrowExpression();
-    }
-    Expression expression = parseConditionalExpression();
-    if (_currentToken.type.isAssignmentOperator) {
-      Token operator = andAdvance;
-      ensureAssignable(expression);
-      expression = new AssignmentExpression.full(expression, operator, parseExpressionWithoutCascade());
-    }
-    return expression;
-  }
-
-  /**
-   * Parse a class extends clause.
-   *
-   * <pre>
-   * classExtendsClause ::=
-   *     'extends' type
-   * </pre>
-   *
-   * @return the class extends clause that was parsed
-   */
-  ExtendsClause parseExtendsClause() {
-    Token keyword = expect(Keyword.EXTENDS);
-    TypeName superclass = parseTypeName();
-    return new ExtendsClause.full(keyword, superclass);
-  }
-
-  /**
    * Parse the 'final', 'const', 'var' or type preceding a variable declaration.
    *
    * <pre>
@@ -2522,141 +4080,6 @@
   }
 
   /**
-   * Parse a list of formal parameters.
-   *
-   * <pre>
-   * formalParameterList ::=
-   *     '(' ')'
-   *   | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
-   *   | '(' optionalFormalParameters ')'
-   *
-   * normalFormalParameters ::=
-   *     normalFormalParameter (',' normalFormalParameter)*
-   *
-   * optionalFormalParameters ::=
-   *     optionalPositionalFormalParameters
-   *   | namedFormalParameters
-   *
-   * optionalPositionalFormalParameters ::=
-   *     '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
-   *
-   * namedFormalParameters ::=
-   *     '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
-   * </pre>
-   *
-   * @return the formal parameters that were parsed
-   */
-  FormalParameterList parseFormalParameterList() {
-    Token leftParenthesis = expect2(TokenType.OPEN_PAREN);
-    if (matches5(TokenType.CLOSE_PAREN)) {
-      return new FormalParameterList.full(leftParenthesis, null, null, null, andAdvance);
-    }
-    List<FormalParameter> parameters = new List<FormalParameter>();
-    List<FormalParameter> normalParameters = new List<FormalParameter>();
-    List<FormalParameter> positionalParameters = new List<FormalParameter>();
-    List<FormalParameter> namedParameters = new List<FormalParameter>();
-    List<FormalParameter> currentParameters = normalParameters;
-    Token leftSquareBracket = null;
-    Token rightSquareBracket = null;
-    Token leftCurlyBracket = null;
-    Token rightCurlyBracket = null;
-    ParameterKind kind = ParameterKind.REQUIRED;
-    bool firstParameter = true;
-    bool reportedMuliplePositionalGroups = false;
-    bool reportedMulipleNamedGroups = false;
-    bool reportedMixedGroups = false;
-    bool wasOptionalParameter = false;
-    Token initialToken = null;
-    do {
-      if (firstParameter) {
-        firstParameter = false;
-      } else if (!optional(TokenType.COMMA)) {
-        if (getEndToken(leftParenthesis) != null) {
-          reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
-        } else {
-          reportError9(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
-          break;
-        }
-      }
-      initialToken = _currentToken;
-      if (matches5(TokenType.OPEN_SQUARE_BRACKET)) {
-        wasOptionalParameter = true;
-        if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
-          reportError8(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
-          reportedMuliplePositionalGroups = true;
-        }
-        if (leftCurlyBracket != null && !reportedMixedGroups) {
-          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
-          reportedMixedGroups = true;
-        }
-        leftSquareBracket = andAdvance;
-        currentParameters = positionalParameters;
-        kind = ParameterKind.POSITIONAL;
-      } else if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
-        wasOptionalParameter = true;
-        if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
-          reportError8(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
-          reportedMulipleNamedGroups = true;
-        }
-        if (leftSquareBracket != null && !reportedMixedGroups) {
-          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
-          reportedMixedGroups = true;
-        }
-        leftCurlyBracket = andAdvance;
-        currentParameters = namedParameters;
-        kind = ParameterKind.NAMED;
-      }
-      FormalParameter parameter = parseFormalParameter(kind);
-      parameters.add(parameter);
-      currentParameters.add(parameter);
-      if (identical(kind, ParameterKind.REQUIRED) && wasOptionalParameter) {
-        reportError(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter, []);
-      }
-      if (matches5(TokenType.CLOSE_SQUARE_BRACKET)) {
-        rightSquareBracket = andAdvance;
-        currentParameters = normalParameters;
-        if (leftSquareBracket == null) {
-          if (leftCurlyBracket != null) {
-            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
-            rightCurlyBracket = rightSquareBracket;
-            rightSquareBracket = null;
-          } else {
-            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
-          }
-        }
-        kind = ParameterKind.REQUIRED;
-      } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-        rightCurlyBracket = andAdvance;
-        currentParameters = normalParameters;
-        if (leftCurlyBracket == null) {
-          if (leftSquareBracket != null) {
-            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
-            rightSquareBracket = rightCurlyBracket;
-            rightCurlyBracket = null;
-          } else {
-            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
-          }
-        }
-        kind = ParameterKind.REQUIRED;
-      }
-    } 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, ["]"]);
-    }
-    if (leftCurlyBracket != null && rightCurlyBracket == null) {
-      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
-    }
-    if (leftSquareBracket == null) {
-      leftSquareBracket = leftCurlyBracket;
-    }
-    if (rightSquareBracket == null) {
-      rightSquareBracket = rightCurlyBracket;
-    }
-    return new FormalParameterList.full(leftParenthesis, parameters, leftSquareBracket, rightSquareBracket, rightParenthesis);
-  }
-
-  /**
    * Parse a for statement.
    *
    * <pre>
@@ -2894,23 +4317,6 @@
   }
 
   /**
-   * Parse a function expression.
-   *
-   * <pre>
-   * functionExpression ::=
-   *     formalParameterList functionExpressionBody
-   * </pre>
-   *
-   * @return the function expression that was parsed
-   */
-  FunctionExpression parseFunctionExpression() {
-    FormalParameterList parameters = parseFormalParameterList();
-    validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
-    return new FunctionExpression.full(parameters, body);
-  }
-
-  /**
    * Parse a function type alias.
    *
    * <pre>
@@ -3030,26 +4436,6 @@
   }
 
   /**
-   * Parse an implements clause.
-   *
-   * <pre>
-   * implementsClause ::=
-   *     'implements' type (',' type)*
-   * </pre>
-   *
-   * @return the implements clause that was parsed
-   */
-  ImplementsClause parseImplementsClause() {
-    Token keyword = expect(Keyword.IMPLEMENTS);
-    List<TypeName> interfaces = new List<TypeName>();
-    interfaces.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
-      interfaces.add(parseTypeName());
-    }
-    return new ImplementsClause.full(keyword, interfaces);
-  }
-
-  /**
    * Parse an import directive.
    *
    * <pre>
@@ -3138,26 +4524,6 @@
   }
 
   /**
-   * Parse a library identifier.
-   *
-   * <pre>
-   * libraryIdentifier ::=
-   *     identifier ('.' identifier)*
-   * </pre>
-   *
-   * @return the library identifier that was parsed
-   */
-  LibraryIdentifier parseLibraryIdentifier() {
-    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
-    components.add(parseSimpleIdentifier());
-    while (matches5(TokenType.PERIOD)) {
-      advance();
-      components.add(parseSimpleIdentifier());
-    }
-    return new LibraryIdentifier.full(components);
-  }
-
-  /**
    * Parse a library name.
    *
    * <pre>
@@ -3272,25 +4638,6 @@
   }
 
   /**
-   * Parse a logical or expression.
-   *
-   * <pre>
-   * logicalOrExpression ::=
-   *     logicalAndExpression ('||' logicalAndExpression)*
-   * </pre>
-   *
-   * @return the logical or expression that was parsed
-   */
-  Expression parseLogicalOrExpression() {
-    Expression expression = parseLogicalAndExpression();
-    while (matches5(TokenType.BAR_BAR)) {
-      Token operator = andAdvance;
-      expression = new BinaryExpression.full(expression, operator, parseLogicalAndExpression());
-    }
-    return expression;
-  }
-
-  /**
    * Parse a map literal.
    *
    * <pre>
@@ -3322,23 +4669,6 @@
   }
 
   /**
-   * Parse a map literal entry.
-   *
-   * <pre>
-   * mapLiteralEntry ::=
-   *     expression ':' expression
-   * </pre>
-   *
-   * @return the map literal entry that was parsed
-   */
-  MapLiteralEntry parseMapLiteralEntry() {
-    Expression key = parseExpression2();
-    Token separator = expect2(TokenType.COLON);
-    Expression value = parseExpression2();
-    return new MapLiteralEntry.full(key, separator, value);
-  }
-
-  /**
    * Parse a method declaration.
    *
    * <pre>
@@ -3636,63 +4966,6 @@
   }
 
   /**
-   * Parse a normal formal parameter.
-   *
-   * <pre>
-   * normalFormalParameter ::=
-   *     functionSignature
-   *   | fieldFormalParameter
-   *   | simpleFormalParameter
-   *
-   * functionSignature:
-   *     metadata returnType? identifier formalParameterList
-   *
-   * fieldFormalParameter ::=
-   *     metadata finalConstVarOrType? 'this' '.' identifier
-   *
-   * simpleFormalParameter ::=
-   *     declaredIdentifier
-   *   | metadata identifier
-   * </pre>
-   *
-   * @return the normal formal parameter that was parsed
-   */
-  NormalFormalParameter parseNormalFormalParameter() {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    FinalConstVarOrType holder = parseFinalConstVarOrType(true);
-    Token thisKeyword = null;
-    Token period = null;
-    if (matches(Keyword.THIS)) {
-      thisKeyword = andAdvance;
-      period = expect2(TokenType.PERIOD);
-    }
-    SimpleIdentifier identifier = parseSimpleIdentifier();
-    if (matches5(TokenType.OPEN_PAREN)) {
-      FormalParameterList parameters = parseFormalParameterList();
-      if (thisKeyword == null) {
-        if (holder.keyword != null) {
-          reportError9(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
-        }
-        return new FunctionTypedFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.type, identifier, parameters);
-      } else {
-        return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, parameters);
-      }
-    }
-    TypeName type = holder.type;
-    if (type != null) {
-      if (matches3(type.name.beginToken, Keyword.VOID)) {
-        reportError9(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
-      } else if (holder.keyword != null && matches3(holder.keyword, Keyword.VAR)) {
-        reportError9(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
-      }
-    }
-    if (thisKeyword != null) {
-      return new FieldFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, null);
-    }
-    return new SimpleFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
-  }
-
-  /**
    * Parse an operator declaration.
    *
    * <pre>
@@ -3825,26 +5098,6 @@
   }
 
   /**
-   * Parse a prefixed identifier.
-   *
-   * <pre>
-   * prefixedIdentifier ::=
-   *     identifier ('.' identifier)?
-   * </pre>
-   *
-   * @return the prefixed identifier that was parsed
-   */
-  Identifier parsePrefixedIdentifier() {
-    SimpleIdentifier qualifier = parseSimpleIdentifier();
-    if (!matches5(TokenType.PERIOD)) {
-      return qualifier;
-    }
-    Token period = andAdvance;
-    SimpleIdentifier qualified = parseSimpleIdentifier();
-    return new PrefixedIdentifier.full(qualifier, period, qualified);
-  }
-
-  /**
    * Parse a primary expression.
    *
    * <pre>
@@ -4033,25 +5286,6 @@
   }
 
   /**
-   * Parse a return type.
-   *
-   * <pre>
-   * returnType ::=
-   *     'void'
-   *   | type
-   * </pre>
-   *
-   * @return the return type that was parsed
-   */
-  TypeName parseReturnType() {
-    if (matches(Keyword.VOID)) {
-      return new TypeName.full(new SimpleIdentifier.full(andAdvance), null);
-    } else {
-      return parseTypeName();
-    }
-  }
-
-  /**
    * Parse a setter.
    *
    * <pre>
@@ -4108,48 +5342,6 @@
   }
 
   /**
-   * Parse a simple identifier.
-   *
-   * <pre>
-   * identifier ::=
-   *     IDENTIFIER
-   * </pre>
-   *
-   * @return the simple identifier that was parsed
-   */
-  SimpleIdentifier parseSimpleIdentifier() {
-    if (matchesIdentifier()) {
-      return new SimpleIdentifier.full(andAdvance);
-    }
-    reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
-    return createSyntheticIdentifier();
-  }
-
-  /**
-   * Parse a statement.
-   *
-   * <pre>
-   * statement ::=
-   *     label* nonLabeledStatement
-   * </pre>
-   *
-   * @return the statement that was parsed
-   */
-  Statement parseStatement2() {
-    List<Label> labels = new List<Label>();
-    while (matchesIdentifier() && matches4(peek(), TokenType.COLON)) {
-      SimpleIdentifier label = parseSimpleIdentifier();
-      Token colon = expect2(TokenType.COLON);
-      labels.add(new Label.full(label, colon));
-    }
-    Statement statement = parseNonLabeledStatement();
-    if (labels.isEmpty) {
-      return statement;
-    }
-    return new LabeledStatement.full(labels, statement);
-  }
-
-  /**
    * Parse a list of statements within a switch statement.
    *
    * <pre>
@@ -4208,37 +5400,6 @@
   }
 
   /**
-   * Parse a string literal.
-   *
-   * <pre>
-   * stringLiteral ::=
-   *     MULTI_LINE_STRING+
-   *   | SINGLE_LINE_STRING+
-   * </pre>
-   *
-   * @return the string literal that was parsed
-   */
-  StringLiteral parseStringLiteral() {
-    List<StringLiteral> strings = new List<StringLiteral>();
-    while (matches5(TokenType.STRING)) {
-      Token string = andAdvance;
-      if (matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
-        strings.add(parseStringInterpolation(string));
-      } else {
-        strings.add(new SimpleStringLiteral.full(string, computeStringValue(string.lexeme, true, true)));
-      }
-    }
-    if (strings.length < 1) {
-      reportError8(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
-      return createSyntheticStringLiteral();
-    } else if (strings.length == 1) {
-      return strings[0];
-    } else {
-      return new AdjacentStrings.full(strings);
-    }
-  }
-
-  /**
    * Parse a super constructor invocation.
    *
    * <pre>
@@ -4515,100 +5676,6 @@
   }
 
   /**
-   * Parse a list of type arguments.
-   *
-   * <pre>
-   * typeArguments ::=
-   *     '<' typeList '>'
-   *
-   * typeList ::=
-   *     type (',' type)*
-   * </pre>
-   *
-   * @return the type argument list that was parsed
-   */
-  TypeArgumentList parseTypeArgumentList() {
-    Token leftBracket = expect2(TokenType.LT);
-    List<TypeName> arguments = new List<TypeName>();
-    arguments.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
-      arguments.add(parseTypeName());
-    }
-    Token rightBracket = expect2(TokenType.GT);
-    return new TypeArgumentList.full(leftBracket, arguments, rightBracket);
-  }
-
-  /**
-   * Parse a type name.
-   *
-   * <pre>
-   * type ::=
-   *     qualified typeArguments?
-   * </pre>
-   *
-   * @return the type name that was parsed
-   */
-  TypeName parseTypeName() {
-    Identifier typeName;
-    if (matches(Keyword.VAR)) {
-      reportError8(ParserErrorCode.VAR_AS_TYPE_NAME, []);
-      typeName = new SimpleIdentifier.full(andAdvance);
-    } else if (matchesIdentifier()) {
-      typeName = parsePrefixedIdentifier();
-    } else {
-      typeName = createSyntheticIdentifier();
-      reportError8(ParserErrorCode.EXPECTED_TYPE_NAME, []);
-    }
-    TypeArgumentList typeArguments = null;
-    if (matches5(TokenType.LT)) {
-      typeArguments = parseTypeArgumentList();
-    }
-    return new TypeName.full(typeName, typeArguments);
-  }
-
-  /**
-   * Parse a type parameter.
-   *
-   * <pre>
-   * typeParameter ::=
-   *     metadata name ('extends' bound)?
-   * </pre>
-   *
-   * @return the type parameter that was parsed
-   */
-  TypeParameter parseTypeParameter() {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    SimpleIdentifier name = parseSimpleIdentifier();
-    if (matches(Keyword.EXTENDS)) {
-      Token keyword = andAdvance;
-      TypeName bound = parseTypeName();
-      return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, keyword, bound);
-    }
-    return new TypeParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, name, null, null);
-  }
-
-  /**
-   * Parse a list of type parameters.
-   *
-   * <pre>
-   * typeParameterList ::=
-   *     '<' typeParameter (',' typeParameter)* '>'
-   * </pre>
-   *
-   * @return the list of type parameters that were parsed
-   */
-  TypeParameterList parseTypeParameterList() {
-    Token leftBracket = expect2(TokenType.LT);
-    List<TypeParameter> typeParameters = new List<TypeParameter>();
-    typeParameters.add(parseTypeParameter());
-    while (optional(TokenType.COMMA)) {
-      typeParameters.add(parseTypeParameter());
-    }
-    Token rightBracket = expect2(TokenType.GT);
-    return new TypeParameterList.full(leftBracket, typeParameters, rightBracket);
-  }
-
-  /**
    * Parse a unary expression.
    *
    * <pre>
@@ -4790,26 +5857,6 @@
   }
 
   /**
-   * Parse a with clause.
-   *
-   * <pre>
-   * withClause ::=
-   *     'with' typeName (',' typeName)*
-   * </pre>
-   *
-   * @return the with clause that was parsed
-   */
-  WithClause parseWithClause() {
-    Token with2 = expect(Keyword.WITH);
-    List<TypeName> types = new List<TypeName>();
-    types.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
-      types.add(parseTypeName());
-    }
-    return new WithClause.full(with2, types);
-  }
-
-  /**
    * Return the token that is immediately after the current token. This is equivalent to
    * [peek].
    *
@@ -6003,6 +7050,769 @@
   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.
+   *
+   * @param fromNode the node from which resolution information will be copied
+   * @param toNode the node to which resolution information will be copied
+   */
+  static void copyResolutionData(ASTNode fromNode, ASTNode toNode) {
+    ResolutionCopier copier = new ResolutionCopier();
+    copier.isEqual(fromNode, toNode);
+  }
+
+  /**
+   * The AST node with which the node being visited is to be compared. This is only valid at the
+   * 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))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    ArgumentDefinitionTest toNode = this._toNode as ArgumentDefinitionTest;
+    if (javaBooleanAnd(isEqual3(node.question, toNode.question), isEqual(node.identifier, toNode.identifier))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.element = node.element;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.element = node.element;
+      return true;
+    }
+    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))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    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)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.element = node.element;
+      return true;
+    }
+    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))) {
+      toNode.element = node.element;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation toNode = this._toNode as FunctionExpressionInvocation;
+    if (javaBooleanAnd(isEqual(node.function, toNode.function), isEqual(node.argumentList, toNode.argumentList))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.element = node.element;
+      return true;
+    }
+    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))) {
+      toNode.auxiliaryElements = node.auxiliaryElements;
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral toNode = this._toNode as IntegerLiteral;
+    if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitNamedExpression(NamedExpression node) {
+    NamedExpression toNode = this._toNode as NamedExpression;
+    if (javaBooleanAnd(isEqual(node.name, toNode.name), isEqual(node.expression, toNode.expression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.element = node.element;
+      return true;
+    }
+    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))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+  bool visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression toNode = this._toNode as PostfixExpression;
+    if (javaBooleanAnd(isEqual(node.operand, toNode.operand), isEqual3(node.operator, toNode.operator))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression toNode = this._toNode as PrefixExpression;
+    if (javaBooleanAnd(isEqual3(node.operator, toNode.operator), isEqual(node.operand, toNode.operand))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+  bool visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression toNode = this._toNode as RethrowExpression;
+    if (isEqual3(node.keyword, toNode.keyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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)) {
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.auxiliaryElements = node.auxiliaryElements;
+      return true;
+    }
+    return false;
+  }
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
+    if (javaBooleanAnd(isEqual3(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation toNode = this._toNode as StringInterpolation;
+    if (isEqual2(node.elements, toNode.elements)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+  bool visitSuperExpression(SuperExpression node) {
+    SuperExpression toNode = this._toNode as SuperExpression;
+    if (isEqual3(node.keyword, toNode.keyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitThisExpression(ThisExpression node) {
+    ThisExpression toNode = this._toNode as ThisExpression;
+    if (isEqual3(node.keyword, toNode.keyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+  bool visitThrowExpression(ThrowExpression node) {
+    ThrowExpression toNode = this._toNode as ThrowExpression;
+    if (javaBooleanAnd(isEqual3(node.keyword, toNode.keyword), isEqual(node.expression, toNode.expression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    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))) {
+      toNode.type = node.type;
+      return true;
+    }
+    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));
+  }
+
+  /**
+   * Return `true` if the given AST nodes have the same structure. As a side-effect, if the
+   * nodes do have the same structure, any resolution data from the first node will be copied to the
+   * second node.
+   *
+   * @param fromNode the node from which resolution information will be copied
+   * @param toNode the node to which resolution information will be copied
+   * @return `true` if the given AST nodes have the same structure
+   */
+  bool isEqual(ASTNode fromNode, ASTNode toNode) {
+    if (fromNode == null) {
+      return toNode == null;
+    } else if (toNode == null) {
+      return false;
+    } else if (fromNode.runtimeType == toNode.runtimeType) {
+      this._toNode = toNode;
+      return fromNode.accept(this);
+    }
+    if (toNode is PrefixedIdentifier) {
+      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;
+      if (fromNode.runtimeType == target.runtimeType) {
+        this._toNode = target;
+        return fromNode.accept(this);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given lists of AST nodes have the same size and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same size and corresponding elements are
+   *         equal
+   */
+  bool isEqual2(NodeList first, NodeList second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    int size = first.length;
+    if (second.length != size) {
+      return false;
+    }
+    bool equal = true;
+    for (int i = 0; i < size; i++) {
+      if (!isEqual(first[i], second[i])) {
+        equal = false;
+      }
+    }
+    return equal;
+  }
+
+  /**
+   * Return `true` if the given tokens have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given tokens have the same structure
+   */
+  bool isEqual3(Token first, Token second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    return first.lexeme == second.lexeme;
+  }
+
+  /**
+   * Return `true` if the given arrays of tokens have the same length and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given arrays of tokens have the same length and corresponding
+   *         elements are equal
+   */
+  bool isEqual4(List<Token> first, List<Token> second) {
+    int length = first.length;
+    if (second.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (!isEqual3(first[i], second[i])) {
+        return false;
+      }
+    }
+    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.
  */
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index bf066f2..ed27b38 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3270,7 +3270,19 @@
     setMetadata(node.element, node);
     return null;
   }
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    Expression expression = node.function;
+    if (expression is FunctionExpression) {
+      FunctionExpression functionExpression = expression as FunctionExpression;
+      ExecutableElement functionElement = functionExpression.element;
+      ArgumentList argumentList = node.argumentList;
+      List<ParameterElement> parameters = resolveArgumentsToParameters(false, argumentList, functionElement);
+      if (parameters != null) {
+        argumentList.correspondingStaticParameters = parameters;
+      }
+    }
+    return null;
+  }
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     setMetadata(node.element, node);
     return null;
@@ -3491,6 +3503,10 @@
       if (element == null) {
         if (identifier.inSetterContext()) {
           _resolver.reportError5(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, []);
+          return null;
         } else {
           _resolver.reportError5(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
         }
@@ -3602,6 +3618,9 @@
     } else if (element == null || (element is PrefixElement && !isValidAsPrefix(node))) {
       if (isConstructorReturnType(node)) {
         _resolver.reportError5(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+      } else if (node.parent is Annotation) {
+        Annotation annotation = node.parent as Annotation;
+        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
       } else {
         _resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
       }
@@ -7304,6 +7323,9 @@
   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;
@@ -7411,7 +7433,7 @@
    */
   void clearTypePromotionsIfAccessedInScopeAndProtentiallyMutated(ASTNode target) {
     for (Element element in promoteManager.promotedElements) {
-      if (((element as VariableElementImpl)).isPotentiallyMutated) {
+      if (((element as VariableElementImpl)).isPotentiallyMutatedInScope) {
         if (isVariableAccessedInClosure(element, target)) {
           promoteManager.setType(element, null);
         }
@@ -9069,7 +9091,11 @@
         staticType = _typeProvider.typeType;
       }
     } else if (staticElement is FunctionTypeAliasElement) {
-      staticType = ((staticElement as FunctionTypeAliasElement)).type;
+      if (isNotTypeLiteral(node)) {
+        staticType = ((staticElement as FunctionTypeAliasElement)).type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
     } else if (staticElement is MethodElement) {
       staticType = ((staticElement as MethodElement)).type;
     } else if (staticElement is PropertyAccessorElement) {
@@ -9268,7 +9294,11 @@
         staticType = _typeProvider.typeType;
       }
     } else if (element is FunctionTypeAliasElement) {
-      staticType = ((element as FunctionTypeAliasElement)).type;
+      if (isNotTypeLiteral(node)) {
+        staticType = ((element as FunctionTypeAliasElement)).type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
     } else if (element is MethodElement) {
       staticType = ((element as MethodElement)).type;
     } else if (element is PropertyAccessorElement) {
@@ -11401,6 +11431,12 @@
 class VariableResolverVisitor extends ScopedVisitor {
 
   /**
+   * The method or function that we are currently visiting, or `null` if we are not inside a
+   * method or function.
+   */
+  ExecutableElement _enclosingFunction;
+
+  /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    *
    * @param library the library containing the compilation unit being resolved
@@ -11408,6 +11444,28 @@
    * @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);
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+  }
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      ExecutableElement outerFunction = _enclosingFunction;
+      try {
+        _enclosingFunction = node.element;
+        return super.visitFunctionExpression(node);
+      } finally {
+        _enclosingFunction = outerFunction;
+      }
+    } else {
+      return super.visitFunctionExpression(node);
+    }
+  }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.staticElement != null) {
       return null;
@@ -11436,12 +11494,20 @@
     if (identical(kind, ElementKind.LOCAL_VARIABLE)) {
       node.staticElement = element;
       if (node.inSetterContext()) {
-        ((element as LocalVariableElementImpl)).markPotentiallyMutated();
+        LocalVariableElementImpl variableImpl = element as LocalVariableElementImpl;
+        variableImpl.markPotentiallyMutatedInScope();
+        if (element.enclosingElement != _enclosingFunction) {
+          variableImpl.markPotentiallyMutatedInClosure();
+        }
       }
     } else if (identical(kind, ElementKind.PARAMETER)) {
       node.staticElement = element;
       if (node.inSetterContext()) {
-        ((element as ParameterElementImpl)).markPotentiallyMutated();
+        ParameterElementImpl parameterImpl = element as ParameterElementImpl;
+        parameterImpl.markPotentiallyMutatedInScope();
+        if (_enclosingFunction != null && (element.enclosingElement != _enclosingFunction)) {
+          parameterImpl.markPotentiallyMutatedInClosure();
+        }
       }
     }
     return null;
@@ -11529,7 +11595,6 @@
   EnclosedScope(Scope enclosingScope) {
     this.enclosingScope = enclosingScope;
   }
-  LibraryElement get definingLibrary => enclosingScope.definingLibrary;
   AnalysisErrorListener get errorListener => enclosingScope.errorListener;
 
   /**
@@ -11552,7 +11617,7 @@
       return element;
     }
     if (_hiddenNames.contains(name)) {
-      errorListener.onError(new AnalysisError.con2(source, identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
+      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
     }
     return enclosingScope.lookup3(identifier, name, referencingLibrary);
   }
@@ -11770,7 +11835,6 @@
       super.define(element);
     }
   }
-  LibraryElement get definingLibrary => _definingLibrary;
   AnalysisErrorListener get errorListener => _errorListener;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element foundElement = localLookup(name, referencingLibrary);
@@ -11795,7 +11859,7 @@
       List<Element> conflictingMembers = ((foundElement as MultiplyDefinedElementImpl)).conflictingElements;
       String libName1 = getLibraryName(conflictingMembers[0], "");
       String libName2 = getLibraryName(conflictingMembers[1], "");
-      _errorListener.onError(new AnalysisError.con2(getSource2(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
+      _errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
       return foundElement;
     }
     if (foundElement != null) {
@@ -11837,27 +11901,6 @@
   }
 
   /**
-   * Return the source that contains the given identifier, or the source associated with this scope
-   * if the source containing the identifier could not be determined.
-   *
-   * @param identifier the identifier whose source is to be returned
-   * @return the source that contains the given identifier
-   */
-  Source getSource2(Identifier identifier) {
-    CompilationUnit unit = identifier.getAncestor(CompilationUnit);
-    if (unit != null) {
-      CompilationUnitElement element = unit.element;
-      if (element != null) {
-        Source source = element.source;
-        if (source != null) {
-          return source;
-        }
-      }
-    }
-    return this.source;
-  }
-
-  /**
    * Given a collection of elements that a single name could all be mapped to, remove from the list
    * all of the names defined in the SDK. Return the element(s) that remain.
    *
@@ -11882,7 +11925,7 @@
     if (sdkElement != null && to > 0) {
       String sdkLibName = getLibraryName(sdkElement, "");
       String otherLibName = getLibraryName(conflictingMembers[0], "");
-      _errorListener.onError(new AnalysisError.con2(getSource2(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
+      _errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
     }
     if (to == length) {
       return foundElement;
@@ -11923,7 +11966,7 @@
           offset = accessor.variable.nameOffset;
         }
       }
-      return new AnalysisError.con2(source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
+      return new AnalysisError.con2(duplicate.source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
     }
     return super.getErrorForDuplicate(existing, duplicate);
   }
@@ -12326,13 +12369,6 @@
   }
 
   /**
-   * Return the element representing the library in which this scope is enclosed.
-   *
-   * @return the element representing the library in which this scope is enclosed
-   */
-  LibraryElement get definingLibrary;
-
-  /**
    * Return the error code to be used when reporting that a name being defined locally conflicts
    * with another element of the same name in the local scope.
    *
@@ -12342,9 +12378,6 @@
    */
   AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
     Source source = duplicate.source;
-    if (source == null) {
-      source = this.source;
-    }
     return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]);
   }
 
@@ -12356,12 +12389,22 @@
   AnalysisErrorListener get errorListener;
 
   /**
-   * Return the source object representing the compilation unit with which errors related to this
-   * scope should be associated.
+   * Return the source that contains the given identifier, or the source associated with this scope
+   * if the source containing the identifier could not be determined.
    *
-   * @return the source object with which errors should be associated
+   * @param identifier the identifier whose source is to be returned
+   * @return the source that contains the given identifier
    */
-  Source get source => definingLibrary.definingCompilationUnit.source;
+  Source getSource(ASTNode node) {
+    CompilationUnit unit = node.getAncestor(CompilationUnit);
+    if (unit != null) {
+      CompilationUnitElement unitElement = unit.element;
+      if (unitElement != null) {
+        return unitElement.source;
+      }
+    }
+    return null;
+  }
 
   /**
    * Return the element with which the given name is associated, or `null` if the name is not
@@ -13386,7 +13429,6 @@
     return super.visitSimpleFormalParameter(node);
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    checkForReferenceToDeclaredVariableInInitializer(node);
     checkForImplicitThisReferenceInInitializer(node);
     if (!isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
       checkForUnqualifiedReferenceToNonLocalStaticMember(node);
@@ -16274,54 +16316,6 @@
   }
 
   /**
-   * This checks if the passed identifier is banned because it is part of the variable declaration
-   * with the same name.
-   *
-   * @param node the identifier to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER
-   */
-  bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) {
-    ASTNode parent = node.parent;
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
-      if (identical(prefixedIdentifier.identifier, node)) {
-        return false;
-      }
-    }
-    if (parent is PropertyAccess) {
-      PropertyAccess propertyAccess = parent as PropertyAccess;
-      if (identical(propertyAccess.propertyName, node)) {
-        return false;
-      }
-    }
-    if (parent is MethodInvocation) {
-      MethodInvocation methodInvocation = parent as MethodInvocation;
-      if (methodInvocation.target != null && identical(methodInvocation.methodName, node)) {
-        return false;
-      }
-    }
-    if (parent is ConstructorName) {
-      ConstructorName constructorName = parent as ConstructorName;
-      if (identical(constructorName.name, node)) {
-        return false;
-      }
-    }
-    if (parent is Label) {
-      Label label = parent as Label;
-      if (identical(label.label, node)) {
-        return false;
-      }
-    }
-    String name = node.name;
-    if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name)) {
-      return false;
-    }
-    _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, node, [name]);
-    return true;
-  }
-
-  /**
    * This checks that the rethrow is inside of a catch clause.
    *
    * @param node the rethrow expression to evaluate
@@ -16973,6 +16967,12 @@
     if (parent is Annotation && identical(((parent as Annotation)).constructorName, node)) {
       return true;
     }
+    if (parent is CommentReference) {
+      CommentReference commentReference = parent as CommentReference;
+      if (commentReference.newKeyword != null) {
+        return true;
+      }
+    }
     return false;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index e60e57a..3e93f73 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -137,15 +137,13 @@
  * @coverage dart.engine.parser
  */
 class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
-  static final ScannerErrorCode CHARACTER_EXPECTED_AFTER_SLASH = new ScannerErrorCode.con1('CHARACTER_EXPECTED_AFTER_SLASH', 0, "Character expected after slash");
-  static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode.con1('ILLEGAL_CHARACTER', 1, "Illegal character %x");
-  static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode.con1('MISSING_DIGIT', 2, "Decimal digit expected");
-  static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode.con1('MISSING_HEX_DIGIT', 3, "Hexidecimal digit expected");
-  static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode.con1('MISSING_QUOTE', 4, "Expected quote (' or \")");
-  static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 5, "Unterminated multi-line comment");
-  static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 6, "Unterminated string literal");
+  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 = [
-      CHARACTER_EXPECTED_AFTER_SLASH,
       ILLEGAL_CHARACTER,
       MISSING_DIGIT,
       MISSING_HEX_DIGIT,
@@ -469,7 +467,19 @@
   /**
    * A map from tokens that were copied to the copies of the tokens.
    */
-  TokenMap _tokenMap = new TokenMap();
+  final TokenMap tokenMap = new TokenMap();
+
+  /**
+   * The first token in the range of tokens that are different from the tokens in the original token
+   * stream.
+   */
+  Token _firstToken;
+
+  /**
+   * The last token in the range of tokens that are different from the tokens in the original token
+   * stream.
+   */
+  Token lastToken;
 
   /**
    * Initialize a newly created scanner.
@@ -483,6 +493,15 @@
   }
 
   /**
+   * Return the first token in the range of tokens that are different from the tokens in the
+   * original token stream or `null` if the new tokens are the same as the original tokens
+   * except for offset.
+   *
+   * @return the first token in the range of new tokens
+   */
+  Token get firstToken => _firstToken;
+
+  /**
    * Given the stream of tokens scanned from the original source, the modified source (the result of
    * replacing one contiguous range of characters with another string of characters), and a
    * specification of the modification that was made, return a stream of tokens scanned from the
@@ -495,16 +514,32 @@
    * @param insertedLength the number of characters added to the modified source
    */
   Token rescan(Token originalStream, int index, int removedLength, int insertedLength) {
-    while (originalStream.end < index) {
+    while (originalStream.type != TokenType.EOF && originalStream.end < index) {
       originalStream = copyAndAdvance(originalStream, 0);
     }
+    Token lastCopied = tail;
     int modifiedEnd = index + insertedLength - 1;
+    if (originalStream.offset < index) {
+      modifiedEnd += originalStream.end - index - removedLength;
+    }
     _reader.offset = Math.min(originalStream.offset, index) - 1;
     int next = _reader.advance();
     while (next != -1 && _reader.offset <= modifiedEnd) {
       next = bigSwitch(next);
     }
-    int removedEnd = index + removedLength - 1;
+    _firstToken = lastCopied.next;
+    lastToken = tail;
+    if (_firstToken == null || identical(_firstToken.type, TokenType.EOF)) {
+      _firstToken = null;
+      lastToken = null;
+    } else if (originalStream.end == index && _firstToken.end == index) {
+      tokenMap.put(originalStream, _firstToken);
+      if (identical(lastToken, _firstToken)) {
+        lastToken = lastToken.next;
+      }
+      _firstToken = _firstToken.next;
+    }
+    int removedEnd = index + removedLength - 1 + Math.max(0, tail.end - index - insertedLength);
     while (originalStream.offset <= removedEnd) {
       originalStream = originalStream.next;
     }
@@ -512,18 +547,19 @@
     while (originalStream.type != TokenType.EOF) {
       originalStream = copyAndAdvance(originalStream, delta);
     }
-    copyAndAdvance(originalStream, delta);
-    return firstToken();
+    Token eof = copyAndAdvance(originalStream, delta);
+    eof.setNextWithoutSettingPrevious(eof);
+    return super.firstToken;
   }
   Token copyAndAdvance(Token originalToken, int delta) {
     Token copiedToken = originalToken.copy();
-    _tokenMap.put(originalToken, copiedToken);
+    tokenMap.put(originalToken, copiedToken);
     copiedToken.applyDelta(delta);
     appendToken(copiedToken);
     Token originalComment = originalToken.precedingComments;
     Token copiedComment = originalToken.precedingComments;
     while (originalComment != null) {
-      _tokenMap.put(originalComment, copiedComment);
+      tokenMap.put(originalComment, copiedComment);
       originalComment = originalComment.next;
       copiedComment = copiedComment.next;
     }
@@ -566,7 +602,7 @@
   /**
    * The last token that was scanned.
    */
-  Token _tail;
+  Token tail;
 
   /**
    * The first token in the list of comment tokens found since the last non-comment token.
@@ -617,7 +653,7 @@
     this._errorListener = errorListener;
     _tokens = new Token(TokenType.EOF, -1);
     _tokens.setNext(_tokens);
-    _tail = _tokens;
+    tail = _tokens;
     _tokenStart = -1;
     _lineStarts.add(0);
   }
@@ -674,7 +710,7 @@
       }
       appendEofToken();
       instrumentation.metric2("tokensCount", tokenCounter);
-      return firstToken();
+      return firstToken;
     } finally {
       instrumentation.log2(2);
     }
@@ -688,7 +724,7 @@
    * @param token the token to be appended
    */
   void appendToken(Token token) {
-    _tail = _tail.setNext(token);
+    tail = tail.setNext(token);
   }
   int bigSwitch(int next) {
     beginToken();
@@ -836,7 +872,7 @@
    *
    * @return the first token in the token stream that was scanned
    */
-  Token firstToken() => _tokens.next;
+  Token get firstToken => _tokens.next;
 
   /**
    * Record the fact that we are at the beginning of a new line in the source.
@@ -853,7 +889,7 @@
       _firstComment = null;
       _lastComment = null;
     }
-    _tail = _tail.setNext(token);
+    tail = tail.setNext(token);
     _groupingStack.add(token);
     _stackEnd++;
   }
@@ -874,7 +910,7 @@
       _firstComment = null;
       _lastComment = null;
     }
-    _tail = _tail.setNext(token);
+    tail = tail.setNext(token);
     if (_stackEnd >= 0) {
       BeginToken begin = _groupingStack[_stackEnd];
       if (identical(begin.type, beginType)) {
@@ -893,52 +929,52 @@
       _lastComment = null;
     }
     eofToken.setNext(eofToken);
-    _tail = _tail.setNext(eofToken);
+    tail = tail.setNext(eofToken);
     if (_stackEnd >= 0) {
       _hasUnmatchedGroups2 = true;
     }
   }
   void appendKeywordToken(Keyword keyword) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new KeywordToken(keyword, _tokenStart));
+      tail = tail.setNext(new KeywordToken(keyword, _tokenStart));
     } else {
-      _tail = _tail.setNext(new KeywordTokenWithComment(keyword, _tokenStart, _firstComment));
+      tail = tail.setNext(new KeywordTokenWithComment(keyword, _tokenStart, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendStringToken(TokenType type, String value) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new StringToken(type, value, _tokenStart));
+      tail = tail.setNext(new StringToken(type, value, _tokenStart));
     } else {
-      _tail = _tail.setNext(new StringTokenWithComment(type, value, _tokenStart, _firstComment));
+      tail = tail.setNext(new StringTokenWithComment(type, value, _tokenStart, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendStringToken2(TokenType type, String value, int offset) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new StringToken(type, value, _tokenStart + offset));
+      tail = tail.setNext(new StringToken(type, value, _tokenStart + offset));
     } else {
-      _tail = _tail.setNext(new StringTokenWithComment(type, value, _tokenStart + offset, _firstComment));
+      tail = tail.setNext(new StringTokenWithComment(type, value, _tokenStart + offset, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendToken2(TokenType type) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new Token(type, _tokenStart));
+      tail = tail.setNext(new Token(type, _tokenStart));
     } else {
-      _tail = _tail.setNext(new TokenWithComment(type, _tokenStart, _firstComment));
+      tail = tail.setNext(new TokenWithComment(type, _tokenStart, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
   }
   void appendToken3(TokenType type, int offset) {
     if (_firstComment == null) {
-      _tail = _tail.setNext(new Token(type, offset));
+      tail = tail.setNext(new Token(type, offset));
     } else {
-      _tail = _tail.setNext(new TokenWithComment(type, offset, _firstComment));
+      tail = tail.setNext(new TokenWithComment(type, offset, _firstComment));
       _firstComment = null;
       _lastComment = null;
     }
@@ -1337,24 +1373,18 @@
         if (next == -1) {
           break;
         }
-        bool missingCharacter = false;
         if (next == 0xD) {
-          missingCharacter = true;
           next = _reader.advance();
           if (next == 0xA) {
             next = _reader.advance();
           }
           recordStartOfLine();
         } else if (next == 0xA) {
-          missingCharacter = true;
           recordStartOfLine();
           next = _reader.advance();
         } else {
           next = _reader.advance();
         }
-        if (missingCharacter) {
-          _errorListener.onError(new AnalysisError.con2(source, _reader.offset - 1, 1, ScannerErrorCode.CHARACTER_EXPECTED_AFTER_SLASH, []));
-        }
       } else if (next == 0xD) {
         next = _reader.advance();
         if (next == 0xA) {
@@ -1740,6 +1770,7 @@
     token = token.next;
     while (token != null) {
       tail = tail.setNext(token.copy());
+      token = token.next;
     }
     return head;
   }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 1df9ef8..ae88fb2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,11 +1,11 @@
 name: analyzer
-version: 0.9.1
+version: 0.10.0
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
 dependencies:
-  args: ">=0.8.6"
-  logging: ">=0.8.6"
-  path: ">=0.8.6"
+  args: ">=0.8.9 <1.0.0"
+  logging: ">=0.8.9 <1.0.0"
+  path: ">=0.8.9 <1.0.0"
 dev_dependencies:
-  unittest: ">=0.8.6"
+  unittest: ">=0.8.9 <1.0.0"
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 0ceef47..e8f3dad 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -4,14 +4,17 @@
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
 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
@@ -473,6 +476,14 @@
     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);
+    JUnitTestCase.assertNotNull(section.period);
+    JUnitTestCase.assertNotNull(section.methodName);
+    JUnitTestCase.assertNotNull(section.argumentList);
+    EngineTestCase.assertSize(1, section.argumentList.arguments);
+  }
   void test_parseCascadeSection_p() {
     PropertyAccess section = ParserTestCase.parse5("parseCascadeSection", "..a", []);
     JUnitTestCase.assertNull(section.target);
@@ -515,7 +526,7 @@
   }
   void test_parseCascadeSection_paapaa() {
     FunctionExpressionInvocation section = ParserTestCase.parse5("parseCascadeSection", "..a(b)(c).d(e)(f)", []);
-    EngineTestCase.assertInstanceOf(FunctionExpressionInvocation, section.function);
+    EngineTestCase.assertInstanceOf(MethodInvocation, section.function);
     JUnitTestCase.assertNotNull(section.argumentList);
     EngineTestCase.assertSize(1, section.argumentList.arguments);
   }
@@ -4297,6 +4308,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseCascadeSection_ia);
       });
+      _ut.test('test_parseCascadeSection_ii', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseCascadeSection_ii);
+      });
       _ut.test('test_parseCascadeSection_p', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseCascadeSection_p);
@@ -6759,6 +6774,698 @@
     });
   }
 }
+class ResolutionCopierTest extends EngineTestCase {
+  void test_visitAnnotation() {
+    String annotationName = "proxy";
+    Annotation fromNode = ASTFactory.annotation(ASTFactory.identifier3(annotationName));
+    Element element = ElementFactory.topLevelVariableElement2(annotationName);
+    fromNode.element = element;
+    Annotation toNode = ASTFactory.annotation(ASTFactory.identifier3(annotationName));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+  void test_visitArgumentDefinitionTest() {
+    String identifier = "p";
+    ArgumentDefinitionTest fromNode = ASTFactory.argumentDefinitionTest(identifier);
+    Type2 propagatedType = ElementFactory.classElement2("A", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("B", []).type;
+    fromNode.staticType = staticType;
+    ArgumentDefinitionTest toNode = ASTFactory.argumentDefinitionTest(identifier);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitAsExpression() {
+    AsExpression fromNode = ASTFactory.asExpression(ASTFactory.identifier3("x"), ASTFactory.typeName4("A", []));
+    Type2 propagatedType = ElementFactory.classElement2("A", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("B", []).type;
+    fromNode.staticType = staticType;
+    AsExpression toNode = ASTFactory.asExpression(ASTFactory.identifier3("x"), ASTFactory.typeName4("A", []));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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;
+    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    AssignmentExpression toNode = ASTFactory.assignmentExpression(ASTFactory.identifier3("a"), TokenType.PLUS_EQ, ASTFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    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;
+    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    BinaryExpression toNode = ASTFactory.binaryExpression(ASTFactory.identifier3("a"), TokenType.PLUS, ASTFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitBooleanLiteral() {
+    BooleanLiteral fromNode = ASTFactory.booleanLiteral(true);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    BooleanLiteral toNode = ASTFactory.booleanLiteral(true);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    CascadeExpression toNode = ASTFactory.cascadeExpression(ASTFactory.identifier3("a"), [ASTFactory.identifier3("b")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitCompilationUnit() {
+    CompilationUnit fromNode = ASTFactory.compilationUnit();
+    CompilationUnitElement element = new CompilationUnitElementImpl("test.dart");
+    fromNode.element = element;
+    CompilationUnit toNode = ASTFactory.compilationUnit();
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ConditionalExpression toNode = ASTFactory.conditionalExpression(ASTFactory.identifier3("c"), ASTFactory.identifier3("a"), ASTFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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);
+    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");
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    DoubleLiteral toNode = ASTFactory.doubleLiteral(1.0);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitExportDirective() {
+    ExportDirective fromNode = ASTFactory.exportDirective2("dart:uri", []);
+    ExportElement element = new ExportElementImpl();
+    fromNode.element = element;
+    ExportDirective toNode = ASTFactory.exportDirective2("dart:uri", []);
+    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, []);
+    fromNode.element = element;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    FunctionExpression toNode = ASTFactory.functionExpression2(ASTFactory.formalParameterList([]), ASTFactory.emptyFunctionBody());
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+    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, []);
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    FunctionExpressionInvocation toNode = ASTFactory.functionExpressionInvocation(ASTFactory.identifier3("f"), []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitImportDirective() {
+    ImportDirective fromNode = ASTFactory.importDirective2("dart:uri", null, []);
+    ImportElement element = new ImportElementImpl();
+    fromNode.element = element;
+    ImportDirective toNode = ASTFactory.importDirective2("dart:uri", null, []);
+    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, []);
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IndexExpression toNode = ASTFactory.indexExpression(ASTFactory.identifier3("a"), ASTFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    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);
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    InstanceCreationExpression toNode = ASTFactory.instanceCreationExpression2(Keyword.NEW, ASTFactory.typeName4("C", []), []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitIntegerLiteral() {
+    IntegerLiteral fromNode = ASTFactory.integer(2);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IntegerLiteral toNode = ASTFactory.integer(2);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IsExpression toNode = ASTFactory.isExpression(ASTFactory.identifier3("x"), false, ASTFactory.typeName4("A", []));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    LibraryIdentifier toNode = ASTFactory.libraryIdentifier([ASTFactory.identifier3("lib")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitListLiteral() {
+    ListLiteral fromNode = ASTFactory.listLiteral([]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ListLiteral toNode = ASTFactory.listLiteral([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitMapLiteral() {
+    MapLiteral fromNode = ASTFactory.mapLiteral2([]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    MapLiteral toNode = ASTFactory.mapLiteral2([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitMethodInvocation() {
+    MethodInvocation fromNode = ASTFactory.methodInvocation2("m", []);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    MethodInvocation toNode = ASTFactory.methodInvocation2("m", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    NamedExpression toNode = ASTFactory.namedExpression2("n", ASTFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitNullLiteral() {
+    NullLiteral fromNode = ASTFactory.nullLiteral();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    NullLiteral toNode = ASTFactory.nullLiteral();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ParenthesizedExpression toNode = ASTFactory.parenthesizedExpression(ASTFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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"]));
+    fromNode.element = element;
+    PartDirective toNode = ASTFactory.partDirective2("part.dart");
+    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"]));
+    fromNode.element = element;
+    PartOfDirective toNode = ASTFactory.partOfDirective(ASTFactory.libraryIdentifier2(["lib"]));
+    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);
+    MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PostfixExpression toNode = ASTFactory.postfixExpression(ASTFactory.identifier3(variableName), TokenType.PLUS_PLUS);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PrefixedIdentifier toNode = ASTFactory.identifier5("p", "f");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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, []);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    PrefixExpression toNode = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, ASTFactory.identifier3("x"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PropertyAccess toNode = ASTFactory.propertyAccess2(ASTFactory.identifier3("x"), "y");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    RethrowExpression toNode = ASTFactory.rethrowExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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, []);
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SimpleIdentifier toNode = ASTFactory.identifier3("x");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitSimpleStringLiteral() {
+    SimpleStringLiteral fromNode = ASTFactory.string2("abc");
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SimpleStringLiteral toNode = ASTFactory.string2("abc");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    StringInterpolation toNode = ASTFactory.string([ASTFactory.interpolationString("a", "'a'")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    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);
+    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;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SuperExpression toNode = ASTFactory.superExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitSymbolLiteral() {
+    SymbolLiteral fromNode = ASTFactory.symbolLiteral(["s"]);
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SymbolLiteral toNode = ASTFactory.symbolLiteral(["s"]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitThisExpression() {
+    ThisExpression fromNode = ASTFactory.thisExpression();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ThisExpression toNode = ASTFactory.thisExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitThrowExpression() {
+    ThrowExpression fromNode = ASTFactory.throwExpression();
+    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ThrowExpression toNode = ASTFactory.throwExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+  void test_visitTypeName() {
+    TypeName fromNode = ASTFactory.typeName4("C", []);
+    Type2 type = ElementFactory.classElement2("C", []).type;
+    fromNode.type = type;
+    TypeName toNode = ASTFactory.typeName4("C", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(type, toNode.type);
+  }
+  static dartSuite() {
+    _ut.group('ResolutionCopierTest', () {
+      _ut.test('test_visitAnnotation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAnnotation);
+      });
+      _ut.test('test_visitArgumentDefinitionTest', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
+      });
+      _ut.test('test_visitAsExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAsExpression);
+      });
+      _ut.test('test_visitAssignmentExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAssignmentExpression);
+      });
+      _ut.test('test_visitBinaryExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression);
+      });
+      _ut.test('test_visitBooleanLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitBooleanLiteral);
+      });
+      _ut.test('test_visitCascadeExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitCascadeExpression);
+      });
+      _ut.test('test_visitCompilationUnit', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitCompilationUnit);
+      });
+      _ut.test('test_visitConditionalExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConditionalExpression);
+      });
+      _ut.test('test_visitConstructorDeclaration', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConstructorDeclaration);
+      });
+      _ut.test('test_visitConstructorName', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConstructorName);
+      });
+      _ut.test('test_visitDoubleLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitDoubleLiteral);
+      });
+      _ut.test('test_visitExportDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitExportDirective);
+      });
+      _ut.test('test_visitFunctionExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression);
+      });
+      _ut.test('test_visitFunctionExpressionInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpressionInvocation);
+      });
+      _ut.test('test_visitImportDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitImportDirective);
+      });
+      _ut.test('test_visitIndexExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression);
+      });
+      _ut.test('test_visitInstanceCreationExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression);
+      });
+      _ut.test('test_visitIntegerLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIntegerLiteral);
+      });
+      _ut.test('test_visitIsExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIsExpression);
+      });
+      _ut.test('test_visitLibraryIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitLibraryIdentifier);
+      });
+      _ut.test('test_visitListLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitListLiteral);
+      });
+      _ut.test('test_visitMapLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitMapLiteral);
+      });
+      _ut.test('test_visitMethodInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitMethodInvocation);
+      });
+      _ut.test('test_visitNamedExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitNamedExpression);
+      });
+      _ut.test('test_visitNullLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitNullLiteral);
+      });
+      _ut.test('test_visitParenthesizedExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitParenthesizedExpression);
+      });
+      _ut.test('test_visitPartDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPartDirective);
+      });
+      _ut.test('test_visitPartOfDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPartOfDirective);
+      });
+      _ut.test('test_visitPostfixExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPostfixExpression);
+      });
+      _ut.test('test_visitPrefixExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression);
+      });
+      _ut.test('test_visitPrefixedIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier);
+      });
+      _ut.test('test_visitPropertyAccess', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess);
+      });
+      _ut.test('test_visitRedirectingConstructorInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitRedirectingConstructorInvocation);
+      });
+      _ut.test('test_visitRethrowExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitRethrowExpression);
+      });
+      _ut.test('test_visitSimpleIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier);
+      });
+      _ut.test('test_visitSimpleStringLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSimpleStringLiteral);
+      });
+      _ut.test('test_visitStringInterpolation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitStringInterpolation);
+      });
+      _ut.test('test_visitSuperConstructorInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation);
+      });
+      _ut.test('test_visitSuperExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSuperExpression);
+      });
+      _ut.test('test_visitSymbolLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSymbolLiteral);
+      });
+      _ut.test('test_visitThisExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitThisExpression);
+      });
+      _ut.test('test_visitThrowExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitThrowExpression);
+      });
+      _ut.test('test_visitTypeName', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitTypeName);
+      });
+    });
+  }
+}
 /**
  * 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.
@@ -7594,6 +8301,123 @@
     });
   }
 }
+class IncrementalParserTest extends EngineTestCase {
+  void fail_reparse_oneFunctionToTwo() {
+    assertParse("f() {}", "f() => 0; g() {}");
+  }
+  void test_reparse_addedAfterIdentifier1() {
+    assertParse("f() => a + b;", "f() => abs + b;");
+  }
+  void test_reparse_addedAfterIdentifier2() {
+    assertParse("f() => a + b;", "f() => a + bar;");
+  }
+  void test_resparse_addedBeforeIdentifier1() {
+    assertParse("f() => a + b;", "f() => xa + b;");
+  }
+  void test_resparse_addedBeforeIdentifier2() {
+    assertParse("f() => a + b;", "f() => a + xb;");
+  }
+  void test_resparse_addedNewIdentifier1() {
+    assertParse("a; c;", "a; b c;");
+  }
+  void test_resparse_addedNewIdentifier2() {
+    assertParse("a;  c;", "a;b  c;");
+  }
+  void test_resparse_appendWhitespace1() {
+    assertParse("f() => a + b;", "f() => a + b; ");
+  }
+  void test_resparse_appendWhitespace2() {
+    assertParse("f() => a + b;", "f() => a + b;  ");
+  }
+  void test_resparse_insertedPeriod() {
+    assertParse("f() => a + b;", "f() => a + b.;");
+  }
+  void test_resparse_insertWhitespace() {
+    assertParse("f() => a + b;", "f() => a  + 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--;
+    }
+    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);
+    Parser originalParser = new Parser(source, originalListener);
+    CompilationUnit originalUnit = originalParser.parseCompilationUnit(originalToken);
+    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);
+    Parser modifiedParser = new Parser(source, modifiedListener);
+    CompilationUnit modifiedUnit = modifiedParser.parseCompilationUnit(modifiedToken);
+    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);
+    IncrementalParser incrementalParser = new IncrementalParser(source, incrementalScanner.tokenMap, incrementalListener);
+    CompilationUnit incrementalUnit = incrementalParser.reparse(originalUnit, incrementalScanner.firstToken, incrementalScanner.lastToken, replaceStart, originalEnd);
+    JUnitTestCase.assertNotNull(incrementalUnit);
+    JUnitTestCase.assertTrue(ASTComparator.equals3(modifiedUnit, incrementalUnit));
+  }
+  static dartSuite() {
+    _ut.group('IncrementalParserTest', () {
+      _ut.test('test_reparse_addedAfterIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_reparse_addedAfterIdentifier1);
+      });
+      _ut.test('test_reparse_addedAfterIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_reparse_addedAfterIdentifier2);
+      });
+      _ut.test('test_resparse_addedBeforeIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedBeforeIdentifier1);
+      });
+      _ut.test('test_resparse_addedBeforeIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedBeforeIdentifier2);
+      });
+      _ut.test('test_resparse_addedNewIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedNewIdentifier1);
+      });
+      _ut.test('test_resparse_addedNewIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_addedNewIdentifier2);
+      });
+      _ut.test('test_resparse_appendWhitespace1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_appendWhitespace1);
+      });
+      _ut.test('test_resparse_appendWhitespace2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_appendWhitespace2);
+      });
+      _ut.test('test_resparse_insertWhitespace', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_insertWhitespace);
+      });
+      _ut.test('test_resparse_insertedPeriod', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_resparse_insertedPeriod);
+      });
+    });
+  }
+}
 /**
  * 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.
@@ -9347,7 +10171,9 @@
 main() {
   ComplexParserTest.dartSuite();
   ErrorParserTest.dartSuite();
+  IncrementalParserTest.dartSuite();
   RecoveryParserTest.dartSuite();
+  ResolutionCopierTest.dartSuite();
   SimpleParserTest.dartSuite();
 }
 Map<String, MethodTrampoline> _methodTable_Parser = <String, MethodTrampoline> {
@@ -9355,6 +10181,36 @@
   'parseExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseExpression(arg0)),
   'parseStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatement(arg0)),
   'parseStatements_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatements(arg0)),
+  'parseAnnotation_0': new MethodTrampoline(0, (Parser target) => target.parseAnnotation()),
+  'parseArgument_0': new MethodTrampoline(0, (Parser target) => target.parseArgument()),
+  'parseArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentList()),
+  'parseBitwiseOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseOrExpression()),
+  'parseBlock_0': new MethodTrampoline(0, (Parser target) => target.parseBlock()),
+  'parseClassMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseClassMember(arg0)),
+  'parseCompilationUnit_0': new MethodTrampoline(0, (Parser target) => target.parseCompilationUnit2()),
+  'parseConditionalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConditionalExpression()),
+  'parseConstructorName_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorName()),
+  'parseExpression_0': new MethodTrampoline(0, (Parser target) => target.parseExpression2()),
+  'parseExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionWithoutCascade()),
+  'parseExtendsClause_0': new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()),
+  'parseFormalParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseFormalParameterList()),
+  'parseFunctionExpression_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionExpression()),
+  'parseImplementsClause_0': new MethodTrampoline(0, (Parser target) => target.parseImplementsClause()),
+  'parseLabel_0': new MethodTrampoline(0, (Parser target) => target.parseLabel()),
+  'parseLibraryIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseLibraryIdentifier()),
+  'parseLogicalOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalOrExpression()),
+  'parseMapLiteralEntry_0': new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()),
+  'parseNormalFormalParameter_0': new MethodTrampoline(0, (Parser target) => target.parseNormalFormalParameter()),
+  'parsePrefixedIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parsePrefixedIdentifier()),
+  'parseReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseReturnType()),
+  'parseSimpleIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseSimpleIdentifier()),
+  'parseStatement_0': new MethodTrampoline(0, (Parser target) => target.parseStatement2()),
+  'parseStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()),
+  'parseTypeArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeArgumentList()),
+  'parseTypeName_0': new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
+  'parseTypeParameter_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
+  'parseTypeParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameterList()),
+  'parseWithClause_0': new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
   'advance_0': new MethodTrampoline(0, (Parser target) => target.advance()),
   'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1, arg2, arg3, arg4) => target.appendScalarValue(arg0, arg1, arg2, arg3, arg4)),
   'computeStringValue_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.computeStringValue(arg0, arg1, arg2)),
@@ -9386,34 +10242,25 @@
   'matchesIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target.matchesIdentifier2(arg0)),
   'optional_1': new MethodTrampoline(1, (Parser target, arg0) => target.optional(arg0)),
   'parseAdditiveExpression_0': new MethodTrampoline(0, (Parser target) => target.parseAdditiveExpression()),
-  'parseAnnotation_0': new MethodTrampoline(0, (Parser target) => target.parseAnnotation()),
-  'parseArgument_0': new MethodTrampoline(0, (Parser target) => target.parseArgument()),
   'parseArgumentDefinitionTest_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentDefinitionTest()),
-  'parseArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentList()),
   'parseAssertStatement_0': new MethodTrampoline(0, (Parser target) => target.parseAssertStatement()),
   'parseAssignableExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseAssignableExpression(arg0)),
   'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseAssignableSelector(arg0, arg1)),
   'parseBitwiseAndExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseAndExpression()),
-  'parseBitwiseOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseOrExpression()),
   'parseBitwiseXorExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseXorExpression()),
-  'parseBlock_0': new MethodTrampoline(0, (Parser target) => target.parseBlock()),
   'parseBreakStatement_0': new MethodTrampoline(0, (Parser target) => target.parseBreakStatement()),
   'parseCascadeSection_0': new MethodTrampoline(0, (Parser target) => target.parseCascadeSection()),
   'parseClassDeclaration_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassDeclaration(arg0, arg1)),
-  'parseClassMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseClassMember(arg0)),
   'parseClassMembers_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassMembers(arg0, arg1)),
   'parseClassTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassTypeAlias(arg0, arg1)),
   'parseCombinators_0': new MethodTrampoline(0, (Parser target) => target.parseCombinators()),
   'parseCommentAndMetadata_0': new MethodTrampoline(0, (Parser target) => target.parseCommentAndMetadata()),
   'parseCommentReference_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseCommentReference(arg0, arg1)),
   'parseCommentReferences_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCommentReferences(arg0)),
-  'parseCompilationUnit_0': new MethodTrampoline(0, (Parser target) => target.parseCompilationUnit2()),
   'parseCompilationUnitMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCompilationUnitMember(arg0)),
-  'parseConditionalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConditionalExpression()),
   'parseConstExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConstExpression()),
   'parseConstructor_8': new MethodTrampoline(8, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) => target.parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)),
   'parseConstructorFieldInitializer_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorFieldInitializer()),
-  'parseConstructorName_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorName()),
   'parseContinueStatement_0': new MethodTrampoline(0, (Parser target) => target.parseContinueStatement()),
   'parseDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseDirective(arg0)),
   'parseDocumentationComment_0': new MethodTrampoline(0, (Parser target) => target.parseDocumentationComment()),
@@ -9421,36 +10268,27 @@
   'parseEmptyStatement_0': new MethodTrampoline(0, (Parser target) => target.parseEmptyStatement()),
   'parseEqualityExpression_0': new MethodTrampoline(0, (Parser target) => target.parseEqualityExpression()),
   'parseExportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseExportDirective(arg0)),
-  'parseExpression_0': new MethodTrampoline(0, (Parser target) => target.parseExpression2()),
   'parseExpressionList_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionList()),
-  'parseExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionWithoutCascade()),
-  'parseExtendsClause_0': new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()),
   'parseFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseFinalConstVarOrType(arg0)),
   'parseFormalParameter_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseFormalParameter(arg0)),
-  'parseFormalParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseFormalParameterList()),
   'parseForStatement_0': new MethodTrampoline(0, (Parser target) => target.parseForStatement()),
   'parseFunctionBody_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionBody(arg0, arg1, arg2)),
   'parseFunctionDeclaration_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionDeclaration(arg0, arg1, arg2)),
   'parseFunctionDeclarationStatement_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionDeclarationStatement()),
   'parseFunctionDeclarationStatement_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionDeclarationStatement2(arg0, arg1)),
-  'parseFunctionExpression_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionExpression()),
   'parseFunctionTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionTypeAlias(arg0, arg1)),
   'parseGetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseGetter(arg0, arg1, arg2, arg3)),
   'parseIdentifierList_0': new MethodTrampoline(0, (Parser target) => target.parseIdentifierList()),
   'parseIfStatement_0': new MethodTrampoline(0, (Parser target) => target.parseIfStatement()),
-  'parseImplementsClause_0': new MethodTrampoline(0, (Parser target) => target.parseImplementsClause()),
   'parseImportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseImportDirective(arg0)),
   'parseInitializedIdentifierList_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseInitializedIdentifierList(arg0, arg1, arg2, arg3)),
   'parseInstanceCreationExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseInstanceCreationExpression(arg0)),
   'parseLibraryDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseLibraryDirective(arg0)),
-  'parseLibraryIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseLibraryIdentifier()),
   'parseLibraryName_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseLibraryName(arg0, arg1)),
   'parseListLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseListLiteral(arg0, arg1)),
   'parseListOrMapLiteral_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseListOrMapLiteral(arg0)),
   'parseLogicalAndExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalAndExpression()),
-  'parseLogicalOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalOrExpression()),
   'parseMapLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseMapLiteral(arg0, arg1)),
-  'parseMapLiteralEntry_0': new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()),
   'parseMethodDeclaration_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseMethodDeclaration(arg0, arg1, arg2, arg3)),
   'parseMethodDeclaration_6': new MethodTrampoline(6, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5) => target.parseMethodDeclaration2(arg0, arg1, arg2, arg3, arg4, arg5)),
   'parseModifiers_0': new MethodTrampoline(0, (Parser target) => target.parseModifiers()),
@@ -9458,25 +10296,19 @@
   'parseNativeClause_0': new MethodTrampoline(0, (Parser target) => target.parseNativeClause()),
   'parseNewExpression_0': new MethodTrampoline(0, (Parser target) => target.parseNewExpression()),
   'parseNonLabeledStatement_0': new MethodTrampoline(0, (Parser target) => target.parseNonLabeledStatement()),
-  'parseNormalFormalParameter_0': new MethodTrampoline(0, (Parser target) => target.parseNormalFormalParameter()),
   'parseOperator_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseOperator(arg0, arg1, arg2)),
   'parseOptionalReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseOptionalReturnType()),
   'parsePartDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parsePartDirective(arg0)),
   'parsePostfixExpression_0': new MethodTrampoline(0, (Parser target) => target.parsePostfixExpression()),
-  'parsePrefixedIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parsePrefixedIdentifier()),
   'parsePrimaryExpression_0': new MethodTrampoline(0, (Parser target) => target.parsePrimaryExpression()),
   'parseRedirectingConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target.parseRedirectingConstructorInvocation()),
   'parseRelationalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseRelationalExpression()),
   'parseRethrowExpression_0': new MethodTrampoline(0, (Parser target) => target.parseRethrowExpression()),
   'parseReturnStatement_0': new MethodTrampoline(0, (Parser target) => target.parseReturnStatement()),
-  'parseReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseReturnType()),
   'parseSetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseSetter(arg0, arg1, arg2, arg3)),
   'parseShiftExpression_0': new MethodTrampoline(0, (Parser target) => target.parseShiftExpression()),
-  'parseSimpleIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseSimpleIdentifier()),
-  'parseStatement_0': new MethodTrampoline(0, (Parser target) => target.parseStatement2()),
   'parseStatements_0': new MethodTrampoline(0, (Parser target) => target.parseStatements2()),
   'parseStringInterpolation_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStringInterpolation(arg0)),
-  'parseStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()),
   'parseSuperConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target.parseSuperConstructorInvocation()),
   'parseSwitchStatement_0': new MethodTrampoline(0, (Parser target) => target.parseSwitchStatement()),
   'parseSymbolLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseSymbolLiteral()),
@@ -9484,10 +10316,6 @@
   'parseThrowExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseThrowExpressionWithoutCascade()),
   'parseTryStatement_0': new MethodTrampoline(0, (Parser target) => target.parseTryStatement()),
   'parseTypeAlias_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseTypeAlias(arg0)),
-  'parseTypeArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeArgumentList()),
-  'parseTypeName_0': new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
-  'parseTypeParameter_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
-  'parseTypeParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameterList()),
   'parseUnaryExpression_0': new MethodTrampoline(0, (Parser target) => target.parseUnaryExpression()),
   'parseVariableDeclaration_0': new MethodTrampoline(0, (Parser target) => target.parseVariableDeclaration()),
   'parseVariableDeclarationList_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseVariableDeclarationList(arg0)),
@@ -9495,7 +10323,6 @@
   'parseVariableDeclarationStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseVariableDeclarationStatement(arg0)),
   'parseVariableDeclarationStatement_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseVariableDeclarationStatement2(arg0, arg1, arg2)),
   'parseWhileStatement_0': new MethodTrampoline(0, (Parser target) => target.parseWhileStatement()),
-  'parseWithClause_0': new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
   '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)),
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 07b7193..ef46283 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -19,27 +19,6 @@
 import 'ast_test.dart' show ASTFactory;
 import 'element_test.dart' show ElementFactory;
 class TypePropagationTest extends ResolverTestCase {
-  void fail_functionExpression_asInvocationArgument_functionExpressionInvocation() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  (f(String value)) {} ((v) {",
-        "    v;",
-        "  });",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    Type2 dynamicType = typeProvider.dynamicType;
-    Type2 stringType = typeProvider.stringType;
-    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", FormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
-  }
   void fail_propagatedReturnType_functionExpression() {
     String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
     check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
@@ -184,6 +163,27 @@
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", SimpleFormalParameter);
     JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
   }
+  void test_functionExpression_asInvocationArgument_functionExpressionInvocation() {
+    String code = EngineTestCase.createSource([
+        "main() {",
+        "  (f(String value)) {} ((v) {",
+        "    v;",
+        "  });",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    Type2 dynamicType = typeProvider.dynamicType;
+    Type2 stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", FormalParameter);
+    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+    JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", SimpleIdentifier);
+    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
+    JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
+  }
   void test_functionExpression_asInvocationArgument_keepIfLessSpecific() {
     String code = EngineTestCase.createSource([
         "class MyList {",
@@ -759,6 +759,10 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_fromInferredInvocation);
       });
+      _ut.test('test_functionExpression_asInvocationArgument_functionExpressionInvocation', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_functionExpressionInvocation);
+      });
       _ut.test('test_functionExpression_asInvocationArgument_keepIfLessSpecific', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_keepIfLessSpecific);
@@ -2936,6 +2940,7 @@
   void test_proxy_annotation_prefixed() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "f(A a) {",
@@ -2946,12 +2951,17 @@
         "  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 {",
@@ -2964,12 +2974,17 @@
         "    ++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();",
@@ -2982,12 +2997,17 @@
         "}",
         "@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() {",
@@ -2997,6 +3017,10 @@
         "    var y = this + this;",
         "  }",
         "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -3186,6 +3210,18 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_reversedTypeArguments() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class Codec<S1, T1> {",
+        "  Codec<T1, S1> get inverted => new _InvertedCodec<T1, S1>(this);",
+        "}",
+        "class _InvertedCodec<T2, S2> extends Codec<T2, S2> {",
+        "  _InvertedCodec(Codec<S2, T2> codec);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_staticAccessToInstanceMember_annotation() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3393,6 +3429,24 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_typePromotion_if_extends_moreSpecific() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class VP extends V {}",
+        "class A<T> {}",
+        "class B<S> extends A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B<VP>) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_typePromotion_if_hasAssignment_outsideAfter() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -3417,6 +3471,38 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_typePromotion_if_implements_moreSpecific() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class VP extends V {}",
+        "class A<T> {}",
+        "class B<S> implements A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B<VP>) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+  void test_typePromotion_if_inClosure_assignedAfter_inSameFunction() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main() {",
+        "  f(Object p) {",
+        "    if (p is String) {",
+        "      p.length;",
+        "    }",
+        "    p = 0;",
+        "  };",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_typePromotion_if_is_and_left() {
     Source source = addSource(EngineTestCase.createSource([
         "bool tt() => true;",
@@ -3481,6 +3567,47 @@
     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([
+        "import 'lib.dart' as p;",
+        "f(Type t) {}",
+        "main() {",
+        "  f(p.C);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+  void test_typeType_functionTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource([
+        "typedef F();",
+        "f(Type t) {}",
+        "main() {",
+        "  f(F);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+  void test_typeType_functionTypeAlias_prefixed() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef F();"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib.dart' as p;",
+        "f(Type t) {}",
+        "main() {",
+        "  f(p.F);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_undefinedConstructorInInitializer_explicit_named() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3646,6 +3773,19 @@
     assertNoErrors(source);
     verify([source]);
   }
+  void test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A() {}",
+        "  A.named() {}",
+        "}",
+        "/// [new A] or [new A.named]",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
   void test_wrongNumberOfParametersForOperator_index() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
     resolve(source);
@@ -4591,6 +4731,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnWithoutValue_void);
       });
+      _ut.test('test_reversedTypeArguments', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_reversedTypeArguments);
+      });
       _ut.test('test_staticAccessToInstanceMember_annotation', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_staticAccessToInstanceMember_annotation);
@@ -4667,6 +4811,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_accessedInClosure_noAssignment);
       });
+      _ut.test('test_typePromotion_if_extends_moreSpecific', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_extends_moreSpecific);
+      });
       _ut.test('test_typePromotion_if_hasAssignment_outsideAfter', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_outsideAfter);
@@ -4675,6 +4823,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_outsideBefore);
       });
+      _ut.test('test_typePromotion_if_implements_moreSpecific', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_implements_moreSpecific);
+      });
+      _ut.test('test_typePromotion_if_inClosure_assignedAfter_inSameFunction', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_inClosure_assignedAfter_inSameFunction);
+      });
       _ut.test('test_typePromotion_if_is_and_left', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_is_and_left);
@@ -4695,6 +4851,22 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typePromotion_if_is_single);
       });
+      _ut.test('test_typeType_class', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_class);
+      });
+      _ut.test('test_typeType_class_prefixed', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_class_prefixed);
+      });
+      _ut.test('test_typeType_functionTypeAlias', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_functionTypeAlias);
+      });
+      _ut.test('test_typeType_functionTypeAlias_prefixed', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeType_functionTypeAlias_prefixed);
+      });
       _ut.test('test_undefinedConstructorInInitializer_explicit_named', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_named);
@@ -4759,6 +4931,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedSuperMethod_method);
       });
+      _ut.test('test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new);
+      });
       _ut.test('test_wrongNumberOfParametersForOperator1', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator1);
@@ -5550,6 +5726,38 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+  void test_typePromotion_if_extends_notMoreSpecific_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> extends A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> extends A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B<int>) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
   void test_typePromotion_if_hasAssignment_after() {
     Source source = addSource(EngineTestCase.createSource([
         "main(Object p) {",
@@ -5572,6 +5780,82 @@
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
+  void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "  () {p = 0;};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  () {p = 0;};",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_hasAssignment_inClosure_function_after() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "  f() {p = 0;};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_hasAssignment_inClosure_function_before() {
+    Source source = addSource(EngineTestCase.createSource([
+        "main(Object p) {",
+        "  f() {p = 0;};",
+        "  if (p is String) {",
+        "    p.length;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_implements_notMoreSpecific_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> implements A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+  void test_typePromotion_if_with_notMoreSpecific_dynamic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class V {}",
+        "class A<T> {}",
+        "class B<S> extends Object with A<S> {",
+        "  var b;",
+        "}",
+        "",
+        "main(A<V> p) {",
+        "  if (p is B) {",
+        "    p.b;",
+        "  }",
+        "}"]));
+    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);
@@ -6033,6 +6317,14 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typePromotion_if_and_right_hasAssignment);
       });
+      _ut.test('test_typePromotion_if_extends_notMoreSpecific_dynamic', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_extends_notMoreSpecific_dynamic);
+      });
+      _ut.test('test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg);
+      });
       _ut.test('test_typePromotion_if_hasAssignment_after', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_after);
@@ -6041,6 +6333,30 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_before);
       });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_anonymous_after', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_anonymous_after);
+      });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_anonymous_before', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_anonymous_before);
+      });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_function_after', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_function_after);
+      });
+      _ut.test('test_typePromotion_if_hasAssignment_inClosure_function_before', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_hasAssignment_inClosure_function_before);
+      });
+      _ut.test('test_typePromotion_if_implements_notMoreSpecific_dynamic', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_implements_notMoreSpecific_dynamic);
+      });
+      _ut.test('test_typePromotion_if_with_notMoreSpecific_dynamic', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_typePromotion_if_with_notMoreSpecific_dynamic);
+      });
       _ut.test('test_undefinedGetter', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedGetter);
@@ -9631,6 +9947,25 @@
     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;",
+        "@p.unresolved",
+        "main() {",
+        "}"]));
+    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);
@@ -10578,30 +10913,6 @@
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
-  void test_referenceToDeclaredVariableInInitializer_closure() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var x = (x) {};", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
-  void test_referenceToDeclaredVariableInInitializer_getter() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x + 1;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
-  void test_referenceToDeclaredVariableInInitializer_setter() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x = x++;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
-  void test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var x = x();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER]);
-    verify([source]);
-  }
   void test_rethrowOutsideCatch() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  rethrow;", "}"]));
     resolve(source);
@@ -11654,6 +11965,18 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidAnnotation_staticMethodReference);
       });
+      _ut.test('test_invalidAnnotation_unresolved_identifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_identifier);
+      });
+      _ut.test('test_invalidAnnotation_unresolved_invocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_invocation);
+      });
+      _ut.test('test_invalidAnnotation_unresolved_prefixedIdentifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_prefixedIdentifier);
+      });
       _ut.test('test_invalidConstructorName_notEnclosingClassName_defined', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_defined);
@@ -12098,22 +12421,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_redirectToNonConstConstructor);
       });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_closure', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_closure);
-      });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_getter);
-      });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_setter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_setter);
-      });
-      _ut.test('test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referenceToDeclaredVariableInInitializer_unqualifiedInvocation);
-      });
       _ut.test('test_referencedBeforeDeclaration_hideInBlock_function', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_function);
@@ -13815,6 +14122,24 @@
     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",
+        "class A {",
+        "  B ma() {}",
+        "}",
+        "class B {",
+        "  mb(String p) {}",
+        "}",
+        "",
+        "main() {",
+        "  A a = new A();",
+        "  a..  ma().mb(0);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
   void test_argumentTypeNotAssignable_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -13839,6 +14164,12 @@
     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 {",
@@ -14294,6 +14625,12 @@
     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 {",
@@ -15153,6 +15490,12 @@
     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;"]));
@@ -15388,11 +15731,6 @@
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
-  void test_undefinedIdentifier_metadata() {
-    Source source = addSource(EngineTestCase.createSource(["@undefined class A {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
-  }
   void test_undefinedIdentifier_methodInvocation() {
     Source source = addSource(EngineTestCase.createSource(["f() { C.m(); }"]));
     resolve(source);
@@ -15500,6 +15838,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_binary);
       });
+      _ut.test('test_argumentTypeNotAssignable_cascadeSEcond', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_cascadeSEcond);
+      });
       _ut.test('test_argumentTypeNotAssignable_const', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_const);
@@ -15508,6 +15850,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_const_super);
       });
+      _ut.test('test_argumentTypeNotAssignable_functionExpressionInvocation_required', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_functionExpressionInvocation_required);
+      });
       _ut.test('test_argumentTypeNotAssignable_index', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_index);
@@ -15696,6 +16042,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_extraPositionalArguments);
       });
+      _ut.test('test_extraPositionalArguments_functionExpression', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_functionExpression);
+      });
       _ut.test('test_fieldInitializedInInitializerAndDeclaration_final', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedInInitializerAndDeclaration_final);
@@ -16016,6 +16366,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_notEnoughRequiredArguments);
       });
+      _ut.test('test_notEnoughRequiredArguments_functionExpression', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_functionExpression);
+      });
       _ut.test('test_partOfDifferentLibrary', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_partOfDifferentLibrary);
@@ -16140,10 +16494,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_initializer_prefix);
       });
-      _ut.test('test_undefinedIdentifier_metadata', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_undefinedIdentifier_metadata);
-      });
       _ut.test('test_undefinedIdentifier_methodInvocation', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_methodInvocation);
@@ -16692,12 +17042,6 @@
     Scope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
-  void test_getDefiningLibrary() {
-    LibraryElement definingLibrary = createTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
-  }
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -16775,10 +17119,6 @@
         final __test = new LibraryImportScopeTest();
         runJUnitTest(__test, __test.test_creation_nonEmpty);
       });
-      _ut.test('test_getDefiningLibrary', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_getDefiningLibrary);
-      });
       _ut.test('test_getErrorListener', () {
         final __test = new LibraryImportScopeTest();
         runJUnitTest(__test, __test.test_getErrorListener);
@@ -17083,12 +17423,6 @@
     Scope scope = new LibraryScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(importedType, scope.lookup(ASTFactory.identifier3(importedTypeName), definingLibrary));
   }
-  void test_getDefiningLibrary() {
-    LibraryElement definingLibrary = createTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
-  }
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -17105,10 +17439,6 @@
         final __test = new LibraryScopeTest();
         runJUnitTest(__test, __test.test_creation_nonEmpty);
       });
-      _ut.test('test_getDefiningLibrary', () {
-        final __test = new LibraryScopeTest();
-        runJUnitTest(__test, __test.test_getDefiningLibrary);
-      });
       _ut.test('test_getErrorListener', () {
         final __test = new LibraryScopeTest();
         runJUnitTest(__test, __test.test_getErrorListener);
@@ -18384,6 +18714,7 @@
   void test_proxy_annotation_prefixed() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
+        "import 'meta.dart';",
         "@proxy",
         "class A {}",
         "f(var a) {",
@@ -18395,12 +18726,17 @@
         "  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 {",
@@ -18414,12 +18750,17 @@
         "    ++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();",
@@ -18433,6 +18774,10 @@
         "}",
         "@proxy",
         "class A {}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
     resolve(source);
     assertNoErrors(source);
   }
@@ -18828,9 +19173,8 @@
 }
 class EnclosedScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
-    LibraryElement definingLibrary2 = createTestLibrary();
     GatheringErrorListener errorListener2 = new GatheringErrorListener();
-    Scope rootScope = new Scope_21(definingLibrary2, errorListener2);
+    Scope rootScope = new Scope_21(errorListener2);
     EnclosedScope scope = new EnclosedScope(rootScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -18839,9 +19183,8 @@
     errorListener2.assertErrors3([ErrorSeverity.ERROR]);
   }
   void test_define_normal() {
-    LibraryElement definingLibrary3 = createTestLibrary();
     GatheringErrorListener errorListener3 = new GatheringErrorListener();
-    Scope rootScope = new Scope_22(definingLibrary3, errorListener3);
+    Scope rootScope = new Scope_22(errorListener3);
     EnclosedScope outerScope = new EnclosedScope(rootScope);
     EnclosedScope innerScope = new EnclosedScope(outerScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -18864,18 +19207,14 @@
   }
 }
 class Scope_21 extends Scope {
-  LibraryElement definingLibrary2;
   GatheringErrorListener errorListener2;
-  Scope_21(this.definingLibrary2, this.errorListener2) : super();
-  LibraryElement get definingLibrary => definingLibrary2;
+  Scope_21(this.errorListener2) : super();
   AnalysisErrorListener get errorListener => errorListener2;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 class Scope_22 extends Scope {
-  LibraryElement definingLibrary3;
   GatheringErrorListener errorListener3;
-  Scope_22(this.definingLibrary3, this.errorListener3) : super();
-  LibraryElement get definingLibrary => definingLibrary3;
+  Scope_22(this.errorListener3) : super();
   AnalysisErrorListener get errorListener => errorListener3;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
@@ -19068,9 +19407,8 @@
 }
 class ScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
-    LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     scope.define(element1);
@@ -19078,24 +19416,17 @@
     errorListener.assertErrors3([ErrorSeverity.ERROR]);
   }
   void test_define_normal() {
-    LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v2"));
     scope.define(element1);
     scope.define(element2);
     errorListener.assertNoErrors();
   }
-  void test_getDefiningLibrary() {
-    LibraryElement definingLibrary = createTestLibrary();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, null);
-    JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
-  }
   void test_getErrorListener() {
-    LibraryElement definingLibrary = new LibraryElementImpl(new AnalysisContextImpl(), ASTFactory.libraryIdentifier2(["test"]));
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
   void test_isPrivateName_nonPrivate() {
@@ -19114,10 +19445,6 @@
         final __test = new ScopeTest();
         runJUnitTest(__test, __test.test_define_normal);
       });
-      _ut.test('test_getDefiningLibrary', () {
-        final __test = new ScopeTest();
-        runJUnitTest(__test, __test.test_getDefiningLibrary);
-      });
       _ut.test('test_getErrorListener', () {
         final __test = new ScopeTest();
         runJUnitTest(__test, __test.test_getErrorListener);
@@ -19139,19 +19466,12 @@
 class ScopeTest_TestScope extends Scope {
 
   /**
-   * The element representing the library in which this scope is enclosed.
-   */
-  LibraryElement _definingLibrary;
-
-  /**
    * The listener that is to be informed when an error is encountered.
    */
   AnalysisErrorListener _errorListener;
-  ScopeTest_TestScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) {
-    this._definingLibrary = definingLibrary;
+  ScopeTest_TestScope(AnalysisErrorListener errorListener) {
     this._errorListener = errorListener;
   }
-  LibraryElement get definingLibrary => _definingLibrary;
   AnalysisErrorListener get errorListener => _errorListener;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
 }
@@ -20042,4 +20362,4 @@
 //  StaticWarningCodeTest.dartSuite();
 //  StrictModeTest.dartSuite();
 //  TypePropagationTest.dartSuite();
-}
+}
\ No newline at end of file
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 1f830c6..8702c38 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/scanner.dart';
+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 {
@@ -727,7 +728,7 @@
     assertToken(TokenType.STRING, "'''string'''");
   }
   void test_string_multi_slashEnter() {
-    assertError(ScannerErrorCode.CHARACTER_EXPECTED_AFTER_SLASH, 0, "'''\\\n'''");
+    assertToken(TokenType.STRING, "'''\\\n'''");
   }
   void test_string_multi_unterminated() {
     assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
@@ -1667,17 +1668,123 @@
     this._columnNumber = columnNumber;
   }
 }
-class IncrementalScannerTest extends JUnitTestCase {
-  void test_rescan_addedToIdentifier() {
-    assertTokens("a + b;", "abs + b;");
+class IncrementalScannerTest extends EngineTestCase {
+  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);
+  }
+  void test_rescan_addedBeforeIdentifier2() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a + xb;");
+    JUnitTestCase.assertEquals("xb", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("xb", scanner.lastToken.lexeme);
+  }
+  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 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_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_rescan_addedToIdentifier2() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a + by;");
+    JUnitTestCase.assertEquals("by", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("by", scanner.lastToken.lexeme);
+  }
+  void test_rescan_appendWhitespace1() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a + b; ");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
+  }
+  void test_rescan_appendWhitespace2() {
+    IncrementalScanner scanner = assertTokens("a + b; ", "a + b;  ");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
   }
   void test_rescan_insertedPeriod() {
-    assertTokens("a + b;", "a + b.;");
+    IncrementalScanner scanner = assertTokens("a + b;", "a + b.;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodBetweenIdentifiers1() {
+    IncrementalScanner scanner = assertTokens("a b;", "a. b;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodBetweenIdentifiers2() {
+    IncrementalScanner scanner = assertTokens("a b;", "a .b;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertedPeriodBetweenIdentifiers3() {
+    IncrementalScanner scanner = assertTokens("a  b;", "a . b;");
+    JUnitTestCase.assertEquals(".", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(".", scanner.lastToken.lexeme);
+  }
+  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_rescan_insertedPeriodInsideExistingIdentifier() {
+    IncrementalScanner scanner = assertTokens("ab;", "a.b;");
+    JUnitTestCase.assertEquals("a", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals("b", scanner.lastToken.lexeme);
+  }
+  void test_rescan_insertLeadingWhitespace() {
+    IncrementalScanner scanner = assertTokens("a + b;", " a + b;");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
+  }
+  void test_rescan_insertWhitespace() {
+    IncrementalScanner scanner = assertTokens("a + b;", "a  + b;");
+    JUnitTestCase.assertNull(scanner.firstToken);
+    JUnitTestCase.assertNull(scanner.lastToken);
+  }
+  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_rescan_oneFunctionToTwo() {
-    assertTokens("f() {}", "f() => 0; g() {}");
+    IncrementalScanner scanner = assertTokens("f() {}", "f() => 0; g() {}");
+    JUnitTestCase.assertEquals("=>", scanner.firstToken.lexeme);
+    JUnitTestCase.assertEquals(")", scanner.lastToken.lexeme);
   }
-  void assertTokens(String originalContents, String modifiedContents) {
+  void test_tokenMap() {
+    IncrementalScanner scanner = assertTokens("main() {a + b;}", "main() { a + b;}");
+    TokenMap tokenMap = scanner.tokenMap;
+    Token oldToken = _originalTokens;
+    while (oldToken.type != TokenType.EOF) {
+      Token newToken = tokenMap.get(oldToken);
+      JUnitTestCase.assertNotSame(oldToken, newToken);
+      JUnitTestCase.assertSame(oldToken.type, newToken.type);
+      JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
+      oldToken = oldToken.next;
+    }
+  }
+  IncrementalScanner assertTokens(String originalContents, String modifiedContents) {
     int originalLength = originalContents.length;
     int modifiedLength = modifiedContents.length;
     int replaceStart = 0;
@@ -1693,41 +1800,107 @@
     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);
+    _originalTokens = originalScanner.tokenize();
+    JUnitTestCase.assertNotNull(_originalTokens);
     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);
     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);
+    Token incrementalTokens = incrementalScanner.rescan(_originalTokens, replaceStart, originalEnd - replaceStart + 1, modifiedEnd - replaceStart + 1);
+    Token incrementalToken = incrementalTokens;
     JUnitTestCase.assertNotNull(incrementalToken);
-    while (incrementalToken.type != TokenType.EOF && modifiedToken.type != TokenType.EOF) {
-      JUnitTestCase.assertSameMsg("Wrong type for token", modifiedToken.type, incrementalToken.type);
-      JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedToken.offset, incrementalToken.offset);
-      JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedToken.length, incrementalToken.length);
-      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedToken.lexeme, incrementalToken.lexeme);
+    while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
+      JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
+      JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedTokens.offset, incrementalToken.offset);
+      JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedTokens.length, incrementalToken.length);
+      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedTokens.lexeme, incrementalToken.lexeme);
       incrementalToken = incrementalToken.next;
-      modifiedToken = modifiedToken.next;
+      modifiedTokens = modifiedTokens.next;
     }
     JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
-    JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedToken.type);
+    JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
+    return incrementalScanner;
   }
   static dartSuite() {
     _ut.group('IncrementalScannerTest', () {
-      _ut.test('test_rescan_addedToIdentifier', () {
+      _ut.test('test_rescan_addedBeforeIdentifier1', () {
         final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_rescan_addedToIdentifier);
+        runJUnitTest(__test, __test.test_rescan_addedBeforeIdentifier1);
+      });
+      _ut.test('test_rescan_addedBeforeIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedBeforeIdentifier2);
+      });
+      _ut.test('test_rescan_addedNewIdentifier1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedNewIdentifier1);
+      });
+      _ut.test('test_rescan_addedNewIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedNewIdentifier2);
+      });
+      _ut.test('test_rescan_addedToIdentifier1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedToIdentifier1);
+      });
+      _ut.test('test_rescan_addedToIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_addedToIdentifier2);
+      });
+      _ut.test('test_rescan_appendWhitespace1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_appendWhitespace1);
+      });
+      _ut.test('test_rescan_appendWhitespace2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_appendWhitespace2);
+      });
+      _ut.test('test_rescan_insertLeadingWhitespace', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertLeadingWhitespace);
+      });
+      _ut.test('test_rescan_insertWhitespace', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertWhitespace);
+      });
+      _ut.test('test_rescan_insertWhitespaceWithMultipleComments', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertWhitespaceWithMultipleComments);
       });
       _ut.test('test_rescan_insertedPeriod', () {
         final __test = new IncrementalScannerTest();
         runJUnitTest(__test, __test.test_rescan_insertedPeriod);
       });
+      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers1);
+      });
+      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers2);
+      });
+      _ut.test('test_rescan_insertedPeriodBetweenIdentifiers3', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodBetweenIdentifiers3);
+      });
+      _ut.test('test_rescan_insertedPeriodIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodIdentifier);
+      });
+      _ut.test('test_rescan_insertedPeriodInsideExistingIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_rescan_insertedPeriodInsideExistingIdentifier);
+      });
       _ut.test('test_rescan_oneFunctionToTwo', () {
         final __test = new IncrementalScannerTest();
         runJUnitTest(__test, __test.test_rescan_oneFunctionToTwo);
       });
+      _ut.test('test_tokenMap', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_tokenMap);
+      });
     });
   }
 }
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index aebb0d2..ac118a1 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -283,7 +283,7 @@
    * @param secondError the second error being compared
    * @return `true` if the two errors are equivalent
    */
-  bool equals3(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equals4(firstError.source, secondError.source);
+  bool equals4(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equals5(firstError.source, secondError.source);
 
   /**
    * Return `true` if the two sources are equivalent.
@@ -292,7 +292,7 @@
    * @param secondSource the second source being compared
    * @return `true` if the two sources are equivalent
    */
-  bool equals4(Source firstSource, Source secondSource) {
+  bool equals5(Source firstSource, Source secondSource) {
     if (firstSource == null) {
       return secondSource == null;
     } else if (secondSource == null) {
@@ -376,7 +376,7 @@
    */
   bool foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
     for (AnalysisError error in errors) {
-      if (equals3(error, targetError)) {
+      if (equals4(error, targetError)) {
         errors.remove(error);
         return true;
       }
diff --git a/pkg/logging/lib/logging.dart b/pkg/logging/lib/logging.dart
index efbe9ba..25213bb 100644
--- a/pkg/logging/lib/logging.dart
+++ b/pkg/logging/lib/logging.dart
@@ -3,14 +3,50 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /**
- * Support for debugging and error logging.
- *
- * This library introduces abstractions similar to those used in other
- * languages, such as the Closure JS Logger and java.util.logging.Logger.
+ * Support for logging.
  *
  * For information on installing and importing this library, see the
  * [logging package on pub.dartlang.org]
  * (http://pub.dartlang.org/packages/logging).
+ *
+ * ## Initializing
+ *
+ * By default, the logging package does not do anything useful with the
+ * log messages. You must configure the logging level and add a handler
+ * for the log messages.
+ *
+ * Here is a simple logging configuration that logs all messages
+ * via `print`.
+ *
+ *     Logger.root.level = Level.ALL;
+ *     Logger.root.onRecord.listen((LogRecord rec) {
+ *       print('${rec.level.name}: ${rec.time}: ${rec.message}');
+ *     });
+ *
+ * First, set the root [Level]. All messages at or above the level are
+ * sent to the [onRecord] stream.
+ *
+ * Then, listen on the [onRecord] stream for [LogRecord] events. The
+ * [LogRecord] class has various properties for the message, error,
+ * logger name, and more.
+ *
+ * ## Logging messages
+ *
+ * Create a [Logger] with a unique name to easily identify the source
+ * of the log messages.
+ *
+ *     final Logger log = new Logger('MyClassName');
+ *
+ * Here is an example of logging a debug message and an error:
+ *
+ *     Future future = doSomethingAsync();
+ *     future.then((result) {
+ *       log.fine('Got the result: $result');
+ *       processResult(result);
+ *     })
+ *     .catchError((e, stackTrace) => log.severe('Oh noes!', e, stackTrace));
+ *
+ * See the [Logger] class for the different logging methods.
  */
 library logging;
 
diff --git a/pkg/pkg.status b/pkg/pkg.status
index da33bb8..c14883e 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -51,6 +51,7 @@
 polymer/test/event_path_test: Skip #uses dart:html
 polymer/test/events_test: Skip #uses dart:html
 polymer/test/instance_attrs_test: Skip #uses dart:html
+polymer/test/nested_binding_test: Skip # uses dart:html
 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
@@ -98,6 +99,7 @@
 polymer/test/event_path_declarative_test: Pass, Timeout # Issue 13260
 polymer/test/event_path_test: Pass, Timeout # Issue 13260
 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/prop_attr_reflection_test: Pass, Timeout # Issue 13260
 polymer/test/prop_attr_bind_reflection_test: Pass, Timeout # Issue 13260
@@ -150,9 +152,6 @@
 # minified.
 unittest/test/*_unminified_test: Skip # DO NOT COPY THIS UNLESS YOU WORK ON DART2JS
 
- # Issue 9217: Uses unspecified Type.toString.
-analyzer/test/generated/ast_test: Fail
-
 [ $compiler == dart2js && $browser ]
 stack_trace/test/vm_test: Fail, OK # VM-specific traces
 crypto/test/sha256_test: Slow, Pass
@@ -168,6 +167,10 @@
 http_server/test/http_body_test: Pass, Fail # Issue 14381
 
 [ $browser ]
+analyzer/test/generated/ast_test: Fail, OK # Uses dart:io.
+analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
+analyzer/test/generated/parser_test: Fail, OK # Uses dart:io.
+analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
 analyzer/test/error_test: Fail, Timeout, OK # Uses dart:io.
 analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
diff --git a/pkg/polymer/test/nested_binding_test.dart b/pkg/polymer/test/nested_binding_test.dart
new file mode 100644
index 0000000..ab991d9
--- /dev/null
+++ b/pkg/polymer/test/nested_binding_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.
+
+library polymer.test.nested_binding_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';
+
+@CustomTag('my-test')
+class MyTest extends PolymerElement {
+  final List fruits = toObservable(['apples', 'oranges', 'pears']);
+
+  final _testDone = new Completer();
+
+  MyTest.created() : super.created();
+
+  _runTest(_) {
+    expect($['fruit'].text.trim(), 'Short name: [pears]');
+    _testDone.complete();
+  }
+
+  ready() {
+    onMutation($['fruit']).then(_runTest);
+  }
+}
+
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('ready called', () => (query('my-test') as MyTest)._testDone.future);
+}
diff --git a/pkg/polymer/test/nested_binding_test.html b/pkg/polymer/test/nested_binding_test.html
new file mode 100644
index 0000000..3e853cd
--- /dev/null
+++ b/pkg/polymer/test/nested_binding_test.html
@@ -0,0 +1,31 @@
+<!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>nesting binding test</title>
+    <script src="packages/unittest/test_controller.js"></script>
+  </head>
+  <body>
+    <polymer-element name="my-test">
+      <template>
+        <h2>Fruits</h2>
+        <ul id="fruit">
+          <template repeat="{{fruit in fruits}}">
+            <template if="{{ fruit == 'pears' }}">
+              <li>Short name: [{{fruit}}]</li>
+            </template>
+          </template>
+        </ul>
+      </template>
+    </polymer-element>
+
+    <my-test></my-test>
+
+    <script type="application/dart" src="nested_binding_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
index 354fb5e..0d4d061 100644
--- a/pkg/polymer_expressions/lib/polymer_expressions.dart
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -70,6 +70,17 @@
   prepareBinding(String path, name, node) {
     if (path == null) return null;
     var expr = new Parser(path).parse();
+
+    // For template bind/repeat to an empty path, just pass through the model.
+    // We don't want to unwrap the Scope.
+    // TODO(jmesserly): a custom element extending <template> could notice this
+    // behavior. An alternative is to associate the Scope with the node via an
+    // Expando, which is what the JavaScript PolymerExpressions does.
+    if (isSemanticTemplate(node) && (name == 'bind' || name == 'repeat') &&
+        expr is EmptyExpression) {
+      return null;
+    }
+
     return (model, node) {
       if (model is! Scope) {
         model = new Scope(model: model, variables: globals);
diff --git a/pkg/shadow_dom/lib/shadow_dom.debug.js b/pkg/shadow_dom/lib/shadow_dom.debug.js
index c8a4d5b..2622ea3 100644
--- a/pkg/shadow_dom/lib/shadow_dom.debug.js
+++ b/pkg/shadow_dom/lib/shadow_dom.debug.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();
@@ -836,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')
@@ -872,7 +913,7 @@
     var observer = new PathObserver(obj, descriptor.path,
         function(newValue, oldValue) {
           if (notify)
-            notify('updated', oldValue);
+            notify(PROP_UPDATE_TYPE, oldValue);
         }
     );
 
@@ -907,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;
@@ -916,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
@@ -928,7 +969,7 @@
         continue;
       }
 
-      // type = 'deleted'
+      // type = 'delete'
       if (record.name in added) {
         delete added[record.name];
         delete oldValues[record.name];
@@ -1316,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);
@@ -1368,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);
 
 /*
@@ -1430,6 +1481,7 @@
       var f = new Function('', 'return true;');
       hasEval = f();
     } catch (ex) {
+      hasEval = false;
     }
   }
 
@@ -1780,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.
@@ -4872,6 +4925,7 @@
       });
 
       var nativeConstructor = originalRegister.call(unwrap(this), tagName,
+          object.extends ? {prototype: newPrototype, extends: object.extends} :
           {prototype: newPrototype});
 
       function GeneratedWrapper(node) {
diff --git a/pkg/shadow_dom/lib/shadow_dom.min.js b/pkg/shadow_dom/lib/shadow_dom.min.js
index 2017c03..3f339be 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){"splice"===a[0].type&&"splice"===a[1].type&&(b=!0)}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=!1,c=[0];return Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),b}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:H(a)&&H(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:P.test(a))}function i(a,b){if(b!==Q)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),G&&!F&&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=R[a];if(b)return b;if(!h(a))return S;var b=new i(a,Q);return R[a]=b,b}function k(b){for(var c=0;T>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,F){var e=this;this.boundInternalCallback=function(a){e.internalCallback(a)}}q(this)}function q(a){V&&(U.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];$[g.type]?(g.name in c||(c[g.name]=g.oldValue),"updated"!=g.type&&("new"!=g.type?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 db.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"splice":C(c,g.index,g.removed.slice(),g.addedCount);break;case"new":case"updated":case"deleted":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=b(),G=c(),H=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},I="__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},J="[$_a-zA-Z]",K="[$_a-zA-Z0-9]",L=J+"+"+K+"*",M="(?:[0-9]|[1-9]+[0-9]+)",N="(?:"+L+"|"+M+")",O="(?:"+N+")(?:\\s*\\.\\s*"+N+")*",P=new RegExp("^"+O+"$"),Q={},R={};i.get=j,i.prototype=I({__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 S=new i("",Q);S.valid=!1,S.getValueFrom=S.setValueFrom=function(){};var T=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||(F?(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||(F&&(this.reporting=!1,Object.deliverChangeRecords(this.boundInternalCallback),this.reporting=!0),this.sync(!0))}};var U,V=!F||a.forceCollectObservers;p._allObserversCount=0,V&&(U=[]);var W=!1,X="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!W){if(X)return Object.deliverAllChangeRecords(),void 0;if(V){W=!0;var b=0,c={};do{b++;var d=U;U=[],c.anyChanged=!1;for(var e=0;e<d.length;e++){var f=d[e];f.closed||(F?f.deliver(c):f.check()&&(c.anyChanged=!0,f.report()),U.push(f))}}while(T>b&&c.anyChanged);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=b),p._allObserversCount=U.length,W=!1}}},V&&(a.Platform.clearObservers=function(){U=[]}),r.prototype=I({__proto__:p.prototype,connect:function(){F&&Object.observe(this.object,this.boundInternalCallback)},sync:function(){F||(this.oldObject=o(this.object))},check:function(a){var b,c;if(F){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(){F?this.object&&Object.unobserve(this.object,this.boundInternalCallback):this.oldObject=void 0}}),s.prototype=I({__proto__:r.prototype,connect:function(){F&&Array.observe(this.object,this.boundInternalCallback)},sync:function(){F||(this.oldObject=this.object.slice())},check:function(a){var b;if(F){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 Y=Object.getPrototypeOf({}),Z=Object.getPrototypeOf([]);t.prototype={reset:function(){this.isObserved=!this.isObserved},observe:function(a){if(f(a)&&a!==Y&&a!==Z){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=I({__proto__:p.prototype,connect:function(){F&&(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=I({__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 $={"new":!0,updated:!0,deleted:!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("updated",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 _=0,ab=1,bb=2,cb=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(_):(e.push(ab),d=g),b--,c--):f==h?(e.push(cb),b--,d=h):(e.push(bb),c--,d=i)}else e.push(cb),b--;else e.push(bb),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 _:j&&(l.push(j),j=void 0),m++,n++;break;case ab:j||(j=y(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case bb:j||(j=y(m,[],0)),j.addedCount++,m++;break;case cb: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 db=new z;a.Observer=p,a.Observer.hasObjectObserve=F,a.ArrayObserver=s,a.ArrayObserver.calculateSplices=function(a,b){return db.calculateSplices(a,b)},a.ArraySplice=z,a.ObjectObserver=r,a.PathObserver=u,a.CompoundPathObserver=v,a.Path=i}("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){}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)||a.getHostForShadowRoot(f);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(d,e){for(var g=[];d;){for(var i=[],j=e,l=void 0;j;){var n=null;if(i.length){if(c(j)&&(n=h(i),k(l))){var o=i[i.length-1];i.push(o)}}else i.push(j);if(m(j,d))return i[i.length-1];b(j)&&i.pop(),l=j,j=f(j,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.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(b,c){if(b===c)return!0;if(b instanceof O.ShadowRoot){var d=a.getHostForShadowRoot(b);return n(l(d),c)}return!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(b){return b instanceof O.ShadowRoot&&(b=a.getHostForShadowRoot(b)),M(b)}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=[];e=a.firstChild;)a.removeChild(e),f.push(e),e.parentNode_=b;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||c,f[g].nextSibling_=f[g+1]||d;return c&&(c.nextSibling_=f[0]),d&&(d.previousSibling_=f[f.length-1]),f}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&&y.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,y.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=u.prototype.appendChild,w=u.prototype.insertBefore,x=u.prototype.replaceChild,y=u.prototype.removeChild,z=u.prototype.compareDocumentPosition;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]),v.call(this.impl,h(this,g))}else g=d(a),f(this,a),v.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?w.call(p,h(this,k),n):g(this,k)}else k=d(a),f(this,a),w.call(this.impl,r(a),r(i));return e(k),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");var c=r(a);if(this.invalidateShadowRenderer()){var d=this.firstChild,e=this.lastChild,f=a.nextSibling,g=a.previousSibling,h=c.parentNode;h&&y.call(h,c),d===a&&(this.firstChild_=f),e===a&&(this.lastChild_=g),g&&(g.nextSibling_=f),f&&(f.previousSibling_=g),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else y.call(this.impl,c);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&&x.call(k.parentNode,h(this,i),k)}else i=d(a),f(this,a),x.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 z.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"));void 0!==a&&(e.width=a),void 0!==b&&(e.height=b),d.call(this,e),g(e,this)}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){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},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,a.getHostForShadowRoot=function(a){return j.get(a)}}(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=G(a),g=G(c),h=e?G(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=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(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=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){return I.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(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++)P[a].render();P=[]}function l(){F=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.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(D(a))}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){K.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;var D=a.getHostForShadowRoot;a.mixin,a.muteMutationEvents;var E=a.oneOf;a.unmuteMutationEvents;var F,G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=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("|")+")"),O=E(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(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(G(b)),g=a||new WeakMap,i=Q.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=H(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(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,P.push(this),F)return;F=window[O](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=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,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","HTMLOptionElement","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):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);return["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})}),z.call(u(this),b,{prototype:i}),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",audio:"HTMLAudioElement",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),new RegExp("^"+c+u,"m")))},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 c?y+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=c?b:"\\[is="+b+"\\]",e=new RegExp("^("+d+")"+u,"m");return!a.match(e)},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}();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)||a.getHostForShadowRoot(f);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(d,e){for(var g=[];d;){for(var i=[],j=e,l=void 0;j;){var n=null;if(i.length){if(c(j)&&(n=h(i),k(l))){var o=i[i.length-1];i.push(o)}}else i.push(j);if(m(j,d))return i[i.length-1];b(j)&&i.pop(),l=j,j=f(j,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.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(b,c){if(b===c)return!0;if(b instanceof O.ShadowRoot){var d=a.getHostForShadowRoot(b);return n(l(d),c)}return!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(b){return b instanceof O.ShadowRoot&&(b=a.getHostForShadowRoot(b)),M(b)}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=[];e=a.firstChild;)a.removeChild(e),f.push(e),e.parentNode_=b;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||c,f[g].nextSibling_=f[g+1]||d;return c&&(c.nextSibling_=f[0]),d&&(d.previousSibling_=f[f.length-1]),f}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&&y.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,y.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=u.prototype.appendChild,w=u.prototype.insertBefore,x=u.prototype.replaceChild,y=u.prototype.removeChild,z=u.prototype.compareDocumentPosition;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]),v.call(this.impl,h(this,g))}else g=d(a),f(this,a),v.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?w.call(p,h(this,k),n):g(this,k)}else k=d(a),f(this,a),w.call(this.impl,r(a),r(i));return e(k),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");var c=r(a);if(this.invalidateShadowRenderer()){var d=this.firstChild,e=this.lastChild,f=a.nextSibling,g=a.previousSibling,h=c.parentNode;h&&y.call(h,c),d===a&&(this.firstChild_=f),e===a&&(this.lastChild_=g),g&&(g.nextSibling_=f),f&&(f.previousSibling_=g),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else y.call(this.impl,c);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&&x.call(k.parentNode,h(this,i),k)}else i=d(a),f(this,a),x.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 z.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"));void 0!==a&&(e.width=a),void 0!==b&&(e.height=b),d.call(this,e),g(e,this)}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){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},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,a.getHostForShadowRoot=function(a){return j.get(a)}}(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=G(a),g=G(c),h=e?G(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=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(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=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){return I.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(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++)P[a].render();P=[]}function l(){F=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.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(D(a))}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){K.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;var D=a.getHostForShadowRoot;a.mixin,a.muteMutationEvents;var E=a.oneOf;a.unmuteMutationEvents;var F,G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=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("|")+")"),O=E(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(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(G(b)),g=a||new WeakMap,i=Q.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=H(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(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,P.push(this),F)return;F=window[O](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=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,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","HTMLOptionElement","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):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);return["createdCallback","enteredViewCallback","leftViewCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){b.apply(v(this),arguments)})}),z.call(u(this),b,c.extends?{prototype:i,"extends":c.extends}:{prototype:i}),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",audio:"HTMLAudioElement",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),new RegExp("^"+c+u,"m")))},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 c?y+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=c?b:"\\[is="+b+"\\]",e=new RegExp("^("+d+")"+u,"m");return!a.match(e)},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/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index c031162..90e9df2 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -514,7 +514,7 @@
         Future chainSource = listenerValueOrError;
         // Shortcut if the chain-source is already completed. Just continue the
         // loop.
-        if (chainSource is _Future && (chainSource as _Future)._isComplete) {
+        if (chainSource is _Future && chainSource._isComplete) {
           // propagate the value (simulating a tail call).
           listener._isChained = true;
           source = chainSource;
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 1c9797c..e6b17b3 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -12,7 +12,7 @@
    * toString method.
    */
   static String safeToString(Object object) {
-    if (object is int || object is double || object is bool || null == object) {
+    if (object is num || object is bool || null == object) {
       return object.toString();
     }
     if (object is String) {
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 3a6983a..d1a106a 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -126,10 +126,17 @@
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [AbstractWorker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AbstractWorker.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<ErrorEvent> errorEvent = const EventStreamProvider<ErrorEvent>('error');
 
+  /// Stream of `error` events handled by this [AbstractWorker].
   @DomName('AbstractWorker.onerror')
   @DocsEditable()
   Stream<ErrorEvent> get onError => errorEvent.forTarget(this);
@@ -305,34 +312,82 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCache._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cached` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.cachedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
 
+  /**
+   * Static factory designed to expose `checking` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.checkingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');
 
+  /**
+   * Static factory designed to expose `downloading` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.downloadingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `noupdate` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.noupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');
 
+  /**
+   * Static factory designed to expose `obsolete` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.obsoleteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `updateready` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.updatereadyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
@@ -380,34 +435,42 @@
   @DocsEditable()
   void update() native;
 
+  /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
 
+  /// Stream of `checking` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onchecking')
   @DocsEditable()
   Stream<Event> get onChecking => checkingEvent.forTarget(this);
 
+  /// Stream of `downloading` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.ondownloading')
   @DocsEditable()
   Stream<Event> get onDownloading => downloadingEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `noupdate` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onnoupdate')
   @DocsEditable()
   Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);
 
+  /// Stream of `obsolete` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onobsolete')
   @DocsEditable()
   Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `updateready` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onupdateready')
   @DocsEditable()
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
@@ -626,10 +689,16 @@
 
 @DocsEditable()
 @DomName('BeforeUnloadEvent')
-@Experimental() // untriaged
 class BeforeUnloadEvent extends Event native "BeforeUnloadEvent" {
   // To suppress missing implicit constructor warnings.
   factory BeforeUnloadEvent._() { throw new UnsupportedError("Not supported"); }
+
+  // Shadowing definition.
+  String get returnValue => JS("String", "#.returnValue", this);
+
+  void set returnValue(String value) {
+    JS("void", "#.returnValue = #", this, value);
+  }
 }
 // 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
@@ -684,50 +753,122 @@
   // To suppress missing implicit constructor warnings.
   factory BodyElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -742,50 +883,62 @@
    */
   BodyElement.created() : super.created();
 
+  /// Stream of `blur` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `hashchange` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onhashchange')
   @DocsEditable()
   ElementStream<Event> get onHashChange => hashChangeEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `message` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onmessage')
   @DocsEditable()
   ElementStream<MessageEvent> get onMessage => messageEvent.forElement(this);
 
+  /// Stream of `offline` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onoffline')
   @DocsEditable()
   ElementStream<Event> get onOffline => offlineEvent.forElement(this);
 
+  /// Stream of `online` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.ononline')
   @DocsEditable()
   ElementStream<Event> get onOnline => onlineEvent.forElement(this);
 
+  /// Stream of `popstate` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onpopstate')
   @DocsEditable()
   ElementStream<PopStateEvent> get onPopState => popStateEvent.forElement(this);
 
+  /// Stream of `resize` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onresize')
   @DocsEditable()
   ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
+  /// Stream of `storage` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onstorage')
   @DocsEditable()
   ElementStream<StorageEvent> get onStorage => storageEvent.forElement(this);
 
+  /// Stream of `unload` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onunload')
   @DocsEditable()
   ElementStream<Event> get onUnload => unloadEvent.forElement(this);
@@ -922,10 +1075,22 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `webglcontextlost` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextlostEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextLostEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextlost');
 
+  /**
+   * Static factory designed to expose `webglcontextrestored` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextrestoredEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextRestoredEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextrestored');
@@ -978,10 +1143,12 @@
   @DocsEditable()
   String _toDataUrl(String type, [num quality]) native;
 
+  /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forElement(this);
 
+  /// Stream of `webglcontextrestored` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextrestored')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forElement(this);
@@ -1904,19 +2071,14 @@
 @DocsEditable()
 @DomName('Comment')
 class Comment extends CharacterData native "Comment" {
-  // To suppress missing implicit constructor warnings.
-  factory Comment._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Comment.Comment')
-  @DocsEditable()
   factory Comment([String data]) {
     if (data != null) {
-      return Comment._create_1(data);
+      return JS('Comment', '#.createComment(#)', document, data);
     }
-    return Comment._create_2();
+    return JS('Comment', '#.createComment("")', document);
   }
-  static Comment _create_1(data) => JS('Comment', 'new Comment(#)', data);
-  static Comment _create_2() => JS('Comment', 'new Comment()');
+  // To suppress missing implicit constructor warnings.
+  factory Comment._() { throw new UnsupportedError("Not supported"); }
 }
 // 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
@@ -6354,6 +6516,12 @@
   // To suppress missing implicit constructor warnings.
   factory DedicatedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('DedicatedWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6364,6 +6532,7 @@
   @Experimental() // untriaged
   void postMessage(Object message, [List messagePorts]) native;
 
+  /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6824,20 +6993,44 @@
   // To suppress missing implicit constructor warnings.
   factory Document._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
 
+  /**
+   * Static factory designed to expose `securitypolicyviolation` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.securitypolicyviolationEvent')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   static const EventStreamProvider<SecurityPolicyViolationEvent> securityPolicyViolationEvent = const EventStreamProvider<SecurityPolicyViolationEvent>('securitypolicyviolation');
 
+  /**
+   * Static factory designed to expose `selectionchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.selectionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
+  /**
+   * Static factory designed to expose `pointerlockchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -6846,6 +7039,12 @@
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
+  /**
+   * Static factory designed to expose `pointerlockerror` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -7193,230 +7392,282 @@
   @DocsEditable()
   final Element _lastElementChild;
 
+  /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [Document].
   @DomName('Document.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [Document].
   @DomName('Document.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [Document].
   @DomName('Document.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Document].
   @DomName('Document.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Document].
   @DomName('Document.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Document].
   @DomName('Document.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Document].
   @DomName('Document.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [Document].
   @DomName('Document.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [Document].
   @DomName('Document.oncut')
   @DocsEditable()
   Stream<Event> get onCut => Element.cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Document].
   @DomName('Document.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Document].
   @DomName('Document.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Document].
   @DomName('Document.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Document].
   @DomName('Document.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Document].
   @DomName('Document.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Document].
   @DomName('Document.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Document].
   @DomName('Document.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Document].
   @DomName('Document.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Document].
   @DomName('Document.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Document].
   @DomName('Document.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Document].
   @DomName('Document.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Document].
   @DomName('Document.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Document].
   @DomName('Document.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Document].
   @DomName('Document.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Document].
   @DomName('Document.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Document].
   @DomName('Document.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Document].
   @DomName('Document.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Document].
   @DomName('Document.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Document].
   @DomName('Document.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Document].
   @DomName('Document.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Document].
   @DomName('Document.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Document].
   @DomName('Document.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Document].
   @DomName('Document.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Document].
   @DomName('Document.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [Document].
   @DomName('Document.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
+  /// Stream of `readystatechange` events handled by this [Document].
   @DomName('Document.onreadystatechange')
   @DocsEditable()
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Document].
   @DomName('Document.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Document].
   @DomName('Document.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Document].
   @DomName('Document.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `securitypolicyviolation` events handled by this [Document].
   @DomName('Document.onsecuritypolicyviolation')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Document].
   @DomName('Document.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `selectionchange` events handled by this [Document].
   @DomName('Document.onselectionchange')
   @DocsEditable()
   Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [Document].
   @DomName('Document.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Document].
   @DomName('Document.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Document].
   @DomName('Document.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Document].
   @DomName('Document.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Document].
   @DomName('Document.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Document].
   @DomName('Document.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
+  /// Stream of `pointerlockchange` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   @Experimental()
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
+  /// Stream of `pointerlockerror` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
@@ -8138,213 +8389,355 @@
   @Experimental()
   CssRect get marginEdge;
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort;
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy;
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut;
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste;
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur;
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange;
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick;
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu;
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy;
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut;
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick;
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag;
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd;
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter;
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave;
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver;
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart;
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop;
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError;
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus;
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput;
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid;
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown;
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress;
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp;
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad;
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown;
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter;
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave;
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove;
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut;
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver;
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp;
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel;
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste;
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset;
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll;
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch;
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect;
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart;
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit;
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel;
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd;
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter;
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave;
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove;
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart;
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8353,12 +8746,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd;
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange;
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -8427,213 +8822,355 @@
   List<Node> get rawList => _nodeList;
 
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => Element.abortEvent._forElementList(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => Element.changeEvent._forElementList(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => Element.clickEvent._forElementList(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => Element.contextMenuEvent._forElementList(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => Element.doubleClickEvent._forElementList(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => Element.dragEvent._forElementList(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => Element.dragEndEvent._forElementList(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => Element.dragEnterEvent._forElementList(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => Element.dragLeaveEvent._forElementList(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => Element.dragOverEvent._forElementList(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => Element.dragStartEvent._forElementList(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => Element.errorEvent._forElementList(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => Element.focusEvent._forElementList(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => Element.inputEvent._forElementList(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => Element.invalidEvent._forElementList(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => Element.keyDownEvent._forElementList(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => Element.keyPressEvent._forElementList(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => Element.keyUpEvent._forElementList(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => Element.mouseDownEvent._forElementList(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent._forElementList(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent._forElementList(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => Element.mouseMoveEvent._forElementList(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => Element.mouseOutEvent._forElementList(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => Element.mouseOverEvent._forElementList(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => Element.mouseUpEvent._forElementList(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent._forElementList(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => Element.resetEvent._forElementList(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => Element.scrollEvent._forElementList(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => Element.selectEvent._forElementList(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => Element.touchCancelEvent._forElementList(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => Element.touchEndEvent._forElementList(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => Element.touchEnterEvent._forElementList(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => Element.touchLeaveEvent._forElementList(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => Element.touchMoveEvent._forElementList(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => Element.touchStartEvent._forElementList(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8642,12 +9179,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -9125,8 +9664,17 @@
   @DocsEditable()
   String get localName => _localName;
 
+  /**
+   * A URI that identifies the XML namespace of this element.
+   *
+   * `null` if no namespace URI is specified.
+   *
+   * ## Other resources
+   *
+   * * [Node.namespaceURI]
+   * (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname) from W3C.
+   */
   @DomName('Element.namespaceUri')
-  @DocsEditable()
   String get namespaceUri => _namespaceUri;
 
   String toString() => localName;
@@ -9167,6 +9715,12 @@
     }
   }
 
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseWheelEvent')
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const _CustomEventStreamProvider<WheelEvent>(
@@ -9185,6 +9739,12 @@
     }
   }
 
+  /**
+   * Static factory designed to expose `transitionend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.transitionEndEvent')
   static const EventStreamProvider<TransitionEvent> transitionEndEvent =
       const _CustomEventStreamProvider<TransitionEvent>(
@@ -9326,6 +9886,17 @@
     return false;
   }
 
+  /**
+   * Creates a new shadow root for this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.createShadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
@@ -9335,6 +9906,17 @@
       this, this, this);
   }
 
+  /**
+   * The shadow root of this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.shadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
@@ -9589,207 +10171,547 @@
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * A stream of `drag` events fired when an element is currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * A stream of `dragend` events fired when an element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over an
+   * element leaves the element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * A stream of `dragstart` events for a dragged element whose drag has begun.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on an
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `invalid` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.invalidEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectstartEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `touchcancel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchcancelEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
 
+  /**
+   * Static factory designed to expose `touchend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchendEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
 
+  /**
+   * Static factory designed to expose `touchenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchenterEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');
 
+  /**
+   * Static factory designed to expose `touchleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchleaveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');
 
+  /**
+   * Static factory designed to expose `touchmove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchmoveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
 
+  /**
+   * Static factory designed to expose `touchstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchstartEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
 
+  /**
+   * Static factory designed to expose `fullscreenchange` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9798,6 +10720,12 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
 
+  /**
+   * Static factory designed to expose `fullscreenerror` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9814,10 +10742,32 @@
   @DocsEditable()
   String dir;
 
+  /**
+   * Indicates whether the element can be dragged and dropped.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.draggable')
   @DocsEditable()
   bool draggable;
 
+  /**
+   * Indicates whether the element is not relevant to the page's current state.
+   *
+   * ## Other resources
+   *
+   * * [Hidden attribute specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#the-hidden-attribute)
+   * from WHATWG.
+   */
   @DomName('Element.hidden')
   @DocsEditable()
   bool hidden;
@@ -9827,6 +10777,14 @@
   @DocsEditable()
   String _innerHtml;
 
+  /**
+   * The current state of IME composition.
+   *
+   * ## Other resources
+   *
+   * * [Input method editor specification]
+   * (http://www.w3.org/TR/ime-api/) from W3C.
+   */
   @DomName('Element.inputMethodContext')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9859,6 +10817,16 @@
   @DocsEditable()
   String title;
 
+  /**
+   * Specifies whether this element's text content changes when the page is
+   * localized.
+   *
+   * ## Other resources
+   *
+   * * [The translate attribute]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute)
+   * from WHATWG.
+   */
   @DomName('Element.translate')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute
@@ -9866,6 +10834,20 @@
   bool translate;
 
   @JSName('webkitdropzone')
+  /**
+   * A set of space-separated keywords that specify what kind of data this
+   * Element accepts on drop and what to do with that data.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.webkitdropzone')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9933,6 +10915,19 @@
   @DocsEditable()
   final int offsetWidth;
 
+  /**
+   * The name of this element's custom pseudo-element.
+   *
+   * This value must begin with an x and a hyphen, `x-`, to be considered valid.
+   *
+   * ## Other resources
+   *
+   * * [Using custom pseudo elements]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)
+   * from HTML5Rocks.
+   * * [Custom pseudo-elements]
+   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.
+   */
   @DomName('Element.pseudo')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9963,6 +10958,22 @@
   final String tagName;
 
   @JSName('webkitRegionOverset')
+  /**
+   * The current state of this region.
+   *
+   * If `"empty"`, then there is no content in this region.
+   * If `"fit"`, then content fits into this region, and more content can be
+   * added. If `"overset"`, then there is more content than can be fit into this
+   * region.
+   *
+   * ## Other resources
+   *
+   * * [CSS regions and exclusions tutorial]
+   * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.
+   * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.
+   * * [CSS regions specification]
+   * (http://www.w3.org/TR/css3-regions/) from W3C.
+   */
   @DomName('Element.webkitRegionOverset')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9989,10 +11000,33 @@
   @Experimental() // untriaged
   String getAttributeNS(String namespaceURI, String localName) native;
 
+  /**
+   * The smallest bounding rectangle that encompasses this element's padding,
+   * scrollbar, and border.
+   *
+   * ## Other resources
+   *
+   * * [Element.getBoundingClientRect]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
+   * from MDN.
+   * * [The getBoundingClientRect() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
   Rectangle getBoundingClientRect() native;
 
+  /**
+   * A list of bounding rectangles for each box associated with this element.
+   *
+   * ## Other resources
+   *
+   * * [Element.getClientRects]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)
+   * from MDN.
+   * * [The getClientRects() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getClientRects')
   @DocsEditable()
   @Returns('_ClientRectList')
@@ -10156,213 +11190,355 @@
   @DocsEditable()
   final Element _lastElementChild;
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => changeEvent.forElement(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => copyEvent.forElement(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => cutEvent.forElement(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => inputEvent.forElement(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => resetEvent.forElement(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => touchCancelEvent.forElement(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => touchEnterEvent.forElement(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => touchLeaveEvent.forElement(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => touchStartEvent.forElement(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10371,12 +11547,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -10834,14 +12012,32 @@
   // To suppress missing implicit constructor warnings.
   factory EventSource._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -10885,14 +12081,17 @@
   @DocsEditable()
   void close() native;
 
+  /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [EventSource].
   @DomName('EventSource.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [EventSource].
   @DomName('EventSource.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -11306,26 +12505,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileReader._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
@@ -11379,26 +12614,32 @@
   @DocsEditable()
   void readAsText(Blob blob, [String encoding]) native;
 
+  /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileReader].
   @DomName('FileReader.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [FileReader].
   @DomName('FileReader.onload')
   @DocsEditable()
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [FileReader].
   @DomName('FileReader.onloadend')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [FileReader].
   @DomName('FileReader.onloadstart')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileReader].
   @DomName('FileReader.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
@@ -11469,26 +12710,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileWriter._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `write` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEvent = const EventStreamProvider<ProgressEvent>('write');
 
+  /**
+   * Static factory designed to expose `writeend` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEndEvent = const EventStreamProvider<ProgressEvent>('writeend');
 
+  /**
+   * Static factory designed to expose `writestart` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writestartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
@@ -11537,26 +12814,32 @@
   @DocsEditable()
   void write(Blob data) native;
 
+  /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileWriter].
   @DomName('FileWriter.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileWriter].
   @DomName('FileWriter.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `write` events handled by this [FileWriter].
   @DomName('FileWriter.onwrite')
   @DocsEditable()
   Stream<ProgressEvent> get onWrite => writeEvent.forTarget(this);
 
+  /// Stream of `writeend` events handled by this [FileWriter].
   @DomName('FileWriter.onwriteend')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteEnd => writeEndEvent.forTarget(this);
 
+  /// Stream of `writestart` events handled by this [FileWriter].
   @DomName('FileWriter.onwritestart')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteStart => writeStartEvent.forTarget(this);
@@ -11727,12 +13010,24 @@
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `autocomplete` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
 
+  /**
+   * Static factory designed to expose `autocompleteerror` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteerrorEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -11813,12 +13108,14 @@
   @DocsEditable()
   void submit() native;
 
+  /// Stream of `autocomplete` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
 
+  /// Stream of `autocompleteerror` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -12519,6 +13816,12 @@
         extendsTag);
   }
 
+  /**
+   * Static factory designed to expose `visibilitychange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -12910,6 +14213,12 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [HttpRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
@@ -13188,7 +14497,8 @@
   @DocsEditable()
   void setRequestHeader(String header, String value) native;
 
-  /**
+  /// Stream of `readystatechange` events handled by this [HttpRequest].
+/**
    * Event listeners to be notified every time the [HttpRequest]
    * object's `readyState` changes values.
    */
@@ -13209,56 +14519,102 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.abortEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadendEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadstartEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.progressEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `timeout` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.timeoutEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> timeoutEvent = const EventStreamProvider<ProgressEvent>('timeout');
 
+  /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onload')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13268,11 +14624,13 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadstart')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onprogress')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13282,6 +14640,7 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `timeout` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.ontimeout')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13522,6 +14881,12 @@
   // To suppress missing implicit constructor warnings.
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `speechchange` events to event
+   * handlers that are not necessarily instances of [InputElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLInputElement.webkitSpeechChangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13801,6 +15166,7 @@
   @DocsEditable()
   void stepUp([int n]) native;
 
+  /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
   @DocsEditable()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
@@ -14994,92 +16360,224 @@
   // To suppress missing implicit constructor warnings.
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `canplay` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplayEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
 
+  /**
+   * Static factory designed to expose `canplaythrough` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplaythroughEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
 
+  /**
+   * Static factory designed to expose `durationchange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.durationchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
 
+  /**
+   * Static factory designed to expose `emptied` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.emptiedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `loadeddata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadeddataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
 
+  /**
+   * Static factory designed to expose `loadedmetadata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadedmetadataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `play` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
 
+  /**
+   * Static factory designed to expose `playing` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
 
+  /**
+   * Static factory designed to expose `ratechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.ratechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
 
+  /**
+   * Static factory designed to expose `seeked` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
 
+  /**
+   * Static factory designed to expose `seeking` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.showEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
+  /**
+   * Static factory designed to expose `stalled` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.stalledEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
 
+  /**
+   * Static factory designed to expose `suspend` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.suspendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
 
+  /**
+   * Static factory designed to expose `timeupdate` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.timeupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
 
+  /**
+   * Static factory designed to expose `volumechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.volumechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
 
+  /**
+   * Static factory designed to expose `waiting` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.waitingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15088,6 +16586,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15096,6 +16600,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15104,6 +16614,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
 
+  /**
+   * Static factory designed to expose `needkey` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitneedkeyEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15368,110 +16884,135 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
   void generateKeyRequest(String keySystem, [Uint8List initData]) native;
 
+  /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
   @DocsEditable()
   ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
+  /// Stream of `canplaythrough` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplaythrough')
   @DocsEditable()
   ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
 
+  /// Stream of `durationchange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ondurationchange')
   @DocsEditable()
   ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
 
+  /// Stream of `emptied` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onemptied')
   @DocsEditable()
   ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
+  /// Stream of `ended` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onended')
   @DocsEditable()
   ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
+  /// Stream of `loadeddata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadeddata')
   @DocsEditable()
   ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
+  /// Stream of `loadedmetadata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadedmetadata')
   @DocsEditable()
   ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
 
+  /// Stream of `loadstart` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadstart')
   @DocsEditable()
   ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
 
+  /// Stream of `pause` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onpause')
   @DocsEditable()
   ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
+  /// Stream of `play` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplay')
   @DocsEditable()
   ElementStream<Event> get onPlay => playEvent.forElement(this);
 
+  /// Stream of `playing` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplaying')
   @DocsEditable()
   ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
+  /// Stream of `progress` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onprogress')
   @DocsEditable()
   ElementStream<Event> get onProgress => progressEvent.forElement(this);
 
+  /// Stream of `ratechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onratechange')
   @DocsEditable()
   ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
+  /// Stream of `seeked` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeked')
   @DocsEditable()
   ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
+  /// Stream of `seeking` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeking')
   @DocsEditable()
   ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
+  /// Stream of `show` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   ElementStream<Event> get onShow => showEvent.forElement(this);
 
+  /// Stream of `stalled` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onstalled')
   @DocsEditable()
   ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
+  /// Stream of `suspend` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onsuspend')
   @DocsEditable()
   ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
+  /// Stream of `timeupdate` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ontimeupdate')
   @DocsEditable()
   ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
+  /// Stream of `volumechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onvolumechange')
   @DocsEditable()
   ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
+  /// Stream of `waiting` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwaiting')
   @DocsEditable()
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
+  /// Stream of `keyadded` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forElement(this);
 
+  /// Stream of `keyerror` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyError => keyErrorEvent.forElement(this);
 
+  /// Stream of `keymessage` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forElement(this);
 
+  /// Stream of `needkey` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
@@ -15656,6 +17197,12 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeySession._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15663,6 +17210,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15670,6 +17223,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15697,14 +17256,17 @@
   @DocsEditable()
   void update(Uint8List key) native;
 
+  /// Stream of `keyadded` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyadded')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
 
+  /// Stream of `keyerror` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyerror')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
 
+  /// Stream of `keymessage` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeymessage')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
@@ -15876,14 +17438,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStream._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> addTrackEvent = const EventStreamProvider<Event>('addtrack');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `removetrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.removetrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> removeTrackEvent = const EventStreamProvider<Event>('removetrack');
@@ -15947,14 +17527,17 @@
   @DocsEditable()
   void stop() native;
 
+  /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
   @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
 
+  /// Stream of `ended` events handled by this [MediaStream].
   @DomName('MediaStream.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `removetrack` events handled by this [MediaStream].
   @DomName('MediaStream.onremovetrack')
   @DocsEditable()
   Stream<Event> get onRemoveTrack => removeTrackEvent.forTarget(this);
@@ -16010,14 +17593,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `mute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.muteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> muteEvent = const EventStreamProvider<Event>('mute');
 
+  /**
+   * Static factory designed to expose `unmute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.unmuteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
@@ -16059,14 +17660,17 @@
     return completer.future;
   }
 
+  /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `mute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onmute')
   @DocsEditable()
   Stream<Event> get onMute => muteEvent.forTarget(this);
 
+  /// Stream of `unmute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onunmute')
   @DocsEditable()
   Stream<Event> get onUnmute => unmuteEvent.forTarget(this);
@@ -16248,6 +17852,12 @@
   // To suppress missing implicit constructor warnings.
   factory MessagePort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [MessagePort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MessagePort.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -16281,6 +17891,7 @@
   @DocsEditable()
   void start() native;
 
+  /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -16427,10 +18038,22 @@
   // To suppress missing implicit constructor warnings.
   factory MidiAccess._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.connectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -16443,10 +18066,12 @@
   @DocsEditable()
   List<MidiOutput> outputs() native;
 
+  /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
 
+  /// Stream of `disconnect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -16498,10 +18123,17 @@
   // To suppress missing implicit constructor warnings.
   factory MidiInput._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `midimessage` events to event
+   * handlers that are not necessarily instances of [MidiInput].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIInput.midimessageEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
 
+  /// Stream of `midimessage` events handled by this [MidiInput].
   @DomName('MIDIInput.onmidimessage')
   @DocsEditable()
   Stream<MidiMessageEvent> get onMidiMessage => midiMessageEvent.forTarget(this);
@@ -16557,6 +18189,12 @@
   // To suppress missing implicit constructor warnings.
   factory MidiPort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiPort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -16581,6 +18219,7 @@
   @DocsEditable()
   final String version;
 
+  /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -18007,23 +19646,53 @@
   // To suppress missing implicit constructor warnings.
   factory Notification._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> clickEvent = const EventStreamProvider<Event>('click');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `display` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.displayEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> displayEvent = const EventStreamProvider<Event>('display');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.showEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
@@ -18087,23 +19756,28 @@
   @Experimental() // nonstandard
   void show() native;
 
+  /// Stream of `click` events handled by this [Notification].
   @DomName('Notification.onclick')
   @DocsEditable()
   Stream<Event> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Notification].
   @DomName('Notification.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `display` events handled by this [Notification].
   @DomName('Notification.ondisplay')
   @DocsEditable()
   @Experimental() // nonstandard
   Stream<Event> get onDisplay => displayEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Notification].
   @DomName('Notification.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `show` events handled by this [Notification].
   @DomName('Notification.onshow')
   @DocsEditable()
   Stream<Event> get onShow => showEvent.forTarget(this);
@@ -18614,6 +20288,12 @@
   // To suppress missing implicit constructor warnings.
   factory Performance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `resourcetimingbufferfull` events to event
+   * handlers that are not necessarily instances of [Performance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Performance.webkitresourcetimingbufferfullEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -18702,6 +20382,7 @@
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void setResourceTimingBufferSize(int maxSize) native;
 
+  /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
@@ -19615,18 +21296,42 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDataChannel._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -19709,18 +21414,22 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native;
 
+  /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -19755,6 +21464,12 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDtmfSender._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `tonechange` events to event
+   * handlers that are not necessarily instances of [RtcDtmfSender].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDTMFSender.tonechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
@@ -19785,6 +21500,7 @@
   @DocsEditable()
   void insertDtmf(String tones, [int duration, int interToneGap]) native;
 
+  /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
   @DocsEditable()
   Stream<RtcDtmfToneChangeEvent> get onToneChange => toneChangeEvent.forTarget(this);
@@ -19923,30 +21639,72 @@
   // To suppress missing implicit constructor warnings.
   factory RtcPeerConnection._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addstream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.addstreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> addStreamEvent = const EventStreamProvider<MediaStreamEvent>('addstream');
 
+  /**
+   * Static factory designed to expose `datachannel` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.datachannelEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent = const EventStreamProvider<RtcDataChannelEvent>('datachannel');
 
+  /**
+   * Static factory designed to expose `icecandidate` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.icecandidateEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
 
+  /**
+   * Static factory designed to expose `iceconnectionstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> iceConnectionStateChangeEvent = const EventStreamProvider<Event>('iceconnectionstatechange');
 
+  /**
+   * Static factory designed to expose `negotiationneeded` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.negotiationneededEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');
 
+  /**
+   * Static factory designed to expose `removestream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.removestreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');
 
+  /**
+   * Static factory designed to expose `signalingstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.signalingstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> signalingStateChangeEvent = const EventStreamProvider<Event>('signalingstatechange');
@@ -20145,30 +21903,37 @@
   @DocsEditable()
   void _updateIce_3() native;
 
+  /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
 
+  /// Stream of `datachannel` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.ondatachannel')
   @DocsEditable()
   Stream<RtcDataChannelEvent> get onDataChannel => dataChannelEvent.forTarget(this);
 
+  /// Stream of `icecandidate` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onicecandidate')
   @DocsEditable()
   Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);
 
+  /// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.oniceconnectionstatechange')
   @DocsEditable()
   Stream<Event> get onIceConnectionStateChange => iceConnectionStateChangeEvent.forTarget(this);
 
+  /// Stream of `negotiationneeded` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onnegotiationneeded')
   @DocsEditable()
   Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);
 
+  /// Stream of `removestream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onremovestream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);
 
+  /// Stream of `signalingstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onsignalingstatechange')
   @DocsEditable()
   Stream<Event> get onSignalingStateChange => signalingStateChangeEvent.forTarget(this);
@@ -20893,6 +22658,12 @@
   // To suppress missing implicit constructor warnings.
   factory SharedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SharedWorkerGlobalScope.connectEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -20903,6 +22674,7 @@
   @Experimental() // untriaged
   final String name;
 
+  /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21281,46 +23053,112 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognition._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audioendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioEndEvent = const EventStreamProvider<Event>('audioend');
 
+  /**
+   * Static factory designed to expose `audiostart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audiostartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioStartEvent = const EventStreamProvider<Event>('audiostart');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.endEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endEvent = const EventStreamProvider<Event>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionError> errorEvent = const EventStreamProvider<SpeechRecognitionError>('error');
 
+  /**
+   * Static factory designed to expose `nomatch` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.nomatchEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent = const EventStreamProvider<SpeechRecognitionEvent>('nomatch');
 
+  /**
+   * Static factory designed to expose `result` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.resultEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> resultEvent = const EventStreamProvider<SpeechRecognitionEvent>('result');
 
+  /**
+   * Static factory designed to expose `soundend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundEndEvent = const EventStreamProvider<Event>('soundend');
 
+  /**
+   * Static factory designed to expose `soundstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundStartEvent = const EventStreamProvider<Event>('soundstart');
 
+  /**
+   * Static factory designed to expose `speechend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechEndEvent = const EventStreamProvider<Event>('speechend');
 
+  /**
+   * Static factory designed to expose `speechstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechStartEvent = const EventStreamProvider<Event>('speechstart');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.startEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');
@@ -21360,46 +23198,57 @@
   @DocsEditable()
   void stop() native;
 
+  /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
   @DocsEditable()
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
 
+  /// Stream of `audiostart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudiostart')
   @DocsEditable()
   Stream<Event> get onAudioStart => audioStartEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onend')
   @DocsEditable()
   Stream<Event> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onerror')
   @DocsEditable()
   Stream<SpeechRecognitionError> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `nomatch` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onnomatch')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onNoMatch => noMatchEvent.forTarget(this);
 
+  /// Stream of `result` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onresult')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onResult => resultEvent.forTarget(this);
 
+  /// Stream of `soundend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundend')
   @DocsEditable()
   Stream<Event> get onSoundEnd => soundEndEvent.forTarget(this);
 
+  /// Stream of `soundstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundstart')
   @DocsEditable()
   Stream<Event> get onSoundStart => soundStartEvent.forTarget(this);
 
+  /// Stream of `speechend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechend')
   @DocsEditable()
   Stream<Event> get onSpeechEnd => speechEndEvent.forTarget(this);
 
+  /// Stream of `speechstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechstart')
   @DocsEditable()
   Stream<Event> get onSpeechStart => speechStartEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onstart')
   @DocsEditable()
   Stream<Event> get onStart => startEvent.forTarget(this);
@@ -21594,30 +23443,72 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisUtterance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `boundary` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `mark` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `resume` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
@@ -21657,30 +23548,37 @@
   @DocsEditable()
   num volume;
 
+  /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `mark` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
+  /// Stream of `pause` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable()
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
+  /// Stream of `resume` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
@@ -22755,6 +24653,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cuechange` events to event
+   * handlers that are not necessarily instances of [TextTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrack.cuechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
@@ -22791,6 +24695,7 @@
   @DocsEditable()
   void removeCue(TextTrackCue cue) native;
 
+  /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
   @DocsEditable()
   Stream<Event> get onCueChange => cueChangeEvent.forTarget(this);
@@ -22808,10 +24713,22 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackCue._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `enter` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.enterEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> enterEvent = const EventStreamProvider<Event>('enter');
 
+  /**
+   * Static factory designed to expose `exit` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.exitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
@@ -22884,10 +24801,12 @@
   @Experimental() // nonstandard
   DocumentFragment getCueAsHtml() native;
 
+  /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
   @DocsEditable()
   Stream<Event> get onEnter => enterEvent.forTarget(this);
 
+  /// Stream of `exit` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onexit')
   @DocsEditable()
   Stream<Event> get onExit => exitEvent.forTarget(this);
@@ -22974,6 +24893,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackList._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [TextTrackList].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackList.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');
@@ -23030,6 +24955,7 @@
   @DocsEditable()
   TextTrack item(int index) native;
 
+  /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
   @DocsEditable()
   Stream<TrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
@@ -23872,18 +25798,42 @@
   // To suppress missing implicit constructor warnings.
   factory WebSocket._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<CloseEvent> closeEvent = const EventStreamProvider<CloseEvent>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -24012,18 +25962,22 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native;
 
+  /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
   @DocsEditable()
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [WebSocket].
   @DomName('WebSocket.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [WebSocket].
   @DomName('WebSocket.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [WebSocket].
   @DomName('WebSocket.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -24559,62 +26513,146 @@
   // To suppress missing implicit constructor warnings.
   factory Window._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `contentloaded` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
+  /**
+   * Static factory designed to expose `devicemotion` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.devicemotionEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
+  /**
+   * Static factory designed to expose `deviceorientation` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.deviceorientationEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `pagehide` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pagehideEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageHideEvent = const EventStreamProvider<Event>('pagehide');
 
+  /**
+   * Static factory designed to expose `pageshow` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pageshowEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
+  /**
+   * Static factory designed to expose `animationend` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationEndEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -24622,6 +26660,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
+  /**
+   * Static factory designed to expose `animationiteration` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationIterationEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -24629,6 +26673,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
+  /**
+   * Static factory designed to expose `animationstart` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationStartEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -25079,253 +27129,313 @@
   @DocsEditable()
   int _setTimeout(Object handler, int timeout) native;
 
+  /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable()
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
+  /// Stream of `abort` events handled by this [Window].
   @DomName('Window.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Window].
   @DomName('Window.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Window].
   @DomName('Window.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Window].
   @DomName('Window.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Window].
   @DomName('Window.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Window].
   @DomName('Window.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `devicemotion` events handled by this [Window].
   @DomName('Window.ondevicemotion')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
+  /// Stream of `deviceorientation` events handled by this [Window].
   @DomName('Window.ondeviceorientation')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Window].
   @DomName('Window.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Window].
   @DomName('Window.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Window].
   @DomName('Window.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Window].
   @DomName('Window.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Window].
   @DomName('Window.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Window].
   @DomName('Window.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Window].
   @DomName('Window.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Window].
   @DomName('Window.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Window].
   @DomName('Window.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `hashchange` events handled by this [Window].
   @DomName('Window.onhashchange')
   @DocsEditable()
   Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Window].
   @DomName('Window.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Window].
   @DomName('Window.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Window].
   @DomName('Window.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Window].
   @DomName('Window.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Window].
   @DomName('Window.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Window].
   @DomName('Window.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Window].
   @DomName('Window.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Window].
   @DomName('Window.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Window].
   @DomName('Window.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Window].
   @DomName('Window.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Window].
   @DomName('Window.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Window].
   @DomName('Window.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Window].
   @DomName('Window.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Window].
   @DomName('Window.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Window].
   @DomName('Window.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `offline` events handled by this [Window].
   @DomName('Window.onoffline')
   @DocsEditable()
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
+  /// Stream of `online` events handled by this [Window].
   @DomName('Window.ononline')
   @DocsEditable()
   Stream<Event> get onOnline => onlineEvent.forTarget(this);
 
+  /// Stream of `pagehide` events handled by this [Window].
   @DomName('Window.onpagehide')
   @DocsEditable()
   Stream<Event> get onPageHide => pageHideEvent.forTarget(this);
 
+  /// Stream of `pageshow` events handled by this [Window].
   @DomName('Window.onpageshow')
   @DocsEditable()
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
+  /// Stream of `popstate` events handled by this [Window].
   @DomName('Window.onpopstate')
   @DocsEditable()
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Window].
   @DomName('Window.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [Window].
   @DomName('Window.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Window].
   @DomName('Window.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Window].
   @DomName('Window.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Window].
   @DomName('Window.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `storage` events handled by this [Window].
   @DomName('Window.onstorage')
   @DocsEditable()
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Window].
   @DomName('Window.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Window].
   @DomName('Window.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Window].
   @DomName('Window.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Window].
   @DomName('Window.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Window].
   @DomName('Window.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `transitionend` events handled by this [Window].
   @DomName('Window.ontransitionend')
   @DocsEditable()
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [Window].
   @DomName('Window.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
+  /// Stream of `animationend` events handled by this [Window].
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
+  /// Stream of `animationiteration` events handled by this [Window].
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
+  /// Stream of `animationstart` events handled by this [Window].
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
 
+  /**
+   * Static factory designed to expose `beforeunload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.beforeunloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
+  /// Stream of `beforeunload` events handled by this [Window].
   @DomName('Window.onbeforeunload')
-  @DocsEditable()
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   void moveTo(Point p) {
@@ -25362,8 +27472,9 @@
   const _BeforeUnloadEventStreamProvider(this._eventType);
 
   Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
-    var controller = new StreamController(sync: true);
     var stream = new _EventStream(e, _eventType, useCapture);
+    var controller = new StreamController(sync: true);
+
     stream.listen((event) {
       var wrapped = new _BeforeUnloadEvent(event);
       controller.add(wrapped);
@@ -25410,11 +27521,23 @@
   // To suppress missing implicit constructor warnings.
   factory Worker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -25437,11 +27560,13 @@
   @DocsEditable()
   void terminate() native;
 
+  /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Worker].
   @DomName('Worker.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -25489,6 +27614,12 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WorkerGlobalScope.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25651,6 +27782,7 @@
   @Experimental() // untriaged
   int setTimeout(Object handler, int timeout) native;
 
+  /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 51bfff9..047cafc 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -55,6 +55,7 @@
 
 
 
+// Issue 14721, order important for WrappedEvent.
 
 
 Window _window;
@@ -122,10 +123,17 @@
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [AbstractWorker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AbstractWorker.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<ErrorEvent> errorEvent = const EventStreamProvider<ErrorEvent>('error');
 
+  /// Stream of `error` events handled by this [AbstractWorker].
   @DomName('AbstractWorker.onerror')
   @DocsEditable()
   Stream<ErrorEvent> get onError => errorEvent.forTarget(this);
@@ -370,34 +378,82 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCache._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cached` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.cachedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
 
+  /**
+   * Static factory designed to expose `checking` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.checkingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');
 
+  /**
+   * Static factory designed to expose `downloading` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.downloadingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `noupdate` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.noupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');
 
+  /**
+   * Static factory designed to expose `obsolete` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.obsoleteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `updateready` events to event
+   * handlers that are not necessarily instances of [ApplicationCache].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ApplicationCache.updatereadyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
@@ -457,34 +513,42 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "ApplicationCache_removeEventListener_Callback";
 
+  /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
 
+  /// Stream of `checking` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onchecking')
   @DocsEditable()
   Stream<Event> get onChecking => checkingEvent.forTarget(this);
 
+  /// Stream of `downloading` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.ondownloading')
   @DocsEditable()
   Stream<Event> get onDownloading => downloadingEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `noupdate` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onnoupdate')
   @DocsEditable()
   Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);
 
+  /// Stream of `obsolete` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onobsolete')
   @DocsEditable()
   Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `updateready` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.onupdateready')
   @DocsEditable()
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
@@ -753,11 +817,18 @@
 
 @DocsEditable()
 @DomName('BeforeUnloadEvent')
-@Experimental() // untriaged
 class BeforeUnloadEvent extends Event {
   // To suppress missing implicit constructor warnings.
   factory BeforeUnloadEvent._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('BeforeUnloadEvent.returnValue')
+  @DocsEditable()
+  String get returnValue native "BeforeUnloadEvent_returnValue_Getter";
+
+  @DomName('BeforeUnloadEvent.returnValue')
+  @DocsEditable()
+  void set returnValue(String value) native "BeforeUnloadEvent_returnValue_Setter";
+
 }
 // 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
@@ -820,50 +891,122 @@
   // To suppress missing implicit constructor warnings.
   factory BodyElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [BodyElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLBodyElement.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -878,50 +1021,62 @@
    */
   BodyElement.created() : super.created();
 
+  /// Stream of `blur` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `hashchange` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onhashchange')
   @DocsEditable()
   ElementStream<Event> get onHashChange => hashChangeEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `message` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onmessage')
   @DocsEditable()
   ElementStream<MessageEvent> get onMessage => messageEvent.forElement(this);
 
+  /// Stream of `offline` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onoffline')
   @DocsEditable()
   ElementStream<Event> get onOffline => offlineEvent.forElement(this);
 
+  /// Stream of `online` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.ononline')
   @DocsEditable()
   ElementStream<Event> get onOnline => onlineEvent.forElement(this);
 
+  /// Stream of `popstate` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onpopstate')
   @DocsEditable()
   ElementStream<PopStateEvent> get onPopState => popStateEvent.forElement(this);
 
+  /// Stream of `resize` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onresize')
   @DocsEditable()
   ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
+  /// Stream of `storage` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onstorage')
   @DocsEditable()
   ElementStream<StorageEvent> get onStorage => storageEvent.forElement(this);
 
+  /// Stream of `unload` events handled by this [BodyElement].
   @DomName('HTMLBodyElement.onunload')
   @DocsEditable()
   ElementStream<Event> get onUnload => unloadEvent.forElement(this);
@@ -1110,10 +1265,22 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `webglcontextlost` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextlostEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextLostEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextlost');
 
+  /**
+   * Static factory designed to expose `webglcontextrestored` events to event
+   * handlers that are not necessarily instances of [CanvasElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLCanvasElement.webglcontextrestoredEvent')
   @DocsEditable()
   static const EventStreamProvider<gl.ContextEvent> webGlContextRestoredEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextrestored');
@@ -1161,10 +1328,12 @@
   @DocsEditable()
   String _toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
 
+  /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forElement(this);
 
+  /// Stream of `webglcontextrestored` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextrestored')
   @DocsEditable()
   ElementStream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forElement(this);
@@ -2197,8 +2366,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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('Comment')
@@ -2214,7 +2381,6 @@
 
   @DocsEditable()
   static Comment _create_1(data) native "Comment__create_1constructorCallback";
-
 }
 // 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
@@ -6771,6 +6937,12 @@
   // To suppress missing implicit constructor warnings.
   factory DedicatedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('DedicatedWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6781,6 +6953,7 @@
   @Experimental() // untriaged
   void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerGlobalScope_postMessage_Callback";
 
+  /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7193,20 +7366,44 @@
   // To suppress missing implicit constructor warnings.
   factory Document._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
 
+  /**
+   * Static factory designed to expose `securitypolicyviolation` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.securitypolicyviolationEvent')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   static const EventStreamProvider<SecurityPolicyViolationEvent> securityPolicyViolationEvent = const EventStreamProvider<SecurityPolicyViolationEvent>('securitypolicyviolation');
 
+  /**
+   * Static factory designed to expose `selectionchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.selectionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
+  /**
+   * Static factory designed to expose `pointerlockchange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -7215,6 +7412,12 @@
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');
 
+  /**
+   * Static factory designed to expose `pointerlockerror` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.webkitpointerlockerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -7558,230 +7761,282 @@
   @DocsEditable()
   Element get _lastElementChild native "Document_lastElementChild_Getter";
 
+  /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [Document].
   @DomName('Document.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [Document].
   @DomName('Document.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [Document].
   @DomName('Document.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Document].
   @DomName('Document.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Document].
   @DomName('Document.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Document].
   @DomName('Document.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Document].
   @DomName('Document.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [Document].
   @DomName('Document.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [Document].
   @DomName('Document.oncut')
   @DocsEditable()
   Stream<Event> get onCut => Element.cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Document].
   @DomName('Document.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Document].
   @DomName('Document.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Document].
   @DomName('Document.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Document].
   @DomName('Document.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Document].
   @DomName('Document.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Document].
   @DomName('Document.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Document].
   @DomName('Document.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Document].
   @DomName('Document.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Document].
   @DomName('Document.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Document].
   @DomName('Document.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Document].
   @DomName('Document.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Document].
   @DomName('Document.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Document].
   @DomName('Document.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Document].
   @DomName('Document.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Document].
   @DomName('Document.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Document].
   @DomName('Document.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Document].
   @DomName('Document.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Document].
   @DomName('Document.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Document].
   @DomName('Document.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Document].
   @DomName('Document.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Document].
   @DomName('Document.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Document].
   @DomName('Document.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Document].
   @DomName('Document.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Document].
   @DomName('Document.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [Document].
   @DomName('Document.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
 
+  /// Stream of `readystatechange` events handled by this [Document].
   @DomName('Document.onreadystatechange')
   @DocsEditable()
   Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Document].
   @DomName('Document.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Document].
   @DomName('Document.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Document].
   @DomName('Document.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `securitypolicyviolation` events handled by this [Document].
   @DomName('Document.onsecuritypolicyviolation')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
   Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Document].
   @DomName('Document.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `selectionchange` events handled by this [Document].
   @DomName('Document.onselectionchange')
   @DocsEditable()
   Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [Document].
   @DomName('Document.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Document].
   @DomName('Document.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Document].
   @DomName('Document.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Document].
   @DomName('Document.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Document].
   @DomName('Document.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Document].
   @DomName('Document.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
 
+  /// Stream of `pointerlockchange` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockchange
   @Experimental()
   Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
 
+  /// Stream of `pointerlockerror` events handled by this [Document].
   @DomName('Document.onwebkitpointerlockerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-onpointerlockerror
@@ -8531,213 +8786,355 @@
   @Experimental()
   CssRect get marginEdge;
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort;
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy;
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut;
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste;
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur;
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange;
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick;
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu;
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy;
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut;
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick;
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag;
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd;
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter;
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave;
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver;
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart;
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop;
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError;
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus;
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput;
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid;
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown;
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress;
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp;
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad;
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown;
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter;
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave;
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove;
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut;
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver;
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp;
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel;
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste;
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset;
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll;
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch;
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect;
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart;
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit;
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel;
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd;
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter;
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave;
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove;
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart;
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8746,12 +9143,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd;
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange;
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -8820,213 +9219,355 @@
   List<Node> get rawList => _nodeList;
 
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => Element.abortEvent._forElementList(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => Element.changeEvent._forElementList(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => Element.clickEvent._forElementList(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => Element.contextMenuEvent._forElementList(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => Element.doubleClickEvent._forElementList(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => Element.dragEvent._forElementList(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => Element.dragEndEvent._forElementList(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => Element.dragEnterEvent._forElementList(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => Element.dragLeaveEvent._forElementList(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => Element.dragOverEvent._forElementList(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => Element.dragStartEvent._forElementList(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => Element.errorEvent._forElementList(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => Element.focusEvent._forElementList(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => Element.inputEvent._forElementList(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => Element.invalidEvent._forElementList(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => Element.keyDownEvent._forElementList(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => Element.keyPressEvent._forElementList(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => Element.keyUpEvent._forElementList(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => Element.mouseDownEvent._forElementList(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent._forElementList(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent._forElementList(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => Element.mouseMoveEvent._forElementList(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => Element.mouseOutEvent._forElementList(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => Element.mouseOverEvent._forElementList(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => Element.mouseUpEvent._forElementList(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent._forElementList(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => Element.resetEvent._forElementList(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => Element.scrollEvent._forElementList(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => Element.selectEvent._forElementList(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => Element.touchCancelEvent._forElementList(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => Element.touchEndEvent._forElementList(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => Element.touchEnterEvent._forElementList(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => Element.touchLeaveEvent._forElementList(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => Element.touchMoveEvent._forElementList(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => Element.touchStartEvent._forElementList(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9035,12 +9576,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -9517,8 +10060,17 @@
   @DocsEditable()
   String get localName => _localName;
 
+  /**
+   * A URI that identifies the XML namespace of this element.
+   *
+   * `null` if no namespace URI is specified.
+   *
+   * ## Other resources
+   *
+   * * [Node.namespaceURI]
+   * (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname) from W3C.
+   */
   @DomName('Element.namespaceUri')
-  @DocsEditable()
   String get namespaceUri => _namespaceUri;
 
   String toString() => localName;
@@ -9818,136 +10370,392 @@
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * A stream of `drag` events fired when an element is currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * A stream of `dragend` events fired when an element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over an
+   * element leaves the element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over an element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * A stream of `dragstart` events for a dragged element whose drag has begun.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on an
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `invalid` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.invalidEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
@@ -9958,67 +10766,145 @@
   @Experimental() // non-standard
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.selectstartEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `touchcancel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchcancelEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
 
+  /**
+   * Static factory designed to expose `touchend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchendEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
 
+  /**
+   * Static factory designed to expose `touchenter` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchenterEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');
 
+  /**
+   * Static factory designed to expose `touchleave` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchleaveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');
 
+  /**
+   * Static factory designed to expose `touchmove` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchmoveEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
 
+  /**
+   * Static factory designed to expose `touchstart` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.touchstartEvent')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
@@ -10029,6 +10915,12 @@
   @DocsEditable()
   static const EventStreamProvider<TransitionEvent> transitionEndEvent = const EventStreamProvider<TransitionEvent>('transitionend');
 
+  /**
+   * Static factory designed to expose `fullscreenchange` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenchangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10037,6 +10929,12 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
 
+  /**
+   * Static factory designed to expose `fullscreenerror` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.webkitfullscreenerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10147,11 +11045,37 @@
   @DocsEditable()
   int get offsetWidth native "Element_offsetWidth_Getter";
 
+  /**
+   * The name of this element's custom pseudo-element.
+   *
+   * This value must begin with an x and a hyphen, `x-`, to be considered valid.
+   *
+   * ## Other resources
+   *
+   * * [Using custom pseudo elements]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)
+   * from HTML5Rocks.
+   * * [Custom pseudo-elements]
+   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.
+   */
   @DomName('Element.pseudo')
   @DocsEditable()
   @Experimental() // untriaged
   String get pseudo native "Element_pseudo_Getter";
 
+  /**
+   * The name of this element's custom pseudo-element.
+   *
+   * This value must begin with an x and a hyphen, `x-`, to be considered valid.
+   *
+   * ## Other resources
+   *
+   * * [Using custom pseudo elements]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)
+   * from HTML5Rocks.
+   * * [Custom pseudo-elements]
+   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.
+   */
   @DomName('Element.pseudo')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10195,6 +11119,22 @@
   @DocsEditable()
   String get tagName native "Element_tagName_Getter";
 
+  /**
+   * The current state of this region.
+   *
+   * If `"empty"`, then there is no content in this region.
+   * If `"fit"`, then content fits into this region, and more content can be
+   * added. If `"overset"`, then there is more content than can be fit into this
+   * region.
+   *
+   * ## Other resources
+   *
+   * * [CSS regions and exclusions tutorial]
+   * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.
+   * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.
+   * * [CSS regions specification]
+   * (http://www.w3.org/TR/css3-regions/) from W3C.
+   */
   @DomName('Element.webkitRegionOverset')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10228,10 +11168,33 @@
   @Experimental() // untriaged
   String getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
 
+  /**
+   * The smallest bounding rectangle that encompasses this element's padding,
+   * scrollbar, and border.
+   *
+   * ## Other resources
+   *
+   * * [Element.getBoundingClientRect]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
+   * from MDN.
+   * * [The getBoundingClientRect() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
   Rectangle getBoundingClientRect() native "Element_getBoundingClientRect_Callback";
 
+  /**
+   * A list of bounding rectangles for each box associated with this element.
+   *
+   * ## Other resources
+   *
+   * * [Element.getClientRects]
+   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)
+   * from MDN.
+   * * [The getClientRects() method]
+   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.
+   */
   @DomName('Element.getClientRects')
   @DocsEditable()
   List<Rectangle> getClientRects() native "Element_getClientRects_Callback";
@@ -10390,213 +11353,355 @@
   @DocsEditable()
   Element get _lastElementChild native "Element_lastElementChild_Getter";
 
+  /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
   ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
+  /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
   ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
 
+  /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
   ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
 
+  /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
   ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
 
+  /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
   @DocsEditable()
   ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
+  /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
   ElementStream<Event> get onChange => changeEvent.forElement(this);
 
+  /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
   ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
+  /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
   ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
 
+  /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
   ElementStream<Event> get onCopy => copyEvent.forElement(this);
 
+  /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
   ElementStream<Event> get onCut => cutEvent.forElement(this);
 
+  /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
   ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
+  /**
+   * A stream of `drag` events fired when this element currently being dragged.
+   *
+   * A `drag` event is added to this stream as soon as the drag begins.
+   * A `drag` event is also added to this stream at intervals while the drag
+   * operation is still ongoing.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrag')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
+  /**
+   * A stream of `dragend` events fired when this element completes a drag
+   * operation.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragend')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
+  /**
+   * A stream of `dragenter` events fired when a dragged object is first dragged
+   * over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragenter')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
+  /**
+   * A stream of `dragleave` events fired when an object being dragged over this
+   * element leaves this element's target area.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragleave')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
+  /**
+   * A stream of `dragover` events fired when a dragged object is currently
+   * being dragged over this element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragover')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
+  /**
+   * A stream of `dragstart` events fired when this element starts being
+   * dragged.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondragstart')
   @DocsEditable()
   ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
+  /**
+   * A stream of `drop` events fired when a dragged object is dropped on this
+   * element.
+   *
+   * ## Other resources
+   *
+   * * [Drag and drop sample]
+   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+   * from HTML5Rocks.
+   * * [Drag and drop specification]
+   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+   * from WHATWG.
+   */
   @DomName('Element.ondrop')
   @DocsEditable()
   ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
+  /// Stream of `error` events handled by this [Element].
   @DomName('Element.onerror')
   @DocsEditable()
   ElementStream<Event> get onError => errorEvent.forElement(this);
 
+  /// Stream of `focus` events handled by this [Element].
   @DomName('Element.onfocus')
   @DocsEditable()
   ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
+  /// Stream of `input` events handled by this [Element].
   @DomName('Element.oninput')
   @DocsEditable()
   ElementStream<Event> get onInput => inputEvent.forElement(this);
 
+  /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
   ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
+  /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
+  /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
+  /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
   ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
+  /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
   @DocsEditable()
   ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
+  /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
 
+  /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
 
+  /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
 
+  /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
+  /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
+  /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
+  /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
   ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
+  /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
   ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
 
+  /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
   ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
+  /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
   @DocsEditable()
   ElementStream<Event> get onReset => resetEvent.forElement(this);
 
+  /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
   ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
+  /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
+  /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
   ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
+  /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
   ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
+  /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
   ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
+  /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchCancel => touchCancelEvent.forElement(this);
 
+  /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
+  /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchEnter => touchEnterEvent.forElement(this);
 
+  /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchLeave => touchLeaveEvent.forElement(this);
 
+  /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
+  /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   ElementStream<TouchEvent> get onTouchStart => touchStartEvent.forElement(this);
 
+  /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -10605,12 +11710,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
+  /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
 
+  /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
@@ -11065,14 +12172,32 @@
   // To suppress missing implicit constructor warnings.
   factory EventSource._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [EventSource].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('EventSource.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -11126,14 +12251,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";
 
+  /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [EventSource].
   @DomName('EventSource.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [EventSource].
   @DomName('EventSource.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -11559,26 +12687,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileReader._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileReader].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileReader.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
@@ -11653,26 +12817,32 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileReader].
   @DomName('FileReader.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [FileReader].
   @DomName('FileReader.onload')
   @DocsEditable()
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [FileReader].
   @DomName('FileReader.onloadend')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [FileReader].
   @DomName('FileReader.onloadstart')
   @DocsEditable()
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileReader].
   @DomName('FileReader.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
@@ -11752,26 +12922,62 @@
   // To suppress missing implicit constructor warnings.
   factory FileWriter._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `write` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEvent = const EventStreamProvider<ProgressEvent>('write');
 
+  /**
+   * Static factory designed to expose `writeend` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writeendEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeEndEvent = const EventStreamProvider<ProgressEvent>('writeend');
 
+  /**
+   * Static factory designed to expose `writestart` events to event
+   * handlers that are not necessarily instances of [FileWriter].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('FileWriter.writestartEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
@@ -11832,26 +13038,32 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [FileWriter].
   @DomName('FileWriter.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [FileWriter].
   @DomName('FileWriter.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `write` events handled by this [FileWriter].
   @DomName('FileWriter.onwrite')
   @DocsEditable()
   Stream<ProgressEvent> get onWrite => writeEvent.forTarget(this);
 
+  /// Stream of `writeend` events handled by this [FileWriter].
   @DomName('FileWriter.onwriteend')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteEnd => writeEndEvent.forTarget(this);
 
+  /// Stream of `writestart` events handled by this [FileWriter].
   @DomName('FileWriter.onwritestart')
   @DocsEditable()
   Stream<ProgressEvent> get onWriteStart => writeStartEvent.forTarget(this);
@@ -12079,12 +13291,24 @@
   // To suppress missing implicit constructor warnings.
   factory FormElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `autocomplete` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   static const EventStreamProvider<Event> autocompleteEvent = const EventStreamProvider<Event>('autocomplete');
 
+  /**
+   * Static factory designed to expose `autocompleteerror` events to event
+   * handlers that are not necessarily instances of [FormElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLFormElement.autocompleteerrorEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -12203,12 +13427,14 @@
   @DocsEditable()
   void submit() native "HTMLFormElement_submit_Callback";
 
+  /// Stream of `autocomplete` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
   ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
 
+  /// Stream of `autocompleteerror` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
@@ -12906,6 +14132,12 @@
     _Utils.register(this, tag, customElementClass, extendsTag);
   }
 
+  /**
+   * Static factory designed to expose `visibilitychange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -13419,6 +14651,12 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `readystatechange` events to event
+   * handlers that are not necessarily instances of [HttpRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
@@ -13709,7 +14947,8 @@
   @DocsEditable()
   void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
 
-  /**
+  /// Stream of `readystatechange` events handled by this [HttpRequest].
+/**
    * Event listeners to be notified every time the [HttpRequest]
    * object's `readyState` changes values.
    */
@@ -13732,36 +14971,78 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.abortEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
 
+  /**
+   * Static factory designed to expose `loadend` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadendEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.loadstartEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.progressEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  /**
+   * Static factory designed to expose `timeout` events to event
+   * handlers that are not necessarily instances of [HttpRequestEventTarget].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('XMLHttpRequestEventTarget.timeoutEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -13782,21 +15063,25 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestEventTarget_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onload')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `loadend` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadend')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13806,11 +15091,13 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
 
+  /// Stream of `loadstart` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onloadstart')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
 
+  /// Stream of `progress` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onprogress')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -13820,6 +15107,7 @@
   @Experimental() // untriaged
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
+  /// Stream of `timeout` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.ontimeout')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14131,6 +15419,12 @@
   // To suppress missing implicit constructor warnings.
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `speechchange` events to event
+   * handlers that are not necessarily instances of [InputElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLInputElement.webkitSpeechChangeEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -14610,6 +15904,7 @@
 
   void _stepUp_2() native "HTMLInputElement__stepUp_2_Callback";
 
+  /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
   @DocsEditable()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
@@ -15917,92 +17212,224 @@
   // To suppress missing implicit constructor warnings.
   factory MediaElement._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `canplay` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplayEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
 
+  /**
+   * Static factory designed to expose `canplaythrough` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.canplaythroughEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
 
+  /**
+   * Static factory designed to expose `durationchange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.durationchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
 
+  /**
+   * Static factory designed to expose `emptied` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.emptiedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `loadeddata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadeddataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
 
+  /**
+   * Static factory designed to expose `loadedmetadata` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadedmetadataEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
 
+  /**
+   * Static factory designed to expose `loadstart` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.loadstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `play` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
 
+  /**
+   * Static factory designed to expose `playing` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.playingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
 
+  /**
+   * Static factory designed to expose `progress` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
 
+  /**
+   * Static factory designed to expose `ratechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.ratechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
 
+  /**
+   * Static factory designed to expose `seeked` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
 
+  /**
+   * Static factory designed to expose `seeking` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.seekingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.showEvent')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
 
+  /**
+   * Static factory designed to expose `stalled` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.stalledEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
 
+  /**
+   * Static factory designed to expose `suspend` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.suspendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
 
+  /**
+   * Static factory designed to expose `timeupdate` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.timeupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
 
+  /**
+   * Static factory designed to expose `volumechange` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.volumechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
 
+  /**
+   * Static factory designed to expose `waiting` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.waitingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16011,6 +17438,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16019,6 +17452,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16027,6 +17466,12 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
 
+  /**
+   * Static factory designed to expose `needkey` events to event
+   * handlers that are not necessarily instances of [MediaElement].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('HTMLMediaElement.webkitneedkeyEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16377,110 +17822,135 @@
 
   void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";
 
+  /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
   @DocsEditable()
   ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
+  /// Stream of `canplaythrough` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplaythrough')
   @DocsEditable()
   ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
 
+  /// Stream of `durationchange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ondurationchange')
   @DocsEditable()
   ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
 
+  /// Stream of `emptied` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onemptied')
   @DocsEditable()
   ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
+  /// Stream of `ended` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onended')
   @DocsEditable()
   ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
+  /// Stream of `loadeddata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadeddata')
   @DocsEditable()
   ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
+  /// Stream of `loadedmetadata` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadedmetadata')
   @DocsEditable()
   ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
 
+  /// Stream of `loadstart` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onloadstart')
   @DocsEditable()
   ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
 
+  /// Stream of `pause` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onpause')
   @DocsEditable()
   ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
+  /// Stream of `play` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplay')
   @DocsEditable()
   ElementStream<Event> get onPlay => playEvent.forElement(this);
 
+  /// Stream of `playing` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onplaying')
   @DocsEditable()
   ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
+  /// Stream of `progress` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onprogress')
   @DocsEditable()
   ElementStream<Event> get onProgress => progressEvent.forElement(this);
 
+  /// Stream of `ratechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onratechange')
   @DocsEditable()
   ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
+  /// Stream of `seeked` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeked')
   @DocsEditable()
   ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
+  /// Stream of `seeking` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onseeking')
   @DocsEditable()
   ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
+  /// Stream of `show` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
   ElementStream<Event> get onShow => showEvent.forElement(this);
 
+  /// Stream of `stalled` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onstalled')
   @DocsEditable()
   ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
+  /// Stream of `suspend` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onsuspend')
   @DocsEditable()
   ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
+  /// Stream of `timeupdate` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.ontimeupdate')
   @DocsEditable()
   ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
+  /// Stream of `volumechange` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onvolumechange')
   @DocsEditable()
   ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
+  /// Stream of `waiting` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwaiting')
   @DocsEditable()
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
+  /// Stream of `keyadded` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forElement(this);
 
+  /// Stream of `keyerror` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyError => keyErrorEvent.forElement(this);
 
+  /// Stream of `keymessage` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forElement(this);
 
+  /// Stream of `needkey` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
@@ -16681,6 +18151,12 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeySession._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `keyadded` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyaddedEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16688,6 +18164,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
+  /**
+   * Static factory designed to expose `keyerror` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeyerrorEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16695,6 +18177,12 @@
   @Experimental()
   static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
+  /**
+   * Static factory designed to expose `keymessage` events to event
+   * handlers that are not necessarily instances of [MediaKeySession].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaKeySession.webkitkeymessageEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16734,14 +18222,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_removeEventListener_Callback";
 
+  /// Stream of `keyadded` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyadded')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
 
+  /// Stream of `keyerror` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeyerror')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
 
+  /// Stream of `keymessage` events handled by this [MediaKeySession].
   @DomName('MediaKeySession.onwebkitkeymessage')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
@@ -16955,14 +18446,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStream._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> addTrackEvent = const EventStreamProvider<Event>('addtrack');
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `removetrack` events to event
+   * handlers that are not necessarily instances of [MediaStream].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStream.removetrackEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> removeTrackEvent = const EventStreamProvider<Event>('removetrack');
@@ -17040,14 +18549,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
 
+  /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
   @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
 
+  /// Stream of `ended` events handled by this [MediaStream].
   @DomName('MediaStream.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `removetrack` events handled by this [MediaStream].
   @DomName('MediaStream.onremovetrack')
   @DocsEditable()
   Stream<Event> get onRemoveTrack => removeTrackEvent.forTarget(this);
@@ -17102,14 +18614,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.endedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+  /**
+   * Static factory designed to expose `mute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.muteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> muteEvent = const EventStreamProvider<Event>('mute');
 
+  /**
+   * Static factory designed to expose `unmute` events to event
+   * handlers that are not necessarily instances of [MediaStreamTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MediaStreamTrack.unmuteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
@@ -17162,14 +18692,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";
 
+  /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
   @DocsEditable()
   Stream<Event> get onEnded => endedEvent.forTarget(this);
 
+  /// Stream of `mute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onmute')
   @DocsEditable()
   Stream<Event> get onMute => muteEvent.forTarget(this);
 
+  /// Stream of `unmute` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onunmute')
   @DocsEditable()
   Stream<Event> get onUnmute => unmuteEvent.forTarget(this);
@@ -17353,6 +18886,12 @@
   // To suppress missing implicit constructor warnings.
   factory MessagePort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [MessagePort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MessagePort.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -17381,6 +18920,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";
 
+  /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -17568,10 +19108,22 @@
   // To suppress missing implicit constructor warnings.
   factory MidiAccess._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.connectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiAccess].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIAccess.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -17596,10 +19148,12 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_removeEventListener_Callback";
 
+  /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
 
+  /// Stream of `disconnect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -17660,10 +19214,17 @@
   // To suppress missing implicit constructor warnings.
   factory MidiInput._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `midimessage` events to event
+   * handlers that are not necessarily instances of [MidiInput].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIInput.midimessageEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
 
+  /// Stream of `midimessage` events handled by this [MidiInput].
   @DomName('MIDIInput.onmidimessage')
   @DocsEditable()
   Stream<MidiMessageEvent> get onMidiMessage => midiMessageEvent.forTarget(this);
@@ -17737,6 +19298,12 @@
   // To suppress missing implicit constructor warnings.
   factory MidiPort._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `disconnect` events to event
+   * handlers that are not necessarily instances of [MidiPort].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('MIDIPort.disconnectEvent')
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
@@ -17773,6 +19340,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_removeEventListener_Callback";
 
+  /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
   @DocsEditable()
   Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.forTarget(this);
@@ -19222,23 +20790,53 @@
   // To suppress missing implicit constructor warnings.
   factory Notification._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> clickEvent = const EventStreamProvider<Event>('click');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `display` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.displayEvent')
   @DocsEditable()
   @Experimental() // nonstandard
   static const EventStreamProvider<Event> displayEvent = const EventStreamProvider<Event>('display');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `show` events to event
+   * handlers that are not necessarily instances of [Notification].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Notification.showEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
@@ -19323,23 +20921,28 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";
 
+  /// Stream of `click` events handled by this [Notification].
   @DomName('Notification.onclick')
   @DocsEditable()
   Stream<Event> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Notification].
   @DomName('Notification.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `display` events handled by this [Notification].
   @DomName('Notification.ondisplay')
   @DocsEditable()
   @Experimental() // nonstandard
   Stream<Event> get onDisplay => displayEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Notification].
   @DomName('Notification.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `show` events handled by this [Notification].
   @DomName('Notification.onshow')
   @DocsEditable()
   Stream<Event> get onShow => showEvent.forTarget(this);
@@ -19968,6 +21571,12 @@
   // To suppress missing implicit constructor warnings.
   factory Performance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `resourcetimingbufferfull` events to event
+   * handlers that are not necessarily instances of [Performance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Performance.webkitresourcetimingbufferfullEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -20069,6 +21678,7 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Performance_removeEventListener_Callback";
 
+  /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
@@ -21044,18 +22654,42 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDataChannel._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [RtcDataChannel].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDataChannel.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -21174,18 +22808,22 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";
 
+  /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -21226,6 +22864,12 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDtmfSender._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `tonechange` events to event
+   * handlers that are not necessarily instances of [RtcDtmfSender].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCDTMFSender.tonechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
@@ -21281,6 +22925,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_removeEventListener_Callback";
 
+  /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
   @DocsEditable()
   Stream<RtcDtmfToneChangeEvent> get onToneChange => toneChangeEvent.forTarget(this);
@@ -21405,30 +23050,72 @@
   // To suppress missing implicit constructor warnings.
   factory RtcPeerConnection._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addstream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.addstreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> addStreamEvent = const EventStreamProvider<MediaStreamEvent>('addstream');
 
+  /**
+   * Static factory designed to expose `datachannel` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.datachannelEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent = const EventStreamProvider<RtcDataChannelEvent>('datachannel');
 
+  /**
+   * Static factory designed to expose `icecandidate` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.icecandidateEvent')
   @DocsEditable()
   static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
 
+  /**
+   * Static factory designed to expose `iceconnectionstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> iceConnectionStateChangeEvent = const EventStreamProvider<Event>('iceconnectionstatechange');
 
+  /**
+   * Static factory designed to expose `negotiationneeded` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.negotiationneededEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');
 
+  /**
+   * Static factory designed to expose `removestream` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.removestreamEvent')
   @DocsEditable()
   static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');
 
+  /**
+   * Static factory designed to expose `signalingstatechange` events to event
+   * handlers that are not necessarily instances of [RtcPeerConnection].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('RTCPeerConnection.signalingstatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> signalingStateChangeEvent = const EventStreamProvider<Event>('signalingstatechange');
@@ -21550,30 +23237,37 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";
 
+  /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
 
+  /// Stream of `datachannel` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.ondatachannel')
   @DocsEditable()
   Stream<RtcDataChannelEvent> get onDataChannel => dataChannelEvent.forTarget(this);
 
+  /// Stream of `icecandidate` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onicecandidate')
   @DocsEditable()
   Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);
 
+  /// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.oniceconnectionstatechange')
   @DocsEditable()
   Stream<Event> get onIceConnectionStateChange => iceConnectionStateChangeEvent.forTarget(this);
 
+  /// Stream of `negotiationneeded` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onnegotiationneeded')
   @DocsEditable()
   Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);
 
+  /// Stream of `removestream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onremovestream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);
 
+  /// Stream of `signalingstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onsignalingstatechange')
   @DocsEditable()
   Stream<Event> get onSignalingStateChange => signalingStateChangeEvent.forTarget(this);
@@ -22395,6 +24089,12 @@
   // To suppress missing implicit constructor warnings.
   factory SharedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `connect` events to event
+   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SharedWorkerGlobalScope.connectEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22405,6 +24105,7 @@
   @Experimental() // untriaged
   String get name native "SharedWorkerGlobalScope_name_Getter";
 
+  /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22904,46 +24605,112 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognition._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audioendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioEndEvent = const EventStreamProvider<Event>('audioend');
 
+  /**
+   * Static factory designed to expose `audiostart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.audiostartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> audioStartEvent = const EventStreamProvider<Event>('audiostart');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.endEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> endEvent = const EventStreamProvider<Event>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionError> errorEvent = const EventStreamProvider<SpeechRecognitionError>('error');
 
+  /**
+   * Static factory designed to expose `nomatch` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.nomatchEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent = const EventStreamProvider<SpeechRecognitionEvent>('nomatch');
 
+  /**
+   * Static factory designed to expose `result` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.resultEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechRecognitionEvent> resultEvent = const EventStreamProvider<SpeechRecognitionEvent>('result');
 
+  /**
+   * Static factory designed to expose `soundend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundEndEvent = const EventStreamProvider<Event>('soundend');
 
+  /**
+   * Static factory designed to expose `soundstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.soundstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> soundStartEvent = const EventStreamProvider<Event>('soundstart');
 
+  /**
+   * Static factory designed to expose `speechend` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechendEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechEndEvent = const EventStreamProvider<Event>('speechend');
 
+  /**
+   * Static factory designed to expose `speechstart` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.speechstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> speechStartEvent = const EventStreamProvider<Event>('speechstart');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechRecognition].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechRecognition.startEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');
@@ -23024,46 +24791,57 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";
 
+  /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
   @DocsEditable()
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
 
+  /// Stream of `audiostart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudiostart')
   @DocsEditable()
   Stream<Event> get onAudioStart => audioStartEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onend')
   @DocsEditable()
   Stream<Event> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onerror')
   @DocsEditable()
   Stream<SpeechRecognitionError> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `nomatch` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onnomatch')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onNoMatch => noMatchEvent.forTarget(this);
 
+  /// Stream of `result` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onresult')
   @DocsEditable()
   Stream<SpeechRecognitionEvent> get onResult => resultEvent.forTarget(this);
 
+  /// Stream of `soundend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundend')
   @DocsEditable()
   Stream<Event> get onSoundEnd => soundEndEvent.forTarget(this);
 
+  /// Stream of `soundstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onsoundstart')
   @DocsEditable()
   Stream<Event> get onSoundStart => soundStartEvent.forTarget(this);
 
+  /// Stream of `speechend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechend')
   @DocsEditable()
   Stream<Event> get onSpeechEnd => speechEndEvent.forTarget(this);
 
+  /// Stream of `speechstart` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onspeechstart')
   @DocsEditable()
   Stream<Event> get onSpeechStart => speechStartEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onstart')
   @DocsEditable()
   Stream<Event> get onStart => startEvent.forTarget(this);
@@ -23272,30 +25050,72 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisUtterance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `boundary` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
+  /**
+   * Static factory designed to expose `end` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `mark` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
+  /**
+   * Static factory designed to expose `pause` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
 
+  /**
+   * Static factory designed to expose `resume` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
+  /**
+   * Static factory designed to expose `start` events to event
+   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable()
   static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
@@ -23372,30 +25192,37 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesisUtterance_removeEventListener_Callback";
 
+  /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
 
+  /// Stream of `end` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onend')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onEnd => endEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `mark` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onmark')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onMark => markEvent.forTarget(this);
 
+  /// Stream of `pause` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onpause')
   @DocsEditable()
   Stream<Event> get onPause => pauseEvent.forTarget(this);
 
+  /// Stream of `resume` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onresume')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onResume => resumeEvent.forTarget(this);
 
+  /// Stream of `start` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onstart')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onStart => startEvent.forTarget(this);
@@ -24590,6 +26417,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrack._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `cuechange` events to event
+   * handlers that are not necessarily instances of [TextTrack].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrack.cuechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
@@ -24642,6 +26475,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";
 
+  /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
   @DocsEditable()
   Stream<Event> get onCueChange => cueChangeEvent.forTarget(this);
@@ -24662,10 +26496,22 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackCue._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `enter` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.enterEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> enterEvent = const EventStreamProvider<Event>('enter');
 
+  /**
+   * Static factory designed to expose `exit` events to event
+   * handlers that are not necessarily instances of [TextTrackCue].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackCue.exitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
@@ -24802,10 +26648,12 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";
 
+  /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
   @DocsEditable()
   Stream<Event> get onEnter => enterEvent.forTarget(this);
 
+  /// Stream of `exit` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onexit')
   @DocsEditable()
   Stream<Event> get onExit => exitEvent.forTarget(this);
@@ -24899,6 +26747,12 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackList._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `addtrack` events to event
+   * handlers that are not necessarily instances of [TextTrackList].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('TextTrackList.addtrackEvent')
   @DocsEditable()
   static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');
@@ -24968,6 +26822,7 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";
 
+  /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
   @DocsEditable()
   Stream<TrackEvent> get onAddTrack => addTrackEvent.forTarget(this);
@@ -25626,13 +27481,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 MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_2(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_3(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_4(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -25863,18 +27718,42 @@
   // To suppress missing implicit constructor warnings.
   factory WebSocket._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.closeEvent')
   @DocsEditable()
   static const EventStreamProvider<CloseEvent> closeEvent = const EventStreamProvider<CloseEvent>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `open` events to event
+   * handlers that are not necessarily instances of [WebSocket].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WebSocket.openEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
@@ -26008,18 +27887,22 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
 
+  /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
   @DocsEditable()
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [WebSocket].
   @DomName('WebSocket.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [WebSocket].
   @DomName('WebSocket.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `open` events handled by this [WebSocket].
   @DomName('WebSocket.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(this);
@@ -26296,62 +28179,146 @@
   // To suppress missing implicit constructor warnings.
   factory Window._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `contentloaded` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
 
+  /**
+   * Static factory designed to expose `devicemotion` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.devicemotionEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
+  /**
+   * Static factory designed to expose `deviceorientation` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.deviceorientationEvent')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
+  /**
+   * Static factory designed to expose `hashchange` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.hashchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+  /**
+   * Static factory designed to expose `offline` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.offlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
 
+  /**
+   * Static factory designed to expose `online` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.onlineEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
 
+  /**
+   * Static factory designed to expose `pagehide` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pagehideEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageHideEvent = const EventStreamProvider<Event>('pagehide');
 
+  /**
+   * Static factory designed to expose `pageshow` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.pageshowEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');
 
+  /**
+   * Static factory designed to expose `popstate` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.popstateEvent')
   @DocsEditable()
   static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `storage` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.storageEvent')
   @DocsEditable()
   static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
+  /**
+   * Static factory designed to expose `animationend` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationEndEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26359,6 +28326,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
+  /**
+   * Static factory designed to expose `animationiteration` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationIterationEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26366,6 +28339,12 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
+  /**
+   * Static factory designed to expose `animationstart` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.webkitAnimationStartEvent')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26794,253 +28773,313 @@
   @DocsEditable()
   int _setTimeout(Object handler, int timeout) native "Window_setTimeout_Callback";
 
+  /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
   @DocsEditable()
   Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
 
+  /// Stream of `abort` events handled by this [Window].
   @DomName('Window.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => Element.abortEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [Window].
   @DomName('Window.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => Element.blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [Window].
   @DomName('Window.onchange')
   @DocsEditable()
   Stream<Event> get onChange => Element.changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [Window].
   @DomName('Window.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [Window].
   @DomName('Window.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [Window].
   @DomName('Window.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);
 
+  /// Stream of `devicemotion` events handled by this [Window].
   @DomName('Window.ondevicemotion')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
 
+  /// Stream of `deviceorientation` events handled by this [Window].
   @DomName('Window.ondeviceorientation')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
   Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [Window].
   @DomName('Window.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [Window].
   @DomName('Window.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [Window].
   @DomName('Window.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [Window].
   @DomName('Window.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [Window].
   @DomName('Window.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [Window].
   @DomName('Window.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [Window].
   @DomName('Window.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Window].
   @DomName('Window.onerror')
   @DocsEditable()
   Stream<Event> get onError => Element.errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [Window].
   @DomName('Window.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => Element.focusEvent.forTarget(this);
 
+  /// Stream of `hashchange` events handled by this [Window].
   @DomName('Window.onhashchange')
   @DocsEditable()
   Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [Window].
   @DomName('Window.oninput')
   @DocsEditable()
   Stream<Event> get onInput => Element.inputEvent.forTarget(this);
 
+  /// Stream of `invalid` events handled by this [Window].
   @DomName('Window.oninvalid')
   @DocsEditable()
   Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [Window].
   @DomName('Window.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [Window].
   @DomName('Window.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [Window].
   @DomName('Window.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [Window].
   @DomName('Window.onload')
   @DocsEditable()
   Stream<Event> get onLoad => Element.loadEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Window].
   @DomName('Window.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [Window].
   @DomName('Window.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [Window].
   @DomName('Window.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [Window].
   @DomName('Window.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [Window].
   @DomName('Window.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [Window].
   @DomName('Window.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [Window].
   @DomName('Window.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [Window].
   @DomName('Window.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [Window].
   @DomName('Window.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
 
+  /// Stream of `offline` events handled by this [Window].
   @DomName('Window.onoffline')
   @DocsEditable()
   Stream<Event> get onOffline => offlineEvent.forTarget(this);
 
+  /// Stream of `online` events handled by this [Window].
   @DomName('Window.ononline')
   @DocsEditable()
   Stream<Event> get onOnline => onlineEvent.forTarget(this);
 
+  /// Stream of `pagehide` events handled by this [Window].
   @DomName('Window.onpagehide')
   @DocsEditable()
   Stream<Event> get onPageHide => pageHideEvent.forTarget(this);
 
+  /// Stream of `pageshow` events handled by this [Window].
   @DomName('Window.onpageshow')
   @DocsEditable()
   Stream<Event> get onPageShow => pageShowEvent.forTarget(this);
 
+  /// Stream of `popstate` events handled by this [Window].
   @DomName('Window.onpopstate')
   @DocsEditable()
   Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [Window].
   @DomName('Window.onreset')
   @DocsEditable()
   Stream<Event> get onReset => Element.resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [Window].
   @DomName('Window.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [Window].
   @DomName('Window.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [Window].
   @DomName('Window.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [Window].
   @DomName('Window.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => Element.selectEvent.forTarget(this);
 
+  /// Stream of `storage` events handled by this [Window].
   @DomName('Window.onstorage')
   @DocsEditable()
   Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [Window].
   @DomName('Window.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);
 
+  /// Stream of `touchcancel` events handled by this [Window].
   @DomName('Window.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
 
+  /// Stream of `touchend` events handled by this [Window].
   @DomName('Window.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);
 
+  /// Stream of `touchmove` events handled by this [Window].
   @DomName('Window.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);
 
+  /// Stream of `touchstart` events handled by this [Window].
   @DomName('Window.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
   Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
 
+  /// Stream of `transitionend` events handled by this [Window].
   @DomName('Window.ontransitionend')
   @DocsEditable()
   Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [Window].
   @DomName('Window.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
 
+  /// Stream of `animationend` events handled by this [Window].
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
 
+  /// Stream of `animationiteration` events handled by this [Window].
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
 
+  /// Stream of `animationstart` events handled by this [Window].
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable()
   @Experimental()
   Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
 
 
+  /**
+   * Static factory designed to expose `beforeunload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.beforeunloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
+  /// Stream of `beforeunload` events handled by this [Window].
   @DomName('Window.onbeforeunload')
-  @DocsEditable()
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   void moveTo(Point p) {
@@ -27049,17 +29088,6 @@
 
 }
 
-class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
-  String _returnValue;
-
-  _BeforeUnloadEvent(Event base): super(base);
-
-  String get returnValue => _returnValue;
-
-  void set returnValue(String value) {
-    _returnValue = value;
-  }
-}
 
 class _BeforeUnloadEventStreamProvider implements
     EventStreamProvider<BeforeUnloadEvent> {
@@ -27068,15 +29096,8 @@
   const _BeforeUnloadEventStreamProvider(this._eventType);
 
   Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
-    var controller = new StreamController(sync: true);
     var stream = new _EventStream(e, _eventType, useCapture);
-    stream.listen((event) {
-      var wrapped = new _BeforeUnloadEvent(event);
-      controller.add(wrapped);
-      return wrapped.returnValue;
-    });
-
-    return controller.stream;
+    return stream;
   }
 
   String getEventType(EventTarget target) {
@@ -27127,11 +29148,23 @@
   // To suppress missing implicit constructor warnings.
   factory Worker._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `message` events to event
+   * handlers that are not necessarily instances of [Worker].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Worker.messageEvent')
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
@@ -27171,11 +29204,13 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Worker_removeEventListener_Callback";
 
+  /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `message` events handled by this [Worker].
   @DomName('Worker.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -27230,6 +29265,12 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [WorkerGlobalScope].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('WorkerGlobalScope.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27390,6 +29431,7 @@
   @Experimental() // untriaged
   int setTimeout(Object handler, int timeout) native "WorkerGlobalScope_setTimeout_Callback";
 
+  /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29273,6 +31315,54 @@
   factory _XMLHttpRequestProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
 }
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+  final Event wrapped;
+  _WrappedEvent(this.wrapped);
+
+  bool get bubbles => wrapped.bubbles;
+
+  bool get cancelable => wrapped.cancelable;
+
+  DataTransfer get clipboardData => wrapped.clipboardData;
+
+  EventTarget get currentTarget => wrapped.currentTarget;
+
+  bool get defaultPrevented => wrapped.defaultPrevented;
+
+  int get eventPhase => wrapped.eventPhase;
+
+  EventTarget get target => wrapped.target;
+
+  int get timeStamp => wrapped.timeStamp;
+
+  String get type => wrapped.type;
+
+  void _initEvent(String eventTypeArg, bool canBubbleArg,
+      bool cancelableArg) {
+    throw new UnsupportedError(
+        'Cannot initialize this Event.');
+  }
+
+  void preventDefault() {
+    wrapped.preventDefault();
+  }
+
+  void stopImmediatePropagation() {
+    wrapped.stopImmediatePropagation();
+  }
+
+  void stopPropagation() {
+    wrapped.stopPropagation();
+  }
+}
 // 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.
@@ -33474,54 +35564,6 @@
 
 
 /**
- * Helper class to implement custom events which wrap DOM events.
- */
-class _WrappedEvent implements Event {
-  final Event wrapped;
-  _WrappedEvent(this.wrapped);
-
-  bool get bubbles => wrapped.bubbles;
-
-  bool get cancelable => wrapped.cancelable;
-
-  DataTransfer get clipboardData => wrapped.clipboardData;
-
-  EventTarget get currentTarget => wrapped.currentTarget;
-
-  bool get defaultPrevented => wrapped.defaultPrevented;
-
-  int get eventPhase => wrapped.eventPhase;
-
-  EventTarget get target => wrapped.target;
-
-  int get timeStamp => wrapped.timeStamp;
-
-  String get type => wrapped.type;
-
-  void _initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError(
-        'Cannot initialize this Event.');
-  }
-
-  void preventDefault() {
-    wrapped.preventDefault();
-  }
-
-  void stopImmediatePropagation() {
-    wrapped.stopImmediatePropagation();
-  }
-
-  void stopPropagation() {
-    wrapped.stopPropagation();
-  }
-}
-// 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.
-
-
-/**
  * A list which just wraps another list, for either intercepting list calls or
  * retyping the list (for example, from List<A> to List<B> where B extends A).
  */
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index e5d187f..1068f9c 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -385,20 +385,44 @@
   // To suppress missing implicit constructor warnings.
   factory Database._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.closeEvent')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `versionchange` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.versionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = const EventStreamProvider<VersionChangeEvent>('versionchange');
@@ -445,20 +469,24 @@
   @DocsEditable()
   void deleteObjectStore(String name) native;
 
+  /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Database].
   @DomName('IDBDatabase.onclose')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Database].
   @DomName('IDBDatabase.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `versionchange` events handled by this [Database].
   @DomName('IDBDatabase.onversionchange')
   @DocsEditable()
   Stream<VersionChangeEvent> get onVersionChange => versionChangeEvent.forTarget(this);
@@ -1163,18 +1191,32 @@
   // To suppress missing implicit constructor warnings.
   factory OpenDBRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blocked` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.blockedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
 
+  /**
+   * Static factory designed to expose `upgradeneeded` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.upgradeneededEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
+  /// Stream of `blocked` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onblocked')
   @DocsEditable()
   Stream<Event> get onBlocked => blockedEvent.forTarget(this);
 
+  /// Stream of `upgradeneeded` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onupgradeneeded')
   @DocsEditable()
   Stream<VersionChangeEvent> get onUpgradeNeeded => upgradeNeededEvent.forTarget(this);
@@ -1191,10 +1233,22 @@
   // To suppress missing implicit constructor warnings.
   factory Request._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `success` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.successEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
@@ -1225,10 +1279,12 @@
   @DocsEditable()
   final Transaction transaction;
 
+  /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `success` events handled by this [Request].
   @DomName('IDBRequest.onsuccess')
   @DocsEditable()
   Stream<Event> get onSuccess => successEvent.forTarget(this);
@@ -1273,14 +1329,32 @@
   // To suppress missing implicit constructor warnings.
   factory Transaction._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
@@ -1305,14 +1379,17 @@
   @DocsEditable()
   ObjectStore objectStore(String name) native;
 
+  /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `complete` events handled by this [Transaction].
   @DomName('IDBTransaction.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Transaction].
   @DomName('IDBTransaction.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 33a79bd..ae72ed0 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -151,20 +151,44 @@
   // To suppress missing implicit constructor warnings.
   factory Database._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `close` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.closeEvent')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `versionchange` events to event
+   * handlers that are not necessarily instances of [Database].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBDatabase.versionchangeEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = const EventStreamProvider<VersionChangeEvent>('versionchange');
@@ -236,20 +260,24 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `close` events handled by this [Database].
   @DomName('IDBDatabase.onclose')
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
   Stream<Event> get onClose => closeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Database].
   @DomName('IDBDatabase.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `versionchange` events handled by this [Database].
   @DomName('IDBDatabase.onversionchange')
   @DocsEditable()
   Stream<VersionChangeEvent> get onVersionChange => versionChangeEvent.forTarget(this);
@@ -841,18 +869,32 @@
   // To suppress missing implicit constructor warnings.
   factory OpenDBRequest._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `blocked` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.blockedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
 
+  /**
+   * Static factory designed to expose `upgradeneeded` events to event
+   * handlers that are not necessarily instances of [OpenDBRequest].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBOpenDBRequest.upgradeneededEvent')
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
+  /// Stream of `blocked` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onblocked')
   @DocsEditable()
   Stream<Event> get onBlocked => blockedEvent.forTarget(this);
 
+  /// Stream of `upgradeneeded` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onupgradeneeded')
   @DocsEditable()
   Stream<VersionChangeEvent> get onUpgradeNeeded => upgradeNeededEvent.forTarget(this);
@@ -872,10 +914,22 @@
   // To suppress missing implicit constructor warnings.
   factory Request._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `success` events to event
+   * handlers that are not necessarily instances of [Request].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBRequest.successEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
@@ -912,10 +966,12 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_removeEventListener_Callback";
 
+  /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `success` events handled by this [Request].
   @DomName('IDBRequest.onsuccess')
   @DocsEditable()
   Stream<Event> get onSuccess => successEvent.forTarget(this);
@@ -961,14 +1017,32 @@
   // To suppress missing implicit constructor warnings.
   factory Transaction._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [Transaction].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('IDBTransaction.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
@@ -1005,14 +1079,17 @@
   @DocsEditable()
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `complete` events handled by this [Transaction].
   @DomName('IDBTransaction.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [Transaction].
   @DomName('IDBTransaction.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 1d51c92..d599314 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -708,174 +708,426 @@
   // To suppress missing implicit constructor warnings.
   factory ElementInstance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * Static factory designed to expose `drag` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * Static factory designed to expose `dragend` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * Static factory designed to expose `dragenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * Static factory designed to expose `dragleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * Static factory designed to expose `dragover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * Static factory designed to expose `dragstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * Static factory designed to expose `drop` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
 
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousewheelEvent')
   @DocsEditable()
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -914,174 +1166,216 @@
   @DocsEditable()
   final ElementInstance previousSibling;
 
+  /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onchange')
   @DocsEditable()
   Stream<Event> get onChange => changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncut')
   @DocsEditable()
   Stream<Event> get onCut => cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oninput')
   @DocsEditable()
   Stream<Event> get onInput => inputEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onload')
   @DocsEditable()
   Stream<Event> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => pasteEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onreset')
   @DocsEditable()
   Stream<Event> get onReset => resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => selectEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => submitEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 7e348f0..b6cb36e 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -792,174 +792,426 @@
   // To suppress missing implicit constructor warnings.
   factory ElementInstance._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `abort` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.abortEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  /**
+   * Static factory designed to expose `beforecopy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecopyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
 
+  /**
+   * Static factory designed to expose `beforecut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforecutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
 
+  /**
+   * Static factory designed to expose `beforepaste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.beforepasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
 
+  /**
+   * Static factory designed to expose `blur` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.blurEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
 
+  /**
+   * Static factory designed to expose `change` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.changeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+  /**
+   * Static factory designed to expose `click` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.clickEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
 
+  /**
+   * Static factory designed to expose `contextmenu` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.contextmenuEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
 
+  /**
+   * Static factory designed to expose `copy` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.copyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
 
+  /**
+   * Static factory designed to expose `cut` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.cutEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
 
+  /**
+   * Static factory designed to expose `doubleclick` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dblclickEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
 
+  /**
+   * Static factory designed to expose `drag` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
 
+  /**
+   * Static factory designed to expose `dragend` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragendEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
 
+  /**
+   * Static factory designed to expose `dragenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragenterEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
 
+  /**
+   * Static factory designed to expose `dragleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragleaveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
 
+  /**
+   * Static factory designed to expose `dragover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
 
+  /**
+   * Static factory designed to expose `dragstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dragstartEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
 
+  /**
+   * Static factory designed to expose `drop` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.dropEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
 
+  /**
+   * Static factory designed to expose `error` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+  /**
+   * Static factory designed to expose `focus` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.focusEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
 
+  /**
+   * Static factory designed to expose `input` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.inputEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
 
+  /**
+   * Static factory designed to expose `keydown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keydownEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
 
+  /**
+   * Static factory designed to expose `keypress` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keypressEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
 
+  /**
+   * Static factory designed to expose `keyup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.keyupEvent')
   @DocsEditable()
   static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
 
+  /**
+   * Static factory designed to expose `load` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.loadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
 
+  /**
+   * Static factory designed to expose `mousedown` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousedownEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  /**
+   * Static factory designed to expose `mouseenter` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
 
+  /**
+   * Static factory designed to expose `mouseleave` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
 
+  /**
+   * Static factory designed to expose `mousemove` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
 
+  /**
+   * Static factory designed to expose `mouseout` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoutEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
 
+  /**
+   * Static factory designed to expose `mouseover` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseoverEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
 
+  /**
+   * Static factory designed to expose `mouseup` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mouseupEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
 
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.mousewheelEvent')
   @DocsEditable()
   static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
 
+  /**
+   * Static factory designed to expose `paste` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.pasteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
 
+  /**
+   * Static factory designed to expose `reset` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resetEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
 
+  /**
+   * Static factory designed to expose `resize` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.resizeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
 
+  /**
+   * Static factory designed to expose `scroll` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.scrollEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
 
+  /**
+   * Static factory designed to expose `search` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.searchEvent')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
 
+  /**
+   * Static factory designed to expose `select` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
 
+  /**
+   * Static factory designed to expose `selectstart` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.selectstartEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
 
+  /**
+   * Static factory designed to expose `submit` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.submitEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
 
+  /**
+   * Static factory designed to expose `unload` events to event
+   * handlers that are not necessarily instances of [ElementInstance].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('SVGElementInstance.unloadEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
@@ -1011,174 +1263,216 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SVGElementInstance_removeEventListener_Callback";
 
+  /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  /// Stream of `beforecopy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecopy')
   @DocsEditable()
   Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
 
+  /// Stream of `beforecut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforecut')
   @DocsEditable()
   Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
 
+  /// Stream of `beforepaste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onbeforepaste')
   @DocsEditable()
   Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
 
+  /// Stream of `blur` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onblur')
   @DocsEditable()
   Stream<Event> get onBlur => blurEvent.forTarget(this);
 
+  /// Stream of `change` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onchange')
   @DocsEditable()
   Stream<Event> get onChange => changeEvent.forTarget(this);
 
+  /// Stream of `click` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onclick')
   @DocsEditable()
   Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
 
+  /// Stream of `contextmenu` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncontextmenu')
   @DocsEditable()
   Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
 
+  /// Stream of `copy` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncopy')
   @DocsEditable()
   Stream<Event> get onCopy => copyEvent.forTarget(this);
 
+  /// Stream of `cut` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oncut')
   @DocsEditable()
   Stream<Event> get onCut => cutEvent.forTarget(this);
 
+  /// Stream of `doubleclick` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondblclick')
   @DocsEditable()
   Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
 
+  /// Stream of `drag` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrag')
   @DocsEditable()
   Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
 
+  /// Stream of `dragend` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragend')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
 
+  /// Stream of `dragenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragenter')
   @DocsEditable()
   Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
 
+  /// Stream of `dragleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragleave')
   @DocsEditable()
   Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
 
+  /// Stream of `dragover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragover')
   @DocsEditable()
   Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
 
+  /// Stream of `dragstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondragstart')
   @DocsEditable()
   Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
 
+  /// Stream of `drop` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.ondrop')
   @DocsEditable()
   Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
 
+  /// Stream of `error` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
+  /// Stream of `focus` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onfocus')
   @DocsEditable()
   Stream<Event> get onFocus => focusEvent.forTarget(this);
 
+  /// Stream of `input` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.oninput')
   @DocsEditable()
   Stream<Event> get onInput => inputEvent.forTarget(this);
 
+  /// Stream of `keydown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeydown')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
 
+  /// Stream of `keypress` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeypress')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
 
+  /// Stream of `keyup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onkeyup')
   @DocsEditable()
   Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
 
+  /// Stream of `load` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onload')
   @DocsEditable()
   Stream<Event> get onLoad => loadEvent.forTarget(this);
 
+  /// Stream of `mousedown` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousedown')
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
 
+  /// Stream of `mouseenter` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
 
+  /// Stream of `mouseleave` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
   Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
 
+  /// Stream of `mousemove` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
 
+  /// Stream of `mouseout` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseout')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
 
+  /// Stream of `mouseover` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseover')
   @DocsEditable()
   Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
 
+  /// Stream of `mouseup` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmouseup')
   @DocsEditable()
   Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
 
+  /// Stream of `mousewheel` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onmousewheel')
   @DocsEditable()
   Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
 
+  /// Stream of `paste` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onpaste')
   @DocsEditable()
   Stream<Event> get onPaste => pasteEvent.forTarget(this);
 
+  /// Stream of `reset` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onreset')
   @DocsEditable()
   Stream<Event> get onReset => resetEvent.forTarget(this);
 
+  /// Stream of `resize` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onresize')
   @DocsEditable()
   Stream<Event> get onResize => resizeEvent.forTarget(this);
 
+  /// Stream of `scroll` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onscroll')
   @DocsEditable()
   Stream<Event> get onScroll => scrollEvent.forTarget(this);
 
+  /// Stream of `search` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
   Stream<Event> get onSearch => searchEvent.forTarget(this);
 
+  /// Stream of `select` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselect')
   @DocsEditable()
   Stream<Event> get onSelect => selectEvent.forTarget(this);
 
+  /// Stream of `selectstart` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onselectstart')
   @DocsEditable()
   Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
 
+  /// Stream of `submit` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onsubmit')
   @DocsEditable()
   Stream<Event> get onSubmit => submitEvent.forTarget(this);
 
+  /// Stream of `unload` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onunload')
   @DocsEditable()
   Stream<Event> get onUnload => unloadEvent.forTarget(this);
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 2caaa64..4556a90 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -154,6 +154,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [AudioBufferSourceNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioBufferSourceNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -215,6 +221,7 @@
   @DocsEditable()
   void noteOn(num when) native;
 
+  /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -233,6 +240,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [AudioContext].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioContext.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
@@ -362,6 +375,7 @@
   @DocsEditable()
   void startRendering() native;
 
+  /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
@@ -884,6 +898,12 @@
   // To suppress missing implicit constructor warnings.
   factory OscillatorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [OscillatorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('OscillatorNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -942,6 +962,7 @@
   @DocsEditable()
   void stop(num when) native;
 
+  /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1029,6 +1050,12 @@
   // To suppress missing implicit constructor warnings.
   factory ScriptProcessorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioprocess` events to event
+   * handlers that are not necessarily instances of [ScriptProcessorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ScriptProcessorNode.audioprocessEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1038,7 +1065,8 @@
   @DocsEditable()
   final int bufferSize;
 
-  /**
+  /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
+/**
    * Get a Stream that fires events when AudioProcessingEvents occur.
    * This particular stream is special in that it only allows one listener to a
    * given stream. Converting the returned Stream [asBroadcast] will likely ruin
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index e5cc155..5157bc3 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -147,6 +147,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [AudioBufferSourceNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioBufferSourceNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -250,6 +256,7 @@
   @DocsEditable()
   void stop(num when) native "AudioBufferSourceNode_stop_Callback";
 
+  /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -268,6 +275,12 @@
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `complete` events to event
+   * handlers that are not necessarily instances of [AudioContext].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('AudioContext.completeEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
@@ -474,6 +487,7 @@
   @Experimental() // untriaged
   void removeEventListener(String type, EventListener listener, [bool useCapture]) native "AudioContext_removeEventListener_Callback";
 
+  /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
@@ -1084,6 +1098,12 @@
   // To suppress missing implicit constructor warnings.
   factory OscillatorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `ended` events to event
+   * handlers that are not necessarily instances of [OscillatorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('OscillatorNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1146,6 +1166,7 @@
   @DocsEditable()
   void stop(num when) native "OscillatorNode_stop_Callback";
 
+  /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1274,6 +1295,12 @@
   // To suppress missing implicit constructor warnings.
   factory ScriptProcessorNode._() { throw new UnsupportedError("Not supported"); }
 
+  /**
+   * Static factory designed to expose `audioprocess` events to event
+   * handlers that are not necessarily instances of [ScriptProcessorNode].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('ScriptProcessorNode.audioprocessEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1288,7 +1315,8 @@
   @Experimental() // non-standard
   void _setEventListener(EventListener eventListener) native "ScriptProcessorNode__setEventListener_Callback";
 
-  /**
+  /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
+/**
    * Get a Stream that fires events when AudioProcessingEvents occur.
    * This particular stream is special in that it only allows one listener to a
    * given stream. Converting the returned Stream [asBroadcast] will likely ruin
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index da0374b..99b4ee0 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+
 # invalid argument for constant constructor
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t02: fail
 
@@ -15,6 +16,22 @@
 # 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
+
+# TBF: when we override "foo([x = 0]) {}" with "foo([x]) {}" we should report warning - different default value
+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"
@@ -71,13 +88,6 @@
 # co19 issue #623: main() { {}; } is block and empty statement, not a map
 Language/13_Statements/02_Expression_Statements_A01_t13: Fail, OK
 
-# co19 issue #650: two argument shuffles have been refactored.
-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
-
 # co19 issue #626: StreamTransformers have been refactored.
 LibTest/async/EventTransformStream/EventTransformStream_A01_t01: Fail
 LibTest/async/EventTransformStream/EventTransformStream_A01_t02: Fail
@@ -234,28 +244,23 @@
 
 Language/13_Statements/09_Switch_A02_t04: Fail  # Issue 629
 
-Language/12_Expressions/05_Strings_A20_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/collection/ListQueue/ListQueue_class_A01_t01: Fail # co19-roll r623: Please triage this failure
-LibTest/collection/Queue/Queue_class_A01_t01: Fail # co19-roll r623: Please triage this failure
 
-Language/13_Statements/04_Local_Function_Declaration_A04_t02: Fail # co19-roll r641: Please triage this failure
 
-Language/06_Functions/06_Functions_A04_t01: MissingStaticWarning
-Language/07_Classes/1_Instance_Methods_A04_t02: MissingStaticWarning
-Language/07_Classes/1_Instance_Methods_A07_t01: MissingStaticWarning
-Language/07_Classes/1_Instance_Methods_A07_t02: MissingStaticWarning
-Language/07_Classes/4_Abstract_Instance_Members_A07_t04: MissingStaticWarning
-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 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/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A06_t06: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A07_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t02: MissingStaticWarning
-Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A04_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
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 4a6e5a3..726f14e 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -29,10 +29,6 @@
 #
 
 
-# test issue 10683, It is a compile-time error if e refers to the name v or the name v=.
-block_scope_test: fail
-lazy_static3_test: fail
-
 # test issue 11124, It is warning, not error to don't initialize final field
 field3a_negative_test: Fail # Issue 11124
 final_syntax_test/01: Fail # Issue 11124
@@ -161,18 +157,9 @@
 bailout3_test: fail # test issue 14289
 prefix9_test: fail # test issue 14289
 
-# test issue 14358, E does not implement inherited A.+
-type_promotion_closure_test/01: Fail
-type_promotion_closure_test/02: Fail
-
 # test issue 14363, "if ((a is B))" has the same effect as "if (a is B)", so no static warning expected
 type_promotion_parameter_test/53: Fail
 
-# test issue 14364, "E<A> << D"
-type_promotion_more_specific_test/09: Fail
-type_promotion_more_specific_test/10: Fail
-type_promotion_more_specific_test/11: Fail
-
 # test issue 14410, "typedef C = " is now really illegal syntax
 mixin_illegal_syntax_test/none: fail
 
@@ -184,7 +171,6 @@
 application_negative_test: CompileTimeError
 bad_constructor_test/05: CompileTimeError
 bad_initializer1_negative_test: CompileTimeError
-bad_initializer2_negative_test: CompileTimeError
 bad_named_constructor_negative_test: CompileTimeError
 bad_named_parameters2_test: StaticWarning
 bad_named_parameters_test: StaticWarning
@@ -454,8 +440,6 @@
 try_catch5_test: StaticWarning
 type_argument_in_super_type_test: StaticWarning
 typed_selector2_test: StaticWarning
-type_variable_bounds2_test/05: StaticWarning
-type_variable_bounds3_test/00: StaticWarning
 type_variable_identifier_expression_test: StaticWarning
 type_variable_scope2_test: StaticWarning
 unary_plus_negative_test: CompileTimeError
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 22712a8..84c66b4 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -2,10 +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.
 
+[ $compiler == dart2analyzer ]
+lib: Skip # Slow like a hell - timeouts.
+
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-lib/core/bool: CompileTimeError
-lib/core/int: CompileTimeError
-lib/core/string: CompileTimeError
+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
diff --git a/tools/VERSION b/tools/VERSION
index b4cf83b..8ce1702 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 8
 BUILD 10
-PATCH 0
+PATCH 1
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 82c6737..00cf4d1 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -1,5 +1,112 @@
 {
   "dart.dom.html": {
+    "AbstractWorker": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [AbstractWorker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [AbstractWorker]."
+        ]
+      }
+    },
+    "ApplicationCache": {
+      "members": {
+        "cachedEvent": [
+          "/**",
+          "   * Static factory designed to expose `cached` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "checkingEvent": [
+          "/**",
+          "   * Static factory designed to expose `checking` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "downloadingEvent": [
+          "/**",
+          "   * Static factory designed to expose `downloading` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "noupdateEvent": [
+          "/**",
+          "   * Static factory designed to expose `noupdate` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "obsoleteEvent": [
+          "/**",
+          "   * Static factory designed to expose `obsolete` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncached": [
+          "/// Stream of `cached` events handled by this [ApplicationCache]."
+        ],
+        "onchecking": [
+          "/// Stream of `checking` events handled by this [ApplicationCache]."
+        ],
+        "ondownloading": [
+          "/// Stream of `downloading` events handled by this [ApplicationCache]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [ApplicationCache]."
+        ],
+        "onnoupdate": [
+          "/// Stream of `noupdate` events handled by this [ApplicationCache]."
+        ],
+        "onobsolete": [
+          "/// Stream of `obsolete` events handled by this [ApplicationCache]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [ApplicationCache]."
+        ],
+        "onupdateready": [
+          "/// Stream of `updateready` events handled by this [ApplicationCache]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "updatereadyEvent": [
+          "/**",
+          "   * Static factory designed to expose `updateready` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
     "CanvasGradient": {
       "comment": [
         "/**",
@@ -114,6 +221,21 @@
         ]
       }
     },
+    "DedicatedWorkerGlobalScope": {
+      "members": {
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [DedicatedWorkerGlobalScope]."
+        ]
+      }
+    },
     "Document": {
       "comment": [
         "/**",
@@ -127,6 +249,162 @@
         " */"
       ],
       "members": {
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Document]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [Document]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [Document]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [Document]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Document]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Document]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Document]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Document]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [Document]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [Document]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Document]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [Document]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [Document]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [Document]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [Document]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [Document]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [Document]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [Document]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Document]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Document]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Document]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Document]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Document]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Document]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Document]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Document]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Document]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Document]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Document]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Document]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Document]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Document]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Document]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Document]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [Document]."
+        ],
+        "onreadystatechange": [
+          "/// Stream of `readystatechange` events handled by this [Document]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Document]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Document]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Document]."
+        ],
+        "onsecuritypolicyviolation": [
+          "/// Stream of `securitypolicyviolation` events handled by this [Document]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Document]."
+        ],
+        "onselectionchange": [
+          "/// Stream of `selectionchange` events handled by this [Document]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [Document]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Document]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Document]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Document]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Document]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Document]."
+        ],
+        "onwebkitfullscreenchange": [
+          "/// Stream of `fullscreenchange` events handled by this [Document]."
+        ],
+        "onwebkitfullscreenerror": [
+          "/// Stream of `fullscreenerror` events handled by this [Document]."
+        ],
+        "onwebkitpointerlockchange": [
+          "/// Stream of `pointerlockchange` events handled by this [Document]."
+        ],
+        "onwebkitpointerlockerror": [
+          "/// Stream of `pointerlockerror` events handled by this [Document]."
+        ],
         "querySelector": [
           "/**",
           "   * Finds the first descendant element of this document that matches the",
@@ -144,6 +422,46 @@
           "   * For details about CSS selector syntax, see the",
           "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
           "   */"
+        ],
+        "readystatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `readystatechange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "securitypolicyviolationEvent": [
+          "/**",
+          "   * Static factory designed to expose `securitypolicyviolation` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectionchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectionchange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitpointerlockchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `pointerlockchange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitpointerlockerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `pointerlockerror` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
         ]
       }
     },
@@ -154,6 +472,658 @@
         " */"
       ],
       "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecopyEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecopy` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecutEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecut` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforepasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforepaste` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "changeEvent": [
+          "/**",
+          "   * Static factory designed to expose `change` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "contextmenuEvent": [
+          "/**",
+          "   * Static factory designed to expose `contextmenu` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "copyEvent": [
+          "/**",
+          "   * Static factory designed to expose `copy` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "cutEvent": [
+          "/**",
+          "   * Static factory designed to expose `cut` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dblclickEvent": [
+          "/**",
+          "   * Static factory designed to expose `doubleclick` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragendEvent": [
+          "/**",
+          "   * A stream of `dragend` events fired when an element completes a drag",
+          "   * operation.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragenterEvent": [
+          "/**",
+          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
+          "   * over an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragEvent": [
+          "/**",
+          "   * A stream of `drag` events fired when an element is currently being dragged.",
+          "   *",
+          "   * A `drag` event is added to this stream as soon as the drag begins.",
+          "   * A `drag` event is also added to this stream at intervals while the drag",
+          "   * operation is still ongoing.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "draggable": [
+          "/**",
+          "   * Indicates whether the element can be dragged and dropped.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragleaveEvent": [
+          "/**",
+          "   * A stream of `dragleave` events fired when an object being dragged over an",
+          "   * element leaves the element's target area.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragoverEvent": [
+          "/**",
+          "   * A stream of `dragover` events fired when a dragged object is currently",
+          "   * being dragged over an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dragstartEvent": [
+          "/**",
+          "   * A stream of `dragstart` events for a dragged element whose drag has begun.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "dropEvent": [
+          "/**",
+          "   * A stream of `drop` events fired when a dragged object is dropped on an",
+          "   * element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "getBoundingClientRect": [
+          "/**",
+          "   * The smallest bounding rectangle that encompasses this element's padding,",
+          "   * scrollbar, and border.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Element.getBoundingClientRect]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)",
+          "   * from MDN.",
+          "   * * [The getBoundingClientRect() method]",
+          "   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.",
+          "   */"
+        ],
+        "getClientRects": [
+          "/**",
+          "   * A list of bounding rectangles for each box associated with this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Element.getClientRects]",
+          "   * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)",
+          "   * from MDN.",
+          "   * * [The getClientRects() method]",
+          "   * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods) from W3C.",
+          "   */"
+        ],
+        "hidden": [
+          "/**",
+          "   * Indicates whether the element is not relevant to the page's current state.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Hidden attribute specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#the-hidden-attribute)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "inputEvent": [
+          "/**",
+          "   * Static factory designed to expose `input` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "inputMethodContext": [
+          "/**",
+          "   * The current state of IME composition.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Input method editor specification]",
+          "   * (http://www.w3.org/TR/ime-api/) from W3C.",
+          "   */"
+        ],
+        "invalidEvent": [
+          "/**",
+          "   * Static factory designed to expose `invalid` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keydownEvent": [
+          "/**",
+          "   * Static factory designed to expose `keydown` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keypressEvent": [
+          "/**",
+          "   * Static factory designed to expose `keypress` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keyupEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyup` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousedownEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousedown` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseenter` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseleave` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousemoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousemove` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseout` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseover` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseupEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseup` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Element]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [Element]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [Element]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [Element]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Element]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Element]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Element]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Element]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [Element]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [Element]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Element]."
+        ],
+        "ondrag": [
+          "/**",
+          "   * A stream of `drag` events fired when this element currently being dragged.",
+          "   *",
+          "   * A `drag` event is added to this stream as soon as the drag begins.",
+          "   * A `drag` event is also added to this stream at intervals while the drag",
+          "   * operation is still ongoing.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragend": [
+          "/**",
+          "   * A stream of `dragend` events fired when this element completes a drag",
+          "   * operation.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragenter": [
+          "/**",
+          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
+          "   * over this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragleave": [
+          "/**",
+          "   * A stream of `dragleave` events fired when an object being dragged over this",
+          "   * element leaves this element's target area.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragover": [
+          "/**",
+          "   * A stream of `dragover` events fired when a dragged object is currently",
+          "   * being dragged over this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondragstart": [
+          "/**",
+          "   * A stream of `dragstart` events fired when this element starts being",
+          "   * dragged.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "ondrop": [
+          "/**",
+          "   * A stream of `drop` events fired when a dragged object is dropped on this",
+          "   * element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Element]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Element]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Element]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Element]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Element]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Element]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Element]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Element]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Element]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Element]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Element]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Element]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Element]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Element]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Element]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Element]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [Element]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Element]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Element]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Element]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Element]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [Element]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Element]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Element]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Element]."
+        ],
+        "ontouchenter": [
+          "/// Stream of `touchenter` events handled by this [Element]."
+        ],
+        "ontouchleave": [
+          "/// Stream of `touchleave` events handled by this [Element]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Element]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Element]."
+        ],
+        "ontransitionend": [
+          "/// Stream of `transitionend` events handled by this [Element]."
+        ],
+        "onwebkitfullscreenchange": [
+          "/// Stream of `fullscreenchange` events handled by this [Element]."
+        ],
+        "onwebkitfullscreenerror": [
+          "/// Stream of `fullscreenerror` events handled by this [Element]."
+        ],
+        "pasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `paste` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "pseudo": [
+          "/**",
+          "   * The name of this element's custom pseudo-element.",
+          "   *",
+          "   * This value must begin with an x and a hyphen, `x-`, to be considered valid.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Using custom pseudo elements]",
+          "   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)",
+          "   * from HTML5Rocks.",
+          "   * * [Custom pseudo-elements]",
+          "   * (http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements) from W3C.",
+          "   */"
+        ],
         "querySelector": [
           "/**",
           "   * Finds the first descendant element of this element that matches the",
@@ -172,6 +1142,341 @@
           "   *",
           "   * * [CSS Selectors](http://docs.webplatform.org/wiki/css/selectors)",
           "   */"
+        ],
+        "resetEvent": [
+          "/**",
+          "   * Static factory designed to expose `reset` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "scrollEvent": [
+          "/**",
+          "   * Static factory designed to expose `scroll` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "searchEvent": [
+          "/**",
+          "   * Static factory designed to expose `search` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectEvent": [
+          "/**",
+          "   * Static factory designed to expose `select` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectstart` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "submitEvent": [
+          "/**",
+          "   * Static factory designed to expose `submit` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchcancelEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchcancel` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchendEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchend` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchenter` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchleave` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchmoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchmove` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchstart` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "translate": [
+          "/**",
+          "   * Specifies whether this element's text content changes when the page is",
+          "   * localized.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The translate attribute]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "webkitdropzone": [
+          "/**",
+          "   * A set of space-separated keywords that specify what kind of data this",
+          "   * Element accepts on drop and what to do with that data.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop sample]",
+          "   * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)",
+          "   * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   * from HTML5Rocks.",
+          "   * * [Drag and drop specification]",
+          "   * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)",
+          "   * from WHATWG.",
+          "   */"
+        ],
+        "webkitfullscreenchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `fullscreenchange` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitfullscreenerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `fullscreenerror` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitRegionOverset": [
+          "/**",
+          "   * The current state of this region.",
+          "   *",
+          "   * If `\"empty\"`, then there is no content in this region.",
+          "   * If `\"fit\"`, then content fits into this region, and more content can be",
+          "   * added. If `\"overset\"`, then there is more content than can be fit into this",
+          "   * region.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [CSS regions and exclusions tutorial]",
+          "   * (http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.",
+          "   * * [Regions](http://html.adobe.com/webplatform/layout/regions/) from Adobe.",
+          "   * * [CSS regions specification]",
+          "   * (http://www.w3.org/TR/css3-regions/) from W3C.",
+          "   */"
+        ]
+      }
+    },
+    "EventSource": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [EventSource]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [EventSource]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [EventSource]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "FileReader": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadendEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadend` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [FileReader]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [FileReader]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [FileReader]."
+        ],
+        "onloadend": [
+          "/// Stream of `loadend` events handled by this [FileReader]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [FileReader]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [FileReader]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "FileWriter": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [FileWriter]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [FileWriter]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [FileWriter]."
+        ],
+        "onwrite": [
+          "/// Stream of `write` events handled by this [FileWriter]."
+        ],
+        "onwriteend": [
+          "/// Stream of `writeend` events handled by this [FileWriter]."
+        ],
+        "onwritestart": [
+          "/// Stream of `writestart` events handled by this [FileWriter]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writeendEvent": [
+          "/**",
+          "   * Static factory designed to expose `writeend` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writeEvent": [
+          "/**",
+          "   * Static factory designed to expose `write` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writestartEvent": [
+          "/**",
+          "   * Static factory designed to expose `writestart` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
         ]
       }
     },
@@ -189,11 +1494,169 @@
         " */"
       ]
     },
+    "HTMLBodyElement": {
+      "members": {
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "hashchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `hashchange` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "offlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `offline` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [BodyElement]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [BodyElement]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [BodyElement]."
+        ],
+        "onhashchange": [
+          "/// Stream of `hashchange` events handled by this [BodyElement]."
+        ],
+        "onlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `online` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [BodyElement]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [BodyElement]."
+        ],
+        "onoffline": [
+          "/// Stream of `offline` events handled by this [BodyElement]."
+        ],
+        "ononline": [
+          "/// Stream of `online` events handled by this [BodyElement]."
+        ],
+        "onpopstate": [
+          "/// Stream of `popstate` events handled by this [BodyElement]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [BodyElement]."
+        ],
+        "onstorage": [
+          "/// Stream of `storage` events handled by this [BodyElement]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [BodyElement]."
+        ],
+        "popstateEvent": [
+          "/**",
+          "   * Static factory designed to expose `popstate` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "storageEvent": [
+          "/**",
+          "   * Static factory designed to expose `storage` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
     "HTMLCanvasElement": {
       "members": {
         "height": [
           "/// The height of this canvas element in CSS pixels."
         ],
+        "onwebglcontextlost": [
+          "/// Stream of `webglcontextlost` events handled by this [CanvasElement]."
+        ],
+        "onwebglcontextrestored": [
+          "/// Stream of `webglcontextrestored` events handled by this [CanvasElement]."
+        ],
+        "webglcontextlostEvent": [
+          "/**",
+          "   * Static factory designed to expose `webglcontextlost` events to event",
+          "   * handlers that are not necessarily instances of [CanvasElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webglcontextrestoredEvent": [
+          "/**",
+          "   * Static factory designed to expose `webglcontextrestored` events to event",
+          "   * handlers that are not necessarily instances of [CanvasElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "width": [
           "/// The width of this canvas element in CSS pixels."
         ]
@@ -225,6 +1688,32 @@
         " */"
       ]
     },
+    "HTMLFormElement": {
+      "members": {
+        "autocompleteerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `autocompleteerror` events to event",
+          "   * handlers that are not necessarily instances of [FormElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "autocompleteEvent": [
+          "/**",
+          "   * Static factory designed to expose `autocomplete` events to event",
+          "   * handlers that are not necessarily instances of [FormElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onautocomplete": [
+          "/// Stream of `autocomplete` events handled by this [FormElement]."
+        ],
+        "onautocompleteerror": [
+          "/// Stream of `autocompleteerror` events handled by this [FormElement]."
+        ]
+      }
+    },
     "HTMLHRElement": {
       "comment": [
         "/**",
@@ -232,6 +1721,300 @@
         " */"
       ]
     },
+    "HTMLInputElement": {
+      "members": {
+        "onwebkitSpeechChange": [
+          "/// Stream of `speechchange` events handled by this [InputElement]."
+        ],
+        "webkitSpeechChangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechchange` events to event",
+          "   * handlers that are not necessarily instances of [InputElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "HTMLMediaElement": {
+      "members": {
+        "canplayEvent": [
+          "/**",
+          "   * Static factory designed to expose `canplay` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "canplaythroughEvent": [
+          "/**",
+          "   * Static factory designed to expose `canplaythrough` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "durationchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `durationchange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "emptiedEvent": [
+          "/**",
+          "   * Static factory designed to expose `emptied` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadeddataEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadeddata` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadedmetadataEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadedmetadata` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncanplay": [
+          "/// Stream of `canplay` events handled by this [MediaElement]."
+        ],
+        "oncanplaythrough": [
+          "/// Stream of `canplaythrough` events handled by this [MediaElement]."
+        ],
+        "ondurationchange": [
+          "/// Stream of `durationchange` events handled by this [MediaElement]."
+        ],
+        "onemptied": [
+          "/// Stream of `emptied` events handled by this [MediaElement]."
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaElement]."
+        ],
+        "onloadeddata": [
+          "/// Stream of `loadeddata` events handled by this [MediaElement]."
+        ],
+        "onloadedmetadata": [
+          "/// Stream of `loadedmetadata` events handled by this [MediaElement]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [MediaElement]."
+        ],
+        "onpause": [
+          "/// Stream of `pause` events handled by this [MediaElement]."
+        ],
+        "onplay": [
+          "/// Stream of `play` events handled by this [MediaElement]."
+        ],
+        "onplaying": [
+          "/// Stream of `playing` events handled by this [MediaElement]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [MediaElement]."
+        ],
+        "onratechange": [
+          "/// Stream of `ratechange` events handled by this [MediaElement]."
+        ],
+        "onseeked": [
+          "/// Stream of `seeked` events handled by this [MediaElement]."
+        ],
+        "onseeking": [
+          "/// Stream of `seeking` events handled by this [MediaElement]."
+        ],
+        "onshow": [
+          "/// Stream of `show` events handled by this [MediaElement]."
+        ],
+        "onstalled": [
+          "/// Stream of `stalled` events handled by this [MediaElement]."
+        ],
+        "onsuspend": [
+          "/// Stream of `suspend` events handled by this [MediaElement]."
+        ],
+        "ontimeupdate": [
+          "/// Stream of `timeupdate` events handled by this [MediaElement]."
+        ],
+        "onvolumechange": [
+          "/// Stream of `volumechange` events handled by this [MediaElement]."
+        ],
+        "onwaiting": [
+          "/// Stream of `waiting` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeyadded": [
+          "/// Stream of `keyadded` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeyerror": [
+          "/// Stream of `keyerror` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeymessage": [
+          "/// Stream of `keymessage` events handled by this [MediaElement]."
+        ],
+        "onwebkitneedkey": [
+          "/// Stream of `needkey` events handled by this [MediaElement]."
+        ],
+        "pauseEvent": [
+          "/**",
+          "   * Static factory designed to expose `pause` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "playEvent": [
+          "/**",
+          "   * Static factory designed to expose `play` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "playingEvent": [
+          "/**",
+          "   * Static factory designed to expose `playing` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "ratechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `ratechange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "seekedEvent": [
+          "/**",
+          "   * Static factory designed to expose `seeked` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "seekingEvent": [
+          "/**",
+          "   * Static factory designed to expose `seeking` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "showEvent": [
+          "/**",
+          "   * Static factory designed to expose `show` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "stalledEvent": [
+          "/**",
+          "   * Static factory designed to expose `stalled` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "suspendEvent": [
+          "/**",
+          "   * Static factory designed to expose `suspend` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "timeupdateEvent": [
+          "/**",
+          "   * Static factory designed to expose `timeupdate` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "volumechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `volumechange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "waitingEvent": [
+          "/**",
+          "   * Static factory designed to expose `waiting` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyaddedEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyadded` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyerror` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeymessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `keymessage` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitneedkeyEvent": [
+          "/**",
+          "   * Static factory designed to expose `needkey` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
     "HTMLMenuElement": {
       "comment": [
         "/**",
@@ -246,6 +2029,188 @@
         " */"
       ]
     },
+    "MediaKeySession": {
+      "members": {
+        "onwebkitkeyadded": [
+          "/// Stream of `keyadded` events handled by this [MediaKeySession]."
+        ],
+        "onwebkitkeyerror": [
+          "/// Stream of `keyerror` events handled by this [MediaKeySession]."
+        ],
+        "onwebkitkeymessage": [
+          "/// Stream of `keymessage` events handled by this [MediaKeySession]."
+        ],
+        "webkitkeyaddedEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyadded` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyerror` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeymessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `keymessage` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MediaStream": {
+      "members": {
+        "addtrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `addtrack` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddtrack": [
+          "/// Stream of `addtrack` events handled by this [MediaStream]."
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaStream]."
+        ],
+        "onremovetrack": [
+          "/// Stream of `removetrack` events handled by this [MediaStream]."
+        ],
+        "removetrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `removetrack` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MediaStreamTrack": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "muteEvent": [
+          "/**",
+          "   * Static factory designed to expose `mute` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaStreamTrack]."
+        ],
+        "onmute": [
+          "/// Stream of `mute` events handled by this [MediaStreamTrack]."
+        ],
+        "onunmute": [
+          "/// Stream of `unmute` events handled by this [MediaStreamTrack]."
+        ],
+        "unmuteEvent": [
+          "/**",
+          "   * Static factory designed to expose `unmute` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MessagePort": {
+      "members": {
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [MessagePort].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [MessagePort]."
+        ]
+      }
+    },
+    "MIDIAccess": {
+      "members": {
+        "connectEvent": [
+          "/**",
+          "   * Static factory designed to expose `connect` events to event",
+          "   * handlers that are not necessarily instances of [MidiAccess].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "disconnectEvent": [
+          "/**",
+          "   * Static factory designed to expose `disconnect` events to event",
+          "   * handlers that are not necessarily instances of [MidiAccess].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onconnect": [
+          "/// Stream of `connect` events handled by this [MidiAccess]."
+        ],
+        "ondisconnect": [
+          "/// Stream of `disconnect` events handled by this [MidiAccess]."
+        ]
+      }
+    },
+    "MIDIInput": {
+      "members": {
+        "midimessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `midimessage` events to event",
+          "   * handlers that are not necessarily instances of [MidiInput].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmidimessage": [
+          "/// Stream of `midimessage` events handled by this [MidiInput]."
+        ]
+      }
+    },
+    "MIDIPort": {
+      "members": {
+        "disconnectEvent": [
+          "/**",
+          "   * Static factory designed to expose `disconnect` events to event",
+          "   * handlers that are not necessarily instances of [MidiPort].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "ondisconnect": [
+          "/// Stream of `disconnect` events handled by this [MidiPort]."
+        ]
+      }
+    },
     "Node": {
       "members": {
         "appendChild": [
@@ -261,6 +2226,501 @@
         ]
       }
     },
+    "Notification": {
+      "members": {
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "displayEvent": [
+          "/**",
+          "   * Static factory designed to expose `display` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Notification]."
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [Notification]."
+        ],
+        "ondisplay": [
+          "/// Stream of `display` events handled by this [Notification]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Notification]."
+        ],
+        "onshow": [
+          "/// Stream of `show` events handled by this [Notification]."
+        ],
+        "showEvent": [
+          "/**",
+          "   * Static factory designed to expose `show` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "Performance": {
+      "members": {
+        "onwebkitresourcetimingbufferfull": [
+          "/// Stream of `resourcetimingbufferfull` events handled by this [Performance]."
+        ],
+        "webkitresourcetimingbufferfullEvent": [
+          "/**",
+          "   * Static factory designed to expose `resourcetimingbufferfull` events to event",
+          "   * handlers that are not necessarily instances of [Performance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCDataChannel": {
+      "members": {
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [RtcDataChannel]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [RtcDataChannel]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [RtcDataChannel]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [RtcDataChannel]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCDTMFSender": {
+      "members": {
+        "ontonechange": [
+          "/// Stream of `tonechange` events handled by this [RtcDtmfSender]."
+        ],
+        "tonechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `tonechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcDtmfSender].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCPeerConnection": {
+      "members": {
+        "addstreamEvent": [
+          "/**",
+          "   * Static factory designed to expose `addstream` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "datachannelEvent": [
+          "/**",
+          "   * Static factory designed to expose `datachannel` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "icecandidateEvent": [
+          "/**",
+          "   * Static factory designed to expose `icecandidate` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "iceconnectionstatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `iceconnectionstatechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "negotiationneededEvent": [
+          "/**",
+          "   * Static factory designed to expose `negotiationneeded` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddstream": [
+          "/// Stream of `addstream` events handled by this [RtcPeerConnection]."
+        ],
+        "ondatachannel": [
+          "/// Stream of `datachannel` events handled by this [RtcPeerConnection]."
+        ],
+        "onicecandidate": [
+          "/// Stream of `icecandidate` events handled by this [RtcPeerConnection]."
+        ],
+        "oniceconnectionstatechange": [
+          "/// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection]."
+        ],
+        "onnegotiationneeded": [
+          "/// Stream of `negotiationneeded` events handled by this [RtcPeerConnection]."
+        ],
+        "onremovestream": [
+          "/// Stream of `removestream` events handled by this [RtcPeerConnection]."
+        ],
+        "onsignalingstatechange": [
+          "/// Stream of `signalingstatechange` events handled by this [RtcPeerConnection]."
+        ],
+        "removestreamEvent": [
+          "/**",
+          "   * Static factory designed to expose `removestream` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "signalingstatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `signalingstatechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "SharedWorkerGlobalScope": {
+      "members": {
+        "connectEvent": [
+          "/**",
+          "   * Static factory designed to expose `connect` events to event",
+          "   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onconnect": [
+          "/// Stream of `connect` events handled by this [SharedWorkerGlobalScope]."
+        ]
+      }
+    },
+    "SpeechRecognition": {
+      "members": {
+        "audioendEvent": [
+          "/**",
+          "   * Static factory designed to expose `audioend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "audiostartEvent": [
+          "/**",
+          "   * Static factory designed to expose `audiostart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endEvent": [
+          "/**",
+          "   * Static factory designed to expose `end` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "nomatchEvent": [
+          "/**",
+          "   * Static factory designed to expose `nomatch` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaudioend": [
+          "/// Stream of `audioend` events handled by this [SpeechRecognition]."
+        ],
+        "onaudiostart": [
+          "/// Stream of `audiostart` events handled by this [SpeechRecognition]."
+        ],
+        "onend": [
+          "/// Stream of `end` events handled by this [SpeechRecognition]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [SpeechRecognition]."
+        ],
+        "onnomatch": [
+          "/// Stream of `nomatch` events handled by this [SpeechRecognition]."
+        ],
+        "onresult": [
+          "/// Stream of `result` events handled by this [SpeechRecognition]."
+        ],
+        "onsoundend": [
+          "/// Stream of `soundend` events handled by this [SpeechRecognition]."
+        ],
+        "onsoundstart": [
+          "/// Stream of `soundstart` events handled by this [SpeechRecognition]."
+        ],
+        "onspeechend": [
+          "/// Stream of `speechend` events handled by this [SpeechRecognition]."
+        ],
+        "onspeechstart": [
+          "/// Stream of `speechstart` events handled by this [SpeechRecognition]."
+        ],
+        "onstart": [
+          "/// Stream of `start` events handled by this [SpeechRecognition]."
+        ],
+        "resultEvent": [
+          "/**",
+          "   * Static factory designed to expose `result` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "soundendEvent": [
+          "/**",
+          "   * Static factory designed to expose `soundend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "soundstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `soundstart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "speechendEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "speechstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechstart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "startEvent": [
+          "/**",
+          "   * Static factory designed to expose `start` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "SpeechSynthesisUtterance": {
+      "members": {
+        "boundaryEvent": [
+          "/**",
+          "   * Static factory designed to expose `boundary` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endEvent": [
+          "/**",
+          "   * Static factory designed to expose `end` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "markEvent": [
+          "/**",
+          "   * Static factory designed to expose `mark` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onboundary": [
+          "/// Stream of `boundary` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onend": [
+          "/// Stream of `end` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onmark": [
+          "/// Stream of `mark` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onpause": [
+          "/// Stream of `pause` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onresume": [
+          "/// Stream of `resume` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onstart": [
+          "/// Stream of `start` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "pauseEvent": [
+          "/**",
+          "   * Static factory designed to expose `pause` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resumeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resume` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "startEvent": [
+          "/**",
+          "   * Static factory designed to expose `start` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "TextTrack": {
+      "members": {
+        "cuechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `cuechange` events to event",
+          "   * handlers that are not necessarily instances of [TextTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncuechange": [
+          "/// Stream of `cuechange` events handled by this [TextTrack]."
+        ]
+      }
+    },
+    "TextTrackCue": {
+      "members": {
+        "enterEvent": [
+          "/**",
+          "   * Static factory designed to expose `enter` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackCue].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "exitEvent": [
+          "/**",
+          "   * Static factory designed to expose `exit` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackCue].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onenter": [
+          "/// Stream of `enter` events handled by this [TextTrackCue]."
+        ],
+        "onexit": [
+          "/// Stream of `exit` events handled by this [TextTrackCue]."
+        ]
+      }
+    },
+    "TextTrackList": {
+      "members": {
+        "addtrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `addtrack` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackList].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddtrack": [
+          "/// Stream of `addtrack` events handled by this [TextTrackList]."
+        ]
+      }
+    },
     "WebSocket": {
       "comment": [
         "/**",
@@ -299,6 +2759,50 @@
         " */"
       ],
       "members": {
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [WebSocket]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [WebSocket]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [WebSocket]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [WebSocket]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "send": [
           "/**",
           "   * Transmit data to the server over this connection.",
@@ -339,7 +2843,343 @@
         " * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.",
         " * * [Window](http://www.w3.org/TR/Window/) from the W3C.",
         " */"
-      ]
+      ],
+      "members": {
+        "devicemotionEvent": [
+          "/**",
+          "   * Static factory designed to expose `devicemotion` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "deviceorientationEvent": [
+          "/**",
+          "   * Static factory designed to expose `deviceorientation` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "DOMContentLoadedEvent": [
+          "/**",
+          "   * Static factory designed to expose `contentloaded` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "hashchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `hashchange` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "offlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `offline` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Window]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Window]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Window]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Window]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Window]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Window]."
+        ],
+        "ondevicemotion": [
+          "/// Stream of `devicemotion` events handled by this [Window]."
+        ],
+        "ondeviceorientation": [
+          "/// Stream of `deviceorientation` events handled by this [Window]."
+        ],
+        "onDOMContentLoaded": [
+          "/// Stream of `contentloaded` events handled by this [Window]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [Window]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [Window]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [Window]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [Window]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [Window]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [Window]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [Window]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Window]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Window]."
+        ],
+        "onhashchange": [
+          "/// Stream of `hashchange` events handled by this [Window]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Window]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Window]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Window]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Window]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Window]."
+        ],
+        "onlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `online` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Window]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [Window]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Window]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Window]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Window]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Window]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Window]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Window]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Window]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Window]."
+        ],
+        "onoffline": [
+          "/// Stream of `offline` events handled by this [Window]."
+        ],
+        "ononline": [
+          "/// Stream of `online` events handled by this [Window]."
+        ],
+        "onpagehide": [
+          "/// Stream of `pagehide` events handled by this [Window]."
+        ],
+        "onpageshow": [
+          "/// Stream of `pageshow` events handled by this [Window]."
+        ],
+        "onpopstate": [
+          "/// Stream of `popstate` events handled by this [Window]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Window]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [Window]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Window]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Window]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Window]."
+        ],
+        "onstorage": [
+          "/// Stream of `storage` events handled by this [Window]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Window]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Window]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Window]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Window]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Window]."
+        ],
+        "ontransitionend": [
+          "/// Stream of `transitionend` events handled by this [Window]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [Window]."
+        ],
+        "onwebkitAnimationEnd": [
+          "/// Stream of `animationend` events handled by this [Window]."
+        ],
+        "onwebkitAnimationIteration": [
+          "/// Stream of `animationiteration` events handled by this [Window]."
+        ],
+        "onwebkitAnimationStart": [
+          "/// Stream of `animationstart` events handled by this [Window]."
+        ],
+        "pagehideEvent": [
+          "/**",
+          "   * Static factory designed to expose `pagehide` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "pageshowEvent": [
+          "/**",
+          "   * Static factory designed to expose `pageshow` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "popstateEvent": [
+          "/**",
+          "   * Static factory designed to expose `popstate` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "storageEvent": [
+          "/**",
+          "   * Static factory designed to expose `storage` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationEndEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationend` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationIterationEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationiteration` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationStartEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationstart` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "Worker": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Worker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [Worker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Worker]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [Worker]."
+        ]
+      }
+    },
+    "WorkerGlobalScope": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [WorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [WorkerGlobalScope]."
+        ]
+      }
     },
     "XMLHttpRequest": {
       "members": {
@@ -373,6 +3213,7 @@
           "   */"
         ],
         "onreadystatechange": [
+          "/// Stream of `readystatechange` events handled by this [HttpRequest].",
           "/**",
           "   * Event listeners to be notified every time the [HttpRequest]",
           "   * object's `readyState` changes values.",
@@ -438,6 +3279,14 @@
           "   * </table>",
           "   */"
         ],
+        "readystatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `readystatechange` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "response": [
           "/**",
           "   * The data received as a reponse from the request.",
@@ -533,6 +3382,87 @@
           "   */"
         ]
       }
+    },
+    "XMLHttpRequestEventTarget": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadendEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadend` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onloadend": [
+          "/// Stream of `loadend` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [HttpRequestEventTarget]."
+        ],
+        "ontimeout": [
+          "/// Stream of `timeout` events handled by this [HttpRequestEventTarget]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "timeoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `timeout` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
     }
   },
   "dart.dom.indexed_db": {
@@ -542,13 +3472,670 @@
         " * An indexed database object for storing client-side data",
         " * in web apps.",
         " */"
-      ]
+      ],
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Database]."
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [Database]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Database]."
+        ],
+        "onversionchange": [
+          "/// Stream of `versionchange` events handled by this [Database]."
+        ],
+        "versionchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `versionchange` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBOpenDBRequest": {
+      "members": {
+        "blockedEvent": [
+          "/**",
+          "   * Static factory designed to expose `blocked` events to event",
+          "   * handlers that are not necessarily instances of [OpenDBRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onblocked": [
+          "/// Stream of `blocked` events handled by this [OpenDBRequest]."
+        ],
+        "onupgradeneeded": [
+          "/// Stream of `upgradeneeded` events handled by this [OpenDBRequest]."
+        ],
+        "upgradeneededEvent": [
+          "/**",
+          "   * Static factory designed to expose `upgradeneeded` events to event",
+          "   * handlers that are not necessarily instances of [OpenDBRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBRequest": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Request].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Request]."
+        ],
+        "onsuccess": [
+          "/// Stream of `success` events handled by this [Request]."
+        ],
+        "successEvent": [
+          "/**",
+          "   * Static factory designed to expose `success` events to event",
+          "   * handlers that are not necessarily instances of [Request].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBTransaction": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "completeEvent": [
+          "/**",
+          "   * Static factory designed to expose `complete` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Transaction]."
+        ],
+        "oncomplete": [
+          "/// Stream of `complete` events handled by this [Transaction]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Transaction]."
+        ]
+      }
+    }
+  },
+  "dart.dom.svg": {
+    "SVGElementInstance": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecopyEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecopy` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecutEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecut` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforepasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforepaste` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "changeEvent": [
+          "/**",
+          "   * Static factory designed to expose `change` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "contextmenuEvent": [
+          "/**",
+          "   * Static factory designed to expose `contextmenu` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "copyEvent": [
+          "/**",
+          "   * Static factory designed to expose `copy` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "cutEvent": [
+          "/**",
+          "   * Static factory designed to expose `cut` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dblclickEvent": [
+          "/**",
+          "   * Static factory designed to expose `doubleclick` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragendEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragend` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragenter` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragEvent": [
+          "/**",
+          "   * Static factory designed to expose `drag` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragleave` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragover` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragstart` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dropEvent": [
+          "/**",
+          "   * Static factory designed to expose `drop` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "inputEvent": [
+          "/**",
+          "   * Static factory designed to expose `input` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keydownEvent": [
+          "/**",
+          "   * Static factory designed to expose `keydown` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keypressEvent": [
+          "/**",
+          "   * Static factory designed to expose `keypress` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keyupEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyup` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousedownEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousedown` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseenter` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseleave` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousemoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousemove` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseout` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseover` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseupEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseup` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousewheelEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousewheel` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [ElementInstance]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [ElementInstance]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [ElementInstance]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [ElementInstance]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [ElementInstance]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [ElementInstance]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [ElementInstance]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [ElementInstance]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [ElementInstance]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [ElementInstance]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [ElementInstance]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [ElementInstance]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [ElementInstance]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [ElementInstance]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [ElementInstance]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [ElementInstance]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [ElementInstance]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [ElementInstance]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [ElementInstance]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [ElementInstance]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [ElementInstance]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [ElementInstance]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [ElementInstance]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [ElementInstance]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [ElementInstance]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [ElementInstance]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [ElementInstance]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [ElementInstance]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [ElementInstance]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [ElementInstance]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [ElementInstance]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [ElementInstance]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [ElementInstance]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [ElementInstance]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [ElementInstance]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [ElementInstance]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [ElementInstance]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [ElementInstance]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [ElementInstance]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [ElementInstance]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [ElementInstance]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [ElementInstance]."
+        ],
+        "pasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `paste` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resetEvent": [
+          "/**",
+          "   * Static factory designed to expose `reset` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "scrollEvent": [
+          "/**",
+          "   * Static factory designed to expose `scroll` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "searchEvent": [
+          "/**",
+          "   * Static factory designed to expose `search` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectEvent": [
+          "/**",
+          "   * Static factory designed to expose `select` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectstart` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "submitEvent": [
+          "/**",
+          "   * Static factory designed to expose `submit` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
     }
   },
   "dart.dom.web_audio": {
+    "AudioBufferSourceNode": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [AudioBufferSourceNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [AudioBufferSourceNode]."
+        ]
+      }
+    },
+    "AudioContext": {
+      "members": {
+        "completeEvent": [
+          "/**",
+          "   * Static factory designed to expose `complete` events to event",
+          "   * handlers that are not necessarily instances of [AudioContext].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncomplete": [
+          "/// Stream of `complete` events handled by this [AudioContext]."
+        ]
+      }
+    },
+    "OscillatorNode": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [OscillatorNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [OscillatorNode]."
+        ]
+      }
+    },
     "ScriptProcessorNode": {
       "members": {
+        "audioprocessEvent": [
+          "/**",
+          "   * Static factory designed to expose `audioprocess` events to event",
+          "   * handlers that are not necessarily instances of [ScriptProcessorNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
         "onaudioprocess": [
+          "/// Stream of `audioprocess` events handled by this [ScriptProcessorNode].",
           "/**",
           "   * Get a Stream that fires events when AudioProcessingEvents occur.",
           "   * This particular stream is special in that it only allows one listener to a",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index e429275..852706f 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -333,8 +333,11 @@
     "support_level": "experimental"
   },
   "BeforeUnloadEvent": {
-    "members": {},
-    "support_level": "untriaged"
+    "comment": "http://www.w3.org/html/wg/drafts/html/master/browsers.html#beforeunloadevent",
+    "members": {
+      "returnValue": {}
+    },
+    "support_level": "stable"
   },
   "BiquadFilterNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section",
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 0db0fee..125dbc8 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -474,6 +474,8 @@
 # Syntax is: ClassName.(get\:|set\:|call\:|on\:)?MemberName
 # Using get: and set: is optional and should only be used when a getter needs
 # to be suppressed but not the setter, etc.
+# Prepending ClassName with = will only match against direct class, not for
+# subclasses.
 # TODO(jacobr): cleanup and augment this list.
 removed_html_members = monitored.Set('htmlrenamer.removed_html_members', [
     'AudioBufferSourceNode.looping', # TODO(vsm): Use deprecated IDL annotation
@@ -594,7 +596,7 @@
     'Element.webkitCreateShadowRoot',
     'Element.webkitPseudo',
     'Element.webkitShadowRoot',
-    'Event.returnValue',
+    '=Event.returnValue', # Only suppress on Event, allow for BeforeUnloadEvnt.
     'Event.srcElement',
     'EventSource.URL',
     'FontFaceSet.load',
@@ -845,16 +847,26 @@
       return True
 
   def _FindMatch(self, interface, member, member_prefix, candidates):
+    def find_match(interface_id):
+      member_name = interface_id + '.' + member
+      if member_name in candidates:
+        return member_name
+      member_name = interface_id + '.' + member_prefix + member
+      if member_name in candidates:
+        return member_name
+      member_name = interface_id + '.*'
+      if member_name in candidates:
+        return member_name
+
+    # Check direct matches first
+    match = find_match('=%s' % interface.id)
+    if match:
+      return match
+
     for interface in self._database.Hierarchy(interface):
-      member_name = interface.id + '.' + member
-      if member_name in candidates:
-        return member_name
-      member_name = interface.id + '.' + member_prefix + member
-      if member_name in candidates:
-        return member_name
-      member_name = interface.id + '.*'
-      if member_name in candidates:
-        return member_name
+      match = find_match(interface.id)
+      if match:
+        return match
 
   def GetLibraryName(self, interface):
     # Some types have attributes merged in from many other interfaces.
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 21deb41..833fb23 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -98,6 +98,7 @@
 _js_custom_constructors = monitored.Set('systemhtml._js_custom_constructors', [
     'AudioContext',
     'Blob',
+    'Comment',
     'MutationObserver',
     'RTCIceCandidate',
     'RTCPeerConnection',
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index daaf6ba..0ee99a3 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -54,6 +54,8 @@
 
 $!GENERATED_DART_FILES
 
+// Issue 14721, order important for WrappedEvent.
+part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/AttributeMap.dart';
 part '$AUXILIARY_DIR/CanvasImageSource.dart';
 part '$AUXILIARY_DIR/CrossFrameTypes.dart';
@@ -73,7 +75,6 @@
 part '$AUXILIARY_DIR/ReadyState.dart';
 part '$AUXILIARY_DIR/Serialization.dart';
 part '$AUXILIARY_DIR/Validators.dart';
-part '$AUXILIARY_DIR/WrappedEvent.dart';
 part '$AUXILIARY_DIR/WrappedList.dart';
 part '$AUXILIARY_DIR/_HttpRequestUtils.dart';
 part '$AUXILIARY_DIR/_ListIterators.dart';
diff --git a/tools/dom/templates/html/impl/impl_Comment.darttemplate b/tools/dom/templates/html/impl/impl_Comment.darttemplate
new file mode 100644
index 0000000..df0d378
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_Comment.darttemplate
@@ -0,0 +1,17 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS$NATIVESPEC {
+$if DART2JS
+  factory Comment([String data]) {
+    if (data != null) {
+      return JS('Comment', '#.createComment(#)', document, data);
+    }
+    return JS('Comment', '#.createComment("")', document);
+  }
+$endif
+$!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index e04ec31..5c52b06 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -783,8 +783,17 @@
   @DocsEditable()
   String get localName => _localName;
 
+  /**
+   * A URI that identifies the XML namespace of this element.
+   *
+   * `null` if no namespace URI is specified.
+   *
+   * ## Other resources
+   *
+   * * [Node.namespaceURI]
+   * (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname) from W3C.
+   */
   @DomName('Element.namespaceUri')
-  @DocsEditable()
   String get namespaceUri => _namespaceUri;
 
   String toString() => localName;
@@ -828,6 +837,12 @@
   }
 
 $if DART2JS
+  /**
+   * Static factory designed to expose `mousewheel` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.mouseWheelEvent')
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const _CustomEventStreamProvider<WheelEvent>(
@@ -846,6 +861,12 @@
     }
   }
 
+  /**
+   * Static factory designed to expose `transitionend` events to event
+   * handlers that are not necessarily instances of [Element].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Element.transitionEndEvent')
   static const EventStreamProvider<TransitionEvent> transitionEndEvent =
       const _CustomEventStreamProvider<TransitionEvent>(
@@ -990,6 +1011,17 @@
   }
 
 $if DART2JS
+  /**
+   * Creates a new shadow root for this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.createShadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
@@ -999,6 +1031,17 @@
       this, this, this);
   }
 
+  /**
+   * The shadow root of this shadow host.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM 101]
+   * (http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/)
+   * from HTML5Rocks.
+   * * [Shadow DOM specification]
+   * (http://www.w3.org/TR/shadow-dom/) from W3C.
+   */
   @DomName('Element.shadowRoot')
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 2ff16e3..53adce9 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -238,6 +238,12 @@
   }
 $endif
 
+  /**
+   * Static factory designed to expose `visibilitychange` events to event
+   * handlers that are not necessarily instances of [Document].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Document.visibilityChange')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index a45122a..a0211c8 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -271,13 +271,18 @@
   static bool get supportsPointConversions => _DomPoint.supported;
 $!MEMBERS
 
+  /**
+   * Static factory designed to expose `beforeunload` events to event
+   * handlers that are not necessarily instances of [Window].
+   *
+   * See [EventStreamProvider] for usage information.
+   */
   @DomName('Window.beforeunloadEvent')
-  @DocsEditable()
   static const EventStreamProvider<BeforeUnloadEvent> beforeUnloadEvent =
       const _BeforeUnloadEventStreamProvider('beforeunload');
 
+  /// Stream of `beforeunload` events handled by this [Window].
   @DomName('Window.onbeforeunload')
-  @DocsEditable()
   Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
 
   void moveTo(Point p) {
@@ -292,6 +297,7 @@
 $endif
 }
 
+$if DART2JS
 class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
   String _returnValue;
 
@@ -301,15 +307,14 @@
 
   void set returnValue(String value) {
     _returnValue = value;
-$if DART2JS
     // FF and IE use the value as the return value, Chrome will return this from
     // the event callback function.
     if (JS('bool', '("returnValue" in #)', wrapped)) {
       JS('void', '#.returnValue = #', wrapped, value);
     }
-$endif
   }
 }
+$endif
 
 class _BeforeUnloadEventStreamProvider implements
     EventStreamProvider<BeforeUnloadEvent> {
@@ -318,8 +323,10 @@
   const _BeforeUnloadEventStreamProvider(this._eventType);
 
   Stream<BeforeUnloadEvent> forTarget(EventTarget e, {bool useCapture: false}) {
-    var controller = new StreamController(sync: true);
     var stream = new _EventStream(e, _eventType, useCapture);
+$if DART2JS
+    var controller = new StreamController(sync: true);
+
     stream.listen((event) {
       var wrapped = new _BeforeUnloadEvent(event);
       controller.add(wrapped);
@@ -327,6 +334,9 @@
     });
 
     return controller.stream;
+$else
+    return stream;
+$endif
   }
 
   String getEventType(EventTarget target) {